Live push over Server-Sent Events (no inbound port)
Hold this GET open to receive audit.changed events as they happen: a no-inbound-port way to receive pushes. No setup: it’s a plain authenticated endpoint (your API key is all it needs). Each SSE frame is event: audit.changed with the SAME payload as a webhook and id: <event id>. Resume after a disconnect with the Last-Event-ID header (automatic in EventSource) or ?since=<id>; a fresh connect streams new events only (?since=0 replays all). Scoped to your active subscriptions. A : keepalive comment is sent about every 25s.
GET
/
stream
Live push over Server-Sent Events (no inbound port)
curl --request GET \ --url https://www.serializedaudit.io/api/stream \ --header 'X-Auth-Key: <api-key>'
{"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.4117","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/live-push-over-server-sent-events-no-inbound-port","slug":"/api-reference/live-push-over-server-sent-events-no-inbound-port","pageMetadata":{"title":"Live push over Server-Sent Events (no inbound port)","description":"Hold this GET open to receive `audit.changed` events as they happen: a no-inbound-port way to receive pushes. No setup: it's a plain authenticated endpoint (your API key is all it needs). Each SSE frame is `event: audit.changed` with the SAME payload as a webhook and `id: \u003cevent id>`. Resume after a disconnect with the `Last-Event-ID` header (automatic in EventSource) or `?since=\u003cid>`; a fresh connect streams new events only (`?since=0` replays all). Scoped to your active subscriptions. A `:` keepalive comment is sent about every 25s.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /stream","href":"/api-reference/live-push-over-server-sent-events-no-inbound-port","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Hold this GET open to receive \", _jsx(_components.code, {\n children: \"audit.changed\"\n }), \" events as they happen: a no-inbound-port way to receive pushes. No setup: it’s a plain authenticated endpoint (your API key is all it needs). Each SSE frame is \", _jsx(_components.code, {\n children: \"event: audit.changed\"\n }), \" with the SAME payload as a webhook and \", _jsx(_components.code, {\n children: \"id: \u003cevent id>\"\n }), \". Resume after a disconnect with the \", _jsx(_components.code, {\n children: \"Last-Event-ID\"\n }), \" header (automatic in EventSource) or \", _jsx(_components.code, {\n children: \"?since=\u003cid>\"\n }), \"; a fresh connect streams new events only (\", _jsx(_components.code, {\n children: \"?since=0\"\n }), \" replays all). Scoped to your active subscriptions. A \", _jsx(_components.code, {\n children: \":\"\n }), \" keepalive comment is sent about every 25s.\"]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Live push over Server-Sent Events (no inbound port)","description":"Hold this GET open to receive `audit.changed` events as they happen: a no-inbound-port way to receive pushes. No setup: it's a plain authenticated endpoint (your API key is all it needs). Each SSE frame is `event: audit.changed` with the SAME payload as a webhook and `id: \u003cevent id>`. Resume after a disconnect with the `Last-Event-ID` header (automatic in EventSource) or `?since=\u003cid>`; a fresh connect streams new events only (`?since=0` replays all). Scoped to your active subscriptions. A `:` keepalive comment is sent about every 25s.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /stream","href":"/api-reference/live-push-over-server-sent-events-no-inbound-port","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"streamEvents","summary":"Live push over Server-Sent Events (no inbound port)","description":"Hold this GET open to receive `audit.changed` events as they happen: a no-inbound-port way to receive pushes. No setup: it's a plain authenticated endpoint (your API key is all it needs). Each SSE frame is `event: audit.changed` with the SAME payload as a webhook and `id: \u003cevent id>`. Resume after a disconnect with the `Last-Event-ID` header (automatic in EventSource) or `?since=\u003cid>`; a fresh connect streams new events only (`?since=0` replays all). Scoped to your active subscriptions. A `:` keepalive comment is sent about every 25s.","parameters":["354bce7f-e01c-4a46-9268-205aae7ee4ed"],"responses":{"200":"bb1ad006-ba5d-4150-b5b1-8d6ded4d37d2","401":"2bd670af-dcbd-440d-8812-54c256ab90b6"},"method":"get","type":"path","servers":["2623a051-51c7-4bde-9d3b-923d7313001f"],"security":["ed654ffa-8836-48c6-8869-a4cad52c5929"],"path":"/stream","baseUrlOptions":["https://www.serializedaudit.io/api"],"title":"Live push over Server-Sent Events (no inbound port)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"354bce7f-e01c-4a46-9268-205aae7ee4ed":{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"isRequired":false,"description":"Resume from this event id (alternative to the Last-Event-ID header). Omit for new events only; 0 replays all.","uniqueKey":"","typeLabel":"integer"},"description":"Resume from this event id (alternative to the Last-Event-ID header). Omit for new events only; 0 replays all."}},"responses":{"bb1ad006-ba5d-4150-b5b1-8d6ded4d37d2":{"description":"An event stream (text/event-stream). Each `audit.changed` frame's data is an AuditChangeEvent.","content":{"text/event-stream":{"schema":{"type":"object","description":"The payload POSTed to your webhook on every verdict change (and, each with an added integer `id`, what /events returns). type is always \"audit.changed\".","properties":{"type":{"type":"string","enum":["audit.changed"],"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"event_id":{"type":"string","description":"Unique per change; dedupe on it (delivery is at-least-once).","uniqueKey":"event_id","typeLabel":"string"},"chain":{"type":"string","uniqueKey":"chain","typeLabel":"string"},"address":{"type":"string","uniqueKey":"address","typeLabel":"string"},"audit_id":{"oneOf":[{"type":"integer","uniqueKey":"audit_id.oneOf.0","typeLabel":"integer"},{"type":"null","uniqueKey":"audit_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit_id","typeLabel":"integer | null"},"created_at":{"type":"string","format":"date-time","uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"change":{"type":"object","description":"Compact summary for cheap routing/alerting.","properties":{"is_safe":{"type":"object","properties":{"before":{"oneOf":[{"type":"boolean","uniqueKey":"change.is_safe.before.oneOf.0","typeLabel":"boolean"},{"type":"null","uniqueKey":"change.is_safe.before.oneOf.1","typeLabel":"null"}],"uniqueKey":"change.is_safe.before","typeLabel":"boolean | null"},"after":{"oneOf":[{"type":"boolean","uniqueKey":"change.is_safe.after.oneOf.0","typeLabel":"boolean"},{"type":"null","uniqueKey":"change.is_safe.after.oneOf.1","typeLabel":"null"}],"uniqueKey":"change.is_safe.after","typeLabel":"boolean | null"},"changed":{"type":"boolean","uniqueKey":"change.is_safe.changed","typeLabel":"boolean"}},"uniqueKey":"change.is_safe","typeLabel":"object"},"owner_changed":{"type":"boolean","uniqueKey":"change.owner_changed","typeLabel":"boolean"},"vulns":{"type":"object","properties":{"added":{"type":"integer","uniqueKey":"change.vulns.added","typeLabel":"integer"},"removed":{"type":"integer","uniqueKey":"change.vulns.removed","typeLabel":"integer"},"changed":{"type":"integer","uniqueKey":"change.vulns.changed","typeLabel":"integer"}},"uniqueKey":"change.vulns","typeLabel":"object"}},"uniqueKey":"change","typeLabel":"object"},"audit":{"oneOf":[{"type":"object","description":"The complete new verdict, identical to a /audit-contract `audit` object, projected to your response profile. null if the change left no audit.","required":["isSafe","description","address","chain","vulnerabilities"],"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":"audit.oneOf.0.isSafe","typeLabel":"boolean"},"description":{"type":"string","description":"A short, human-readable explanation of the verdict, safe to show in a UI.","isRequired":true,"uniqueKey":"audit.oneOf.0.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":"audit.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":"audit.oneOf.0.vulnerabilities.items.[INDEX].impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"audit.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":"audit.oneOf.0.vulnerabilities.items.[INDEX].label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"audit.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":"audit.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":"audit.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":"audit.oneOf.0.vulnerabilities.items.[INDEX].mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.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":"audit.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":"audit.oneOf.0.vulnerabilities.items.[INDEX].gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.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":"audit.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":"audit.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":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.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":"audit.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":"audit.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":"audit.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":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee","typeLabel":"object"}},"uniqueKey":"audit.oneOf.0.vulnerabilities.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"audit.oneOf.0.vulnerabilities","typeLabel":"object[]"},"address":{"type":"string","description":"The audited contract address (echoed back).","isRequired":true,"uniqueKey":"audit.oneOf.0.address","typeLabel":"string"},"chain":{"type":"string","description":"The chain symbol (echoed back).","isRequired":true,"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.pool.oneOf.0.id","typeLabel":"string"},"type":{"type":"string","enum":["v2","v3","v4","other"],"uniqueKey":"audit.oneOf.0.pool.oneOf.0.type","typeLabel":"enum\u003cstring>"},"dexLabel":{"oneOf":[{"type":"string","description":"The DEX/venue label.","uniqueKey":"audit.oneOf.0.pool.oneOf.0.dexLabel.oneOf.0","typeLabel":"string"},{"type":"null","description":"The DEX/venue label.","uniqueKey":"audit.oneOf.0.pool.oneOf.0.dexLabel.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.pool.oneOf.0.dexLabel","typeLabel":"string | null"},"hookAddress":{"oneOf":[{"type":"string","uniqueKey":"audit.oneOf.0.pool.oneOf.0.hookAddress.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"audit.oneOf.0.pool.oneOf.0.hookAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.pool.oneOf.0.isPrimary","typeLabel":"boolean"},"primaryPoolId":{"oneOf":[{"type":"string","uniqueKey":"audit.oneOf.0.pool.oneOf.0.primaryPoolId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"audit.oneOf.0.pool.oneOf.0.primaryPoolId.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.pool.oneOf.0.primaryPoolId","typeLabel":"string | null"},"primaryPoolLiquidity":{"oneOf":[{"type":"number","uniqueKey":"audit.oneOf.0.pool.oneOf.0.primaryPoolLiquidity.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"audit.oneOf.0.pool.oneOf.0.primaryPoolLiquidity.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.pool.oneOf.0.primaryPoolLiquidity","typeLabel":"number | null"},"liquidity":{"oneOf":[{"type":"number","uniqueKey":"audit.oneOf.0.pool.oneOf.0.liquidity.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"audit.oneOf.0.pool.oneOf.0.liquidity.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.pool.oneOf.0.liquidity","typeLabel":"number | null"},"quoteSymbol":{"oneOf":[{"type":"string","uniqueKey":"audit.oneOf.0.pool.oneOf.0.quoteSymbol.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"audit.oneOf.0.pool.oneOf.0.quoteSymbol.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.pool.oneOf.0.quoteSymbol","typeLabel":"string | null"}},"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.pool.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.pool","typeLabel":"object | null"},"isTokenSafe":{"type":"boolean","description":"Verdict for the token contract itself, ignoring any associated pool hook.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.isHookSafe.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.isHookSafe","typeLabel":"boolean | null"},"name":{"oneOf":[{"type":"string","description":"Token name, when available.","uniqueKey":"audit.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Token name, when available.","uniqueKey":"audit.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.name","typeLabel":"string | null"},"symbol":{"oneOf":[{"type":"string","description":"Token symbol, when available.","uniqueKey":"audit.oneOf.0.symbol.oneOf.0","typeLabel":"string"},{"type":"null","description":"Token symbol, when available.","uniqueKey":"audit.oneOf.0.symbol.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.isProxy.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.isProxy","typeLabel":"boolean | null"},"implementationAddress":{"oneOf":[{"type":"string","description":"For a proxy, the implementation contract that was audited; null otherwise.","uniqueKey":"audit.oneOf.0.implementationAddress.oneOf.0","typeLabel":"string"},{"type":"null","description":"For a proxy, the implementation contract that was audited; null otherwise.","uniqueKey":"audit.oneOf.0.implementationAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.implementationAddress","typeLabel":"string | null"},"hookAddress":{"oneOf":[{"type":"string","description":"Address of the associated Uniswap v4 pool hook, when present.","uniqueKey":"audit.oneOf.0.hookAddress.oneOf.0","typeLabel":"string"},{"type":"null","description":"Address of the associated Uniswap v4 pool hook, when present.","uniqueKey":"audit.oneOf.0.hookAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.hookAudit.oneOf.0.isSafe.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Verdict for the hook.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.isSafe.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.isSafe","typeLabel":"boolean | null"},"description":{"oneOf":[{"type":"string","description":"Human-readable summary of the hook verdict.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable summary of the hook verdict.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX].solanaFee","typeLabel":"object"}},"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities.items.[INDEX]","typeLabel":"object"},"description":"Risks detected in the hook.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.vulnerabilities","typeLabel":"object[]"},"address":{"oneOf":[{"type":"string","description":"The hook contract address.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.address.oneOf.0","typeLabel":"string"},{"type":"null","description":"The hook contract address.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.address.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.address","typeLabel":"string | null"},"isDecompiled":{"type":"boolean","description":"Whether the hook verdict came from decompiled bytecode (no verified source).","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0.isDecompiled","typeLabel":"boolean"}},"uniqueKey":"audit.oneOf.0.hookAudit.oneOf.0","typeLabel":"object"},{"type":"null","description":"The audit of the associated pool hook, or null when there is no hook.","uniqueKey":"audit.oneOf.0.hookAudit.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.hookAudit","typeLabel":"object | null"},"createdAt":{"type":"string","format":"date-time","description":"ISO timestamp of when this audit was produced.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.b20Flags.oneOf.0.is_b20","typeLabel":"boolean"},"initialized":{"type":"boolean","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.initialized","typeLabel":"boolean"},"variant":{"oneOf":[{"type":"string","enum":["asset","stablecoin",null],"description":"B20 variant, or null if unknown.","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.variant.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["asset","stablecoin",null],"description":"B20 variant, or null if unknown.","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.variant.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.variant","typeLabel":"enum\u003cstring> | null"},"paused_features":{"type":"array","items":{"type":"integer","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.paused_features.items.[INDEX]","typeLabel":"integer"},"description":"PausableFeature enum values currently paused: 0=TRANSFER, 1=MINT, 2=BURN.","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.paused_features","typeLabel":"integer[]"},"policy_sender":{"type":"string","description":"Transfer-policy id (uint64 decimal string). '0' = ALWAYS_ALLOW (open).","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.policy_sender","typeLabel":"string"},"policy_receiver":{"type":"string","description":"As policy_sender, receiver scope.","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.policy_receiver","typeLabel":"string"},"policy_executor":{"type":"string","description":"As policy_sender, executor scope.","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.policy_executor","typeLabel":"string"},"policy_mint":{"type":"string","description":"As policy_sender, mint scope.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.b20Flags.oneOf.0.multiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.multiplier","typeLabel":"string | null"},"supply_cap":{"oneOf":[{"type":"string","description":"uint256 decimal string; type(uint128).max = uncapped. Informational.","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.supply_cap.oneOf.0","typeLabel":"string"},{"type":"null","description":"uint256 decimal string; type(uint128).max = uncapped. Informational.","uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.supply_cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.b20Flags.oneOf.0.supply_cap","typeLabel":"string | null"}},"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.b20Flags.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.program","typeLabel":"enum\u003cstring>"},"decimals":{"type":"integer","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.decimals","typeLabel":"integer"},"supply":{"type":"string","description":"Raw supply, decimal string.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.mint_authority.address.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.mint_authority.owner.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.mint_authority.owner","typeLabel":"string | null"},"m":{"type":"integer","description":"Multisig: signatures required.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.mint_authority.m","typeLabel":"integer"},"n":{"type":"integer","description":"Multisig: signers.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.mint_authority.keys","typeLabel":"integer"}},"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.freeze_authority.address.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.freeze_authority.owner.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.freeze_authority.owner","typeLabel":"string | null"},"m":{"type":"integer","description":"Multisig: signatures required.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.freeze_authority.m","typeLabel":"integer"},"n":{"type":"integer","description":"Multisig: signers.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.freeze_authority.keys","typeLabel":"integer"}},"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.permanent_delegate.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.transfer_fee.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.transfer_hook.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.transfer_hook","typeLabel":"object | null"},"pausable":{"oneOf":[{"type":"object","description":"Token-2022 pause: paused (boolean) and authority. null when absent.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.pausable.oneOf.0","typeLabel":"object"},{"type":"null","description":"Token-2022 pause: paused (boolean) and authority. null when absent.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.pausable.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.default_account_state.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.default_account_state","typeLabel":"enum\u003cstring> | null"},"non_transferable":{"type":"boolean","description":"Token-2022: the token can never be transferred.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.scaled_ui_amount.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.interest_bearing.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.mint_close_authority.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.metadata","typeLabel":"object"},"extensions":{"type":"array","items":{"type":"string","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.extensions.items.[INDEX]","typeLabel":"string"},"description":"Raw Token-2022 extension names on the mint, in chain order.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.extensions","typeLabel":"string[]"},"unknown_extensions":{"type":"array","items":{"type":"string","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.unknown_extensions.items.[INDEX]","typeLabel":"string"},"description":"Extensions this audit does not judge yet. Each one is a critical finding.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.unknown_extensions","typeLabel":"string[]"},"confidential_transfer":{"type":"boolean","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.confidential_transfer","typeLabel":"boolean"},"confidential_mint_burn":{"type":"boolean","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.confidential_mint_burn","typeLabel":"boolean"},"read_slot":{"type":"integer","description":"Slot of the read.","uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.0.epoch","typeLabel":"integer"},"epoch_start_ts":{"type":"integer","description":"Unix seconds at which that epoch started.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.epoch_start_ts","typeLabel":"integer"},"unix_ts":{"type":"integer","description":"Cluster time of the read, unix seconds.","uniqueKey":"audit.oneOf.0.solanaState.oneOf.0.unix_ts","typeLabel":"integer"}},"uniqueKey":"audit.oneOf.0.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":"audit.oneOf.0.solanaState.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit.oneOf.0.solanaState","typeLabel":"object | null"}},"uniqueKey":"audit.oneOf.0","typeLabel":"object"},{"type":"null","description":"The complete new verdict, identical to a /audit-contract `audit` object, projected to your response profile. null if the change left no audit.","uniqueKey":"audit.oneOf.1","typeLabel":"null"}],"uniqueKey":"audit","typeLabel":"object | null"},"diff":{"type":"object","description":"Which findings moved.","properties":{"added":{"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":"diff.added.items.[INDEX].type","typeLabel":"string"},"impact":{"type":"string","enum":["critical","warning","info"],"description":"How severely this risk affects a holder.","isRequired":true,"uniqueKey":"diff.added.items.[INDEX].impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"diff.added.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":"diff.added.items.[INDEX].label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"diff.added.items.[INDEX].code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"diff.added.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":"diff.added.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":"diff.added.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":"diff.added.items.[INDEX].mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.added.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":"diff.added.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":"diff.added.items.[INDEX].gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.added.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":"diff.added.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":"diff.added.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":"diff.added.items.[INDEX].solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.added.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":"diff.added.items.[INDEX].solanaFee.bps","typeLabel":"integer"},"maxFee":{"type":"string","description":"Per-transfer cap applying now, in raw base units (u64 as a string).","uniqueKey":"diff.added.items.[INDEX].solanaFee.maxFee","typeLabel":"string"},"scheduledBps":{"oneOf":[{"type":"integer","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledBps.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.added.items.[INDEX].solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"diff.added.items.[INDEX].solanaFee","typeLabel":"object"}},"uniqueKey":"diff.added.items.[INDEX]","typeLabel":"object"},"uniqueKey":"diff.added","typeLabel":"object[]"},"removed":{"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":"diff.removed.items.[INDEX].type","typeLabel":"string"},"impact":{"type":"string","enum":["critical","warning","info"],"description":"How severely this risk affects a holder.","isRequired":true,"uniqueKey":"diff.removed.items.[INDEX].impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"diff.removed.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":"diff.removed.items.[INDEX].label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"diff.removed.items.[INDEX].code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"diff.removed.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":"diff.removed.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":"diff.removed.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":"diff.removed.items.[INDEX].mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.removed.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":"diff.removed.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":"diff.removed.items.[INDEX].gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.removed.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":"diff.removed.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":"diff.removed.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":"diff.removed.items.[INDEX].solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.removed.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":"diff.removed.items.[INDEX].solanaFee.bps","typeLabel":"integer"},"maxFee":{"type":"string","description":"Per-transfer cap applying now, in raw base units (u64 as a string).","uniqueKey":"diff.removed.items.[INDEX].solanaFee.maxFee","typeLabel":"string"},"scheduledBps":{"oneOf":[{"type":"integer","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledBps.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.removed.items.[INDEX].solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"diff.removed.items.[INDEX].solanaFee","typeLabel":"object"}},"uniqueKey":"diff.removed.items.[INDEX]","typeLabel":"object"},"uniqueKey":"diff.removed","typeLabel":"object[]"},"changed":{"type":"array","items":{"type":"object","properties":{"before":{"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":"diff.changed.items.[INDEX].before.type","typeLabel":"string"},"impact":{"type":"string","enum":["critical","warning","info"],"description":"How severely this risk affects a holder.","isRequired":true,"uniqueKey":"diff.changed.items.[INDEX].before.impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"diff.changed.items.[INDEX].before.code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].before.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":"diff.changed.items.[INDEX].before.solanaFee.bps","typeLabel":"integer"},"maxFee":{"type":"string","description":"Per-transfer cap applying now, in raw base units (u64 as a string).","uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.maxFee","typeLabel":"string"},"scheduledBps":{"oneOf":[{"type":"integer","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledBps.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].before.solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"diff.changed.items.[INDEX].before.solanaFee","typeLabel":"object"}},"uniqueKey":"diff.changed.items.[INDEX].before","typeLabel":"object"},"after":{"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":"diff.changed.items.[INDEX].after.type","typeLabel":"string"},"impact":{"type":"string","enum":["critical","warning","info"],"description":"How severely this risk affects a holder.","isRequired":true,"uniqueKey":"diff.changed.items.[INDEX].after.impact","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"Plain-language explanation of the risk.","isRequired":true,"uniqueKey":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.label","typeLabel":"string"},"code":{"type":"string","description":"A representative snippet of the relevant code for this risk.","uniqueKey":"diff.changed.items.[INDEX].after.code","typeLabel":"string"},"codes":{"type":"array","items":{"type":"string","uniqueKey":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.mitigated.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.gateReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.solanaHolder.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].after.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":"diff.changed.items.[INDEX].after.solanaFee.bps","typeLabel":"integer"},"maxFee":{"type":"string","description":"Per-transfer cap applying now, in raw base units (u64 as a string).","uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.maxFee","typeLabel":"string"},"scheduledBps":{"oneOf":[{"type":"integer","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledBps.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Fee already written onchain for a later epoch, or null.","uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledBps.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledBps","typeLabel":"integer | null"},"scheduledMaxFee":{"oneOf":[{"type":"string","uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledMaxFee.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledMaxFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledMaxFee","typeLabel":"string | null"},"scheduledEpoch":{"oneOf":[{"type":"integer","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledEpoch.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Epoch from which the scheduled fee applies.","uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledEpoch.oneOf.1","typeLabel":"null"}],"uniqueKey":"diff.changed.items.[INDEX].after.solanaFee.scheduledEpoch","typeLabel":"integer | null"}},"uniqueKey":"diff.changed.items.[INDEX].after.solanaFee","typeLabel":"object"}},"uniqueKey":"diff.changed.items.[INDEX].after","typeLabel":"object"},"fields":{"type":"array","description":"What moved on that finding: impact, mitigated, demotedFromCritical, gateReason, solanaFee (a Solana fee rate or schedule).","items":{"type":"string","uniqueKey":"diff.changed.items.[INDEX].fields.items.[INDEX]","typeLabel":"string"},"uniqueKey":"diff.changed.items.[INDEX].fields","typeLabel":"string[]"}},"uniqueKey":"diff.changed.items.[INDEX]","typeLabel":"object"},"uniqueKey":"diff.changed","typeLabel":"object[]"}},"uniqueKey":"diff","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"audit.changed","event_id":"\u003cstring>","chain":"\u003cstring>","address":"\u003cstring>","audit_id":123,"created_at":"2023-11-07T05:31:56Z","change":{"is_safe":{"before":true,"after":true,"changed":true},"owner_changed":true,"vulns":{"added":123,"removed":123,"changed":123}},"audit":{"isSafe":true,"description":"\u003cstring>","vulnerabilities":[{"type":"UnlimitedMinting","impact":"critical","description":"\u003cstring>","label":"Liquidity Drain","code":"\u003cstring>","codes":["\u003cstring>"],"mitigated":true,"gateReason":"\u003cstring>","solanaFlag":"\u003cstring>","solanaHolder":"\u003cstring>","solanaFee":{"bps":123,"maxFee":"\u003cstring>","scheduledBps":123,"scheduledMaxFee":"\u003cstring>","scheduledEpoch":123}}],"address":"\u003cstring>","chain":"\u003cstring>","entry":"token","pool":{"id":"\u003cstring>","type":"v2","dexLabel":"\u003cstring>","hookAddress":"\u003cstring>","isPrimary":true,"primaryPoolId":"\u003cstring>","primaryPoolLiquidity":123,"liquidity":123,"quoteSymbol":"\u003cstring>"},"isTokenSafe":true,"isHookSafe":true,"name":"\u003cstring>","symbol":"\u003cstring>","sourceType":"verified","isProxy":true,"implementationAddress":"\u003cstring>","hookAddress":"\u003cstring>","hookAudit":{"isSafe":true,"description":"\u003cstring>","vulnerabilities":[{"type":"UnlimitedMinting","impact":"critical","description":"\u003cstring>","label":"Liquidity Drain","code":"\u003cstring>","codes":["\u003cstring>"],"mitigated":true,"gateReason":"\u003cstring>","solanaFlag":"\u003cstring>","solanaHolder":"\u003cstring>","solanaFee":{"bps":123,"maxFee":"\u003cstring>","scheduledBps":123,"scheduledMaxFee":"\u003cstring>","scheduledEpoch":123}}],"address":"\u003cstring>","isDecompiled":true},"createdAt":"2023-11-07T05:31:56Z","auditSystemVersion":"\u003cstring>","latestAuditSystemVersion":"\u003cstring>","b20Flags":{"is_b20":true,"initialized":true,"variant":"asset","paused_features":[123],"policy_sender":"\u003cstring>","policy_receiver":"\u003cstring>","policy_executor":"\u003cstring>","policy_mint":"\u003cstring>","multiplier":"\u003cstring>","supply_cap":"\u003cstring>"},"solanaState":{"program":"spl-token","decimals":123,"supply":"\u003cstring>","mint_authority":{"address":"\u003cstring>","kind":"revoked","owner":"\u003cstring>","m":123,"n":123,"keys":123},"freeze_authority":{"address":"\u003cstring>","kind":"revoked","owner":"\u003cstring>","m":123,"n":123,"keys":123},"permanent_delegate":{},"transfer_fee":{},"transfer_hook":{},"pausable":{},"default_account_state":"initialized","non_transferable":true,"scaled_ui_amount":{},"interest_bearing":{},"mint_close_authority":{},"metadata":{},"extensions":["\u003cstring>"],"unknown_extensions":["\u003cstring>"],"confidential_transfer":true,"confidential_mint_burn":true,"read_slot":123,"epoch":123,"epoch_start_ts":123,"unix_ts":123}},"diff":{"added":[{"type":"UnlimitedMinting","impact":"critical","description":"\u003cstring>","label":"Liquidity Drain","code":"\u003cstring>","codes":["\u003cstring>"],"mitigated":true,"gateReason":"\u003cstring>","solanaFlag":"\u003cstring>","solanaHolder":"\u003cstring>","solanaFee":{"bps":123,"maxFee":"\u003cstring>","scheduledBps":123,"scheduledMaxFee":"\u003cstring>","scheduledEpoch":123}}],"removed":[{"type":"UnlimitedMinting","impact":"critical","description":"\u003cstring>","label":"Liquidity Drain","code":"\u003cstring>","codes":["\u003cstring>"],"mitigated":true,"gateReason":"\u003cstring>","solanaFlag":"\u003cstring>","solanaHolder":"\u003cstring>","solanaFee":{"bps":123,"maxFee":"\u003cstring>","scheduledBps":123,"scheduledMaxFee":"\u003cstring>","scheduledEpoch":123}}],"changed":[{"before":{"type":"UnlimitedMinting","impact":"critical","description":"\u003cstring>","label":"Liquidity Drain","code":"\u003cstring>","codes":["\u003cstring>"],"mitigated":true,"gateReason":"\u003cstring>","solanaFlag":"\u003cstring>","solanaHolder":"\u003cstring>","solanaFee":{"bps":123,"maxFee":"\u003cstring>","scheduledBps":123,"scheduledMaxFee":"\u003cstring>","scheduledEpoch":123}},"after":{"type":"UnlimitedMinting","impact":"critical","description":"\u003cstring>","label":"Liquidity Drain","code":"\u003cstring>","codes":["\u003cstring>"],"mitigated":true,"gateReason":"\u003cstring>","solanaFlag":"\u003cstring>","solanaHolder":"\u003cstring>","solanaFee":{"bps":123,"maxFee":"\u003cstring>","scheduledBps":123,"scheduledMaxFee":"\u003cstring>","scheduledEpoch":123}},"fields":["\u003cstring>"]}]}}}},"exampleType":"generated"}},"exampleType":"generated"},"2bd670af-dcbd-440d-8812-54c256ab90b6":{"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"}},"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":"Live push over Server-Sent Events (no inbound port) - serialized.audit","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-07T04:39:39.906Z","originalFileLocation":"api-reference/live-push-over-server-sent-events-no-inbound-port.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=\"Hold this GET open to receive audit.changed events as they happen: a no-inbound-port way to receive pushes. No setup: it\u0026#x27;s a plain authenticated endpoint (your API key is all it needs). Each SSE frame is event: audit.changed with the SAME payload as a webhook and id: . Resume after a disconnect with the Last-Event-ID header (automatic in EventSource) or ?since=; a fresh connect streams new events only (?since=0 replays all). Scoped to your active subscriptions. A : keepalive comment is sent about every 25s.\">\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=\"Live push over Server-Sent Events (no inbound port) - serialized.audit\">\u003cmeta data-mint-head property=\"og:description\" content=\"Hold this GET open to receive audit.changed events as they happen: a no-inbound-port way to receive pushes. No setup: it\u0026#x27;s a plain authenticated endpoint (your API key is all it needs). Each SSE frame is event: audit.changed with the SAME payload as a webhook and id: . Resume after a disconnect with the Last-Event-ID header (automatic in EventSource) or ?since=; a fresh connect streams new events only (?since=0 replays all). Scoped to your active subscriptions. A : keepalive comment is sent about every 25s.\">\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/live-push-over-server-sent-events-no-inbound-port\">\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=Live+push+over+Server-Sent+Events+%28no+inbound+port%29\u0026amp;description=Hold+this+GET+open+to+receive+%60audit.changed%60+events+as+they+happen%3A+a+no-inbound-port+way+to+receive+pushes.+No+setup%3A+it%27s+a+plain+authenticated+endpoint+%28you\u0026amp;theme=74de849ff768da133dabafff\u0026amp;signature=fb3d6af89fd48012fb32522e81ad558ecd61399dcb0f5befe84b8cdef981e572\">\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=\"Live push over Server-Sent Events (no inbound port) - serialized.audit\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Hold this GET open to receive audit.changed events as they happen: a no-inbound-port way to receive pushes. No setup: it\u0026#x27;s a plain authenticated endpoint (your API key is all it needs). Each SSE frame is event: audit.changed with the SAME payload as a webhook and id: . Resume after a disconnect with the Last-Event-ID header (automatic in EventSource) or ?since=; a fresh connect streams new events only (?since=0 replays all). Scoped to your active subscriptions. A : keepalive comment is sent about every 25s.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://serialized.mintlify.site/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=Live+push+over+Server-Sent+Events+%28no+inbound+port%29\u0026amp;description=Hold+this+GET+open+to+receive+%60audit.changed%60+events+as+they+happen%3A+a+no-inbound-port+way+to+receive+pushes.+No+setup%3A+it%27s+a+plain+authenticated+endpoint+%28you\u0026amp;theme=74de849ff768da133dabafff\u0026amp;signature=fb3d6af89fd48012fb32522e81ad558ecd61399dcb0f5befe84b8cdef981e572\">\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/live-push-over-server-sent-events-no-inbound-port\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/live-push-over-server-sent-events-no-inbound-port.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/live-push-over-server-sent-events-no-inbound-port#webpage\",\"url\":\"https://docs.serializedaudit.io/api-reference/live-push-over-server-sent-events-no-inbound-port\",\"name\":\"Live push over Server-Sent Events (no inbound port)\",\"description\":\"Hold this GET open to receive audit.changed events as they happen: a no-inbound-port way to receive pushes. No setup: it's a plain authenticated endpoint (your API key is all it needs). Each SSE frame is event: audit.changed with the SAME payload as a webhook and id: . Resume after a disconnect with the Last-Event-ID header (automatic in EventSource) or ?since=; a fresh connect streams new events only (?since=0 replays all). Scoped to your active subscriptions. A : keepalive comment is sent about every 25s.\",\"dateModified\":\"2026-10-07T04:39:39.906Z\",\"isPartOf\":{\"@id\":\"https://docs.serializedaudit.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.serializedaudit.io/api-reference/live-push-over-server-sent-events-no-inbound-port#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.serializedaudit.io/api-reference/live-push-over-server-sent-events-no-inbound-port#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.serializedaudit.io/api-reference/audit-contract\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API Reference\",\"item\":\"https://docs.serializedaudit.io/api-reference/audit-a-contract\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Live push over Server-Sent Events (no inbound port)\",\"item\":\"https://docs.serializedaudit.io/api-reference/live-push-over-server-sent-events-no-inbound-port\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.serializedaudit.io/api-reference/live-push-over-server-sent-events-no-inbound-port#apireference\",\"headline\":\"Live push over Server-Sent Events (no inbound port)\",\"name\":\"Live push over Server-Sent Events (no inbound port)\",\"description\":\"Hold this GET open to receive audit.changed events as they happen: a no-inbound-port way to receive pushes. No setup: it's a plain authenticated endpoint (your API key is all it needs). Each SSE frame is event: audit.changed with the SAME payload as a webhook and id: . Resume after a disconnect with the Last-Event-ID header (automatic in EventSource) or ?since=; a fresh connect streams new events only (?since=0 replays all). Scoped to your active subscriptions. A : keepalive comment is sent about every 25s.\",\"url\":\"https://docs.serializedaudit.io/api-reference/live-push-over-server-sent-events-no-inbound-port\",\"mainEntityOfPage\":{\"@id\":\"https://docs.serializedaudit.io/api-reference/live-push-over-server-sent-events-no-inbound-port#webpage\"},\"dateModified\":\"2026-10-07T04:39:39.906Z\",\"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/live-push-over-server-sent-events-no-inbound-port.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","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","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)","description":"The durable catch-up path: replay the `audit.changed` events for your currently-active subscriptions since a cursor. Page with `since=cursor` until `events` is empty. Scoped to active subscriptions; unsubscribing a token also hides its past events. Each event is projected to your response profile, exactly like the pushed webhook.","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","description":"The 29 EVM chains and Solana you can audit, and the chain symbol to pass.","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":"Live push over Server-Sent Events (no inbound port) - serialized.audit","buildId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","deploymentId":"dpl_41S5Z2jG9QnfDRwN1KZrLdBwj7DM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DDP9JXtj.js","utils-8yQyvEtx.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CBCFR8Sn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-rQaXkUHa.js","snippetPresets-J5KpBTgV.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BVxVH4Cj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BxdQ2vIi.js","shallow-BjV2tFiD.js","getApiPlaygroundDisplay-C_55tL4O.js","CodeSnippet-C0JpiCOC.js","CodeSnippets-w9Ps7djG.js","Page-DTNSD-0M.js","getPastedJson-BDfB-H8d.js","icon-g-kUkkO9.js","MethodPill-v4l6fq0h.js","DuplicateIcon-CvLo-CfU.js","createIcon-165clrrV.js","DynamicMarkdown-D3RQ-fEj.js","SectionHeading-vvo-3yLf.js","axios-vUo_bRtp.js","Markdown-CMT1uFWQ.js","clsx-C8f2yC9R.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CI2D8R2Y.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-k78Wrw_e.js"]}