Generate a ready-to-use indexer from a contract ABI with the squid generation tools.
The squid-gen tools generate a legacy pre-Portal squid built on the deprecated v2 gateway + SQD_API_KEY stack. The generated project is incompatible with the Portal-based flow used throughout the rest of this section. To modernize the generated code, follow the gateway-to-Portal migration guide.
V2 gateway requests require an API key. Set SQD_API_KEY in .env before running gateway-based examples, or pass apiKey: process.env.SQD_API_KEY in GatewaySettings.
As of 2025-01-01 we no longer maintain the old squid-gen tool.
SQD provides tools for generating ready-to-use squids that index events and function calls of smart contracts. EVM/Solidity and WASM/ink! smart contracts are supported. The tools can be configured to make squids that save data to a PostgreSQL database or to a file-based dataset. All that is required is NodeJS, Squid CLI and, if your squid will be using a database, Docker.Squid generation procedure is very similar for both contract types. Here are the steps:
Create a new blank squid with sqd init using a suitable template:
# for EVM/Solidity contractssqd init my-squid -t abi# OR# for WASM/ink! contractssqd init my-squid -t https://github.com/subsquid-labs/squid-ink-abi-template
Enter the squid folder and install the dependencies:
cd my-squidnpm ci
Write the configuration of the future squid to squidgen.yaml. Retrieve any necessary contract ABIs and store them at ./abi.Alternatively, skip to the next step and specify the configuration via CLI. Note: some features will not be available.
Generate and build the squid code:
npx squid-gen config squidgen.yaml
npm run build
If you chose to configure the tool via CLI instead, do so now. Here’s an example:
Test the complete squid by running it locally. Start a processor with
node -r dotenv/config lib/main.js
If your squid will be serving GraphQL also run npx squid-graphql-server in a separate terminal. Make sure that the squid saves the requested data to its target:
for PostgreSQL-based squids you can also connect to the database with PGPASSWORD=postgres psql -U postgres -p 23798 -h localhost squid and take a look at the contents;
if it is storing data to a file-based dataset, wait for the first filesystem sync then verify that all the expected files are present and contain the expected data. If your squid produces data at a low rate, you may have to tweak the chunkSizeMb setting and/or add a ctx.store.setForceFlush() call to manually write dataset chunks at appropriate intervals.
At this point your squid is ready. You can run it on your own infrastructure or deploy it to SQD Cloud.
target section describes how the scraped data should be stored. Set
target: type: postgres
to use a PostgreSQL database that can be presented to users as a GraphQL API or used as-is. Another option is to store the data to a file-based dataset.
contracts is a list of contracts to be indexed. Define the following fields for each contract:
name
address
range (optional): block range to be indexed. An object with from and to properties, each of which can be omitted. Defaults to indexing the whole chain.
abi (optional on EVM): path to the contract JSON ABI. If omitted for an EVM contract, the tool will attempt to fetch the ABI by address from the Etherscan API or a compatible alternative set by the etherscanApi root option.
proxy (EVM-only): when indexing a proxy contract for events or calls defined in the implementation, set this option to its address and the address option to the address of the implementation contract. That way the tool will retrieve the ABI of the implementation and use it to index the output of the proxy.
events (optional): a list of events to be indexed or a boolean value. Set to true to index all events defined in the ABI. Defaults to false, meaning that no events are to be indexed.
functions (EVM-only, optional): a list of functions the calls of which are to be indexed or a boolean value. Set to true to index calls of all functions defined in the ABI. Defaults to false, meaning that no function calls are to be indexed.
etherscanApi (EVM-only, optional): Etherscan API-compatible endpoint to fetch contract ABI by a known address. Default: https://api.etherscan.io/.
Currently the only file-based data target type supported by squid-gen packages is parquet. When used, it requires that the path field is also set alongside type. A path can be a local path or an URL pointing to a folder within a bucket on an S3-compatible cloud service.Support for file-store is in alpha stage. Known caveats:
Unlike their PostgreSQL-powered equivalents, the squids that use file-store may not write their data often. You may have to configure the chunkSizeMb parameter of the Database class and/or call ctx.store.setForceFlush() when appropriate to strike an acceptable balance between the lag of the indexed data and the number of files in the resulting dataset. See the Filesystem datasets overview for details.
For parquet targets, the Decimal(38) column type is used by the code generator to represent uint256. This is done for compatibility reasons: very few tools seem to support reading wider decimals from Parquet files. If you’re getting a lot of errors containing value ... does not fit into Decimal(38, 0), consider replacing the Decimal(38) column type with Decimal(78) or String() at src/table.ts.
At the moment, squids generated with file-based data targets contain a lot of facilities for managing the database and have to be stripped of them before use.
Index LiquidationCall events of the AAVE V2 Lending Pool contract, starting from block 11362579 when it was deployed. Save the results to PostgreSQL. Use the ABI located at ./abi/aave-v2-pool.json.
Index events and function calls by the DPX contract (a proxy) on Arbitrum, based on the ABI of the implementation contract retrieved from Arbiscan API. Save the results to Parquet files at ’./data’.
Note: this example is known to run into the integer length issue described in the file-store targets section. One way to make it work is to widen all Decimal column types from 38 to 78 symbols:
sed -i -e 's/38/78/g' src/table.ts
Index all events and function calls of the Positions NFT and Factory contracts of Uniswap, send the results to the uniswap-data folder of the subsquid-testing-data bucket.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"SQD Documentation","description":"Developer docs for SQD. Stream onchain data from 110+ networks through the Portal HTTP API. Build indexers with the Squid or Pipes TypeScript SDKs and deploy on SQD Cloud. API reference, guides, and tutorials.","colors":{"primary":"#4f46e5","light":"#a5b4fc","dark":"#4338ca"},"logo":"https://docs.sqd.dev/images/favicon-512x512.png","favicon":"https://mintcdn.com/sqd-2119b3c3/guSbZXCH4rZ4VplP/images/favicon-512x512.png?fit=max\u0026auto=format\u0026n=guSbZXCH4rZ4VplP\u0026q=85\u0026s=68404b12d41ec308307bc81da4f5244e","api":{"playground":{"display":"interactive"},"examples":{"prefill":true}},"appearance":{"default":"system","strict":false},"background":{"color":{"light":"#ffffff","dark":"#08090a"}},"navbar":{"links":[{"href":"https://github.com/subsquid/squid-sdk","label":"Squid SDK","type":"github"},{"href":"https://github.com/subsquid-labs/pipes-sdk","label":"Pipes SDK","type":"github"},{"icon":"cloud","href":"https://cloud.sqd.dev","label":"Cloud"},{"icon":"waypoints","href":"https://network.sqd.dev","label":"Network"}],"primary":{"type":"button","label":"Get help","href":"https://t.me/hydradevs"}},"footer":{"socials":{"github":"https://github.com/subsquid","x":"https://twitter.com/hellosqd","telegram":"https://t.me/hydradevs","linkedin":"https://www.linkedin.com/company/subsquid","youtube":"https://www.youtube.com/@subsquid"},"links":[{"header":"Quickstarts","items":[{"label":"Pipes SDK","href":"/en/sdk/pipes-sdk/evm/quickstart"},{"label":"Squid SDK","href":"/en/sdk/squid-sdk/evm/quickstart"},{"label":"Portal API","href":"/en/portal/evm/quickstart"}]},{"header":"AI Development","items":[{"label":"llms.txt","href":"/llms.txt"},{"label":"llms-full.txt","href":"/llms-full.txt"},{"label":"skill.md","href":"/skill.md"},{"label":"Agent Skills","href":"https://github.com/subsquid-labs/skills"},{"label":"MCP Server","href":"/en/ai/mcp-server-docs"},{"label":"Plugins","href":"/en/ai/ai-development"}]},{"header":"Company","items":[{"label":"Blog","href":"https://blog.sqd.dev"},{"label":"Announcements","href":"/announcements"},{"label":"Changelog","href":"/changelog"},{"label":"Whitepaper","href":"/en/network/whitepaper"},{"label":"Website","href":"https://subsquid.io"}]}]},"seo":{"metatags":{"msvalidate.01":"570E8FF88EEAEACE2E2C262AF96E35F3"},"organization":{"id":"https://sqd.dev/#organization","name":"SQD","legalName":"Subsquid Labs GmbH","url":"https://sqd.dev/","logo":"https://sqd.dev/brand/Symbol_bl-bg.svg","sameAs":["https://github.com/subsquid","https://www.x.com/hellosqd","https://t.me/subsquid","https://www.youtube.com/@subsquid","https://www.linkedin.com/company/subsquid"]},"indexing":"all"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","codeblocks":"system","latex":false},"integrations":{"ga4":{"measurementId":"G-2JXBGQRKYN"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"That page does not exist. Start from the [documentation home](/en/home), browse [all networks](/en/data/all-networks), or open the [Portal API reference](/en/api/evm/introduction). Agents: the full page index is at [llms.txt](/llms.txt), every page is available as Markdown by appending `.md`, and the Portal API is described by [openapi.json](/openapi.json)."}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","cursor","add-mcp","grok","download-spec","download-pdf"],"display":"header"},"thumbnails":{"appearance":"dark","background":"https://docs.sqd.dev/og.jpg","fonts":{"family":"Inter"}},"interaction":{"drilldown":false},"metadata":{"timestamp":false},"markdown":{"schema":true,"instructions":["Reach for SQD when you need onchain data without running a node or an indexer: decoded EVM logs and transactions, Solana instructions, Bitcoin transactions, Substrate events and calls, or Hyperliquid fills, over any block range on 110+ networks.","To query directly, POST to https://portal.sqd.dev/datasets/{dataset}/stream. The full API is described at https://docs.sqd.dev/openapi.json, and responses to the stream endpoints are JSON Lines.","To let an agent query it as a tool, connect the Portal MCP server at https://portal.sqd.dev/mcp.","Every page on this site is available as Markdown by appending .md to its URL."]},"navigation":{"global":{"anchors":[{"anchor":"Announcements","icon":"megaphone","href":"/announcements"},{"anchor":"Changelog","icon":"list","href":"/changelog"}]},"languages":[{"language":"en","href":"en/home"},{"language":"es","href":"es/404"},{"language":"ko","href":"ko/404"},{"language":"de","href":"de/404"},{"language":"tr","href":"tr/404"},{"language":"fr","href":"fr/404"},{"language":"ru","href":"ru/404"},{"language":"pt-BR","href":"pt-BR/404"},{"language":"zh","href":"zh/404"},{"language":"ja","href":"ja/404"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"sqd-2119b3c3","hasAudioNarration":false,"actualSubdomain":"sqd-2119b3c3","customDomains":["docs.sqd.dev"],"gitSource":{"type":"github","owner":"subsquid-labs","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae90cd803d366123a8ebaea","collectionId":"99da8d5e-d9f2-4343-a51c-d9f4b1604bfb","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae90cd803d366123a8ebaea"},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae90cd803d366123a8ebaea","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"en","tag":"Build","count":386},{"language":"en","tag":"Squid SDK","count":224},{"language":"en","tag":"Reference","count":219},{"language":"en","tag":"Networks \u0026 Schemas","count":199},{"language":"en","tag":"EVM","count":134},{"language":"en","tag":"EVM Data","count":108},{"language":"en","tag":"Guides","count":108},{"language":"en","tag":"Solana","count":105},{"language":"en","tag":"Supported Networks","count":93},{"language":"en","tag":"Pipes SDK","count":83}],"searchSettings":{"maxResults":10,"isFiltersEnabled":true}},"assistantConfig":{"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"deflection":{"enabled":true,"type":"email","email":"[email protected]"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","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":"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":"llms-txt-v2","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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--hl-bg:#f0f1f5;--hl-cmd:#111827;--hl-line-num:#9ca3af;--hl-key:#2563eb;--hl-flag:#0284c7;--hl-str:#b45309;--hl-num:#16a34a;--hl-bool:#c026d3;--hl-comment:#6b7280}:root[class~=dark]{--hl-bg:#131316;--hl-cmd:#e6edf3;--hl-line-num:#484f58;--hl-key:rgb(143,164,255);--hl-flag:rgb(85,205,255);--hl-str:rgb(255,196,124);--hl-num:rgb(137,209,150);--hl-bool:rgb(247,156,224);--hl-comment:rgb(115,115,130)}[data-mode=wide] table{margin-left:auto;margin-right:auto}.network-name-cell button{text-align:left}.mobile-nav-tabs-item[href=\"/en/data/all-networks\"],.nav-tabs-item[href=\"/en/data/all-networks\"]{display:none!important}:root[class~=dark]{--gray-950:14 15 17;--gray-900:19 19 22;--gray-800:28 28 32;--gray-700:46 46 51}#sidebar-content .sidebar-group-header,.breadcrumb-list,.breadcrumb-list .breadcrumb-item,.sqd-microlabel{font-family:var(--font-mono-sqd);font-size:.6875rem;font-weight:550;letter-spacing:.08em;text-transform:uppercase}#sidebar-content .sidebar-group-header{color:#8b8d9e}:root[class~=dark] #sidebar-content .sidebar-group-header,:root[class~=dark] .sqd-microlabel-muted{color:#8a8a93}.sqd-microlabel-muted{color:#8b8d9e}.sqd-pg-label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;font-weight:500;color:rgba(17,17,21,.62)}:root[class~=dark] .sqd-pg-label,:root[class~=dark] .sqd-pg-net{color:rgba(247,248,248,.62)}.sqd-pg-net{font-size:13px;letter-spacing:-.003em;border-radius:.25rem;background:0 0;color:rgba(17,17,21,.62);transition:color .15s,background-color .15s}.sqd-pg-net:hover{color:rgba(17,17,21,.85)}.sqd-pg-net[aria-pressed=true]{background:#e5e7eb;color:#111115;font-weight:510}:root[class~=dark] .sqd-pg-net:hover{color:rgba(247,248,248,.85)}:root[class~=dark] .sqd-pg-net[aria-pressed=true]{background:#1c1c20;color:#f7f8f8}.sqd-pg-panel{border:1px solid rgba(229,231,235,.8);border-radius:.375rem}:root[class~=dark] .sqd-pg-panel{border-color:rgba(36,36,40,.7)}.sqd-pg-bar{background:rgba(229,231,235,.25);border-bottom:1px solid rgba(229,231,235,.8)}:root[class~=dark] .sqd-pg-bar{background:rgba(28,28,32,.25);border-bottom-color:rgba(36,36,40,.7)}.sqd-pg-bar-b{background:rgba(229,231,235,.25);border-top:1px solid rgba(229,231,235,.8)}:root[class~=dark] .sqd-pg-bar-b{background:rgba(28,28,32,.25);border-top-color:rgba(36,36,40,.7)}.sqd-pg-tab{font-size:13px;font-weight:510;letter-spacing:-.003em;border-radius:.25rem;color:rgba(17,17,21,.62);transition:color .15s,background-color .15s}.sqd-pg-tab:hover{color:rgba(17,17,21,.85)}.sqd-pg-tab-active{color:#111115;background:rgba(229,231,235,.6)}:root[class~=dark] .sqd-pg-tab{color:rgba(247,248,248,.62)}:root[class~=dark] .sqd-pg-tab:hover{color:rgba(247,248,248,.85)}:root[class~=dark] .sqd-pg-tab-active{color:#f7f8f8;background:rgba(28,28,32,.6)}.sqd-pg-dim{color:rgba(17,17,21,.62)}:root[class~=dark] .sqd-pg-dim{color:rgba(247,248,248,.62)}.sqd-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.sqd-no-scrollbar::-webkit-scrollbar{display:none}.sqd-pg-select{background:#f8f9fb;border:1px solid #d1d5db;border-radius:.5rem;color:#111115}:root[class~=dark] .sqd-pg-select{background:#131316;border-color:#2e2e33;color:#f7f8f8}.sqd-pg-code{font-family:var(--font-mono-sqd);font-size:13px;line-height:1.7;color:rgba(17,17,21,.9)}:root[class~=dark] .sqd-pg-code{color:rgba(247,248,248,.9)}.sqd-pg-line{display:flex}.sqd-pg-line:hover{background:rgba(0,0,0,.03)}:root[class~=dark] .sqd-pg-line:hover{background:rgba(255,255,255,.03)}.sqd-pg-num{width:44px;flex-shrink:0;text-align:right;padding-right:1.25rem;font-size:12px;line-height:1.7;color:rgba(17,17,21,.25);user-select:none;font-variant-numeric:tabular-nums}:root[class~=dark] .sqd-pg-num{color:rgba(247,248,248,.25)}main h1{letter-spacing:-.032em}main h2{letter-spacing:-.022em}.sqd-btn-primary-docs{background-color:#18181b;color:#fff;border:1px solid transparent;border-radius:.375rem;font-weight:510;letter-spacing:-.011em;transition:background-color .16s cubic-bezier(.25,.46,.45,.94),box-shadow .16s cubic-bezier(.25,.46,.45,.94)}.sqd-btn-primary-docs:hover{background-color:#27272a}:root[class~=dark] .sqd-btn-primary-docs{background-color:#f7f8f8;color:#08090a}:root[class~=dark] .sqd-btn-primary-docs:hover{background-color:#fff;box-shadow:rgba(0,0,0,.08) 0 0 1px,rgba(0,0,0,.07) 0 1px 1px,rgba(0,0,0,.04) 0 3px 2px}.sqd-btn-secondary-docs{background-color:transparent;color:#27272a;border:1px solid rgba(0,0,0,.18);border-radius:.375rem;font-weight:510;letter-spacing:-.011em;transition:background-color .16s cubic-bezier(.25,.46,.45,.94),border-color .16s cubic-bezier(.25,.46,.45,.94),color .16s cubic-bezier(.25,.46,.45,.94)}.sqd-btn-secondary-docs:hover{background-color:#f4f4f5;border-color:rgba(0,0,0,.25);color:#09090b}:root[class~=dark] .sqd-btn-secondary-docs{color:#f7f8f8;border-color:#1c1c20}:root[class~=dark] .sqd-btn-secondary-docs:hover{background-color:rgba(255,255,255,.04);border-color:#2e2e33;color:#fff}#navbar span.bg-primary-dark{background-color:#18181b!important;border-radius:.375rem}#navbar a:has(.bg-primary-dark),#navbar a:has(.bg-primary-dark) span,#navbar a:has(.bg-primary-dark) svg{color:#fff!important}:root[class~=dark] #navbar span.bg-primary-dark{background-color:#f7f8f8!important}:root[class~=dark] #navbar a:has(.bg-primary-dark),:root[class~=dark] #navbar a:has(.bg-primary-dark) span,:root[class~=dark] #navbar a:has(.bg-primary-dark) svg{color:#08090a!important}:root[class~=dark] #sidebar-content .dark\\:text-primary-light{color:#a5b4fc!important}:root[class~=dark] #sidebar-content .bg-primary\\/10,:root[class~=dark] #sidebar-content .dark\\:bg-primary-light\\/10{background-color:rgba(165,180,252,.08)!important}:root[class~=dark] #table-of-contents-layout li[data-active]>a{color:#a5b4fc!important;border-left-color:#2e2e33!important}:root[class~=dark] pre span[style*=\"--shiki-dark: #569CD6\"i]{--shiki-dark:rgb(143, 164, 255)!important}:root[class~=dark] pre span[style*=\"--shiki-dark: #C586C0\"i]{--shiki-dark:rgb(247, 156, 224)!important}:root[class~=dark] pre span[style*=\"--shiki-dark: #CE9178\"i]{--shiki-dark:rgb(255, 196, 124)!important}:root[class~=dark] pre span[style*=\"--shiki-dark: #B5CEA8\"i]{--shiki-dark:rgb(137, 209, 150)!important}:root[class~=dark] pre span[style*=\"--shiki-dark: #6A9955\"i]{--shiki-dark:rgb(115, 115, 130)!important}:root[class~=dark] pre span[style*=\"--shiki-dark: #4FC1FF\"i],:root[class~=dark] pre span[style*=\"--shiki-dark: #DCDCAA\"i]{--shiki-dark:rgb(85, 205, 255)!important}:root[class~=dark] pre span[style*=\"--shiki-dark: #9CDCFE\"i],:root[class~=dark] pre span[style*=\"--shiki-dark: #D4D4D4\"i]{--shiki-dark:rgb(232, 232, 236)!important}[role=listbox]:focus-visible,[role=menu]:focus-visible{outline:0!important}#navbar>.bg-background-light{background-color:rgba(250,250,250,.9)!important;backdrop-filter:blur(16px) saturate(1.4);-webkit-backdrop-filter:blur(16px) saturate(1.4)}:root[class~=dark] #navbar>.bg-background-light{background-color:rgba(8,9,10,.85)!important}#sqd-safari-edge{display:none}@media (max-width:1023px){#sqd-safari-edge{display:block;position:fixed;top:0;left:0;right:0;height:8px;background-color:#fff;pointer-events:none;z-index:40}:root[class~=dark] #sqd-safari-edge{background-color:#08090a}}::selection{background:rgba(99,102,241,.2);color:#09090b}:root[class~=dark] ::selection{color:#f4f4f5}html{scrollbar-width:thin}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:#fff}::-webkit-scrollbar-thumb{background:#d4d4d8;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#a1a1aa}:root[class~=dark] ::-webkit-scrollbar-track{background:#08090a}:root[class~=dark] ::-webkit-scrollbar-thumb{background:#2a2a2e}:root[class~=dark] ::-webkit-scrollbar-thumb:hover{background:#3f3f46}@layer utilities{#banner{background:#eef2ff!important;border-bottom:1px solid #dfe5ff}#banner,#banner button:hover,#banner button:hover path,#banner button:hover svg,#banner div,#banner p,#banner span{color:#18181b!important}#banner button,#banner path,#banner svg{color:rgba(24,24,27,.55)!important}#banner a{color:#4f46e5!important;font-weight:550}#banner a:hover{text-decoration:underline}#banner button:hover{background:rgba(79,70,229,.08)!important}:root[class~=dark] #banner{background:#16161f!important;border-bottom:1px solid rgba(165,180,252,.18);color:#f7f8f8!important}:root[class~=dark] #banner button:hover,:root[class~=dark] #banner button:hover path,:root[class~=dark] #banner button:hover svg,:root[class~=dark] #banner div,:root[class~=dark] #banner p,:root[class~=dark] #banner span{color:#f7f8f8!important}:root[class~=dark] #banner button,:root[class~=dark] #banner path,:root[class~=dark] #banner svg{color:rgba(247,248,248,.55)!important}:root[class~=dark] #banner a{color:#a5b4fc!important}:root[class~=dark] #banner button:hover{background:rgba(165,180,252,.12)!important}}.card{border-radius:.5rem;background-color:#fff;border-color:#e5e7eb;box-shadow:0 1px 3px rgba(18,42,66,.04);transition:border-color .16s cubic-bezier(.25,.46,.45,.94),box-shadow .16s cubic-bezier(.25,.46,.45,.94),filter .16s cubic-bezier(.25,.46,.45,.94)}.card:hover{box-shadow:0 4px 12px rgba(18,42,66,.08),0 1px 3px rgba(18,42,66,.04)}:root[class~=dark] .card{background-color:#131316;border-color:#1c1c20;box-shadow:none}:root[class~=dark] .card:hover{box-shadow:0 2px 8px rgba(0,0,0,.4),0 0 0 1px rgba(255,255,255,.04);filter:brightness(1.15)}@layer utilities{.card:hover{border-color:#d1d5db!important}:root[class~=dark] .card:hover{border-color:#2e2e33!important}}#content-area table th,.prose table th{font-size:.8125rem;font-weight:550;letter-spacing:-.006em;text-transform:none;color:rgba(24,24,27,.85);background-color:#f8f9fb;border-bottom:1px solid #e5e7eb}:root[class~=dark] #content-area table th,:root[class~=dark] .prose table th{color:rgba(247,248,248,.85);background-color:rgba(255,255,255,.02);border-bottom-color:#242428}#content-area table:not(.not-prose *),.prose table:not(.not-prose *){border-collapse:separate;border-spacing:0;border:1px solid #e5e7eb;border-radius:.5rem;letter-spacing:-.011em}:root[class~=dark] #content-area table:not(.not-prose *),:root[class~=dark] .prose table:not(.not-prose *){border-color:#1c1c20}#content-area table:not(.not-prose *) th,.prose table:not(.not-prose *) th{padding:.6875rem 1rem}#content-area table:not(.not-prose *) td,.prose table:not(.not-prose *) td{padding:.875rem 1rem;border-bottom:1px solid #e9eaee;transition:background-color .15s ease}:root[class~=dark] #content-area table:not(.not-prose *) td,:root[class~=dark] .prose table:not(.not-prose *) td{border-bottom-color:#1c1c20}#content-area table:not(.not-prose *) tbody tr:last-child td,.prose table:not(.not-prose *) tbody tr:last-child td{border-bottom:none}#content-area table:not(.not-prose *) thead tr:first-child th:first-child,.prose table:not(.not-prose *) thead tr:first-child th:first-child{border-top-left-radius:calc(.5rem - 1px)}#content-area table:not(.not-prose *) thead tr:first-child th:last-child,.prose table:not(.not-prose *) thead tr:first-child th:last-child{border-top-right-radius:calc(.5rem - 1px)}#content-area table:not(.not-prose *) tbody tr:last-child td:first-child,.prose table:not(.not-prose *) tbody tr:last-child td:first-child{border-bottom-left-radius:calc(.5rem - 1px)}#content-area table:not(.not-prose *) tbody tr:last-child td:last-child,.prose table:not(.not-prose *) tbody tr:last-child td:last-child{border-bottom-right-radius:calc(.5rem - 1px)}#content-area table:not(.not-prose *) tbody tr:hover td,.prose table:not(.not-prose *) tbody tr:hover td{background-color:rgba(230,233,240,.4)}:root[class~=dark] #content-area table:not(.not-prose *) tbody tr:hover td,:root[class~=dark] .prose table:not(.not-prose *) tbody tr:hover td{background-color:rgba(255,255,255,.03)}#content-area table:not(.not-prose *) tbody td:first-child,.prose table:not(.not-prose *) tbody td:first-child{font-weight:510;color:#18181b}:root[class~=dark] #content-area table:not(.not-prose *) tbody td:first-child,:root[class~=dark] .prose table:not(.not-prose *) tbody td:first-child{color:#f7f8f8}#content-area :not(pre)>code,.prose :not(pre)>code{background-color:#f4f4f5;border:1px solid #e4e4e7;border-radius:.25rem;padding:.125rem .375rem;color:#18181b}:root[class~=dark] #content-area :not(pre)>code,:root[class~=dark] .prose :not(pre)>code{background-color:#1a1a1e;border-color:#242428;color:#f7f8f8}.code-block,.code-block-background{border-radius:.5rem}.code-block{border-color:#e5e7eb}.code-block-background{background-color:#fafbfc!important}:root[class~=dark] .code-block{border-color:#1c1c20}:root[class~=dark] .code-block-background{background-color:#0e0f11!important;box-shadow:none}#content-area .tree{--tree-highlight:rgb(var(--primary));margin:1.25rem 0;padding:.5rem .25rem;border:1px solid #e5e7eb;border-radius:.5rem;background-color:#fafbfc}:root[class~=dark] #content-area .tree{border-color:#1c1c20;background-color:#0e0f11}[role=dialog]{border-radius:.75rem;box-shadow:0 8px 32px rgba(0,0,0,.1),0 0 0 1px rgba(0,0,0,.06)}:root[class~=dark] [role=dialog]{background-color:#131316;box-shadow:0 8px 32px rgba(0,0,0,.5),0 0 0 1px #242428}#footer{background-color:#fff;border-top-color:rgba(0,0,0,.06)}:root[class~=dark] #footer{background-color:transparent;border-top-color:#1c1c20}#footer a.text-sm{color:#52525b;transition:color .16s ease-out}#footer a.text-sm:hover{color:#09090b}:root[class~=dark] #footer a.text-sm,:root[class~=dark] .callout[data-callout-type=info] svg{color:#8a8a93}:root[class~=dark] #footer a.text-sm:hover{color:#f7f8f8}img[src*=\"/images/chains/hyperliquid.svg\"],img[src*=\"/images/chains/polkadot.svg\"],img[src*=\"/images/chains/solana.svg\"],img[src*=\"/images/chains/tron.svg\"]{object-position:-999px -999px;background-color:currentColor;mask-repeat:no-repeat;mask-position:center;mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain}img[src*=\"/images/chains/solana.svg\"]{mask-image:url(/images/chains/solana.svg);-webkit-mask-image:url(/images/chains/solana.svg)}img[src*=\"/images/chains/polkadot.svg\"]{mask-image:url(/images/chains/polkadot.svg);-webkit-mask-image:url(/images/chains/polkadot.svg)}img[src*=\"/images/chains/hyperliquid.svg\"]{mask-image:url(/images/chains/hyperliquid.svg);-webkit-mask-image:url(/images/chains/hyperliquid.svg)}img[src*=\"/images/chains/tron.svg\"]{mask-image:url(/images/chains/tron.svg);-webkit-mask-image:url(/images/chains/tron.svg)}.callout{border-radius:.5rem}.callout [data-component-part=callout-content],.callout [data-component-part=callout-content] p{color:#404046}:root[class~=dark] .callout [data-component-part=callout-content],:root[class~=dark] .callout [data-component-part=callout-content] p{color:#a0a0a5}@layer utilities{.callout[data-callout-type=info] a,.callout[data-callout-type=note] a{color:#4f46e5!important}:root[class~=dark] .callout[data-callout-type=info] a,:root[class~=dark] .callout[data-callout-type=note] a{color:#a5b4fc!important}.callout[data-callout-type=warning] a{color:#b45309!important}:root[class~=dark] .callout[data-callout-type=warning] a{color:#fbbf24!important}.callout[data-callout-type=check] a,.callout[data-callout-type=tip] a{color:#16a34a!important}:root[class~=dark] .callout[data-callout-type=check] a,:root[class~=dark] .callout[data-callout-type=tip] a{color:#4ade80!important}.callout[data-callout-type=danger] a,.callout[data-callout-type=error] a{color:#dc2626!important}:root[class~=dark] .callout[data-callout-type=danger] a,:root[class~=dark] .callout[data-callout-type=error] a{color:#f87171!important}}.callout[data-callout-type=info]{background-color:#f8f9fb;border-color:#e5e7eb}.callout[data-callout-type=info] svg{color:#8a8f98}:root[class~=dark] .callout[data-callout-type=info]{background-color:rgba(255,255,255,.03);border-color:#242428}.callout[data-callout-type=note]{background-color:rgba(79,70,229,.04);border-color:rgba(79,70,229,.16)}.callout[data-callout-type=note] svg{color:#4f46e5}:root[class~=dark] .callout[data-callout-type=note]{background-color:rgba(165,180,252,.06);border-color:rgba(165,180,252,.16)}:root[class~=dark] .callout[data-callout-type=note] svg{color:#a5b4fc}.callout[data-callout-type=warning]{background-color:rgba(217,119,6,.05);border-color:rgba(217,119,6,.22)}.callout[data-callout-type=warning] svg{color:#b45309}:root[class~=dark] .callout[data-callout-type=warning]{background-color:rgba(251,191,36,.06);border-color:rgba(251,191,36,.16)}:root[class~=dark] .callout[data-callout-type=warning] svg{color:#fbbf24}.callout[data-callout-type=check],.callout[data-callout-type=tip]{background-color:rgba(22,163,74,.05);border-color:rgba(22,163,74,.2)}.callout[data-callout-type=check] svg,.callout[data-callout-type=tip] svg{color:#16a34a}:root[class~=dark] .callout[data-callout-type=check],:root[class~=dark] .callout[data-callout-type=tip]{background-color:rgba(74,222,128,.06);border-color:rgba(74,222,128,.15)}:root[class~=dark] .callout[data-callout-type=check] svg,:root[class~=dark] .callout[data-callout-type=tip] svg{color:#4ade80}.callout[data-callout-type=danger],.callout[data-callout-type=error]{background-color:rgba(220,38,38,.05);border-color:rgba(220,38,38,.22)}.callout[data-callout-type=danger] svg,.callout[data-callout-type=error] svg{color:#dc2626}:root[class~=dark] .callout[data-callout-type=danger],:root[class~=dark] .callout[data-callout-type=error]{background-color:rgba(248,113,113,.06);border-color:rgba(248,113,113,.18)}:root[class~=dark] .callout[data-callout-type=danger] svg,:root[class~=dark] .callout[data-callout-type=error] svg{color:#f87171}.sqd-nt-frame{background:#fff;border:1px solid #e5e7eb;border-radius:.5rem;box-shadow:0 1px 3px rgba(18,42,66,.04);overflow:hidden}:root[class~=dark] .sqd-nt-frame{background:0 0;border-color:#1c1c20;box-shadow:none}.sqd-nt-toolbar{background:#f8f9fb;border-bottom:1px solid #e5e7eb}.sqd-nt-frame .sqd-nt-scroll{overflow-x:auto;overscroll-behavior-x:contain}:root[class~=dark] .sqd-nt-toolbar{background:rgba(255,255,255,.02);border-bottom-color:#242428}.sqd-nt-frame .sqd-nt-table{padding:0}.sqd-nt-frame .sqd-nt-table div[class*=page-padding]{padding-left:0;padding-right:0}.sqd-nt-frame .sqd-nt-table table{margin:0}.sqd-nt-frame .sqd-nt-table td{min-width:0;overflow:hidden}.sqd-nt-frame .sqd-nt-table td[class*=text-center],.sqd-nt-frame .sqd-nt-table th[class*=text-center]{text-align:center}.sqd-nt-table tbody tr{border-bottom:1px solid #e9eaee;transition:background-color .15s ease}.sqd-nt-table tbody tr:last-child{border-bottom:none}:root[class~=dark] .sqd-nt-table tbody tr{border-bottom-color:#1c1c20}.sqd-nt-table tbody tr:hover{background-color:rgba(230,233,240,.4)}:root[class~=dark] .sqd-nt-table tbody tr:hover{background-color:rgba(255,255,255,.03)}.sqd-nt-table th{transition:background-color .15s ease}.sqd-nt-table th:hover{background-color:#eef0f4}:root[class~=dark] .sqd-nt-table th:hover{background-color:rgba(255,255,255,.05)}.sqd-nt-name{color:#18181b;font-weight:510}:root[class~=dark] .sqd-nt-name{color:#f7f8f8}.sqd-nt-name-link{color:inherit;text-decoration:none;transition:color .15s ease}.sqd-nt-name-link:hover{color:#4f46e5;text-decoration:underline;text-underline-offset:3px}:root[class~=dark] .sqd-nt-name-link:hover{color:#a5b4fc}.sqd-nt-logo{display:inline-flex;flex:none;align-items:center;justify-content:center;width:20px;height:20px;border-radius:9999px;overflow:hidden}.sqd-nt-logo img{display:block;width:100%;height:100%;margin:0;object-fit:contain}.sqd-nt-logo--dark,.sqd-nt-logo--white{padding:3px}.sqd-nt-logo--white{background:#fff}.sqd-nt-logo--dark{background:#0f0f11}.sqd-nt-logo--mono{background:#f4f4f5;color:#71717a;font-size:.625rem;font-weight:600}:root[class~=dark] .sqd-nt-logo--mono{background:#1a1a1e;color:#a1a1aa}.sqd-nt-cell{color:#52525b}:root[class~=dark] .sqd-nt-cell{color:#a1a1aa}.sqd-nt-dim{color:#71717a}:root[class~=dark] .sqd-nt-dim{color:rgba(247,248,248,.62)}.sqd-nt-dot{display:inline-block;width:7px;height:7px;border-radius:9999px;background:#16a34a;box-shadow:0 0 0 3px rgba(22,163,74,.12)}:root[class~=dark] .sqd-nt-dot{background:#4ade80;box-shadow:0 0 0 3px rgba(74,222,128,.1)}.sqd-nt-no{color:#8b919c;font-weight:500;user-select:none}:root[class~=dark] .sqd-nt-no{color:#6b6b76}.sqd-nt-ok{color:#16a34a}:root[class~=dark] .sqd-nt-ok{color:#4ade80}.sqd-nt-badge{display:inline-flex;align-items:center;font-size:.625rem;font-weight:550;letter-spacing:.05em;text-transform:uppercase;padding:.1875rem .5rem;border-radius:9999px;background:#f4f4f5;color:#52525b;border:1px solid #e4e4e7;line-height:1.4;white-space:nowrap}:root[class~=dark] .sqd-nt-badge{background:#1a1a1e;color:#a1a1aa;border-color:#2e2e33}.sqd-nt-badge--vm{background:#eef2ff;color:#4f46e5;border-color:#e0e7ff}:root[class~=dark] .sqd-nt-badge--vm{background:rgba(99,102,241,.12);color:#a5b4fc;border-color:rgba(99,102,241,.28)}a.sqd-nt-badge--tier{text-decoration:none;transition:border-color .15s ease}.sqd-nt-badge--core{background:rgba(217,119,6,.08);color:#b45309;border-color:rgba(217,119,6,.18)}a.sqd-nt-badge--core:hover{border-color:rgba(217,119,6,.36)}:root[class~=dark] .sqd-nt-badge--core{background:rgba(245,158,11,.12);color:#fbbf24;border-color:rgba(245,158,11,.22)}:root[class~=dark] a.sqd-nt-badge--core:hover{border-color:rgba(245,158,11,.44)}.sqd-nt-badge--partner{background:rgba(8,145,178,.07);color:#0e7490;border-color:rgba(8,145,178,.15)}a.sqd-nt-badge--partner:hover{border-color:rgba(8,145,178,.32)}:root[class~=dark] .sqd-nt-badge--partner{background:rgba(34,211,238,.1);color:#22d3ee;border-color:rgba(34,211,238,.2)}:root[class~=dark] a.sqd-nt-badge--partner:hover{border-color:rgba(34,211,238,.4)}.sqd-nt-badge--frontier{background:rgba(124,58,237,.07);color:#6d28d9;border-color:rgba(124,58,237,.15)}a.sqd-nt-badge--frontier:hover{border-color:rgba(124,58,237,.32)}:root[class~=dark] .sqd-nt-badge--frontier{background:rgba(167,139,250,.12);color:#a78bfa;border-color:rgba(167,139,250,.22)}:root[class~=dark] a.sqd-nt-badge--frontier:hover{border-color:rgba(167,139,250,.44)}.sqd-nt-badge--retiring,a.sqd-nt-badge--retiring{background:rgba(225,29,72,.07);color:#be123c;border-color:rgba(225,29,72,.18);text-decoration:none;transition:background .15s ease,border-color .15s ease}a.sqd-nt-badge--retiring:hover{background:rgba(225,29,72,.13);border-color:rgba(225,29,72,.32)}:root[class~=dark] .sqd-nt-badge--retiring,:root[class~=dark] a.sqd-nt-badge--retiring{background:rgba(251,113,133,.1);color:#fda4af;border-color:rgba(251,113,133,.22)}:root[class~=dark] a.sqd-nt-badge--retiring:hover{background:rgba(251,113,133,.18);border-color:rgba(251,113,133,.38)}.sqd-nt-chip{width:fit-content;white-space:nowrap;font-family:var(--font-mono-sqd, \"JetBrains Mono\", ui-monospace, monospace);font-size:.75rem;background:#f4f4f5;border:1px solid #e4e4e7;border-radius:.25rem;padding:.125rem .375rem;color:#18181b}:root[class~=dark] .sqd-nt-chip{background:#1a1a1e;border-color:#242428;color:#d6d6dc}.sqd-nt-copy{color:#71717a;border-radius:.25rem;padding:.25rem;transition:color .15s ease,background-color .15s ease}.sqd-nt-copy svg{background-color:currentColor!important}.sqd-nt-copy:hover{color:#18181b;background:rgba(0,0,0,.04)}:root[class~=dark] .sqd-nt-copy{color:rgba(247,248,248,.62)}:root[class~=dark] .sqd-nt-copy:hover{color:#f7f8f8;background:rgba(255,255,255,.06)}.sqd-nt-control{background-color:#fff;border:1px solid #d4d4d8;border-radius:.375rem;color:#27272a;font-size:14px;font-weight:510;letter-spacing:-.011em;transition:border-color .16s ease,background-color .16s ease}.sqd-nt-control:hover{border-color:#a1a1aa}.sqd-nt-control:focus-visible{outline:0;border-color:#6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.2)}:root[class~=dark] .sqd-nt-control{background-color:#131316;border-color:#2e2e33;color:#f7f8f8}:root[class~=dark] .sqd-nt-control:hover{border-color:#52525b}.sqd-nt-filter{flex:1 1 16rem;min-width:0;font-weight:400}.sqd-nt-actions{flex:0 1 auto;min-width:0}.sqd-nt-filter::placeholder{color:#a1a1aa}:root[class~=dark] .sqd-nt-filter::placeholder{color:#71717a}.sqd-nt-select{appearance:none;-webkit-appearance:none;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%2371717a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .625rem center;background-size:14px 14px}.sqd-nt-toggle-off{color:#71717a}:root[class~=dark] .sqd-nt-toggle-off{color:#a1a1aa}"},{"filePath":"fonts.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCm3FwrK3iLTcvnUwkT9nA2.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCm3FwrK3iLTcvnUwAT9nA2.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCm3FwrK3iLTcvnUwgT9nA2.woff2) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCm3FwrK3iLTcvnUwcT9nA2.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCm3FwrK3iLTcvnUwsT9nA2.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCm3FwrK3iLTcvnUwoT9nA2.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Inter';\n font-style: italic;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCm3FwrK3iLTcvnUwQT9g.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCo3FwrK3iLTcvvYwYL8g.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCo3FwrK3iLTcvmYwYL8g.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCo3FwrK3iLTcvuYwYL8g.woff2) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCo3FwrK3iLTcvhYwYL8g.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCo3FwrK3iLTcvtYwYL8g.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCo3FwrK3iLTcvsYwYL8g.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcCo3FwrK3iLTcviYwY.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: italic;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbX2o-flEEny0FZhsfKu5WU4xD-Cw6nSHrV.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: italic;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbX2o-flEEny0FZhsfKu5WU4xD-CwenSHrV.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: italic;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbX2o-flEEny0FZhsfKu5WU4xD-CwCnSHrV.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: italic;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbX2o-flEEny0FZhsfKu5WU4xD-CwynSHrV.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: italic;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbX2o-flEEny0FZhsfKu5WU4xD-Cw2nSHrV.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: italic;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbX2o-flEEny0FZhsfKu5WU4xD-CwOnSA.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD2OwG_TA.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD_OwG_TA.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD4OwG_TA.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD0OwG_TA.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD1OwG_TA.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'JetBrains Mono';\n font-style: normal;\n font-weight: 300 800;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/jetbrainsmono/v24/tDbV2o-flEEny0FZhsfKu5WU4xD7OwE.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n:root{--font-inter:\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\",\n \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;--font-mono-sqd:\"JetBrains Mono\", \"Menlo\", \"Monaco\", \"Lucida Console\",\n \"Liberation Mono\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\",\n \"Courier New\", monospace;--font-geist-mono:var(--font-mono-sqd)}body{letter-spacing:-.011em;font-feature-settings:normal;font-variant-numeric:normal;font-variant-ligatures:normal}.code,.hljs,code,pre{font-family:var(--font-mono-sqd)}.font-inter,body{font-family:var(--font-inter)}.font-mono{font-family:var(--font-mono-sqd)}.italic,em,i{font-style:italic;font-synthesis:none}div,h1,h2,h3,h4,h5,h6,p,span{font-feature-settings:\"ss01\" 0,\"ss02\" 0,\"ss03\" 0;font-variant-alternates:normal}"}],"page":{"pagePath":"en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer","slug":"/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer","pageMetadata":{"title":"Automatically generate an indexer","description":"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.","href":"/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Warning,{children:_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`squid-gen`}),` tools generate a `,_jsx(_components.strong,{children:`legacy pre-Portal squid`}),` built on the deprecated v2 gateway + `,_jsx(_components.code,{children:`SQD_API_KEY`}),` stack. The generated project is `,_jsx(_components.strong,{children:`incompatible with the Portal-based flow used throughout the rest of this section`}),`. To modernize the generated code, follow the `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/migration/gateway-to-portal`,children:`gateway-to-Portal migration guide`}),`.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`V2 gateway requests require an API key. Set `,_jsx(_components.code,{children:`SQD_API_KEY`}),` in `,_jsx(_components.code,{children:`.env`}),` before running gateway-based examples, or pass `,_jsx(_components.code,{children:`apiKey: process.env.SQD_API_KEY`}),` in `,_jsx(_components.code,{children:`GatewaySettings`}),`.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`As of 2025-01-01 we no longer maintain the old `,_jsx(_components.code,{children:`squid-gen`}),` tool.`]})}),`\n`,_jsxs(_components.p,{children:[`SQD provides `,_jsx(_components.a,{href:`https://github.com/subsquid/squid-gen`,children:`tools`}),` for generating ready-to-use squids that index events and function calls of smart contracts. EVM/Solidity and WASM/ink! smart contracts are supported. The tools can be configured to make squids that save data to a `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/writing-to-postgres`,children:`PostgreSQL database`}),` or to a `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/other-data-destinations`,children:`file-based dataset`}),`. All that is required is NodeJS, `,_jsx(_components.a,{href:`/en/cloud/reference/cli/installation`,children:`Squid CLI`}),` and, if your squid will be using a database, Docker.`]}),`\n`,_jsx(_components.p,{children:`Squid generation procedure is very similar for both contract types. Here are the steps:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Create a new blank squid with `,_jsx(_components.code,{children:`sqd init`}),` using a suitable template:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# for EVM/Solidity contracts`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sqd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` init`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-squid`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -t`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` abi`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# OR`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# for WASM/ink! contracts`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sqd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` init`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-squid`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -t`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://github.com/subsquid-labs/squid-ink-abi-template`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Enter the squid folder and install the dependencies:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-squid`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ci`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Write the `,_jsx(_components.a,{href:`#configuration`,children:`configuration`}),` of the future squid to `,_jsx(_components.code,{children:`squidgen.yaml`}),`. Retrieve any necessary contract ABIs and store them at `,_jsx(_components.code,{children:`./abi`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Alternatively, skip to the next step and specify the configuration via CLI. `,_jsx(_components.strong,{children:`Note:`}),` some features will not be available.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Generate and build the squid code:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` squid-gen`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` config`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` squidgen.yaml`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`If you chose to configure the tool via CLI instead, do so now. Here’s an example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` squid-gen-abi`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --address`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0x2E645469f354BB4F5c8a05B3b30A929361cf77eC`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --archive`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://v2.archive.subsquid.io/network/ethereum-mainnet`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --event`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` NewGravatar`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --event`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` UpdatedGravatar`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --function`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '*'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --from`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 6000000`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.code,{children:`npx squid-gen-abi --help`}),` for all options.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Prepare your squid for launching. If it is using a database, start a PostgreSQL container, then regenerate and apply migrations:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` squid-typeorm-migration`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` generate`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` squid-typeorm-migration`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` apply`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If it is storing its data to a dataset, `,_jsx(_components.a,{href:`#strip-the-squid-folder-for-file-store`,children:`strip the project folder of database-related facilities`}),` that are no longer needed.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Test the complete squid by running it locally. Start a `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/design`,children:`processor`}),` with`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`node`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -r`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` dotenv/config`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` lib/main.js`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If your squid will be serving GraphQL also run `,_jsx(_components.code,{children:`npx squid-graphql-server`}),` in a separate terminal. Make sure that the squid saves the requested data to its target:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`if it is serving GraphQL, visit the local `,_jsx(_components.a,{href:`http://localhost:4350/graphql`,children:`GraphiQL playground`}),`;`]}),`\n`,_jsxs(_components.li,{children:[`for PostgreSQL-based squids you can also connect to the database with `,_jsx(_components.code,{children:`PGPASSWORD=postgres psql -U postgres -p 23798 -h localhost squid`}),` and take a look at the contents;`]}),`\n`,_jsxs(_components.li,{children:[`if it is storing data to a file-based dataset, wait for the first filesystem sync then verify that all the expected files are present and contain the expected data. If your squid produces data at a low rate, you may have to tweak the `,_jsxs(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/other-data-destinations#overview`,children:[_jsx(_components.code,{children:`chunkSizeMb`}),` setting`]}),` and/or add a `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/other-data-destinations#filesystem-datasets`,children:_jsx(_components.code,{children:`ctx.store.setForceFlush()`})}),` call to manually write dataset chunks at appropriate intervals.`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`At this point your squid is ready. You can run it on your own infrastructure or `,_jsx(_components.a,{href:`/en/cloud`,children:`deploy it to SQD Cloud`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`configuration`,children:`Configuration`}),`\n`,_jsxs(_components.p,{children:[`A valid config for the `,_jsx(_components.code,{children:`squid-gen config`}),` is a YAML file with the following sections:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`archive`}),` is an endpoint URL of a `,_jsx(_components.a,{href:`/en/network/overview`,children:`SQD Network`}),` gateway. Find an appropriate gateway at the `,_jsx(_components.a,{href:`/en/data/evm`,children:`Supported networks`}),` page or with `,_jsx(_components.a,{href:`/en/cloud/reference/cli/gateways`,children:_jsx(_components.code,{children:`sqd gateways`})}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`target`}),` section describes how the scraped data should be stored. Set`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`target`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`postgres`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`to use a PostgreSQL database that can be presented to users as a GraphQL API or used as-is. Another option is to `,_jsx(_components.a,{href:`#file-store-targets`,children:`store the data to a file-based dataset`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`contracts`}),` is a list of contracts to be indexed. Define the following fields for each contract:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.strong,{children:`name`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.strong,{children:`address`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`range`}),` (optional): block range to be indexed. An object with `,_jsx(_components.code,{children:`from`}),` and `,_jsx(_components.code,{children:`to`}),` properties, each of which can be omitted. Defaults to indexing the whole chain.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`abi`}),` (optional on EVM): path to the contract JSON ABI. If omitted for an EVM contract, the tool will attempt to fetch the ABI by address from the Etherscan API or a compatible alternative set by the `,_jsx(_components.code,{children:`etherscanApi`}),` root option.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`proxy`}),` (EVM-only): when indexing a `,_jsx(_components.a,{href:`https://eips.ethereum.org/EIPS/eip-1967`,children:`proxy contract`}),` for events or calls defined in the implementation, set this option to its address and the `,_jsx(_components.code,{children:`address`}),` option to the address of the implementation contract. That way the tool will retrieve the ABI of the implementation and use it to index the output of the proxy.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`events`}),` (optional): a list of events to be indexed or a boolean value. Set to `,_jsx(_components.code,{children:`true`}),` to index all events defined in the ABI. Defaults to `,_jsx(_components.code,{children:`false`}),`, meaning that no events are to be indexed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`functions`}),` (EVM-only, optional): a list of functions the calls of which are to be indexed or a boolean value. Set to `,_jsx(_components.code,{children:`true`}),` to index calls of all functions defined in the ABI. Defaults to `,_jsx(_components.code,{children:`false`}),`, meaning that no function calls are to be indexed.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`etherscanApi`}),` (EVM-only, optional): Etherscan API-compatible endpoint to fetch contract ABI by a known address. Default: `,_jsx(_components.a,{href:`https://api.etherscan.io/`,children:`https://api.etherscan.io/`}),`.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`2`,id:`file-store-targets`,children:[_jsx(_components.code,{children:`file-store`}),` targets`]}),`\n`,_jsxs(_components.p,{children:[`Currently the only `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/other-data-destinations#filesystem-datasets`,children:`file-based data target type`}),` supported by `,_jsx(_components.code,{children:`squid-gen`}),` packages is `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/reference/data-stores/file-store/parquet`,children:_jsx(_components.code,{children:`parquet`})}),`. When used, it requires that the `,_jsx(_components.code,{children:`path`}),` field is also set alongside `,_jsx(_components.code,{children:`type`}),`. A `,_jsx(_components.code,{children:`path`}),` can be a local path or an URL pointing to a folder within a bucket on an S3-compatible cloud service.`]}),`\n`,_jsxs(_components.p,{children:[`Support for `,_jsx(_components.code,{children:`file-store`}),` is in alpha stage. Known caveats:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`If a S3 URL is used, then the S3 region, endpoint and user credentials will be `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/reference/data-stores/file-store/s3-dest`,children:`taken from the default environment variables`}),`. Fill your `,_jsx(_components.code,{children:`.env`}),` file and/or set your `,_jsx(_components.a,{href:`/en/cloud/resources/env-variables`,children:`SQD Cloud secrets`}),` accordingly.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Unlike their PostgreSQL-powered equivalents, the squids that use `,_jsx(_components.code,{children:`file-store`}),` may not write their data often. You may have to configure the `,_jsx(_components.code,{children:`chunkSizeMb`}),` parameter of the `,_jsx(_components.code,{children:`Database`}),` class and/or call `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/other-data-destinations#filesystem-datasets`,children:_jsx(_components.code,{children:`ctx.store.setForceFlush()`})}),` when appropriate to strike an acceptable balance between the lag of the indexed data and the number of files in the resulting dataset. See the `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/guides/other-data-destinations#filesystem-datasets`,children:`Filesystem datasets overview`}),` for details.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`For `,_jsx(_components.code,{children:`parquet`}),` targets, the `,_jsx(_components.a,{href:`/en/sdk/squid-sdk/evm/reference/data-stores/file-store/parquet#columns`,children:_jsx(_components.code,{children:`Decimal(38)`})}),` column type is used by the code generator to represent `,_jsx(_components.code,{children:`uint256`}),`. This is done for compatibility reasons: very few tools seem to support reading wider decimals from Parquet files. If you’re getting a lot of errors containing `,_jsx(_components.code,{children:`value ... does not fit into Decimal(38, 0)`}),`, consider replacing the `,_jsx(_components.code,{children:`Decimal(38)`}),` column type with `,_jsx(_components.code,{children:`Decimal(78)`}),` or `,_jsx(_components.code,{children:`String()`}),` at `,_jsx(_components.code,{children:`src/table.ts`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`At the moment, squids generated with file-based data targets contain a lot of facilities for managing the database and have to be `,_jsx(_components.a,{href:`#strip-the-squid-folder-for-file-store`,children:`stripped`}),` of them before use.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`2`,id:`strip-the-squid-folder-for-file-store`,children:[`Strip the squid folder for `,_jsx(_components.code,{children:`file-store`})]}),`\n`,_jsxs(_components.p,{children:[`Steps to convert a squid made with a database-enabled template for use with `,_jsx(_components.code,{children:`file-store`}),`:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Remove unneeded files and packages.`}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`rm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` docker-compose.yml`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` uninstall`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @subsquid/graphql-server`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @subsquid/typeorm-migration`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @subsquid/typeorm-store`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @subsquid/util-internal-json`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pg`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` typeorm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @subsquid/typeorm-codegen`})]}),`\n`]})})}),`\n`,_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsxs(_components.li,{children:[`Replace `,_jsx(_components.code,{children:`commands.json`}),` with the one from the `,_jsx(_components.a,{href:`https://github.com/subsquid-labs/file-store-parquet-example`,children:`file-store-parquet-example repo`}),`.`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` commands.json`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://raw.githubusercontent.com/subsquid-labs/file-store-parquet-example/main/commands.json`})]}),`\n`]})})}),`\n`,_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`In `,_jsx(_components.code,{children:`squid.yaml`}),`, remove the `,_jsx(_components.code,{children:`deploy.addons`}),` section and replace the `,_jsx(_components.code,{children:`deploy.api`}),` section with`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` api:`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` cmd:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [ `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"sleep\",`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"3600\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ]`})]}),`\n`]})})}),`\n`,_jsxs(_components.ol,{start:`4`,children:[`\n`,_jsxs(_components.li,{children:[`Install any required `,_jsx(_components.code,{children:`file-store`}),` packages.`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\"# if target.type was `parquet`\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @subsquid/file-store-parquet`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# if target.path was an S3 URL`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @subsquid/file-store-s3`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`configuration-examples`,children:`Configuration examples`}),`\n`,_jsx(Heading,{level:`3`,id:`evm/solidity`,children:`EVM/Solidity`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Index `,_jsx(_components.code,{children:`LiquidationCall`}),` events of the `,_jsx(_components.a,{href:`https://etherscan.io/address/0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9`,children:`AAVE V2 Lending Pool contract`}),`, starting from block 11362579 when it was deployed. Save the results to PostgreSQL. Use the ABI located at `,_jsx(_components.code,{children:`./abi/aave-v2-pool.json`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`archive`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`eth-mainnet`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`target`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`postgres`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contracts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`aave-v2-pool`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` abi`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`./abi/aave-v2-pool.json`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` range`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`11362579`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` events`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`LiquidationCall`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Index events and function calls by the `,_jsx(_components.a,{href:`https://arbiscan.io/address/0x6c2c06790b3e3e3c38e12ee22f8183b37a13ee55`,children:`DPX contract`}),` (a proxy) on Arbitrum, based on the ABI of the `,_jsx(_components.a,{href:`https://arbiscan.io/address/0x3f770ac673856f105b586bb393d122721265ad46`,children:`implementation contract`}),` retrieved from `,_jsx(_components.a,{href:`https://arbiscan.io`,children:`Arbiscan`}),` API. Save the results to Parquet files at ’./data’.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`archive`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`arbitrum`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`target`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`parquet`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` path`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`./data`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contracts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dpx`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0x3f770Ac673856F105b586bb393d122721265aD46\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` proxy`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0x6C2C06790b3E3E3c38e12Ee22F8183b37a13EE55\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` events`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` functions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`etherscanApi`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://api.arbiscan.io/`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Note:`}),` this example is known to run into the integer length issue described in the `,_jsxs(_components.a,{href:`#file-store-targets`,children:[_jsx(_components.code,{children:`file-store`}),` targets`]}),` section. One way to make it work is to widen all `,_jsx(_components.code,{children:`Decimal`}),` column types from 38 to 78 symbols:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sed`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -i`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -e`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 's/38/78/g'`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` src/table.ts`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Index all events and function calls of the `,_jsx(_components.a,{href:`https://etherscan.io/address/0xc36442b4a4522e871399cd717abdd847ab11fe88`,children:`Positions NFT`}),` and `,_jsx(_components.a,{href:`https://etherscan.io/address/0x1f98431c8ad98523631ae4a59f267346ea31f984`,children:`Factory`}),` contracts of Uniswap, send the results to the `,_jsx(_components.code,{children:`uniswap-data`}),` folder of the `,_jsx(_components.code,{children:`subsquid-testing-data`}),` bucket.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`archive`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`eth-mainnet`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`target`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`parquet`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` path`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`s3://subsquid-testing-bucket/uniswap-data`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contracts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`positions`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0xC36442b4a4522E871399CD717aBDD847Ab11FE88\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` events`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` functions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`factory`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0x1F98431c8aD98523631AE4a59f267346ea31F984\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` events`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` functions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Notes:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`This example is also susceptible to the integer length issue and will drop at least two events if used as-is, without widening the column types.`}),`\n`,_jsxs(_components.li,{children:[`The generated squid requires some variables to be set to connect to S3. Here’s an example of what `,_jsx(_components.code,{children:`.env`}),` may look like:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`S3_REGION`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`us-east-1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`S3_ENDPOINT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://s3.filebase.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`S3_ACCESS_KEY_ID`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`myAccessKeyId`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`S3_SECRET_ACCESS_KEY`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`mySecretAccessKey`})]}),`\n`]})})}),`\n`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`wasm/ink`,children:`WASM/ink!`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Index `,_jsx(_components.code,{children:`Transfer`}),` events emitted by an ERC20 contract on Shibuya, save results to PostgreSQL. Do not forget to use the `,_jsx(_components.a,{href:`https://github.com/subsquid-labs/squid-ink-abi-template`,children:`ink-abi template`}),`!`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`archive`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`shibuya`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`target`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`postgres`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contracts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`testToken`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` abi`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"./abi/erc20.json\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0x5207202c27b646ceeb294ce516d4334edafbd771f869215cb070ba51dd7e2c72\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` events`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Transfer`})]}),`\n`]})})}),`\n`,_jsx(_components.strong,{children:`Note:`}),` you can get the ABI from the `,_jsx(_components.code,{children:`squid-gen`}),` repository:`,`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` abi/erc20.json`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://raw.githubusercontent.com/subsquid/squid-gen/master/tests/ink-erc20/abi/erc20.json`})]}),`\n`]})})}),`\n`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Automatically generate an indexer","description":"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.","href":"/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Configuration","slug":"configuration","depth":2,"children":[]},{"title":"file-store targets","slug":"file-store-targets","depth":2,"children":[]},{"title":"Strip the squid folder for file-store","slug":"strip-the-squid-folder-for-file-store","depth":2,"children":[]},{"title":"Configuration examples","slug":"configuration-examples","depth":2,"children":[{"title":"EVM/Solidity","slug":"evm/solidity","depth":3,"children":[]},{"title":"WASM/ink!","slug":"wasm/ink","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/sqd-2119b3c3/b07d1838ac35ff9a/safari-toolbar.js"],"subdomain":"sqd-2119b3c3","siteName":"SQD Documentation","title":"Automatically generate an indexer - SQD Documentation","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"contextualStarterQuestions":[{"_id":"6a71b13184ea1ad2a62a52d5","deploymentId":"6808b07179034f1572602b7f","questionText":"Do I need Docker to get started?","status":"active","generatedBy":"contextual","path":"en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer","createdAt":"2026-08-04T09:30:25.767Z","updatedAt":"2026-08-04T09:30:25.767Z","__v":0},{"_id":"6a71b13184ea1ad2a62a52d3","deploymentId":"6808b07179034f1572602b7f","questionText":"How do I generate an indexer?","status":"active","generatedBy":"contextual","path":"en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer","createdAt":"2026-08-04T09:30:25.767Z","updatedAt":"2026-08-04T09:30:25.767Z","__v":0},{"_id":"6a71b13184ea1ad2a62a52d4","deploymentId":"6808b07179034f1572602b7f","questionText":"What contracts can I index?","status":"active","generatedBy":"contextual","path":"en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer","createdAt":"2026-08-04T09:30:25.767Z","updatedAt":"2026-08-04T09:30:25.767Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer","matchLevel":0},"es":{"href":"/es/404","matchLevel":3},"ko":{"href":"/ko/404","matchLevel":3},"de":{"href":"/de/404","matchLevel":3},"tr":{"href":"/tr/404","matchLevel":3},"fr":{"href":"/fr/404","matchLevel":3},"ru":{"href":"/ru/404","matchLevel":3},"pt-BR":{"href":"/pt-BR/404","matchLevel":3},"zh":{"href":"/zh/404","matchLevel":3},"ja":{"href":"/ja/404","matchLevel":3}}},"lastModified":"2026-07-28T12:47:47.004Z","originalFileLocation":"en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer.mdx","locale":"en"},"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=\"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.\">\u003cmeta data-mint-head name=\"application-name\" content=\"SQD Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Automatically generate an indexer - SQD Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SQD Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://sqd-2119b3c3.mintlify.app/_mintlify/api/og/v2?division=Examples+%26+tutorials\u0026amp;title=Automatically+generate+an+indexer\u0026amp;description=Generate+a+ready-to-use+indexer+from+a+contract+ABI+with+the+squid+generation+tools.\u0026amp;theme=fdcf458c8520acc4daeceafb\u0026amp;signature=6242e02301ceafe477738d62ef5b76bb88af757d5a5a134800d0ba8ec4c2b493\">\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=\"Automatically generate an indexer - SQD Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sqd-2119b3c3.mintlify.app/_mintlify/api/og/v2?division=Examples+%26+tutorials\u0026amp;title=Automatically+generate+an+indexer\u0026amp;description=Generate+a+ready-to-use+indexer+from+a+contract+ABI+with+the+squid+generation+tools.\u0026amp;theme=fdcf458c8520acc4daeceafb\u0026amp;signature=6242e02301ceafe477738d62ef5b76bb88af757d5a5a134800d0ba8ec4c2b493\">\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/sqd-2119b3c3/L5OEwqNuR6-cqo9-/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SQD Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4f46e5\">\u003cmeta data-mint-head name=\"msvalidate.01\" content=\"570E8FF88EEAEACE2E2C262AF96E35F3\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://sqd.dev/#organization\",\"name\":\"SQD\",\"legalName\":\"Subsquid Labs GmbH\",\"url\":\"https://sqd.dev/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://sqd.dev/brand/Symbol_bl-bg.svg\"},\"sameAs\":[\"https://github.com/subsquid\",\"https://www.x.com/hellosqd\",\"https://t.me/subsquid\",\"https://www.youtube.com/@subsquid\",\"https://www.linkedin.com/company/subsquid\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.sqd.dev#website\",\"name\":\"SQD Documentation\",\"url\":\"https://docs.sqd.dev\",\"publisher\":{\"@id\":\"https://sqd.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer#webpage\",\"url\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer\",\"name\":\"Automatically generate an indexer\",\"description\":\"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.\",\"dateModified\":\"2026-07-28T12:47:47.004Z\",\"isPartOf\":{\"@id\":\"https://docs.sqd.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Squid SDK\",\"item\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/quickstart\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Examples \u0026 tutorials\",\"item\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/build-indexer-from-scratch\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Automatically generate an indexer\",\"item\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer#article\",\"headline\":\"Automatically generate an indexer\",\"name\":\"Automatically generate an indexer\",\"description\":\"Generate a ready-to-use indexer from a contract ABI with the squid generation tools.\",\"url\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sqd.dev/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer#webpage\"},\"dateModified\":\"2026-07-28T12:47:47.004Z\",\"publisher\":{\"@id\":\"https://sqd.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.sqd.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SQD Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SQD Documentation","nav":{"global":{"anchors":[{"anchor":"Announcements","icon":"megaphone","href":"/announcements"},{"anchor":"Changelog","icon":"list","href":"/changelog"}]},"languages":[{"language":"en","tabs":[{"tab":"Getting Started","icon":"house","pages":[{"title":"Getting Started","href":"/en/home"}]},{"tab":"All Networks","hidden":true,"pages":[{"title":"All Networks","href":"/en/data/all-networks"}]},{"tab":"Build","icon":"code","menu":[{"item":"EVM","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/ethereum-color.svg","description":"Ethereum and EVM compatible chains","groups":[{"group":"Overview","pages":[{"title":"Build with SQD","sidebarTitle":"Overview","mode":"wide","href":"/en/sdk/overview"},{"title":"Choosing your tool","sidebarTitle":"Choosing a Tool","href":"/en/sdk/options-comparison"},{"title":"SQD vs The Graph","href":"/en/sdk/subsquid-vs-thegraph"},{"title":"Getting started with Portal","mode":"wide","href":"/en/portal/migration"}]},{"group":"Pipes SDK","icon":"text-align-start","tag":"1.0.0-beta.11","pages":[{"title":"Quickstart","href":"/en/sdk/pipes-sdk/evm/quickstart"},{"title":"Why Pipes SDK?","href":"/en/sdk/pipes-sdk/evm/why-pipes-sdk"},{"title":"Migrate to 1.0","sidebarTitle":"Migrating to 1.0","href":"/en/sdk/pipes-sdk/evm/migration"},{"group":"Guides","pages":[{"group":"Basic development","pages":[{"title":"Pipe anatomy","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/anatomy"},{"title":"Developing pipes","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/flow"},{"title":"Handling contract events","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/handling-events"},{"title":"Running bare bones","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/running-bare-bones"},{"title":"Pipes UI","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/pipes-ui"},{"title":"Testing pipes","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/testing"},{"title":"Dev runner","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/dev-runner"},{"group":"Configuring targets","pages":[{"title":"Postgres via Drizzle","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/targets/postgres-drizzle"},{"title":"ClickHouse","href":"/en/sdk/pipes-sdk/evm/guides/basic-development/targets/clickhouse"}]}]},{"group":"Advanced topics","pages":[{"title":"Factory transformers","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/factory-transformers"},{"title":"Stateful transforms","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/stateful-transforms"},{"title":"Logging","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/logging"},{"title":"Metrics","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/metrics"},{"title":"Profiling","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/profiling"},{"title":"OpenTelemetry tracing","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/tracing"},{"title":"Data freshness monitoring","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/latency-monitoring"},{"title":"Railway deployment","href":"/en/sdk/pipes-sdk/evm/guides/advanced-topics/railway-deployment"}]},{"group":"Architecture deep dives","pages":[{"title":"Cursor management","href":"/en/sdk/pipes-sdk/evm/guides/architecture-deep-dives/cursor-management"},{"title":"Fork handling","href":"/en/sdk/pipes-sdk/evm/guides/architecture-deep-dives/fork-handling"}]}]},{"group":"Reference","pages":[{"group":"Basic components","pages":[{"title":"Portal stream","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/source"},{"title":"Query builder","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/query-builder"},{"title":"Transformer","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/transformer"},{"group":"Target","pages":[{"title":"createTarget","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/target/create-target"},{"title":"drizzleTarget","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/target/postgres-drizzle"},{"title":"clickhouseTarget","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/target/clickhouse"},{"title":"bigqueryTarget","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/target/bigquery"},{"title":"parquetTarget","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/target/parquet"},{"title":"pubsubTarget","href":"/en/sdk/pipes-sdk/evm/reference/basic-components/target/pubsub"}]}]},{"group":"Utility components","pages":[{"title":"evmEventDecoder","href":"/en/sdk/pipes-sdk/evm/reference/utility-components/evm-decoder"},{"title":"contractFactory","href":"/en/sdk/pipes-sdk/evm/reference/utility-components/factory"},{"title":"portalSqliteCache","href":"/en/sdk/pipes-sdk/evm/reference/utility-components/sqlite-cache"},{"title":"metricsServer","href":"/en/sdk/pipes-sdk/evm/reference/utility-components/metrics-server"},{"title":"evmRpcLatencyWatcher","href":"/en/sdk/pipes-sdk/evm/reference/utility-components/evm-rpc-latency-watcher"}]},{"title":"Error reference","href":"/en/sdk/pipes-sdk/reference/errors"}]}]},{"group":"Squid SDK","pages":[{"title":"Quickstart","mode":"wide","href":"/en/sdk/squid-sdk/evm/quickstart"},{"title":"Design","sidebarTitle":"Design","href":"/en/sdk/squid-sdk/evm/design"},{"title":"How it works","sidebarTitle":"How it works","href":"/en/sdk/squid-sdk/evm/how-it-works"},{"title":"FAQ","href":"/en/sdk/squid-sdk/evm/faq"},{"group":"Guides","pages":[{"title":"Make an indexer","href":"/en/sdk/squid-sdk/evm/guides/make-an-indexer"},{"title":"Writing to Postgres","href":"/en/sdk/squid-sdk/evm/guides/writing-to-postgres"},{"title":"Serving GraphQL","href":"/en/sdk/squid-sdk/evm/guides/serving-graphql"},{"title":"Other data destinations","href":"/en/sdk/squid-sdk/evm/guides/other-data-destinations"},{"title":"Best practices","href":"/en/sdk/squid-sdk/evm/guides/best-practices"},{"group":"Migration","pages":[{"title":"Migrate a squid to Portal","sidebarTitle":"Migrate to Portal","mode":"wide","href":"/en/sdk/squid-sdk/evm/guides/migration/gateway-to-portal"},{"title":"How to use your dedicated Portal with a key","sidebarTitle":"Dedicated Portal key","href":"/en/sdk/squid-sdk/evm/guides/migration/portal-api-key"},{"title":"Add an API key for legacy gateways","sidebarTitle":"Gateway API key","href":"/en/sdk/squid-sdk/evm/guides/migration/gateway-api-key"},{"title":"Migrate from The Graph","href":"/en/sdk/squid-sdk/evm/guides/migration/migrate-from-thegraph"},{"title":"hasura-configuration tool v2","href":"/en/sdk/squid-sdk/evm/guides/migration/migrate-to-hasura-v2"}]},{"group":"Advanced","pages":[{"title":"Batch Processing","href":"/en/sdk/squid-sdk/evm/guides/advanced/batch-processing"},{"title":"Unfinalized blocks and reorgs","href":"/en/sdk/squid-sdk/evm/guides/advanced/unfinalized-blocks"},{"title":"Squid SDK tips and troubleshooting","sidebarTitle":"Tips and troubleshooting","href":"/en/sdk/squid-sdk/evm/guides/advanced/tips-and-troubleshooting"},{"title":"High availability","sidebarTitle":"High availability","href":"/en/sdk/squid-sdk/evm/guides/advanced/high-availability"},{"title":"Development Environment Setup","href":"/en/sdk/squid-sdk/evm/guides/advanced/development-environment-setup"},{"title":"CLI Cheatsheet","href":"/en/sdk/squid-sdk/evm/guides/advanced/cli-cheatsheet"},{"title":"Proxy contracts","href":"/en/sdk/squid-sdk/evm/guides/advanced/proxy-contracts"},{"title":"Factory Contracts","href":"/en/sdk/squid-sdk/evm/guides/advanced/factory-contracts"},{"title":"Multichain Indexing","href":"/en/sdk/squid-sdk/evm/guides/advanced/multichain-indexing"},{"title":"External APIs and IPFS","href":"/en/sdk/squid-sdk/evm/guides/advanced/external-apis-ipfs"}]}]},{"group":"Examples \u0026 tutorials","pages":[{"title":"Build an Indexer from Scratch","href":"/en/sdk/squid-sdk/evm/examples-tutorials/build-indexer-from-scratch"},{"group":"BAYC tutorial","pages":[{"title":"Step 1: Transfer events","href":"/en/sdk/squid-sdk/evm/examples-tutorials/bayc/step-one-indexing-transfers"},{"title":"Step 2: Owners \u0026 tokens","href":"/en/sdk/squid-sdk/evm/examples-tutorials/bayc/step-two-deriving-owners-and-tokens"},{"title":"Step 3: External data","href":"/en/sdk/squid-sdk/evm/examples-tutorials/bayc/step-three-adding-external-data"},{"title":"Step 4: Optimization","href":"/en/sdk/squid-sdk/evm/examples-tutorials/bayc/step-four-optimizations"}]},{"title":"Processor in action","href":"/en/sdk/squid-sdk/evm/examples-tutorials/batch-processor-in-action"},{"title":"Use with Ganache or Hardhat","href":"/en/sdk/squid-sdk/evm/examples-tutorials/use-with-ganache-hardhat"},{"title":"Index to local CSV files","href":"/en/sdk/squid-sdk/evm/examples-tutorials/file-csv"},{"title":"Index to Parquet files","description":"Tutorial: index blockchain data into Apache Parquet files for analytics.","href":"/en/sdk/squid-sdk/evm/examples-tutorials/file-parquet"},{"title":"Automatically generate an indexer","href":"/en/sdk/squid-sdk/evm/examples-tutorials/auto-generate-indexer"},{"title":"EVM Examples","sidebarTitle":"Examples","description":"Explore example EVM indexers built with the Squid SDK.","href":"/en/sdk/squid-sdk/evm/examples-tutorials/examples-widget"}]},{"group":"Reference","pages":[{"title":"Packages overview","sidebarTitle":"Packages overview","href":"/en/sdk/squid-sdk/evm/reference/packages-overview"},{"title":"Project Structure","href":"/en/sdk/squid-sdk/evm/reference/project-structure"},{"group":"Data sources","pages":[{"title":"Portal batch processor","sidebarTitle":"Portal batch processor","href":"/en/sdk/squid-sdk/evm/reference/batch-processor"},{"group":"EVM Portal stream","pages":[{"title":"EVM Portal stream","sidebarTitle":"EVM Portal stream","href":"/en/sdk/squid-sdk/evm/reference/evm-stream"},{"title":"Event logs","sidebarTitle":"Event logs","href":"/en/sdk/squid-sdk/evm/reference/evm-stream/logs"},{"title":"EVM transactions","sidebarTitle":"Transactions","href":"/en/sdk/squid-sdk/evm/reference/evm-stream/transactions"},{"title":"Traces","sidebarTitle":"Traces","href":"/en/sdk/squid-sdk/evm/reference/evm-stream/traces"},{"title":"Storage state diffs","sidebarTitle":"State diffs","href":"/en/sdk/squid-sdk/evm/reference/evm-stream/state-diffs"},{"title":"Field selection","sidebarTitle":"Field selection","href":"/en/sdk/squid-sdk/evm/reference/evm-stream/field-selection"},{"title":"Block data for EVM","sidebarTitle":"Block data","href":"/en/sdk/squid-sdk/evm/reference/evm-stream/context-interfaces"}]},{"title":"EVM RPC data source","sidebarTitle":"EVM RPC source","href":"/en/sdk/squid-sdk/evm/reference/evm-rpc-stream"},{"title":"EVM fallback data source","sidebarTitle":"EVM fallback source","href":"/en/sdk/squid-sdk/evm/reference/evm-fallback"}]},{"group":"Data stores","pages":[{"title":"Store interface","href":"/en/sdk/squid-sdk/evm/reference/data-stores/store-interface"},{"title":"TypeORM Store","href":"/en/sdk/squid-sdk/evm/reference/data-stores/typeorm-store"},{"title":"BigQuery Store","href":"/en/sdk/squid-sdk/evm/reference/data-stores/bigquery-store"},{"group":"File store","pages":[{"title":"file-store-* packages","href":"/en/sdk/squid-sdk/evm/reference/data-stores/file-store"},{"title":"CSV support","href":"/en/sdk/squid-sdk/evm/reference/data-stores/file-store/csv"},{"title":"JSON support","href":"/en/sdk/squid-sdk/evm/reference/data-stores/file-store/json"},{"title":"Parquet support","href":"/en/sdk/squid-sdk/evm/reference/data-stores/file-store/parquet"},{"title":"S3 support","href":"/en/sdk/squid-sdk/evm/reference/data-stores/file-store/s3-dest"}]}]},{"group":"Schema files","pages":[{"title":"Schema file and codegen","href":"/en/sdk/squid-sdk/evm/reference/schema-files/schema-files-codegen"},{"title":"Entities","href":"/en/sdk/squid-sdk/evm/reference/schema-files/entities"},{"title":"Entity relations","href":"/en/sdk/squid-sdk/evm/reference/schema-files/entity-relations"},{"title":"Indexes and constraints","href":"/en/sdk/squid-sdk/evm/reference/schema-files/indexes-constraints"},{"title":"Interfaces","href":"/en/sdk/squid-sdk/evm/reference/schema-files/interfaces"},{"title":"Unions and typed JSON","href":"/en/sdk/squid-sdk/evm/reference/schema-files/unions-typed-json"}]},{"title":"TypeORM model generation","href":"/en/sdk/squid-sdk/evm/reference/typeorm-codegen"},{"title":"TypeORM migration generation","href":"/en/sdk/squid-sdk/evm/reference/typeorm-migration"},{"group":"EVM typegen","pages":[{"title":"Generating utility modules","href":"/en/sdk/squid-sdk/evm/reference/evm-typegen/generating-utility-modules"},{"title":"Data decoding","href":"/en/sdk/squid-sdk/evm/reference/evm-typegen/data-decoding"},{"title":"Direct RPC queries","href":"/en/sdk/squid-sdk/evm/reference/evm-typegen/direct-rpc-queries"}]},{"group":"OpenReader","pages":[{"title":"OpenReader Overview","href":"/en/sdk/squid-sdk/evm/reference/openreader/overview"},{"group":"API reference","pages":[{"title":"Core API Introduction","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/intro"},{"title":"Entity Queries","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/queries"},{"title":"AND/OR Filters","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/and-or-filters"},{"title":"Sorting","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/sorting"},{"title":"Pagination","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/paginate-query-results"},{"title":"Nested Field Queries","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/nested-field-queries"},{"title":"Cross-relation Queries","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/cross-relation-field-queries"},{"title":"JSON Queries","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/json-queries"},{"title":"Union Type Resolution","href":"/en/sdk/squid-sdk/evm/reference/openreader/api/resolve-union-types-interfaces"}]},{"group":"Server configuration","pages":[{"title":"Custom Resolvers","href":"/en/sdk/squid-sdk/evm/reference/openreader/configuration/custom-resolvers"},{"title":"Authorization","href":"/en/sdk/squid-sdk/evm/reference/openreader/configuration/authorization"},{"title":"Caching","href":"/en/sdk/squid-sdk/evm/reference/openreader/configuration/caching"},{"title":"Subscriptions","href":"/en/sdk/squid-sdk/evm/reference/openreader/configuration/subscriptions"},{"title":"DoS Protection","href":"/en/sdk/squid-sdk/evm/reference/openreader/configuration/dos-protection"}]}]},{"title":"Hasura configuration tool","href":"/en/sdk/squid-sdk/evm/reference/hasura-configuration"},{"title":"Creating a squid project","sidebarTitle":"Create a squid","href":"/en/sdk/squid-sdk/evm/reference/create-squid"},{"title":"Squid SDK Logger","sidebarTitle":"Logger","href":"/en/sdk/squid-sdk/evm/reference/logger"}]}]},{"group":"Alternative clients","pages":[{"group":"Ponder","tag":"0.17.8","expanded":true,"pages":[{"title":"Use Portal with Ponder","sidebarTitle":"Overview","href":"/en/sdk/alternative-clients/ponder"},{"title":"Run the Ponder and Portal example","sidebarTitle":"Quickstart","href":"/en/sdk/alternative-clients/ponder/quickstart"},{"title":"Migrate a Ponder app to Portal","sidebarTitle":"Migrate an app","href":"/en/sdk/alternative-clients/ponder/guides/migrate"},{"title":"Ponder and Portal examples","sidebarTitle":"Examples","href":"/en/sdk/alternative-clients/ponder/examples"},{"title":"Configure Ponder with Portal","sidebarTitle":"Configuration","href":"/en/sdk/alternative-clients/ponder/configuration"},{"title":"Ponder benchmarks and validation","sidebarTitle":"Benchmarks and validation","href":"/en/sdk/alternative-clients/ponder/benchmarks-and-validation"}]},{"title":"sqd-go","tag":"Community","href":"/en/sdk/alternative-clients/sqd-go"},{"title":"DipDup","href":"/en/sdk/alternative-clients/dipdup"},{"title":"SQD Firehose","href":"/en/sdk/alternative-clients/subgraphs-support"},{"title":"ApeWorx plugin","href":"/en/sdk/alternative-clients/apeworx"}]}]},{"item":"Solana","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/sol.png","description":"Solana and SVM compatible chains","pages":[{"title":"Solana","href":"/en/sdk/pipes-sdk/solana/quickstart"}]},{"item":"Hyperliquid","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/hyperliquid-color.svg","description":"HyperCore trade executions","pages":[{"title":"Hyperliquid","href":"/en/sdk/pipes-sdk/hyperliquid/quickstart"}]},{"item":"Bitcoin","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/btc.png","description":"Bitcoin block and UTXO indexing","pages":[{"title":"Bitcoin","href":"/en/sdk/pipes-sdk/bitcoin/quickstart"}]},{"item":"Tron","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/tron.png","description":"Tron network indexing","pages":[{"title":"Tron","href":"/en/sdk/pipes-sdk/tron/quickstart"}]},{"item":"Substrate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/polkadot-color.svg","description":"Polkadot and other Substrate-based chains","pages":[{"title":"Substrate","href":"/en/sdk/squid-sdk/substrate/quickstart"}]}]},{"tab":"Deploy","icon":"cloud","pages":[{"title":"Deploy","href":"/en/cloud/overview"}]},{"tab":"Participate","icon":"network","pages":[{"title":"Participate","href":"/en/network/overview"}]},{"tab":"Networks \u0026 Schemas","icon":"database","menu":[{"item":"EVM Data","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/ethereum-color.svg","description":"Ethereum and EVM-compatible chains","pages":[{"title":"EVM Data","href":"/en/data/evm"}]},{"item":"Solana Data","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/sol.png","description":"Solana and SVM-compatible chains","pages":[{"title":"Solana Data","href":"/en/data/solana"}]},{"item":"Hyperliquid Data","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/hyperliquid-color.svg","description":"HyperCore and HyperEVM data","pages":[{"title":"Hyperliquid Data","href":"/en/api/hyperliquid-fills/metadata"}]},{"item":"Bitcoin Data","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/btc.png","description":"Bitcoin block and transaction data","pages":[{"title":"Bitcoin Data","href":"/en/api/bitcoin/metadata"}]},{"item":"Tron Data","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/tron.png","description":"Tron network data","pages":[{"title":"Tron Data","href":"/en/api/tron/metadata"}]},{"item":"Substrate Data","icon":"https://mintlify.s3.us-west-1.amazonaws.com/sqd-2119b3c3/images/chains/polkadot-color.svg","description":"Polkadot and Substrate-based chains","pages":[{"title":"Substrate Data","href":"/en/data/substrate"}]}],"pages":[{"title":"Networks \u0026 Schemas","href":"/en/data/evm"}]},{"tab":"Learn","icon":"book","pages":[{"title":"Learn","href":"/en/other/glossary/glossary"}]},{"tab":"AI","icon":"grip","pages":[{"title":"AI","href":"/en/ai/ai-development"}]}]},{"language":"es","pages":[{"title":"es","href":"/es/404"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/404"}]},{"language":"de","pages":[{"title":"de","href":"/de/404"}]},{"language":"tr","pages":[{"title":"tr","href":"/tr/404"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/404"}]},{"language":"ru","pages":[{"title":"ru","href":"/ru/404"}]},{"language":"pt-BR","pages":[{"title":"pt-BR","href":"/pt-BR/404"}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/404"}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/404"}]}]},"basePath":"","title":"Automatically generate an indexer - SQD Documentation","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}