Audit any contract on a supported chain. Send a GET request with your API key in the X-Auth-Key header; the full parameter and response reference is below.By default the call is synchronous: it returns the cached verdict in milliseconds, or holds until a first-time audit completes. Add async=true to make first-time audits non-blocking: a cached verdict is still returned directly, but when an audit has to run you get { "status": "FETCHING" | "DECOMPILING" | "ANALYZING" } immediately instead. Poll the same URL every 1-2 seconds until it flips to { "audit": ... }, useful to drive a progress indicator. Billing is identical in both modes; progress responses are free.Or skip polling entirely: add subscribe=true to fire the audit, subscribe the token, and have the finished verdict (plus every later change) pushed to you over a live SSE stream or a webhook. See SSE & Webhooks.address also accepts a liquidity pool (a Uniswap V2/V3 pair address or a Uniswap V4 pool id) or a V4 hook address. audit.entry tells you how it was addressed (token / pool / hook).
Pool. Audits the token plus that specific pool’s hook, instead of the token’s primary pool. The response is the token’s audit: audit.address is the resolved token, and audit.pool describes the pool the hook verdict was computed against (including whether it is the token’s primary pool). Store results keyed by audit.chain + audit.address, not by the value you sent.
Hook. Returns the hook’s own audit, not a token’s (one hook often serves many tokens): audit.address is the hook, isSafe, description and vulnerabilities are the hook’s verdict, and audit.hookContext lists the pools and tokens that use it (pools, poolCount). For a token’s combined verdict, call with the token address and read isHookSafe / hookAudit.
A pool id or hook that resolves nowhere returns 404 { "reason": "pool_not_found" | "hook_not_found" }.For how to read the result, see Understanding Results. For the full list of type values, see Risk Categories.
Pass chain=solana (or sol) and the token’s mint address as address. A Solana address is base58 and case-sensitive: send it exactly as written, never lowercased (a lowercased mint is a different account). The response echoes it unchanged in audit.address, so key your cache on it as-is.
A Solana token has no contract code of its own: it is a mint account of the SPL Token or Token-2022 program. Its risks are the mint’s configuration: who can mint, who can freeze accounts, and which Token-2022 extensions are on. So a Solana audit makes no LLM call and reads no code. The verdict is computed deterministically from the mint’s live onchain state, re-read on every refresh, and returned with sourceType: "solana" and the snapshot it was read from in solanaState.
We judge the capability, not what the holder did with it so far: a live power to block a sale, seize balances, or raise a fee without a ceiling is critical whoever holds it (a wallet, a multisig or a program). A live mint authority is a warning: it can dilute holders but cannot block or seize their tokens, so on its own it leaves the token SAFE. The description names the holder in plain words. A power is cleared only when it is revoked or held by a burn address, and then it raises no finding at all.
Control
When it is a finding
type
impact
Freeze authority
Live: it can freeze any holder’s account, a pool’s vault included
BlacklistAbuse
critical
Default account state
New accounts start frozen
TradeRestriction
critical
Permanent delegate
Live: it can move or burn anyone’s tokens
UnauthorizedTransfer
critical
Transfer hook
A hook program is set (every transfer calls it), or none is set but its authority can attach one
UnsafeExternalCall
critical
Pause
Transfers paused now, or a live pause authority
TradeRestriction
critical
Non-transferable
The token can never move
TradeRestriction
critical
Transfer fee
Takes 100 % of a transfer
TradeRestriction
critical
Transfer fee
A live fee authority (it can raise the fee to 100 %), whatever today’s rate
HiddenFees
critical
Transfer fee
Fixed (authority revoked) above 10 %
HiddenFees
critical
Transfer fee
Fixed, 10 % or less
HiddenFees
warning
Mint authority
Live: it can create any amount
UnlimitedMinting
warning
Display scaling
A live authority can rescale displayed balances
Other
warning
Display interest
A live authority sets the displayed interest rate
Other
info
Metadata
Name, symbol and image can still be changed
Other
info
Unrecognized extension
A Token-2022 extension this audit does not judge yet
Other
critical
A scheduled fee change already written onchain counts at its future rate. Each Solana finding carries solanaFlag (the control, e.g. freeze_authority) and solanaHolder (the address holding it); code is empty.When a live power is held by the known issuer of that token (a regulated stablecoin issuer on its own stablecoin, for example) or by a program whose code we reviewed and which bounds the power, the finding stays listed with mitigated: true and a gateReason naming the reviewed party, and it no longer counts against isSafe. That never applies to a state actively used against holders: a pause that is on, accounts born frozen, a prohibitive fee.
solanaState is the snapshot the verdict was computed from (snake_case, like b20Flags), null on every other chain. Every power is an authority object { address, kind } where kind is revoked, burned, multisig (with m of n signers, and keys when fewer distinct keys than m are enough), wallet, pda (a program-controlled address, with its owner program) or program (the address of a deployed program, whose deploy key may still sign). The main fields: program (spl-token or spl-token-2022), mint_authority, freeze_authority, permanent_delegate, transfer_fee, transfer_hook, pausable, default_account_state, non_transferable, scaled_ui_amount, metadata, and unix_ts / read_slot (when it was read). The full schema is below.
An address that is not a fungible token mint (a wallet, a pool, a token account, a program, an NFT) returns 404 { "audit": null, "reason": "not_a_token", "message": "..." }, the same shape as the no-pool 404: branch on reason. Do not retry it: send the token’s mint address instead.
Subscriptions work the same on Solana: subscribe with chain: "SOLANA" and the mint. Because the configuration is re-read on every refresh, a change such as an authority revoked, a fee raised or a pause switched on is pushed as an audit.changed event like any other verdict change.
The subject to audit: a token address, a liquidity pool (a Uniswap V2/V3 pair address or a Uniswap V4 pool id, 32 bytes), or a Uniswap V4 hook address. A pool resolves to its token: the response's audit.address is that resolved token and audit.pool describes the pool the hook verdict was computed against. A hook returns the hook's own audit: audit.address is the hook and audit.hookContext lists the pools and tokens that use it. audit.entry tells you how it was addressed. Cache your results by audit.chain + audit.address, not by the value you sent. On chain=solana: the token's base58 mint address, CASE-SENSITIVE (send it exactly as written; a lowercased mint is another account). Pool and hook entries are EVM only.
Optional, EVM only. Pin a specific pool for a token entry: address is the token, pool is the pool whose hook drives the verdict (a V2/V3 pair address or a V4 pool id). A mismatch (the pool does not trade the token) is a 400. Not used on chain=solana (it answers 404 pool_not_found): send the mint alone.
Closed-source contracts are audited on decompiled bytecode (the most expensive tier). Set false to opt out: closed-source contracts then answer { "audit": null, "reason": "decompile_disabled" } instead of being decompiled, and cached decompiled verdicts are not served. Sent as the string "true"/"false" in the query.
Async mode. false (default): the request holds until the audit is done, classic synchronous behavior. true: if no cached audit exists, the audit is started in the background and the response is { status }; poll the SAME URL every 1-2s until it flips to { audit } (typically 10-30s for a first-time audit). There is no job id: an audit is idempotent per (chain, address), so the token address is the job handle. Billing is identical in both modes; progress responses are never billed. With subscribe=true you do not even poll: the finished verdict is pushed to you (over your SSE stream or webhook) the moment it lands (see SSE & Webhooks).
Subscribe this (chain, address) to push updates as part of this call. Once subscribed, any later verdict change (safe↔unsafe flip, owner change, a gate or honeypot flipping, or a closed-source token re-audited on its now-verified source) is pushed to you over a live SSE stream or a webhook, instead of you polling. Combined with async=true, the finished audit result is itself pushed when ready, so you fire the call and just consume the events. Subscribing works with or without a delivery transport configured; with neither, pull the changes from GET /api/events (see SSE & Webhooks). Charges the one-time subscribe fee for a genuinely-new token; idempotent for an already-subscribed one.
Echo of what this call was billed, present only for authenticated API-key callers (never for anonymous/browser traffic). type is the bill category (e.g. cached, fresh_no_decompile, fresh_with_decompile, refresh) or null when the call is free; credits is the amount metered.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"serialized.audit","description":"Instant smart-contract risk verdicts over a single REST endpoint.","colors":{"primary":"#3DCF8E","light":"#3DCF8E","dark":"#007A49"},"logo":{"light":"https://mintcdn.com/serialized/IsfzO_AGlY5OGF8F/logo/light.svg?fit=max\u0026auto=format\u0026n=IsfzO_AGlY5OGF8F\u0026q=85\u0026s=4b7517c65c90720f6e20ad18e1fc2144","dark":"https://mintcdn.com/serialized/IsfzO_AGlY5OGF8F/logo/dark.svg?fit=max\u0026auto=format\u0026n=IsfzO_AGlY5OGF8F\u0026q=85\u0026s=82a7224a3fa08fb06c5606846c4c8a08","href":"https://www.serializedaudit.io"},"favicon":"https://mintcdn.com/serialized/IsfzO_AGlY5OGF8F/logo/favicon.svg?fit=max\u0026auto=format\u0026n=IsfzO_AGlY5OGF8F\u0026q=85\u0026s=2a29c7595bd6ff47b7d1b2ce96e0dcb7","navbar":{"links":[{"href":"https://www.serializedaudit.io/portal","label":"Dashboard"},{"href":"https://www.serializedaudit.io/portal/plans","label":"Pricing"},{"href":"https://docs.serializedaudit.io/support","label":"Support"},{"href":"https://calendar.notion.so/meet/helloserialized/serialized","label":"Book a call"}],"primary":{"type":"button","label":"Get API key","href":"https://www.serializedaudit.io/signup?returnTo=%2Fdashboard"}},"footer":{"socials":{"website":"https://www.serializedaudit.io","x":"https://x.com/serialized_xyz","telegram":"https://t.me/serialized_community","discord":"https://discord.gg/dD6tAxcUMK"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"serialized","hasAudioNarration":false,"actualSubdomain":"serialized","customDomains":["docs.serializedaudit.io"],"gitSource":{"type":"github","owner":"serialized-xyz","repo":"serialized-audit","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af572b051057243856f1e6a","clientVersion":"0.0.4124","searchFilterCounts":[{"language":"default","tag":"API Reference","count":27},{"language":"default","tag":"Serialized Audit","count":24},{"language":"default","tag":"Get Started","count":4},{"language":"default","tag":"Reference","count":2},{"language":"default","tag":"Programs","count":1},{"language":"default","tag":"Resources","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/audit-contract","slug":"/api-reference/audit-contract","pageMetadata":{"title":"Audit a Contract","description":"The single endpoint: send a contract, get a verdict.","openapi":"GET /audit-contract","href":"/api-reference/audit-contract"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"The single endpoint: send a contract, get a verdict.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Audit any contract on a `,_jsx(_components.a,{href:`/supported-chains`,children:`supported chain`}),`. Send a `,_jsx(_components.code,{children:`GET`}),` request with your API key in the `,_jsx(_components.code,{children:`X-Auth-Key`}),` header; the full parameter and response reference is below.`]}),`\n`,_jsxs(_components.p,{children:[`By default the call is synchronous: it returns the cached verdict in milliseconds, or holds until a first-time audit completes. Add `,_jsx(_components.code,{children:`async=true`}),` to make first-time audits non-blocking: a cached verdict is still returned directly, but when an audit has to run you get `,_jsx(_components.code,{children:`{ \"status\": \"FETCHING\" | \"DECOMPILING\" | \"ANALYZING\" }`}),` immediately instead. Poll the same URL every 1-2 seconds until it flips to `,_jsx(_components.code,{children:`{ \"audit\": ... }`}),`, useful to drive a progress indicator. Billing is identical in both modes; progress responses are free.`]}),`\n`,_jsxs(_components.p,{children:[`Or skip polling entirely: add `,_jsx(_components.code,{children:`subscribe=true`}),` to fire the audit, subscribe the token, and have the finished verdict (plus every later change) `,_jsx(_components.strong,{children:`pushed to you`}),` over a live SSE stream or a webhook. See `,_jsx(_components.a,{href:`/sse-and-webhooks`,children:`SSE \u0026 Webhooks`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`address`}),` also accepts a `,_jsx(_components.strong,{children:`liquidity pool`}),` (a Uniswap V2/V3 pair address or a Uniswap V4 pool id) or a `,_jsx(_components.strong,{children:`V4 hook address`}),`. `,_jsx(_components.code,{children:`audit.entry`}),` tells you how it was addressed (`,_jsx(_components.code,{children:`token`}),` / `,_jsx(_components.code,{children:`pool`}),` / `,_jsx(_components.code,{children:`hook`}),`).`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Pool.`}),` Audits the token plus that specific pool’s hook, instead of the token’s primary pool. The response is the token’s audit: `,_jsx(_components.code,{children:`audit.address`}),` is the resolved token, and `,_jsx(_components.code,{children:`audit.pool`}),` describes the pool the hook verdict was computed against (including whether it is the token’s primary pool). Store results keyed by `,_jsx(_components.code,{children:`audit.chain`}),` + `,_jsx(_components.code,{children:`audit.address`}),`, not by the value you sent.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Hook.`}),` Returns the hook’s own audit, not a token’s (one hook often serves many tokens): `,_jsx(_components.code,{children:`audit.address`}),` is the hook, `,_jsx(_components.code,{children:`isSafe`}),`, `,_jsx(_components.code,{children:`description`}),` and `,_jsx(_components.code,{children:`vulnerabilities`}),` are the hook’s verdict, and `,_jsx(_components.code,{children:`audit.hookContext`}),` lists the pools and tokens that use it (`,_jsx(_components.code,{children:`pools`}),`, `,_jsx(_components.code,{children:`poolCount`}),`). For a token’s combined verdict, call with the token address and read `,_jsx(_components.code,{children:`isHookSafe`}),` / `,_jsx(_components.code,{children:`hookAudit`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A pool id or hook that resolves nowhere returns `,_jsx(_components.code,{children:`404 { \"reason\": \"pool_not_found\" | \"hook_not_found\" }`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`For how to read the result, see `,_jsx(_components.a,{href:`/understanding-results`,children:`Understanding Results`}),`. For the full list of `,_jsx(_components.code,{children:`type`}),` values, see `,_jsx(_components.a,{href:`/risk-categories`,children:`Risk Categories`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`solana-tokens`,children:`Solana tokens`}),`\n`,_jsxs(_components.p,{children:[`Pass `,_jsx(_components.code,{children:`chain=solana`}),` (or `,_jsx(_components.code,{children:`sol`}),`) and the token’s `,_jsx(_components.strong,{children:`mint address`}),` as `,_jsx(_components.code,{children:`address`}),`. A Solana address is base58 and `,_jsx(_components.strong,{children:`case-sensitive`}),`: send it exactly as written, never lowercased (a lowercased mint is a different account). The response echoes it unchanged in `,_jsx(_components.code,{children:`audit.address`}),`, so key your cache on it as-is.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://www.serializedaudit.io/api/audit-contract?chain=solana\u0026address=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Auth-Key: sk_live_your_key_here\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A Solana token has no contract code of its own: it is a mint account of the SPL Token or Token-2022 program. Its risks are the mint’s configuration: who can mint, who can freeze accounts, and which Token-2022 extensions are on. So a Solana audit makes no LLM call and reads no code. The verdict is computed deterministically from the mint’s live onchain state, re-read on every refresh, and returned with `,_jsx(_components.code,{children:`sourceType: \"solana\"`}),` and the snapshot it was read from in `,_jsx(_components.code,{children:`solanaState`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`what-is-checked`,children:`What is checked`}),`\n`,_jsxs(_components.p,{children:[`We judge the `,_jsx(_components.strong,{children:`capability`}),`, not what the holder did with it so far: a live power to block a sale, seize balances, or raise a fee without a ceiling is critical whoever holds it (a wallet, a multisig or a program). A live mint authority is a warning: it can dilute holders but cannot block or seize their tokens, so on its own it leaves the token SAFE. The description names the holder in plain words. A power is cleared only when it is revoked or held by a burn address, and then it raises no finding at all.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Control`}),_jsx(_components.th,{children:`When it is a finding`}),_jsx(_components.th,{children:_jsx(_components.code,{children:`type`})}),_jsx(_components.th,{children:_jsx(_components.code,{children:`impact`})})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Freeze authority`}),_jsx(_components.td,{children:`Live: it can freeze any holder’s account, a pool’s vault included`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`BlacklistAbuse`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Default account state`}),_jsx(_components.td,{children:`New accounts start frozen`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`TradeRestriction`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Permanent delegate`}),_jsx(_components.td,{children:`Live: it can move or burn anyone’s tokens`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UnauthorizedTransfer`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Transfer hook`}),_jsx(_components.td,{children:`A hook program is set (every transfer calls it), or none is set but its authority can attach one`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UnsafeExternalCall`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Pause`}),_jsx(_components.td,{children:`Transfers paused now, or a live pause authority`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`TradeRestriction`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Non-transferable`}),_jsx(_components.td,{children:`The token can never move`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`TradeRestriction`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Transfer fee`}),_jsx(_components.td,{children:`Takes 100 % of a transfer`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`TradeRestriction`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Transfer fee`}),_jsx(_components.td,{children:`A live fee authority (it can raise the fee to 100 %), whatever today’s rate`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`HiddenFees`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Transfer fee`}),_jsx(_components.td,{children:`Fixed (authority revoked) above 10 %`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`HiddenFees`})}),_jsx(_components.td,{children:`critical`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Transfer fee`}),_jsx(_components.td,{children:`Fixed, 10 % or less`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`HiddenFees`})}),_jsx(_components.td,{children:`warning`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Mint authority`}),_jsx(_components.td,{children:`Live: it can create any amount`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UnlimitedMinting`})}),_jsx(_components.td,{children:`warning`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Display scaling`}),_jsx(_components.td,{children:`A live authority can rescale displayed balances`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Other`})}),_jsx(_components.td,{children:`warning`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Display interest`}),_jsx(_components.td,{children:`A live authority sets the displayed interest rate`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Other`})}),_jsx(_components.td,{children:`info`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Metadata`}),_jsx(_components.td,{children:`Name, symbol and image can still be changed`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Other`})}),_jsx(_components.td,{children:`info`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Unrecognized extension`}),_jsx(_components.td,{children:`A Token-2022 extension this audit does not judge yet`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Other`})}),_jsx(_components.td,{children:`critical`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`A scheduled fee change already written onchain counts at its future rate. Each Solana finding carries `,_jsx(_components.code,{children:`solanaFlag`}),` (the control, e.g. `,_jsx(_components.code,{children:`freeze_authority`}),`) and `,_jsx(_components.code,{children:`solanaHolder`}),` (the address holding it); `,_jsx(_components.code,{children:`code`}),` is empty.`]}),`\n`,_jsxs(_components.p,{children:[`When a live power is held by the known issuer of that token (a regulated stablecoin issuer on its own stablecoin, for example) or by a program whose code we reviewed and which bounds the power, the finding stays listed with `,_jsx(_components.code,{children:`mitigated: true`}),` and a `,_jsx(_components.code,{children:`gateReason`}),` naming the reviewed party, and it no longer counts against `,_jsx(_components.code,{children:`isSafe`}),`. That never applies to a state actively used against holders: a pause that is on, accounts born frozen, a prohibitive fee.`]}),`\n`,_jsx(Heading,{level:`3`,id:`what-is-not-checked`,children:`What is not checked`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No code review and no LLM.`}),` There is no code to read.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No market analysis.`}),` Holders, liquidity, volume, insiders and deployer history are not part of the verdict.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The onchain sell simulation and the LP-lock warning are not available on Solana yet.`}),` When they are, they will appear exactly as on EVM chains.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Pool and hook entries are EVM only.`}),` On Solana, `,_jsx(_components.code,{children:`address`}),` must be the mint.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`the-solanastate-object`,children:[`The `,_jsx(_components.code,{children:`solanaState`}),` object`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`solanaState`}),` is the snapshot the verdict was computed from (snake_case, like `,_jsx(_components.code,{children:`b20Flags`}),`), `,_jsx(_components.code,{children:`null`}),` on every other chain. Every power is an authority object `,_jsx(_components.code,{children:`{ address, kind }`}),` where `,_jsx(_components.code,{children:`kind`}),` is `,_jsx(_components.code,{children:`revoked`}),`, `,_jsx(_components.code,{children:`burned`}),`, `,_jsx(_components.code,{children:`multisig`}),` (with `,_jsx(_components.code,{children:`m`}),` of `,_jsx(_components.code,{children:`n`}),` signers, and `,_jsx(_components.code,{children:`keys`}),` when fewer distinct keys than `,_jsx(_components.code,{children:`m`}),` are enough), `,_jsx(_components.code,{children:`wallet`}),`, `,_jsx(_components.code,{children:`pda`}),` (a program-controlled address, with its `,_jsx(_components.code,{children:`owner`}),` program) or `,_jsx(_components.code,{children:`program`}),` (the address of a deployed program, whose deploy key may still sign). The main fields: `,_jsx(_components.code,{children:`program`}),` (`,_jsx(_components.code,{children:`spl-token`}),` or `,_jsx(_components.code,{children:`spl-token-2022`}),`), `,_jsx(_components.code,{children:`mint_authority`}),`, `,_jsx(_components.code,{children:`freeze_authority`}),`, `,_jsx(_components.code,{children:`permanent_delegate`}),`, `,_jsx(_components.code,{children:`transfer_fee`}),`, `,_jsx(_components.code,{children:`transfer_hook`}),`, `,_jsx(_components.code,{children:`pausable`}),`, `,_jsx(_components.code,{children:`default_account_state`}),`, `,_jsx(_components.code,{children:`non_transferable`}),`, `,_jsx(_components.code,{children:`scaled_ui_amount`}),`, `,_jsx(_components.code,{children:`metadata`}),`, and `,_jsx(_components.code,{children:`unix_ts`}),` / `,_jsx(_components.code,{children:`read_slot`}),` (when it was read). The full schema is below.`]}),`\n`,_jsx(Heading,{level:`3`,id:`not-a-token-mint`,children:`Not a token mint`}),`\n`,_jsxs(_components.p,{children:[`An address that is not a fungible token mint (a wallet, a pool, a token account, a program, an NFT) returns `,_jsx(_components.code,{children:`404 { \"audit\": null, \"reason\": \"not_a_token\", \"message\": \"...\" }`}),`, the same shape as the no-pool 404: branch on `,_jsx(_components.code,{children:`reason`}),`. Do not retry it: send the token’s mint address instead.`]}),`\n`,_jsx(Heading,{level:`3`,id:`push-updates`,children:`Push updates`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/sse-and-webhooks`,children:`Subscriptions`}),` work the same on Solana: subscribe with `,_jsx(_components.code,{children:`chain: \"SOLANA\"`}),` and the mint. Because the configuration is re-read on every refresh, a change such as an authority revoked, a fee raised or a pause switched on is pushed as an `,_jsx(_components.code,{children:`audit.changed`}),` event like any other verdict change.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Audit a Contract","description":"The single endpoint: send a contract, get a verdict.","openapi":"GET /audit-contract","href":"/api-reference/audit-contract"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Solana tokens","slug":"solana-tokens","depth":2,"children":[{"title":"What is checked","slug":"what-is-checked","depth":3,"children":[]},{"title":"What is not checked","slug":"what-is-not-checked","depth":3,"children":[]},{"title":"The solanaState object","slug":"the-solanastate-object","depth":3,"children":[]},{"title":"Not a token mint","slug":"not-a-token-mint","depth":3,"children":[]},{"title":"Push updates","slug":"push-updates","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"auditContract","summary":"Audit a contract","description":"The single endpoint: send a contract, get a verdict.","parameters":["87d3c38e-ffce-44c2-b0b3-323e29ebe55c","42c8204a-7d78-47f7-b4ad-ec349900194c","b00fddc7-1f41-442a-bcb6-1535c32764db","ff4972a0-4090-49da-8b96-3d6f6ba7c788","8cc51389-d7a7-4bcd-8732-7f78d1a934a6","6f60e62c-f4e3-4f40-8e12-dda107214172"],"responses":{"200":"34a90cd9-0357-42d7-abb0-2326b456fcca","400":"6fac2d6e-447f-4671-9204-10ad054ebc76","401":"8c37b4fa-f005-40ac-9992-d4f157c0c52d","402":"64f4e0a7-ba89-47ed-af37-9efc52db5d1f","404":"c7b729bf-f152-4987-9011-feae45226a99","429":"b118d511-3f81-4433-be6c-70f9026b53ad"},"method":"get","type":"path","servers":["2623a051-51c7-4bde-9d3b-923d7313001f"],"security":["ed654ffa-8836-48c6-8869-a4cad52c5929"],"path":"/audit-contract","baseUrlOptions":["https://www.serializedaudit.io/api"],"title":"Audit a contract","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"87d3c38e-ffce-44c2-b0b3-323e29ebe55c":{"name":"chain","in":"query","required":true,"description":"Chain the contract is deployed on, as a case-insensitive symbol. See Supported Chains. `SOLANA` (alias `SOL`) audits a Solana token by its mint address.","schema":{"type":"string","enum":["ROBINHOOD","BSC","BASE","ETH","AVAX","STABLE","ARC","ARB","HYPE","MONAD","PLASMA","POLYGON","MEGAETH","OP","LINEA","TEMPO","MANTLE","ABSTRACT","SONIC","BLAST","APE","XLAYER","INK","UNICHAIN","STORY","ELYSIUM","ZKEVM","SCROLL","ZKSYNC","SOLANA"],"isRequired":true,"description":"Chain the contract is deployed on, as a case-insensitive symbol. See Supported Chains. `SOLANA` (alias `SOL`) audits a Solana token by its mint address.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"base"},"42c8204a-7d78-47f7-b4ad-ec349900194c":{"name":"address","in":"query","required":true,"description":"The subject to audit: a token address, a liquidity pool (a Uniswap V2/V3 pair address or a Uniswap V4 pool id, 32 bytes), or a Uniswap V4 hook address. A pool resolves to its token: the response's `audit.address` is that resolved token and `audit.pool` describes the pool the hook verdict was computed against. A hook returns the hook's own audit: `audit.address` is the hook and `audit.hookContext` lists the pools and tokens that use it. `audit.entry` tells you how it was addressed. Cache your results by `audit.chain` + `audit.address`, not by the value you sent. On `chain=solana`: the token's base58 mint address, CASE-SENSITIVE (send it exactly as written; a lowercased mint is another account). Pool and hook entries are EVM only.","schema":{"type":"string","pattern":"^(?:0x(?:[a-fA-F0-9]{40}|[a-fA-F0-9]{64})|[1-9A-HJ-NP-Za-km-z]{32,44})$","isRequired":true,"description":"The subject to audit: a token address, a liquidity pool (a Uniswap V2/V3 pair address or a Uniswap V4 pool id, 32 bytes), or a Uniswap V4 hook address. A pool resolves to its token: the response's `audit.address` is that resolved token and `audit.pool` describes the pool the hook verdict was computed against. A hook returns the hook's own audit: `audit.address` is the hook and `audit.hookContext` lists the pools and tokens that use it. `audit.entry` tells you how it was addressed. Cache your results by `audit.chain` + `audit.address`, not by the value you sent. On `chain=solana`: the token's base58 mint address, CASE-SENSITIVE (send it exactly as written; a lowercased mint is another account). Pool and hook entries are EVM only.","uniqueKey":"","typeLabel":"string"},"example":"0x6D7401F6f1fB09ff24a048337ff44D890CdF86F8"},"b00fddc7-1f41-442a-bcb6-1535c32764db":{"name":"pool","in":"query","required":false,"description":"Optional, EVM only. Pin a specific pool for a token entry: `address` is the token, `pool` is the pool whose hook drives the verdict (a V2/V3 pair address or a V4 pool id). A mismatch (the pool does not trade the token) is a 400. Not used on `chain=solana` (it answers 404 `pool_not_found`): send the mint alone.","schema":{"type":"string","pattern":"^0x(?:[a-fA-F0-9]{40}|[a-fA-F0-9]{64})$","isRequired":false,"description":"Optional, EVM only. Pin a specific pool for a token entry: `address` is the token, `pool` is the pool whose hook drives the verdict (a V2/V3 pair address or a V4 pool id). A mismatch (the pool does not trade the token) is a 400. Not used on `chain=solana` (it answers 404 `pool_not_found`): send the mint alone.","uniqueKey":"","typeLabel":"string"}},"ff4972a0-4090-49da-8b96-3d6f6ba7c788":{"name":"allow_decompile","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"true","isRequired":false,"description":"Closed-source contracts are audited on decompiled bytecode (the most expensive tier). Set false to opt out: closed-source contracts then answer `{ \"audit\": null, \"reason\": \"decompile_disabled\" }` instead of being decompiled, and cached decompiled verdicts are not served. Sent as the string \"true\"/\"false\" in the query.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"description":"Closed-source contracts are audited on decompiled bytecode (the most expensive tier). Set false to opt out: closed-source contracts then answer `{ \"audit\": null, \"reason\": \"decompile_disabled\" }` instead of being decompiled, and cached decompiled verdicts are not served. Sent as the string \"true\"/\"false\" in the query."},"8cc51389-d7a7-4bcd-8732-7f78d1a934a6":{"name":"async","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false","isRequired":false,"description":"Async mode. `false` (default): the request holds until the audit is done, classic synchronous behavior. `true`: if no cached audit exists, the audit is started in the background and the response is `{ status }`; poll the SAME URL every 1-2s until it flips to `{ audit }` (typically 10-30s for a first-time audit). There is no job id: an audit is idempotent per (chain, address), so the token address is the job handle. Billing is identical in both modes; progress responses are never billed. With `subscribe=true` you do not even poll: the finished verdict is pushed to you (over your SSE stream or webhook) the moment it lands (see SSE \u0026 Webhooks).","uniqueKey":"","typeLabel":"enum\u003cstring>"},"description":"Async mode. `false` (default): the request holds until the audit is done, classic synchronous behavior. `true`: if no cached audit exists, the audit is started in the background and the response is `{ status }`; poll the SAME URL every 1-2s until it flips to `{ audit }` (typically 10-30s for a first-time audit). There is no job id: an audit is idempotent per (chain, address), so the token address is the job handle. Billing is identical in both modes; progress responses are never billed. With `subscribe=true` you do not even poll: the finished verdict is pushed to you (over your SSE stream or webhook) the moment it lands (see SSE \u0026 Webhooks)."},"6f60e62c-f4e3-4f40-8e12-dda107214172":{"name":"subscribe","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false","isRequired":false,"description":"Subscribe this (chain, address) to push updates as part of this call. Once subscribed, any later verdict change (safe↔unsafe flip, owner change, a gate or honeypot flipping, or a closed-source token re-audited on its now-verified source) is pushed to you over a live SSE stream or a webhook, instead of you polling. Combined with `async=true`, the finished audit result is itself pushed when ready, so you fire the call and just consume the events. Subscribing works with or without a delivery transport configured; with neither, pull the changes from `GET /api/events` (see SSE \u0026 Webhooks). Charges the one-time subscribe fee for a genuinely-new token; idempotent for an already-subscribed one.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"description":"Subscribe this (chain, address) to push updates as part of this call. Once subscribed, any later verdict change (safe↔unsafe flip, owner change, a gate or honeypot flipping, or a closed-source token re-audited on its now-verified source) is pushed to you over a live SSE stream or a webhook, instead of you polling. Combined with `async=true`, the finished audit result is itself pushed when ready, so you fire the call and just consume the events. Subscribing works with or without a delivery transport configured; with neither, pull the changes from `GET /api/events` (see SSE \u0026 Webhooks). Charges the one-time subscribe fee for a genuinely-new token; idempotent for an already-subscribed one."}},"responses":{"34a90cd9-0357-42d7-abb0-2326b456fcca":{"description":"The audit verdict, wrapped in an `audit` object.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"The response shape.","required":["audit"],"properties":{"audit":{"type":"object","required":["isSafe","description","address","chain","vulnerabilities"],"description":"The audit result.","properties":{"isSafe":{"type":"boolean","description":"The overall verdict, your decision boundary. true means no holder-harming risk was active at audit time. Combines the token verdict and, if present, the hook verdict of the requested pool.","isRequired":true,"uniqueKey":"oneOf.0.audit.isSafe","typeLabel":"boolean"},"description":{"type":"string","description":"A short, human-readable explanation of the verdict, safe to show in a UI.","isRequired":true,"uniqueKey":"oneOf.0.audit.description","typeLabel":"string"},"vulnerabilities":{"type":"array","description":"The detected risks. Empty when the contract is safe.","items":{"type":"object","required":["type","impact","description"],"properties":{"type":{"type":"string","description":"Risk category. See Risk Categories for the full list. Treat as an open set and handle unknown values gracefully. `TradeSimulation` is the one category that comes from a live onchain sell simulation rather than the code: it is added when the token cannot be sold right now and removed when it can, and `isSafe` already reflects it.","examples":["UnlimitedMinting","HiddenFees","LiquidityDrain","TradeSimulation"],"isRequired":true,"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].type","typeLabel":"string"},"impact":{"type":"string","enum":["critical","warning","info"],"description":"How severely this risk affects a holder.","isRequired":true,"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].description","typeLabel":"string"},"label":{"type":"string","description":"Display-ready title for this risk, derived from `type` and `impact` at response time: a `warning` or `info` risk gets a calmer title than its category name (an `info` `LiquidityDrain` is labelled `Liquidity`, a `warning` `HiddenFees` is `Fee Controls`). Show this; keep branching on `type`. Full table under Risk Categories.","examples":["Liquidity Drain","Fee Controls","Liquidity"],"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].codes.items.[INDEX]","typeLabel":"string"},"description":"All relevant snippets when several functions share this risk. `code` is the first of them. Present only when more than one applies.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].codes","typeLabel":"string[]"},"mitigated":{"oneOf":[{"type":"boolean","description":"Whether this specific risk is currently neutralized (e.g. the controlling owner has renounced). null when not applicable.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].mitigated.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this specific risk is currently neutralized (e.g. the controlling owner has renounced). null when not applicable.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].mitigated","typeLabel":"boolean | null"},"gateReason":{"oneOf":[{"type":"string","description":"Human-readable explanation of the current state, e.g. \"Owner renounced\" or \"MINTER_ROLE has 2 active holders\". Display-ready.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].gateReason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable explanation of the current state, e.g. \"Owner renounced\" or \"MINTER_ROLE has 2 active holders\". Display-ready.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].gateReason","typeLabel":"string | null"},"solanaFlag":{"type":"string","description":"Solana findings only: the mint control this finding is about. Values today: freeze_authority, default_frozen, default_frozen_permanent, permanent_delegate, transfer_hook, transfer_hook_dormant, paused, pausable, non_transferable, transfer_fee_prohibitive, transfer_fee_mutable, transfer_fee_high, transfer_fee, mint_authority, scaled_ui_amount, interest_bearing, metadata_mutable, unknown_extension. Treat as an open set. Absent on EVM findings.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFlag","typeLabel":"string"},"solanaHolder":{"oneOf":[{"type":"string","description":"Solana findings only: the address holding that control (base58), or null when the finding is a state rather than a power (a fixed fee, a non-transferable mint).","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaHolder.oneOf.0","typeLabel":"string"},{"type":"null","description":"Solana findings only: the address holding that control (base58), or null when the finding is a state rather than a power (a fixed fee, a non-transferable mint).","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaHolder","typeLabel":"string | null"},"solanaFee":{"type":"object","description":"Solana transfer-fee findings only (transfer_fee, transfer_fee_high, transfer_fee_mutable, transfer_fee_prohibitive): the fee the mint is configured to charge, in raw Token-2022 values. A change of these values is pushed as a changed finding (fields contains solanaFee), even when the verdict does not move.","properties":{"bps":{"type":"integer","description":"Fee applying now, in basis points (100 = 1 %).","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.bps","typeLabel":"integer"},"maxFee":{"type":"string","description":"Per-transfer cap applying now, in raw base units (u64 as a string).","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.maxFee","typeLabel":"string"},"scheduledBps":{"oneOf":[{"type":"integer","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledBps.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX].solanaFee","typeLabel":"object"}},"uniqueKey":"oneOf.0.audit.vulnerabilities.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.audit.vulnerabilities","typeLabel":"object[]"},"address":{"type":"string","description":"The audited contract address (echoed back).","isRequired":true,"uniqueKey":"oneOf.0.audit.address","typeLabel":"string"},"chain":{"type":"string","description":"The chain symbol (echoed back).","isRequired":true,"uniqueKey":"oneOf.0.audit.chain","typeLabel":"string"},"entry":{"type":"string","enum":["token","pool","hook"],"description":"How the request addressed the audit. 'pool' and 'hook' mean `address` is the RESOLVED token (for a hook entry, the hook itself), not the value you sent. Absent on a plain token request.","uniqueKey":"oneOf.0.audit.entry","typeLabel":"enum\u003cstring>"},"pool":{"oneOf":[{"type":"object","description":"The pool this verdict is about: the requested pool on a pool entry, the primary pool on a token entry. Absent on a plain token request.","properties":{"id":{"type":"string","description":"The pool: a V2/V3 pair address or a V4 pool id.","uniqueKey":"oneOf.0.audit.pool.oneOf.0.id","typeLabel":"string"},"type":{"type":"string","enum":["v2","v3","v4","other"],"uniqueKey":"oneOf.0.audit.pool.oneOf.0.type","typeLabel":"enum\u003cstring>"},"dexLabel":{"oneOf":[{"type":"string","description":"The DEX/venue label.","uniqueKey":"oneOf.0.audit.pool.oneOf.0.dexLabel.oneOf.0","typeLabel":"string"},{"type":"null","description":"The DEX/venue label.","uniqueKey":"oneOf.0.audit.pool.oneOf.0.dexLabel.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.pool.oneOf.0.dexLabel","typeLabel":"string | null"},"hookAddress":{"oneOf":[{"type":"string","uniqueKey":"oneOf.0.audit.pool.oneOf.0.hookAddress.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"oneOf.0.audit.pool.oneOf.0.hookAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.pool.oneOf.0.hookAddress","typeLabel":"string | null"},"isPrimary":{"type":"boolean","description":"false when this is not the token's largest pool; primaryPoolId then names the primary one.","uniqueKey":"oneOf.0.audit.pool.oneOf.0.isPrimary","typeLabel":"boolean"},"primaryPoolId":{"oneOf":[{"type":"string","uniqueKey":"oneOf.0.audit.pool.oneOf.0.primaryPoolId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"oneOf.0.audit.pool.oneOf.0.primaryPoolId.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.pool.oneOf.0.primaryPoolId","typeLabel":"string | null"},"primaryPoolLiquidity":{"oneOf":[{"type":"number","uniqueKey":"oneOf.0.audit.pool.oneOf.0.primaryPoolLiquidity.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"oneOf.0.audit.pool.oneOf.0.primaryPoolLiquidity.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.pool.oneOf.0.primaryPoolLiquidity","typeLabel":"number | null"},"liquidity":{"oneOf":[{"type":"number","uniqueKey":"oneOf.0.audit.pool.oneOf.0.liquidity.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"oneOf.0.audit.pool.oneOf.0.liquidity.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.pool.oneOf.0.liquidity","typeLabel":"number | null"},"quoteSymbol":{"oneOf":[{"type":"string","uniqueKey":"oneOf.0.audit.pool.oneOf.0.quoteSymbol.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"oneOf.0.audit.pool.oneOf.0.quoteSymbol.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.pool.oneOf.0.quoteSymbol","typeLabel":"string | null"}},"uniqueKey":"oneOf.0.audit.pool.oneOf.0","typeLabel":"object"},{"type":"null","description":"The pool this verdict is about: the requested pool on a pool entry, the primary pool on a token entry. Absent on a plain token request.","properties":{"id":{"type":"string","description":"The pool: a V2/V3 pair address or a V4 pool id."},"type":{"type":"string","enum":["v2","v3","v4","other"]},"dexLabel":{"oneOf":[{"type":"string","description":"The DEX/venue label."},{"type":"null","description":"The DEX/venue label."}]},"hookAddress":{"oneOf":[{"type":"string"},{"type":"null"}]},"isPrimary":{"type":"boolean","description":"false when this is not the token's largest pool; primaryPoolId then names the primary one."},"primaryPoolId":{"oneOf":[{"type":"string"},{"type":"null"}]},"primaryPoolLiquidity":{"oneOf":[{"type":"number"},{"type":"null"}]},"liquidity":{"oneOf":[{"type":"number"},{"type":"null"}]},"quoteSymbol":{"oneOf":[{"type":"string"},{"type":"null"}]}},"uniqueKey":"oneOf.0.audit.pool.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.pool","typeLabel":"object | null"},"isTokenSafe":{"type":"boolean","description":"Verdict for the token contract itself, ignoring any associated pool hook.","uniqueKey":"oneOf.0.audit.isTokenSafe","typeLabel":"boolean"},"isHookSafe":{"oneOf":[{"type":"boolean","description":"Verdict for the associated Uniswap v4 pool hook, or null when the token has no hook.","uniqueKey":"oneOf.0.audit.isHookSafe.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Verdict for the associated Uniswap v4 pool hook, or null when the token has no hook.","uniqueKey":"oneOf.0.audit.isHookSafe.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.isHookSafe","typeLabel":"boolean | null"},"name":{"oneOf":[{"type":"string","description":"Token name, when available.","uniqueKey":"oneOf.0.audit.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Token name, when available.","uniqueKey":"oneOf.0.audit.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.name","typeLabel":"string | null"},"symbol":{"oneOf":[{"type":"string","description":"Token symbol, when available.","uniqueKey":"oneOf.0.audit.symbol.oneOf.0","typeLabel":"string"},{"type":"null","description":"Token symbol, when available.","uniqueKey":"oneOf.0.audit.symbol.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.symbol","typeLabel":"string | null"},"sourceType":{"type":"string","enum":["verified","decompiled","b20","solana","none"],"description":"How the analyzed code was obtained: verified (published source), decompiled (reconstructed from bytecode), b20 (a Base native B20 token with no bytecode; the verdict is read deterministically from on-chain flags), solana (a Solana token: no code, the verdict is read deterministically from the mint's live configuration, see solanaState), or none. `none` with a SAFE verdict means the token was deployed by a launchpad factory we track (launchpadName is set, isWhitelistedLaunchpad is true): the factory deploys a fixed, reviewed template, so each clone's code is not re-analyzed; the onchain checks still run per token.","uniqueKey":"oneOf.0.audit.sourceType","typeLabel":"enum\u003cstring>"},"isProxy":{"oneOf":[{"type":"boolean","description":"Whether the contract is a proxy. When true, the verdict already reflects its implementation. Null on Solana (a mint has no contract code).","uniqueKey":"oneOf.0.audit.isProxy.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether the contract is a proxy. When true, the verdict already reflects its implementation. Null on Solana (a mint has no contract code).","uniqueKey":"oneOf.0.audit.isProxy.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.isProxy","typeLabel":"boolean | null"},"implementationAddress":{"oneOf":[{"type":"string","description":"For a proxy, the implementation contract that was audited; null otherwise.","uniqueKey":"oneOf.0.audit.implementationAddress.oneOf.0","typeLabel":"string"},{"type":"null","description":"For a proxy, the implementation contract that was audited; null otherwise.","uniqueKey":"oneOf.0.audit.implementationAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.implementationAddress","typeLabel":"string | null"},"hookAddress":{"oneOf":[{"type":"string","description":"Address of the associated Uniswap v4 pool hook, when present.","uniqueKey":"oneOf.0.audit.hookAddress.oneOf.0","typeLabel":"string"},{"type":"null","description":"Address of the associated Uniswap v4 pool hook, when present.","uniqueKey":"oneOf.0.audit.hookAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAddress","typeLabel":"string | null"},"hookAudit":{"oneOf":[{"type":"object","description":"The audit of the associated pool hook, or null when there is no hook.","properties":{"isSafe":{"oneOf":[{"type":"boolean","description":"Verdict for the hook.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.isSafe.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Verdict for the hook.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.isSafe.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.isSafe","typeLabel":"boolean | null"},"description":{"oneOf":[{"type":"string","description":"Human-readable summary of the hook verdict.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable summary of the hook verdict.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.description","typeLabel":"string | null"},"vulnerabilities":{"type":"array","items":{"type":"object","required":["type","impact","description"],"properties":{"type":{"type":"string","description":"Risk category. See Risk Categories for the full list. Treat as an open set and handle unknown values gracefully. `TradeSimulation` is the one category that comes from a live onchain sell simulation rather than the code: it is added when the token cannot be sold right now and removed when it can, and `isSafe` already reflects it.","examples":["UnlimitedMinting","HiddenFees","LiquidityDrain","TradeSimulation"],"isRequired":true,"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].type","typeLabel":"string"},"impact":{"type":"string","enum":["critical","warning","info"],"description":"How severely this risk affects a holder.","isRequired":true,"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].description","typeLabel":"string"},"label":{"type":"string","description":"Display-ready title for this risk, derived from `type` and `impact` at response time: a `warning` or `info` risk gets a calmer title than its category name (an `info` `LiquidityDrain` is labelled `Liquidity`, a `warning` `HiddenFees` is `Fee Controls`). Show this; keep branching on `type`. Full table under Risk Categories.","examples":["Liquidity Drain","Fee Controls","Liquidity"],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].codes.items.[INDEX]","typeLabel":"string"},"description":"All relevant snippets when several functions share this risk. `code` is the first of them. Present only when more than one applies.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].codes","typeLabel":"string[]"},"mitigated":{"oneOf":[{"type":"boolean","description":"Whether this specific risk is currently neutralized (e.g. the controlling owner has renounced). null when not applicable.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].mitigated.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this specific risk is currently neutralized (e.g. the controlling owner has renounced). null when not applicable.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].mitigated","typeLabel":"boolean | null"},"gateReason":{"oneOf":[{"type":"string","description":"Human-readable explanation of the current state, e.g. \"Owner renounced\" or \"MINTER_ROLE has 2 active holders\". Display-ready.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].gateReason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable explanation of the current state, e.g. \"Owner renounced\" or \"MINTER_ROLE has 2 active holders\". Display-ready.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].gateReason","typeLabel":"string | null"},"solanaFlag":{"type":"string","description":"Solana findings only: the mint control this finding is about. Values today: freeze_authority, default_frozen, default_frozen_permanent, permanent_delegate, transfer_hook, transfer_hook_dormant, paused, pausable, non_transferable, transfer_fee_prohibitive, transfer_fee_mutable, transfer_fee_high, transfer_fee, mint_authority, scaled_ui_amount, interest_bearing, metadata_mutable, unknown_extension. Treat as an open set. Absent on EVM findings.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFlag","typeLabel":"string"},"solanaHolder":{"oneOf":[{"type":"string","description":"Solana findings only: the address holding that control (base58), or null when the finding is a state rather than a power (a fixed fee, a non-transferable mint).","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaHolder.oneOf.0","typeLabel":"string"},{"type":"null","description":"Solana findings only: the address holding that control (base58), or null when the finding is a state rather than a power (a fixed fee, a non-transferable mint).","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaHolder","typeLabel":"string | null"},"solanaFee":{"type":"object","description":"Solana transfer-fee findings only (transfer_fee, transfer_fee_high, transfer_fee_mutable, transfer_fee_prohibitive): the fee the mint is configured to charge, in raw Token-2022 values. A change of these values is pushed as a changed finding (fields contains solanaFee), even when the verdict does not move.","properties":{"bps":{"type":"integer","description":"Fee applying now, in basis points (100 = 1 %).","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.bps","typeLabel":"integer"},"maxFee":{"type":"string","description":"Per-transfer cap applying now, in raw base units (u64 as a string).","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.maxFee","typeLabel":"string"},"scheduledBps":{"oneOf":[{"type":"integer","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledBps.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee","typeLabel":"object"}},"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities.items.[INDEX]","typeLabel":"object"},"description":"Risks detected in the hook.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.vulnerabilities","typeLabel":"object[]"},"address":{"oneOf":[{"type":"string","description":"The hook contract address.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.address.oneOf.0","typeLabel":"string"},{"type":"null","description":"The hook contract address.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.address.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.address","typeLabel":"string | null"},"isDecompiled":{"type":"boolean","description":"Whether the hook verdict came from decompiled bytecode (no verified source).","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0.isDecompiled","typeLabel":"boolean"}},"uniqueKey":"oneOf.0.audit.hookAudit.oneOf.0","typeLabel":"object"},{"type":"null","description":"The audit of the associated pool hook, or null when there is no hook.","uniqueKey":"oneOf.0.audit.hookAudit.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.hookAudit","typeLabel":"object | null"},"createdAt":{"type":"string","format":"date-time","description":"ISO timestamp of when this audit was produced.","uniqueKey":"oneOf.0.audit.createdAt","typeLabel":"string\u003cdate-time>"},"auditSystemVersion":{"type":"string","description":"The version of the audit system that produced this result. Useful to gate on newly added fields.","uniqueKey":"oneOf.0.audit.auditSystemVersion","typeLabel":"string"},"latestAuditSystemVersion":{"type":"string","description":"The latest audit system version. If it differs from auditSystemVersion, the result refreshes to the latest on the next visit.","uniqueKey":"oneOf.0.audit.latestAuditSystemVersion","typeLabel":"string"},"b20Flags":{"oneOf":[{"type":"object","description":"Live on-chain flag snapshot for a Base-native B20 token. null on every other sourceType.","properties":{"is_b20":{"type":"boolean","description":"Always true on a B20 row.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.is_b20","typeLabel":"boolean"},"initialized":{"type":"boolean","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.initialized","typeLabel":"boolean"},"variant":{"oneOf":[{"type":"string","enum":["asset","stablecoin",null],"description":"B20 variant, or null if unknown.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.variant.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["asset","stablecoin",null],"description":"B20 variant, or null if unknown.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.variant.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.variant","typeLabel":"enum\u003cstring> | null"},"paused_features":{"type":"array","items":{"type":"integer","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.paused_features.items.[INDEX]","typeLabel":"integer"},"description":"PausableFeature enum values currently paused: 0=TRANSFER, 1=MINT, 2=BURN.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.paused_features","typeLabel":"integer[]"},"policy_sender":{"type":"string","description":"Transfer-policy id (uint64 decimal string). '0' = ALWAYS_ALLOW (open).","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.policy_sender","typeLabel":"string"},"policy_receiver":{"type":"string","description":"As policy_sender, receiver scope.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.policy_receiver","typeLabel":"string"},"policy_executor":{"type":"string","description":"As policy_sender, executor scope.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.policy_executor","typeLabel":"string"},"policy_mint":{"type":"string","description":"As policy_sender, mint scope.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.policy_mint","typeLabel":"string"},"multiplier":{"oneOf":[{"type":"string","description":"Rebase multiplier (asset variant), WAD decimal string; 1e18 = neutral. null when absent/unreadable.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.multiplier.oneOf.0","typeLabel":"string"},{"type":"null","description":"Rebase multiplier (asset variant), WAD decimal string; 1e18 = neutral. null when absent/unreadable.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.multiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.multiplier","typeLabel":"string | null"},"supply_cap":{"oneOf":[{"type":"string","description":"uint256 decimal string; type(uint128).max = uncapped. Informational.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.supply_cap.oneOf.0","typeLabel":"string"},{"type":"null","description":"uint256 decimal string; type(uint128).max = uncapped. Informational.","uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.supply_cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0.supply_cap","typeLabel":"string | null"}},"uniqueKey":"oneOf.0.audit.b20Flags.oneOf.0","typeLabel":"object"},{"type":"null","description":"Live on-chain flag snapshot for a Base-native B20 token. null on every other sourceType.","properties":{"is_b20":{"type":"boolean","description":"Always true on a B20 row."},"initialized":{"type":"boolean"},"variant":{"oneOf":[{"type":"string","enum":["asset","stablecoin",null],"description":"B20 variant, or null if unknown."},{"type":"null","enum":["asset","stablecoin",null],"description":"B20 variant, or null if unknown."}]},"paused_features":{"type":"array","items":{"type":"integer"},"description":"PausableFeature enum values currently paused: 0=TRANSFER, 1=MINT, 2=BURN."},"policy_sender":{"type":"string","description":"Transfer-policy id (uint64 decimal string). '0' = ALWAYS_ALLOW (open)."},"policy_receiver":{"type":"string","description":"As policy_sender, receiver scope."},"policy_executor":{"type":"string","description":"As policy_sender, executor scope."},"policy_mint":{"type":"string","description":"As policy_sender, mint scope."},"multiplier":{"oneOf":[{"type":"string","description":"Rebase multiplier (asset variant), WAD decimal string; 1e18 = neutral. null when absent/unreadable."},{"type":"null","description":"Rebase multiplier (asset variant), WAD decimal string; 1e18 = neutral. null when absent/unreadable."}]},"supply_cap":{"oneOf":[{"type":"string","description":"uint256 decimal string; type(uint128).max = uncapped. Informational."},{"type":"null","description":"uint256 decimal string; type(uint128).max = uncapped. Informational."}]}},"uniqueKey":"oneOf.0.audit.b20Flags.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.b20Flags","typeLabel":"object | null"},"solanaState":{"oneOf":[{"type":"object","description":"Live snapshot of a Solana token's mint configuration, the input of its verdict, re-read onchain on every refresh. null on every other chain.","properties":{"program":{"type":"string","enum":["spl-token","spl-token-2022"],"description":"The token program owning the mint: SPL Token, or Token-2022 (which adds extensions).","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.program","typeLabel":"enum\u003cstring>"},"decimals":{"type":"integer","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.decimals","typeLabel":"integer"},"supply":{"type":"string","description":"Raw supply, decimal string.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.supply","typeLabel":"string"},"mint_authority":{"type":"object","required":["address","kind"],"description":"Can create new tokens.","properties":{"address":{"oneOf":[{"type":"string","description":"The holder (base58), or null when the power is revoked.","isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.address.oneOf.0","typeLabel":"string"},{"type":"null","description":"The holder (base58), or null when the power is revoked.","isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.address.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.address","typeLabel":"string | null"},"kind":{"type":"string","enum":["revoked","burned","multisig","wallet","pda","program"],"description":"revoked: the power is gone for good. burned: a burn, system or builtin address that can never sign. multisig: an SPL multisig (m of n; `keys` = the fewest distinct keys that meet it, when fewer than m). wallet: a key someone holds. pda: a program-derived address, only its program can sign. program: the address of a deployed program, whose deploy key may still sign.","isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.kind","typeLabel":"enum\u003cstring>"},"owner":{"oneOf":[{"type":"string","description":"The program owning the holder's account, when known: for a pda or a multisig, the program it belongs to; for a program holder, its loader; for a burned builtin, the native loader.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.owner.oneOf.0","typeLabel":"string"},{"type":"null","description":"The program owning the holder's account, when known: for a pda or a multisig, the program it belongs to; for a program holder, its loader; for a burned builtin, the native loader.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.owner.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.owner","typeLabel":"string | null"},"m":{"type":"integer","description":"Multisig: signatures required.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.m","typeLabel":"integer"},"n":{"type":"integer","description":"Multisig: signers.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.n","typeLabel":"integer"},"keys":{"type":"integer","description":"Multisig only: the fewest distinct keys that meet the threshold m, when fewer than m (a key listed several times fills several signer slots).","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority.keys","typeLabel":"integer"}},"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_authority","typeLabel":"object"},"freeze_authority":{"type":"object","required":["address","kind"],"description":"Can freeze any holder's token account.","properties":{"address":{"oneOf":[{"type":"string","description":"The holder (base58), or null when the power is revoked.","isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.address.oneOf.0","typeLabel":"string"},{"type":"null","description":"The holder (base58), or null when the power is revoked.","isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.address.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.address","typeLabel":"string | null"},"kind":{"type":"string","enum":["revoked","burned","multisig","wallet","pda","program"],"description":"revoked: the power is gone for good. burned: a burn, system or builtin address that can never sign. multisig: an SPL multisig (m of n; `keys` = the fewest distinct keys that meet it, when fewer than m). wallet: a key someone holds. pda: a program-derived address, only its program can sign. program: the address of a deployed program, whose deploy key may still sign.","isRequired":true,"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.kind","typeLabel":"enum\u003cstring>"},"owner":{"oneOf":[{"type":"string","description":"The program owning the holder's account, when known: for a pda or a multisig, the program it belongs to; for a program holder, its loader; for a burned builtin, the native loader.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.owner.oneOf.0","typeLabel":"string"},{"type":"null","description":"The program owning the holder's account, when known: for a pda or a multisig, the program it belongs to; for a program holder, its loader; for a burned builtin, the native loader.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.owner.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.owner","typeLabel":"string | null"},"m":{"type":"integer","description":"Multisig: signatures required.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.m","typeLabel":"integer"},"n":{"type":"integer","description":"Multisig: signers.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.n","typeLabel":"integer"},"keys":{"type":"integer","description":"Multisig only: the fewest distinct keys that meet the threshold m, when fewer than m (a key listed several times fills several signer slots).","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority.keys","typeLabel":"integer"}},"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.freeze_authority","typeLabel":"object"},"permanent_delegate":{"oneOf":[{"type":"object","description":"Token-2022 permanent delegate (a SolanaAuthority): can move or burn any holder's tokens. null when the extension is absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.permanent_delegate.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022 permanent delegate (a SolanaAuthority): can move or burn any holder's tokens. null when the extension is absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.permanent_delegate.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.permanent_delegate","typeLabel":"object | null"},"transfer_fee":{"oneOf":[{"type":"object","description":"Token-2022 transfer fee: older_bps / older_max / older_epoch (the fee before newer_epoch), newer_bps / newer_max / newer_epoch (the fee from that epoch on), config_authority (can change it), withdraw_authority. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.transfer_fee.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022 transfer fee: older_bps / older_max / older_epoch (the fee before newer_epoch), newer_bps / newer_max / newer_epoch (the fee from that epoch on), config_authority (can change it), withdraw_authority. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.transfer_fee.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.transfer_fee","typeLabel":"object | null"},"transfer_hook":{"oneOf":[{"type":"object","description":"Token-2022 transfer hook: program_id (null = none set today), authority (can set or swap it), program (the hook program's loader, upgrade_authority and deploy_slot). null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.transfer_hook.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022 transfer hook: program_id (null = none set today), authority (can set or swap it), program (the hook program's loader, upgrade_authority and deploy_slot). null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.transfer_hook.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.transfer_hook","typeLabel":"object | null"},"pausable":{"oneOf":[{"type":"object","description":"Token-2022 pause: paused (boolean) and authority. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.pausable.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022 pause: paused (boolean) and authority. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.pausable.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.pausable","typeLabel":"object | null"},"default_account_state":{"oneOf":[{"type":"string","enum":["initialized","frozen",null],"description":"Token-2022: the state new token accounts start in. frozen = every new holder needs the freeze authority to move tokens. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.default_account_state.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["initialized","frozen",null],"description":"Token-2022: the state new token accounts start in. frozen = every new holder needs the freeze authority to move tokens. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.default_account_state.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.default_account_state","typeLabel":"enum\u003cstring> | null"},"non_transferable":{"type":"boolean","description":"Token-2022: the token can never be transferred.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.non_transferable","typeLabel":"boolean"},"scaled_ui_amount":{"oneOf":[{"type":"object","description":"Token-2022 display scaling: multiplier, new_multiplier, new_multiplier_effective_ts (unix seconds), authority. Changes the displayed amount only.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.scaled_ui_amount.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022 display scaling: multiplier, new_multiplier, new_multiplier_effective_ts (unix seconds), authority. Changes the displayed amount only.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.scaled_ui_amount.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.scaled_ui_amount","typeLabel":"object | null"},"interest_bearing":{"oneOf":[{"type":"object","description":"Token-2022 display interest: rate_bps and authority. Changes the displayed amount only.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.interest_bearing.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022 display interest: rate_bps and authority. Changes the displayed amount only.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.interest_bearing.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.interest_bearing","typeLabel":"object | null"},"mint_close_authority":{"oneOf":[{"type":"object","description":"Token-2022: can close the mint once its supply is zero. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_close_authority.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022: can close the mint once its supply is zero. null when absent.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_close_authority.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.mint_close_authority","typeLabel":"object | null"},"metadata":{"type":"object","description":"Where the name and symbol were read (source: token2022, metaplex, or unread), update_authority, mutable, name, symbol.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.metadata","typeLabel":"object"},"extensions":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.extensions.items.[INDEX]","typeLabel":"string"},"description":"Raw Token-2022 extension names on the mint, in chain order.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.extensions","typeLabel":"string[]"},"unknown_extensions":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.unknown_extensions.items.[INDEX]","typeLabel":"string"},"description":"Extensions this audit does not judge yet. Each one is a critical finding.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.unknown_extensions","typeLabel":"string[]"},"confidential_transfer":{"type":"boolean","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.confidential_transfer","typeLabel":"boolean"},"confidential_mint_burn":{"type":"boolean","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.confidential_mint_burn","typeLabel":"boolean"},"read_slot":{"type":"integer","description":"Slot of the read.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.read_slot","typeLabel":"integer"},"epoch":{"type":"integer","description":"Epoch of the read (a scheduled fee change takes effect at an epoch).","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.epoch","typeLabel":"integer"},"epoch_start_ts":{"type":"integer","description":"Unix seconds at which that epoch started.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.epoch_start_ts","typeLabel":"integer"},"unix_ts":{"type":"integer","description":"Cluster time of the read, unix seconds.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.0.unix_ts","typeLabel":"integer"}},"uniqueKey":"oneOf.0.audit.solanaState.oneOf.0","typeLabel":"object"},{"type":"null","description":"Live snapshot of a Solana token's mint configuration, the input of its verdict, re-read onchain on every refresh. null on every other chain.","uniqueKey":"oneOf.0.audit.solanaState.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.audit.solanaState","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"oneOf.0.audit","typeLabel":"object"},"billing":{"type":"object","description":"Echo of what this call was billed, present only for authenticated API-key callers (never for anonymous/browser traffic). `type` is the bill category (e.g. cached, fresh_no_decompile, fresh_with_decompile, refresh) or null when the call is free; `credits` is the amount metered.","properties":{"type":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.billing.type.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.billing.type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.billing.type","typeLabel":"string | null"},"credits":{"type":"number","isRequired":true,"uniqueKey":"oneOf.0.billing.credits","typeLabel":"number"}},"required":["type","credits"],"uniqueKey":"oneOf.0.billing","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"HTTP 200 miss body (non-billed). Returned when allow_decompile=false and the only path to a verdict would be decompilation (reason decompile_disabled): no verdict is produced. Retry with allow_decompile=true (the default) to get a full audit.","required":["audit","reason","message"],"properties":{"audit":{"type":"null","description":"Always null; no verdict is served for this miss.","isRequired":true,"uniqueKey":"oneOf.1.audit","typeLabel":"null"},"reason":{"type":"string","enum":["decompile_disabled"],"description":"Machine-readable reason for the miss.","isRequired":true,"uniqueKey":"oneOf.1.reason","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"oneOf.1.message","typeLabel":"string"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","description":"Only with `async=true`: the audit is still running. Poll the same URL until the response carries `audit`. Steps may be skipped (e.g. verified-source contracts never decompile) and there is no terminal status; completion IS the next poll returning `{ audit }`.","required":["status"],"properties":{"status":{"type":"string","enum":["FETCHING","DECOMPILING","ANALYZING"],"description":"Current pipeline step: FETCHING (source code / on-chain metadata), DECOMPILING (closed-source contracts only), ANALYZING (LLM audit in progress).","isRequired":true,"uniqueKey":"oneOf.2.status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"safe":{"title":"safe","value":{"audit":{"isSafe":true,"isTokenSafe":true,"isHookSafe":null,"description":"Standard ERC-20 token. No owner privileges that can harm holders were detected.","vulnerabilities":[],"name":"Example Token","symbol":"EXMPL","address":"0x6D7401F6f1fB09ff24a048337ff44D890CdF86F8","chain":"BASE","sourceType":"verified","isProxy":false,"implementationAddress":null,"hookAddress":null,"hookAudit":null,"createdAt":"2026-06-22T10:00:00.000Z","auditSystemVersion":"prod-v2.10","latestAuditSystemVersion":"prod-v2.10"}}},"unsafe":{"title":"unsafe","value":{"audit":{"isSafe":false,"isTokenSafe":false,"isHookSafe":null,"description":"The owner can mint unlimited supply after deployment, diluting holders at will.","vulnerabilities":[{"type":"UnlimitedMinting","impact":"critical","description":"The owner can mint new tokens without limit.","code":"function mint(address to, uint256 amount) external onlyOwner { _mint(to, amount); }","mitigated":false,"gateReason":"Owner is an active externally-owned account"}],"name":"Risky Token","symbol":"RISK","address":"0x1111111111111111111111111111111111111111","chain":"BASE","sourceType":"verified","isProxy":false,"implementationAddress":null,"hookAddress":null,"hookAudit":null,"createdAt":"2026-06-22T10:00:00.000Z","auditSystemVersion":"prod-v2.10","latestAuditSystemVersion":"prod-v2.10"}}},"solana":{"title":"solana","value":{"audit":{"isSafe":true,"isTokenSafe":true,"isHookSafe":null,"description":"Solana token (SPL Token program). Verdict from the mint's live onchain configuration. No control can block or seize holders' tokens; see the warnings.","vulnerabilities":[{"type":"UnlimitedMinting","impact":"warning","description":"The mint authority is live, held by a program-controlled address (31rY…LGqQ). It can create any amount of new tokens and dilute every holder.","code":"","mitigated":false,"solanaFlag":"mint_authority","solanaHolder":"31rYartQwHeBMjAe2MgGpffGV57fQY3kug4BDN8tLGqQ"},{"type":"Other","impact":"info","description":"The token's name, symbol and image can be changed by a program-controlled address (31rY…LGqQ).","code":"","mitigated":false,"solanaFlag":"metadata_mutable","solanaHolder":"31rYartQwHeBMjAe2MgGpffGV57fQY3kug4BDN8tLGqQ"}],"name":"Grass","symbol":"GRASS","address":"Grass7B4RdKfBCjTKgSqnXkqjwiGvQyFbuSCUJr3XXjs","chain":"SOLANA","sourceType":"solana","isProxy":null,"implementationAddress":null,"hookAddress":null,"hookAudit":null,"createdAt":"2026-09-27T14:19:55.664Z","auditSystemVersion":"prod-v2.11","latestAuditSystemVersion":"prod-v2.11","solanaState":{"epoch":1044,"supply":"999992904642045383","program":"spl-token","unix_ts":1790542309,"decimals":9,"metadata":{"name":"Grass","source":"metaplex","symbol":"GRASS","mutable":true,"update_authority":{"kind":"pda","address":"31rYartQwHeBMjAe2MgGpffGV57fQY3kug4BDN8tLGqQ"}},"pausable":null,"read_slot":451109586,"extensions":[],"transfer_fee":null,"transfer_hook":null,"epoch_start_ts":1790515054,"mint_authority":{"kind":"pda","address":"31rYartQwHeBMjAe2MgGpffGV57fQY3kug4BDN8tLGqQ"},"freeze_authority":{"kind":"revoked","address":null},"interest_bearing":null,"non_transferable":false,"scaled_ui_amount":null,"permanent_delegate":null,"unknown_extensions":[],"mint_close_authority":null,"confidential_transfer":false,"default_account_state":null,"confidential_mint_burn":false}}}},"inProgress":{"title":"inProgress","value":{"status":"ANALYZING"}}},"exampleType":"examples"}},"exampleType":"examples"},"6fac2d6e-447f-4671-9204-10ad054ebc76":{"description":"Invalid request: unknown chain, malformed address, or an address of the wrong family for the chain (a base58 mint on an EVM chain, a 0x address on SOLANA). The body names the problem in `error` and lists the invalid fields in `issues`.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"issues":{"type":"array","description":"On a 400: one entry per invalid field.","items":{"type":"object","properties":{"path":{"type":"string","description":"The field, e.g. `address` or `chain`.","uniqueKey":"issues.items.[INDEX].path","typeLabel":"string"},"message":{"type":"string","uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","issues":[{"path":"\u003cstring>","message":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"8c37b4fa-f005-40ac-9992-d4f157c0c52d":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"issues":{"type":"array","description":"On a 400: one entry per invalid field.","items":{"type":"object","properties":{"path":{"type":"string","description":"The field, e.g. `address` or `chain`.","uniqueKey":"issues.items.[INDEX].path","typeLabel":"string"},"message":{"type":"string","uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","issues":[{"path":"\u003cstring>","message":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"64f4e0a7-ba89-47ed-af37-9efc52db5d1f":{"description":"No active subscription, or your credit allowance is exhausted.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"action":{"type":"string","description":"Suggested next step.","enum":["wait","subscribe","add_payment","resubscribe","verify_payment","payment_processing","raise_cap","upgrade"],"uniqueKey":"action","typeLabel":"enum\u003cstring>"}},"description":"Billing denial. Bodies may carry additional context fields depending on the wall (resets_at, daily_limit, grace_usd, current_period_end, subscription_status).","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","action":"wait"}}},"exampleType":"generated"}},"exampleType":"generated"},"c7b729bf-f152-4987-9011-feae45226a99":{"description":"EVM: the contract is not tradable yet (no liquidity pool found): only tradable contracts are audited, retry once a pool exists. Never on Solana, where a mint is audited with or without a pool. Solana: the address is not a token mint (a wallet, a pool, a token account, a program or an NFT), reason `not_a_token`; do not retry.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["audit","reason"],"properties":{"audit":{"type":"null","description":"Always null; no audit is produced for a non-tradable contract.","isRequired":true,"uniqueKey":"oneOf.0.audit","typeLabel":"null"},"reason":{"type":"string","enum":["no_liquidity_pool"],"description":"Machine-readable reason.","isRequired":true,"uniqueKey":"oneOf.0.reason","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable explanation.","uniqueKey":"oneOf.0.message","typeLabel":"string"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"Solana only: the address was read onchain and is not a fungible SPL Token or Token-2022 mint (a wallet, a pool, a token account, a program, an NFT, or nothing). Same shape as the no_liquidity_pool 404: branch on `reason`. Not retryable: send the token's mint address.","required":["audit","reason","message"],"properties":{"audit":{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.audit","typeLabel":"null"},"reason":{"type":"string","enum":["not_a_token"],"description":"Machine-readable reason.","isRequired":true,"uniqueKey":"oneOf.1.reason","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.message","typeLabel":"string"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"no_liquidity_pool":{"title":"no_liquidity_pool","value":{"audit":null,"reason":"no_liquidity_pool","message":"No liquidity pool found for this token yet — only tradable contracts are audited. Retry once a pool has been created."}},"not_a_token":{"title":"not_a_token","value":{"audit":null,"reason":"not_a_token","message":"This address is not a fungible token on this chain. On Solana, audit a token by its mint address (wallets, pools, token accounts, programs and NFTs are not audited)."}}},"exampleType":"examples"}},"exampleType":"examples"},"b118d511-3f81-4433-be6c-70f9026b53ad":{"description":"Monthly spend cap reached (metered/enterprise accounts). Body carries cap_usd and used_usd; no action field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"issues":{"type":"array","description":"On a 400: one entry per invalid field.","items":{"type":"object","properties":{"path":{"type":"string","description":"The field, e.g. `address` or `chain`.","uniqueKey":"issues.items.[INDEX].path","typeLabel":"string"},"message":{"type":"string","uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","issues":[{"path":"\u003cstring>","message":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"ed654ffa-8836-48c6-8869-a4cad52c5929":{"apiKey":{"type":"apiKey","in":"header","name":"X-Auth-Key","description":"Your secret API key. Create one from your dashboard.","scopes":[],"schemeName":"apiKey"}}},"servers":{"2623a051-51c7-4bde-9d3b-923d7313001f":{"url":"https://www.serializedaudit.io/api"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-Auth-Key","description":"Your secret API key. Create one from your dashboard.","scopes":[],"schemeName":"apiKey"},"schema":{"title":"X-Auth-Key","type":"string","description":"Your secret API key. Create one from your dashboard.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"X-Auth-Key"}],"title":"apiKey"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"serialized","siteName":"serialized.audit","title":"Audit a Contract - serialized.audit","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-27T21:01:57.427Z","originalFileLocation":"api-reference/audit-contract.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The single endpoint: send a contract, get a verdict.\">\u003cmeta data-mint-head name=\"application-name\" content=\"serialized.audit\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Audit a Contract - serialized.audit\">\u003cmeta data-mint-head property=\"og:description\" content=\"The single endpoint: send a contract, get a verdict.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"serialized.audit\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.serializedaudit.io/api-reference/audit-contract\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://serialized.mintlify.site/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=Audit+a+Contract\u0026amp;description=The+single+endpoint%3A+send+a+contract%2C+get+a+verdict.\u0026amp;theme=74de849ff768da133dabafff\u0026amp;signature=672cdff48581e57b92c44649c0f85b1ef716b8b53ab9de8cd8d882594e14f065\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Audit a Contract - serialized.audit\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The single endpoint: send a contract, get a verdict.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://serialized.mintlify.site/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=Audit+a+Contract\u0026amp;description=The+single+endpoint%3A+send+a+contract%2C+get+a+verdict.\u0026amp;theme=74de849ff768da133dabafff\u0026amp;signature=672cdff48581e57b92c44649c0f85b1ef716b8b53ab9de8cd8d882594e14f065\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/serialized/I_QVnRjdTqM-d5OY/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"serialized.audit\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3DCF8E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.serializedaudit.io/api-reference/audit-contract\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/audit-contract.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.serializedaudit.io/#organization\",\"name\":\"serialized.audit\",\"url\":\"https://docs.serializedaudit.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/serialized/IsfzO_AGlY5OGF8F/logo/light.svg?fit=max\u0026auto=format\u0026n=IsfzO_AGlY5OGF8F\u0026q=85\u0026s=4b7517c65c90720f6e20ad18e1fc2144\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.serializedaudit.io#website\",\"name\":\"serialized.audit\",\"url\":\"https://docs.serializedaudit.io\",\"publisher\":{\"@id\":\"https://docs.serializedaudit.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.serializedaudit.io/api-reference/audit-contract#webpage\",\"url\":\"https://docs.serializedaudit.io/api-reference/audit-contract\",\"name\":\"Audit a Contract\",\"description\":\"The single endpoint: send a contract, get a verdict.\",\"dateModified\":\"2026-09-27T21:01:57.427Z\",\"isPartOf\":{\"@id\":\"https://docs.serializedaudit.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.serializedaudit.io/api-reference/audit-contract#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.serializedaudit.io/api-reference/audit-contract#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"serialized.audit\",\"item\":\"https://docs.serializedaudit.io\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Audit a Contract\",\"item\":\"https://docs.serializedaudit.io/api-reference/audit-contract\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.serializedaudit.io/api-reference/audit-contract#apireference\",\"headline\":\"Audit a Contract\",\"name\":\"Audit a Contract\",\"description\":\"The single endpoint: send a contract, get a verdict.\",\"url\":\"https://docs.serializedaudit.io/api-reference/audit-contract\",\"mainEntityOfPage\":{\"@id\":\"https://docs.serializedaudit.io/api-reference/audit-contract#webpage\"},\"dateModified\":\"2026-09-27T21:01:57.427Z\",\"publisher\":{\"@id\":\"https://docs.serializedaudit.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.serializedaudit.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"serialized.audit\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"serialized.audit\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/audit-contract.md","siteName":"serialized.audit","nav":{"global":null,"tabs":[{"tab":"Serialized Audit","groups":[{"group":"Get Started","icon":"rocket","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"How to integrate","href":"/integration-guide"},{"title":"Authentication","description":"Authenticate every request with your secret API key.","href":"/authentication"}]},{"group":"API Reference","icon":"terminal","pages":[{"title":"Audit a Contract","openapi":"GET /audit-contract","href":"/api-reference/audit-contract"},{"title":"SSE \u0026 Webhooks","description":"Subscribe a token once, get pushed every verdict change. No polling.","openapi":"PUT /webhook, GET /webhook, POST /webhook/test, GET /subscriptions, POST /subscriptions, DELETE /subscriptions/{chain}/{address}, DELETE /subscriptions, POST /subscriptions/import-history, GET /events, GET /stream","href":"/sse-and-webhooks"},{"title":"Understanding Results","href":"/understanding-results"},{"title":"Risks","href":"/risk-categories"},{"title":"Errors \u0026 Status Codes","href":"/errors"},{"group":"API Reference","pages":[{"title":"Audit a contract","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /audit-contract","href":"/api-reference/audit-a-contract"},{"title":"Get webhook config + 24h delivery health","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /webhook","href":"/api-reference/get-webhook-config-+-24h-delivery-health"},{"title":"Set the delivery endpoint (push webhook)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json put /webhook","href":"/api-reference/set-the-delivery-endpoint-push-webhook"},{"title":"Send a signed test ping","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /webhook/test","href":"/api-reference/send-a-signed-test-ping"},{"title":"List active subscriptions","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /subscriptions","href":"/api-reference/list-active-subscriptions"},{"title":"Subscribe one or many tokens","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /subscriptions","href":"/api-reference/subscribe-one-or-many-tokens"},{"title":"Unsubscribe all tokens","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /subscriptions","href":"/api-reference/unsubscribe-all-tokens"},{"title":"Unsubscribe one token","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /subscriptions/{chain}/{address}","href":"/api-reference/unsubscribe-one-token"},{"title":"Bulk-subscribe from your 15-day call history","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /subscriptions/import-history","href":"/api-reference/bulk-subscribe-from-your-15-day-call-history"},{"title":"Replay audit-change events (webhook catch-up)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /events","href":"/api-reference/replay-audit-change-events-webhook-catch-up"},{"title":"Live push over Server-Sent Events (no inbound port)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /stream","href":"/api-reference/live-push-over-server-sent-events-no-inbound-port"}]}]},{"group":"Reference","icon":"book","pages":[{"title":"Supported Chains","href":"/supported-chains"},{"title":"Credits \u0026 Billing","href":"/credits"}]},{"group":"Programs","icon":"sparkles","pages":[{"title":"Re-audits \u0026 launchpad program","href":"/programs"}]},{"group":"Resources","icon":"life-ring","pages":[{"title":"Support","href":"/support"}]}]},{"tab":"Serialized Data","href":"https://docs.serialized.xyz"}]},"basePath":"","title":"Audit a Contract - serialized.audit","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CDiBsYGW.js","utils-KF9rPlmF.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C26urKTX.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BdjmJAC1.js","snippetPresets-3IpDBjt3.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-D4x_2vvo.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BIWdc5Pa.js","shallow-LQqfiMNd.js","getApiPlaygroundDisplay-DryzlOZG.js","CodeSnippet-tcJujU4r.js","CodeSnippets-BHp0nVLL.js","Page-1CZdsdAn.js","getPastedJson-DU-1ayUv.js","icon-CZK2hPr4.js","MethodPill-DOaqmTFC.js","DuplicateIcon-B5-nUxxl.js","createIcon-CDP_U77G.js","DynamicMarkdown-GHvayGOn.js","SectionHeading-BYvpkmUD.js","axios-vUo_bRtp.js","Markdown-uxhlayGT.js","clsx-B35qUV0p.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BvrGG8gU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CAf0yVYe.js"]}