Technical design of SQD Network: workers, gateways, query validation, and rewards.
The SQD whitepaper and any other documents attached or linked to this
statement are intended only to provide a broad overview of the general
direction of SQD and the SQD Network. The whitepaper and these documents are
intended for information purposes only and may not be incorporated into any
contract. These materials are not and should not be considered to offer a
commitment to deliver any material, code, functionality, token, and should not
be relied upon in making token purchase decisions or any kind of investment.
All details related to the development, timing, or issue of any SQD feature or
token remain at the sole discretion of Subsquid Labs GmbH.
Blockchain, while initially designed solely for peer-to-peer transfers (Bitcoin), has since evolved into a general
purpose global execution runtime. The introduction of smart contract blockchains (Ethereum being the first) has enabled the creation of decentralized Apps (dApps) that are now catering to users in countless verticals, including:
Decentralized Finance (DeFi) and tokenized real-world assets (RWA)
Decentralized Social application (DeSoc)
Decentralized Gaming with peer-to-peer game economies (GameFi)
One of the key fundamentals that has allowed countless dApps to thrive is the emergent infrastructure addressing the challenges of scaling, storage, and retrieval of data. We also refer to this as the “Web3 tech stack”. The below all form part of the stack:
Bringing off-chain and real-world data on-chain (Oracles like Chainlink)
Permanent and long-term storage for large data (Arweave, Filecoin)
Application-specific databases and APIs (TheGraph, POKT, Kwil, WeaveDB)
However, there is still one part missing. One of the biggest challenges dApp developers face is accessing data at scale. It’s currently highly complex to query and aggregate
the exponentially growing amount of data produced by blockchains (transactions and state data), applications
(decoded smart contract states), and any relevant off-chain data (prices, data kept in IPFS and Arweave, pruned EIP4844 data). In Web2, data produced by applications (such as logs or client data) is
stored in centralized data lakes like BigQuery, Snowflake, Apache, and Iceberg to facilitate access. Storing Web3 data in similar centralized data lakes would defeat the purpose of open, resilient access. Still, Web3 app data, if aggregated, filtered, and easily extractable, will serve as a catalyst to unlock the potential of the industry in a multi-chain paradigm.Instead of replicating Web2 approaches the permissionless and decentralized nature of Web3 requires a fundamentally different solution with the following properties:
Infinite horizontal scalability: the capacity of the lake should grow indefinitely as new nodes join
Permissionless data access: the data can be uploaded and queried without any gatekeeping or centralized control
Credible neutrality: no barrier for new nodes to join the network
Trust-minimized queries: the data can be audited, and all clients can verify the query result
Low maintenance cost: the price per query should be negligible
The SQD Network is built to satisfy all the above properties, thanks to its architecture where:
The raw data is uploaded into permanent storage by the data providers, which act as oracles but for “big data”
The data is compressed and distributed among the network nodes
Node operators have to bond a security deposit, which can be slashed for byzantine behavior
Each node efficiently queries the local data with DuckDB
Any query can be verified by submitting a signed response to an on-chain smart contract
With the recent advances in in-process databases like DuckDB and an ever-decreasing price of quality SSD storage, the operational cost of a single node handling 1Tb of data is as low as 35/mo [1] and will likely decline further in the future.In the first stage, the SQD Network only supports simple queries that can be resolved by querying the local data of a suitable node. This already provides a fundamentally new primitive for on-chain data availability, fully eliminating the need to maintain expensive archival blockchain nodes to access historical blockchain data.After the bootstrapping period, the network will be expanded with an additional query planning and execution layer supporting general-purpose SQL queries inspired by Apache Calcite and DataFusion.
Data Providers produce data to be served by SQD Network. Currently, the focus is on on-chain data, and data providers are blockchains and L2s. At the moment, SQD only supports EVM- and Substrate chains, but we plan on adding support for Cosmos and Solana in the near future.Data providers are responsible for ensuring the quality and timely provision of data. During the bootstrapping phase, Subsquid Labs GmbH acts as the sole data provider for the SQD Network, serving as a proxy for chains from which the data is ingested block-by-block. The ingested data is validated by comparing hashes. It’s then split into small compressed chunks and saved into persistent storage, from which the chunks are randomly distributed between the workers.
The metadata is saved on-chain and is updated by the data provider each time a new piece of the data is uploaded. The metadata describes the schema, the data layout, the reserved storage, and the desired replication factor to be accommodated by the network. You can find the metadata structure in the Appendix.The data provider is incentivized to provide consistent and valid data, and it is their responsibility to make the data available in persistent storage. During the bootstrap phase, the persistent storage used by Subsquid Labs is an S3-compatible service with backups pinned to IPFS. As the network matures, more data providers and storage options will be added, with data providers being vetted by on-chain governance and known trusted parties.Data providers pay on-chain subscription fees to the network to make data available and to have it served by workers. These fees are sent to the SQD Network treasury.
The scheduler is responsible for distributing the data chunks submitted by the data providers among the workers. The scheduler listens to updates of the data sets, as well as updates of the worker sets, and sends requests to the workers to download new chunks and/or redistribute the existing data chunks based on the capacity and the target redundancy for each dataset. Once a worker receives an update request , it downloads the missing data chunks from the corresponding persistent storage.
Workers contribute the storage and compute resources to the network. They serve the data in a peer-to-peer manner for consumption and receive SQD tokens as compensation. Each worker has to be registered on-chain by bonding 100,000 SQD tokens, which can be slashed if the worker provably violates the protocol rule. SQD holders can also delegate to a specific worker to signal the reliability of the worker and earn a portion of the rewards.The rewards are distributed each epoch and depend on:
The previous number of epochs the worker stayed online
The amount of data served to clients
The number of delegated tokens
Fairness
Liveness during the epoch
Workers submit ping information along with their signed logs of the executed query requests to the Validator, thus committing to the results returned to the clients.
The Logs Collector’s sole responsibility is to collect the liveness pings and the query execution logs from the workers, batch them, and save them into public persistent storage. The logs are signed by the workers’ P2P identities and pinned to IPFS. The data is stored for at least 6 months and used by other network participants.
The Reward Manager is responsible for calculating and submitting worker rewards on-chain for each epoch. The rewards depend on:
Worker liveness during the epoch
Delegated tokens
Served queries (in bytes; both scanned and returned sizes are accounted for)
Liveness since the registration
The Reward Manager accesses the logs, calculates the rewards, and submits a claimable commitment on-chain for each epoch. Each worker then claims their reward individually. The rewards may expire after an extended period of time.
To query the network, data consumers have to operate a gateway or use an externally provided service (public or private). Each gateway is bound to an on-chain address. The number of requests a gateway can submit to the network is capped by a number calculated based on the amount of locked SQD tokens. Consequently, the more tokens are locked by the gateway operator, the more bandwidth it is allowed to consume.One can think of this mechanism as if the locked SQD yields virtual “compute units” (CU) based on the period the tokens are locked. All queries cost the same price of 1 CU (until complex SQL queries are implemented).The query cap is calculated by:
Calculating the virtual yield in SQD on the locked tokens (in SQD)
The locking mechanism has an additional booster design to incentivize gateway operators to lock their tokens for longer periods of time for an increase in CU. The longer the lock period, the more CUs are allocated per SQD/yr. The APY is calculated as BASE_VIRTUAL_APY * BOOSTER.
At the launch of the network, the parameters are set to be BASE_VIRTUAL_APY = 12% and 1SQD = 4000 CU.For example, if a gateway operator locks 100 SQD for 2 months, the virtual yield is 2SQD, which means it can perform 8000 queries (8000 CU).
If 100 SQD are locked for 3 years, the virtual yield is 12% * 3 APY, so the operator gets CUs worth 108 of SQD, that is it can submit up to 432000 queries to the network within the period of 3 years.
The SQD Network provides economic guarantees for the validity of the queried data, with the added possibility of validating specific queries on-chain. All query responses are signed by the worker who executed the query, acting as a commitment to the query response. Anyone can submit such a response on-chain, and if it is deemed incorrect, the worker bond is slashed. The smart contract validation logic may be dataset-specific depending on the nature of the data being queried, with the following options:
Proof by Authority: a white-listed set of on-chain identities decides on the validity of the response.
Optimistic on-chain: after the validation request is submitted, anyone can submit a claim proving the query response is incorrect. For example, assuming the original query was “Return transactions matching the filter X in the block range [Y, Z]” and the response is some set of transactions T. During the validation window, anyone can submit a Merkle proof for some transaction t matching the filter X yet not in T. If no such proofs are submitted during the decision window, the response is considered valid.
Zero-Knowledge: a zero-knowledge proof that the response exactly matches the requests. The zero-knowledge proof is generated off-chain by a prover and is validated on-chain by the smart contract.
Since submitting each query for on-chain validation on-chain is costly and not feasible, clients opt-in to submit query responses in an off-chain queue, together with the metadata such as response latency. Then, independent searchers scan the queue and submit suspicious queries for on-chain validation. If the query is deemed invalid, the submitter gets a portion of the slashed bond as a reward, thus incentivizing searchers to efficiently scan the queue for malicious responses.
SQD is the ERC-20 protocol token that is native to the SQD Network ecosystem. The token smart contract is to be deployed on the Ethereum mainnet and bridged to Arbitrum One. This strategy seeks to ensure the blockchain serves as a reliable, censorship-resistant, and verifiably impartial ledger, facilitating reward settlements and managing access to network resources.The SQD token is a critical component of the SQD ecosystem. Use cases for the SQD token are focused on streamlining and securing network operations in a permissionless manner:
Alignment of incentives for infrastructure providers: SQD is used to reward node operators that contribute computation and storage resources to the network.
Curation of network participants: Via delegation, the SQD token design includes built-in curation of nodes, facilitating permissionless selection of trustworthy operators for rewards.
Fair resource consumption: By locking SQD tokens, consumers of data from the decentralized data lake may increase rate limits.
Network decision making: SQD tokenholders can participate in governance, and are enabled to vote on protocol changes and other proposals.
The SQD token’s innovative curation component allows the SQD community to delegate SQD to Node Operators of their choice, ensuring trustlessness. SQD’s utility as a tool for adjusting rate limits is unique in increasing trustless performance, by locking SQD tokens, without having to pay a centralized provider for quicker or more efficient data access.
interface DataSet { dataset_id: string; // how many times the dataset should be replicated replication_factor: int; // a unique URL for permanent storage. Can be s3:// bucket permanent_storage: string; // how much space should for a single replica. // the total space required by a dataset is replication_factor * reserved_space reserved_space: int; // dataset-specific additional metadata extra_meta?: string; // dataset-specific state description state?: string; // reserved for future use, must be false premium: boolean;}
The on-chain state of the dataset should be updated by the data provider periodically, and the total space must not exceed reserved_space. The dataset can be in the following states:
enum DatasetState { // submitted by the data provider SUBMITTED, // the data being distributed by the network IN_PREPARATION, // served by the network ACTIVE, // if the subscription fee // has not been provided for the duration of an epoch COOLDOWN, // if the dataset is no longer served by the network // and will be deleted DISABLED,}
The Scheduler changes the state to IN_PREPARATION and ACTIVE from SUBMITTED. The COOLDOWN and DISABLED states are activated automatically if subscription payments aren’t made.At the initial stage of the network, the switch to disabling datasets is granted to Subsquid Labs GmbH, which is going to be replaced by auto payments at a later stage.
The network rewards are paid out to workers and delegators for each epoch. The Reward Manager submits an on-chain claim commitment, from which each participant can claim.The rewards are allocated from the rewards pool. Each epoch, the rewards pool unlocks APY_D * S * EPOCH_LENGTH in rewards, where EPOCH_LENGTH is the length of the epoch in days, S is the total (bonded + delegated) amount of staked SQD during the epoch and APY_D is the (variable) base reward rate calculated for the epoch.
The SQD supply is fixed for the initial pool, and the rewards are distributed from a pool, to which 10% of the supply is allocated at TGE. The reward pool has a protective mechanism which caps the amount of rewards distributed per epoch, and it is subject to change via governance.During the initial 3-year bootstrapping phase, the reward cap and the total supply of SQD is fixed. Afterwards, the reward cap drops significantly until the governance motion concludes on the inflation schedule and new tokens are minted to replenish the reward pool.Unlike most projects who fix the inflation schedule before the launch, postponing this decision leaves a lot more flexibility and allows the community to analyze the historical 3-year data to make an informed decision on the future issuance of SQD.
The WORKER_CAPACITY is a fixed storage per worker, set to 1TB. CHURN is a discounting factor to account for the churn, set to 0.9.The target APR (365-day-based rate) is then calculated as:
The base_apr is projected to be around 20% in the equilibrium state, when the actual worker capacity matches the desired network capacity, set externally. It is increased up to 70% to incentivize more workers to join the network until the target capacity is reached:
The APR_CAP cut-off is added to cap the total rewards per epoch.
One defines first
total_staked = bonded + delegated
to be the total amount of reward-earning SQD locked by workers (bonded) and delegators (delegated) respectively.We then define
The 0.3 coefficient (yearlyRewardCapCoefficient on the NetworkController contract) is a governance parameter. On Arbitrum One it currently reads 2,900 basis points (0.29); see NetworkController for the deployed address. At the 0.3 design value, this caps cumulative payouts at 90% of the initial reward pool after the 3-year bootstrapping period; at the current 0.29 value, the same calculation caps it at about 87%.
For each epoch, rAPR is calculated, and the total of
R = rAPR/365 * total_staked * EPOCH_LENGTH
is unlocked from the rewards pool.The rewards are then distributed between the workers and delegators, and the leftovers are split between the burn and the treasury.For a single worker and stakers for this token, the maximal reward is rAPR/365 * (bond + staked) * EPOCH_LENGTH. It is split into the worker liveness reward and the worker traffic reward.Let S[i] be the stake for i-th worker and T[i] be the traffic units (defined below) processed by the worker. We define the relative weights as
In other words, s[i] and t[i] correspond to the contribution of the i-th worker to the total stake and to total traffic, respectively.The traffic weight t[i] is a geometric average of the normalized scanned (t_scanned[i]) and the egress (t_e[i]) traffic processed by the worker. It is calculated by aggregating the logs of the queries processed by the worker during the epoch, and for each processed query, the worker reports the response size (egress) and the number of scanned data chunks.The max potential yield for the epoch is given by rAPR described above:
r_max = rAPR/365 * EPOCH_LENGTH
The actual yield r[i] for the i-th worker is discounted:
D_traffic is a Cobb-Douglas type discount factor defined as
D_traffic(t_i, s_i) = min( (t_i/s_i)^alpha, 1 )
with the elasticity parameter alpha set to 0.1.It has the following properties:
Always in the interval [0, 1]
Goes to zero as t_i goes to zero
Neutral (i.e., close to 1) when s_i ~ t_i, that is, the stake contribution is fair (proportional to the traffic contribution)
Excess traffic contributes only sub-linearly to the reward
D_liveness is a liveness factor calculated as the percentage of the time the worker is self-reported as online. A worker sends a ping message every 10 seconds, and if there are no pings within a minute, the worker is deemed offline for this period of time. The liveness factor is the percentage of the time (with minute-based granularity) the network is live. We suggest a piecewise linear function with the following properties:
It is 0 below a reasonably high threshold (set to 0.8)
Sharply increases to near 1 in the “intermediary” regime 0.8-0.9
The penalty around 1 is diminishing
Finally, D_tenure is a long-range liveness factor incentivizing consistent liveness across the epochs. The rationale is that
The probability of a worker failure decreases with the time the worker is live thus freshly spawned workers are rewarded less
The discount for freshly spawned workers discourages the churn among workers and incentivizes longer-term commitments
The total claimable reward for the i-th worker and the stakers is calculated simply as r[i] * s[i]. Clearly, s[i] is the sum of the (fixed) bond b[i] and the (variable) delegated stake d[i]. Thus, the delegator rewards account for r[i] * d[i]. This extra reward part is split between the worker and the delegators:
The worker gets: r[i] * b[i] + 0.5 * r[i] * s[i]
The delegators get 0.5 * r[i] * s[i], effectively attaining 0.5 * r[i] as the effectual reward rate.
The rationale for this split is:
Make the worker accountable for r[i]
Incentivize the worker to attract stakers (the additional reward part)
Incentivize the stakers to stake for a worker with high liveness (and, in general, high r[i])
At an equilibrium, the stakers will get a 10% annual yield, while workers get anything between 20-30% depending on the staked funds. Note that the maximal stake is limited by the bond size.
[1]SuperDAO Growth Trends report[2] Based on the estimate that read-only RPC queries constitute roughly 90% of the RPC provider traffic
Was this page helpful?
{"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":"6aeb20fcd2d002df62e28258","clientVersion":"0.0.4054","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":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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":"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":"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/network/whitepaper","slug":"/en/network/whitepaper","pageMetadata":{"title":"SQD Network Whitepaper","sidebarTitle":"Whitepaper","description":"Technical design of SQD Network: workers, gateways, query validation, and rewards.","href":"/en/network/whitepaper"},"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: \"Technical design of SQD Network: workers, gateways, query validation, and rewards.\"\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`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Frame,Heading,OptimizedImage,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Warning,{children:_jsx(_components.p,{children:`The SQD whitepaper and any other documents attached or linked to this\nstatement are intended only to provide a broad overview of the general\ndirection of SQD and the SQD Network. The whitepaper and these documents are\nintended for information purposes only and may not be incorporated into any\ncontract. These materials are not and should not be considered to offer a\ncommitment to deliver any material, code, functionality, token, and should not\nbe relied upon in making token purchase decisions or any kind of investment.\nAll details related to the development, timing, or issue of any SQD feature or\ntoken remain at the sole discretion of Subsquid Labs GmbH.`})}),`\n`,_jsx(Heading,{level:`2`,id:`intro`,children:`Intro`}),`\n`,_jsx(_components.p,{children:`Blockchain, while initially designed solely for peer-to-peer transfers (Bitcoin), has since evolved into a general\npurpose global execution runtime. The introduction of smart contract blockchains (Ethereum being the first) has enabled the creation of decentralized Apps (dApps) that are now catering to users in countless verticals, including:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Decentralized Finance (DeFi) and tokenized real-world assets (RWA)`}),`\n`,_jsx(_components.li,{children:`Decentralized Social application (DeSoc)`}),`\n`,_jsx(_components.li,{children:`Decentralized Gaming with peer-to-peer game economies (GameFi)`}),`\n`,_jsx(_components.li,{children:`Decentralized physical infrastructure (DePIN)`}),`\n`,_jsx(_components.li,{children:`Decentralized creator economy (Music, Videos, NFTs)`}),`\n`]}),`\n`,_jsx(_components.p,{children:`One of the key fundamentals that has allowed countless dApps to thrive is the emergent infrastructure addressing the challenges of scaling, storage, and retrieval of data. We also refer to this as the “Web3 tech stack”. The below all form part of the stack:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Scalable execution (L2 chains, Rollups, Bridges, Solana)`}),`\n`,_jsx(_components.li,{children:`Bringing off-chain and real-world data on-chain (Oracles like Chainlink)`}),`\n`,_jsx(_components.li,{children:`Permanent and long-term storage for large data (Arweave, Filecoin)`}),`\n`,_jsx(_components.li,{children:`Application-specific databases and APIs (TheGraph, POKT, Kwil, WeaveDB)`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://user-images.githubusercontent.com/8627422/279713390-8667b401-5213-4126-a0c2-55d39ba611e8.png`,alt:`Web3 tech stack diagram`})}),`\n`,_jsx(_components.p,{children:`However, there is still one part missing. One of the biggest challenges dApp developers face is accessing data at scale. It’s currently highly complex to query and aggregate\nthe exponentially growing amount of data produced by blockchains (transactions and state data), applications\n(decoded smart contract states), and any relevant off-chain data (prices, data kept in IPFS and Arweave, pruned EIP4844 data). In Web2, data produced by applications (such as logs or client data) is\nstored in centralized data lakes like BigQuery, Snowflake, Apache, and Iceberg to facilitate access. Storing Web3 data in similar centralized data lakes would defeat the purpose of open, resilient access. Still, Web3 app data, if aggregated, filtered, and easily extractable, will serve as a catalyst to unlock the potential of the industry in a multi-chain paradigm.`}),`\n`,_jsx(_components.p,{children:`Instead of replicating Web2 approaches the permissionless and decentralized nature of Web3 requires a fundamentally different solution with the following properties:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Infinite horizontal scalability: the capacity of the lake should grow indefinitely as new nodes join`}),`\n`,_jsx(_components.li,{children:`Permissionless data access: the data can be uploaded and queried without any gatekeeping or centralized control`}),`\n`,_jsx(_components.li,{children:`Credible neutrality: no barrier for new nodes to join the network`}),`\n`,_jsx(_components.li,{children:`Trust-minimized queries: the data can be audited, and all clients can verify the query result`}),`\n`,_jsx(_components.li,{children:`Low maintenance cost: the price per query should be negligible`}),`\n`]}),`\n`,_jsx(_components.p,{children:`The SQD Network is built to satisfy all the above properties, thanks to its architecture where:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The raw data is uploaded into permanent storage by the data providers, which act as oracles but for “big data”`}),`\n`,_jsx(_components.li,{children:`The data is compressed and distributed among the network nodes`}),`\n`,_jsx(_components.li,{children:`Node operators have to bond a security deposit, which can be slashed for byzantine behavior`}),`\n`,_jsx(_components.li,{children:`Each node efficiently queries the local data with DuckDB`}),`\n`,_jsx(_components.li,{children:`Any query can be verified by submitting a signed response to an on-chain smart contract`}),`\n`]}),`\n`,_jsx(_components.p,{children:`With the recent advances in in-process databases like DuckDB and an ever-decreasing price of quality SSD storage, the operational cost of a single node handling 1Tb of data is as low as 35/mo [1] and will likely decline further in the future.`}),`\n`,_jsx(_components.p,{children:`In the first stage, the SQD Network only supports simple queries that can be resolved by querying the local data of a suitable node. This already provides a fundamentally new primitive for on-chain data availability, fully eliminating the need to maintain expensive archival blockchain nodes to access historical blockchain data.`}),`\n`,_jsx(_components.p,{children:`After the bootstrapping period, the network will be expanded with an additional query planning and execution layer supporting general-purpose SQL queries inspired by Apache Calcite and DataFusion.`}),`\n`,_jsx(Heading,{level:`2`,id:`design-overview`,children:`Design Overview`}),`\n`,_jsx(_components.p,{children:`The below actors all participate in the SQD Network:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Data Providers`}),`\n`,_jsx(_components.li,{children:`Workers`}),`\n`,_jsx(_components.li,{children:`Scheduler`}),`\n`,_jsx(_components.li,{children:`Logs Collector`}),`\n`,_jsx(_components.li,{children:`Rewards manager`}),`\n`,_jsx(_components.li,{children:`Data Consumers`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://github.com/subsquid/subsquid-network-contracts/assets/8627422/beb1439d-aa15-42fa-8bc2-4fa89c7fc96d`,alt:`SQD Network actors diagram`})}),`\n`,_jsx(Heading,{level:`3`,id:`data-providers`,children:`Data Providers`}),`\n`,_jsx(_components.p,{children:`Data Providers produce data to be served by SQD Network. Currently, the focus is on on-chain data, and data providers are blockchains and L2s. At the moment, SQD only supports EVM- and Substrate chains, but we plan on adding support for Cosmos and Solana in the near future.`}),`\n`,_jsx(_components.p,{children:`Data providers are responsible for ensuring the quality and timely provision of data. During the bootstrapping phase, Subsquid Labs GmbH acts as the sole data provider for the SQD Network, serving as a proxy for chains from which the data is ingested block-by-block. The ingested data is validated by comparing hashes. It’s then split into small compressed chunks and saved into persistent storage, from which the chunks are randomly distributed between the workers.`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://user-images.githubusercontent.com/8627422/255241118-9ba68865-c088-42ac-a01b-f961d1ed564b.png`,alt:`Data provider workflow diagram`})}),`\n`,_jsx(_components.p,{children:`The metadata is saved on-chain and is updated by the data provider each time a new piece of the data is uploaded. The metadata describes the schema, the data layout, the reserved storage, and the desired replication factor to be accommodated by the network. You can find the metadata structure in the Appendix.`}),`\n`,_jsx(_components.p,{children:`The data provider is incentivized to provide consistent and valid data, and it is their responsibility to make the data available in persistent storage. During the bootstrap phase, the persistent storage used by Subsquid Labs is an S3-compatible service with backups pinned to IPFS. As the network matures, more data providers and storage options will be added, with data providers being vetted by on-chain governance and known trusted parties.`}),`\n`,_jsx(_components.p,{children:`Data providers pay on-chain subscription fees to the network to make data available and to have it served by workers. These fees are sent to the SQD Network treasury.`}),`\n`,_jsx(Heading,{level:`3`,id:`scheduler`,children:`Scheduler`}),`\n`,_jsx(_components.p,{children:`The scheduler is responsible for distributing the data chunks submitted by the data providers among the workers. The scheduler listens to updates of the data sets, as well as updates of the worker sets, and sends requests to the workers to download new chunks and/or redistribute the existing data chunks based on the capacity and the target redundancy for each dataset. Once a worker receives an update request , it downloads the missing data chunks from the corresponding persistent storage.`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://user-images.githubusercontent.com/8627422/255990260-ee4eca18-faa0-4e14-a495-9aad99ef14cb.png`,alt:`Scheduler workflow diagram`})}),`\n`,_jsx(Heading,{level:`3`,id:`workers`,children:`Workers`}),`\n`,_jsx(_components.p,{children:`Workers contribute the storage and compute resources to the network. They serve the data in a peer-to-peer manner for consumption and receive SQD tokens as compensation. Each worker has to be registered on-chain by bonding 100,000 SQD tokens, which can be slashed if the worker provably violates the protocol rule. SQD holders can also delegate to a specific worker to signal the reliability of the worker and earn a portion of the rewards.`}),`\n`,_jsx(_components.p,{children:`The rewards are distributed each epoch and depend on:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The previous number of epochs the worker stayed online`}),`\n`,_jsx(_components.li,{children:`The amount of data served to clients`}),`\n`,_jsx(_components.li,{children:`The number of delegated tokens`}),`\n`,_jsx(_components.li,{children:`Fairness`}),`\n`,_jsx(_components.li,{children:`Liveness during the epoch`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Workers submit ping information along with their signed logs of the executed query requests to the Validator, thus committing to the results returned to the clients.`}),`\n`,_jsx(Heading,{level:`3`,id:`logs-collector`,children:`Logs collector`}),`\n`,_jsx(_components.p,{children:`The Logs Collector’s sole responsibility is to collect the liveness pings and the query execution logs from the workers, batch them, and save them into public persistent storage. The logs are signed by the workers’ P2P identities and pinned to IPFS. The data is stored for at least 6 months and used by other network participants.`}),`\n`,_jsx(Heading,{level:`3`,id:`reward-manager`,children:`Reward Manager`}),`\n`,_jsx(_components.p,{children:`The Reward Manager is responsible for calculating and submitting worker rewards on-chain for each epoch. The rewards depend on:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Worker liveness during the epoch`}),`\n`,_jsx(_components.li,{children:`Delegated tokens`}),`\n`,_jsx(_components.li,{children:`Served queries (in bytes; both scanned and returned sizes are accounted for)`}),`\n`,_jsx(_components.li,{children:`Liveness since the registration`}),`\n`]}),`\n`,_jsx(_components.p,{children:`The Reward Manager accesses the logs, calculates the rewards, and submits a claimable commitment on-chain for each epoch. Each worker then claims their reward individually. The rewards may expire after an extended period of time.`}),`\n`,_jsx(Heading,{level:`3`,id:`data-consumers`,children:`Data Consumers`}),`\n`,_jsx(_components.p,{children:`To query the network, data consumers have to operate a gateway or use an externally provided service (public or private). Each gateway is bound to an on-chain address. The number of requests a gateway can submit to the network is capped by a number calculated based on the amount of locked SQD tokens. Consequently, the more tokens are locked by the gateway operator, the more bandwidth it is allowed to consume.`}),`\n`,_jsx(_components.p,{children:`One can think of this mechanism as if the locked SQD yields virtual “compute units” (CU) based on the period the tokens are locked. All queries cost the same price of 1 CU (until complex SQL queries are implemented).`}),`\n`,_jsx(_components.p,{children:`The query cap is calculated by:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Calculating the virtual yield in SQD on the locked tokens (in SQD)`}),`\n`,_jsx(_components.li,{children:`Multiplying by the current CU price (in CU/SQD)`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`boosters`,children:`Boosters`}),`\n`,_jsxs(_components.p,{children:[`The locking mechanism has an additional booster design to incentivize gateway operators to lock their tokens for longer periods of time for an increase in CU. The longer the lock period, the more CUs are allocated per SQD/yr. The APY is calculated as `,_jsx(_components.code,{children:`BASE_VIRTUAL_APY * BOOSTER`}),`.`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://github.com/subsquid/subsquid-network-contracts/assets/8627422/a1ab5ce1-da58-4cdc-aac5-90728be23b9e`,alt:`Booster design diagram`})}),`\n`,_jsxs(_components.p,{children:[`At the launch of the network, the parameters are set to be `,_jsx(_components.code,{children:`BASE_VIRTUAL_APY = 12%`}),` and `,_jsx(_components.code,{children:`1SQD = 4000 CU`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`For example, if a gateway operator locks 100 SQD for 2 months, the virtual yield is 2SQD, which means it can perform 8000 queries (8000 CU).\nIf 100 SQD are locked for 3 years, the virtual yield is `,_jsx(_components.code,{children:`12% * 3`}),` APY, so the operator gets CUs worth 108 of SQD, that is it can submit up to `,_jsx(_components.code,{children:`432000`}),` queries to the network within the period of 3 years.`]}),`\n`,_jsx(Heading,{level:`2`,id:`query-validation`,children:`Query Validation`}),`\n`,_jsx(_components.p,{children:`The SQD Network provides economic guarantees for the validity of the queried data, with the added possibility of validating specific queries on-chain. All query responses are signed by the worker who executed the query, acting as a commitment to the query response. Anyone can submit such a response on-chain, and if it is deemed incorrect, the worker bond is slashed. The smart contract validation logic may be dataset-specific depending on the nature of the data being queried, with the following options:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Proof by Authority: a white-listed set of on-chain identities decides on the validity of the response.`}),`\n`,_jsxs(_components.li,{children:[`Optimistic on-chain: after the validation request is submitted, anyone can submit a claim proving the query response is incorrect. For example, assuming the original query was “Return transactions matching the filter `,_jsx(_components.code,{children:`X`}),` in the block range `,_jsx(_components.code,{children:`[Y, Z]`}),`” and the response is some set of transactions `,_jsx(_components.code,{children:`T.`}),` During the validation window, anyone can submit a Merkle proof for some transaction `,_jsx(_components.code,{children:`t`}),` matching the filter `,_jsx(_components.code,{children:`X`}),` yet not in `,_jsx(_components.code,{children:`T.`}),` If no such proofs are submitted during the decision window, the response is considered valid.`]}),`\n`,_jsx(_components.li,{children:`Zero-Knowledge: a zero-knowledge proof that the response exactly matches the requests. The zero-knowledge proof is generated off-chain by a prover and is validated on-chain by the smart contract.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Since submitting each query for on-chain validation on-chain is costly and not feasible, clients opt-in to submit query responses in an off-chain queue, together with the metadata such as response latency. Then, independent searchers scan the queue and submit suspicious queries for on-chain validation. If the query is deemed invalid, the submitter gets a portion of the slashed bond as a reward, thus incentivizing searchers to efficiently scan the queue for malicious responses.`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://github.com/subsquid/subsquid-network-contracts/assets/8627422/8ae1eef9-95f3-4cc4-9b53-2dd8c02d9559`,alt:`Query validation process diagram`})}),`\n`,_jsx(Heading,{level:`2`,id:`sqd-token`,children:`SQD Token`}),`\n`,_jsx(_components.p,{children:`SQD is the ERC-20 protocol token that is native to the SQD Network ecosystem. The token smart contract is to be deployed on the Ethereum mainnet and bridged to Arbitrum One. This strategy seeks to ensure the blockchain serves as a reliable, censorship-resistant, and verifiably impartial ledger, facilitating reward settlements and managing access to network resources.`}),`\n`,_jsx(_components.p,{children:`The SQD token is a critical component of the SQD ecosystem. Use cases for the SQD token are focused on streamlining and securing network operations in a permissionless manner:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Alignment of incentives for infrastructure providers: SQD is used to reward node operators that contribute computation and storage resources to the network.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Curation of network participants: Via delegation, the SQD token design includes built-in curation of nodes, facilitating permissionless selection of trustworthy operators for rewards.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Fair resource consumption: By locking SQD tokens, consumers of data from the decentralized data lake may increase rate limits.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Network decision making: SQD tokenholders can participate in governance, and are enabled to vote on protocol changes and other proposals.`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The SQD token’s innovative curation component allows the SQD community to delegate SQD to Node Operators of their choice, ensuring trustlessness. SQD’s utility as a tool for adjusting rate limits is unique in increasing trustless performance, by locking SQD tokens, without having to pay a centralized provider for quicker or more efficient data access.`}),`\n`,_jsx(Heading,{level:`2`,id:`appendix-i-—-metadata`,children:`Appendix I — Metadata`}),`\n`,_jsx(_components.p,{children:`The metadata has the following structure:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`typescript`,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:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`16`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`interface`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` DataSet`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` dataset_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // how many times the dataset should be replicated`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` replication_factor`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // a unique URL for permanent storage. Can be s3:// bucket`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` permanent_storage`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // how much space should for a single replica.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // the total space required by a dataset is replication_factor * reserved_space`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` reserved_space`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // dataset-specific additional metadata`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` extra_meta`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // dataset-specific state description`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` state`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // reserved for future use, must be false`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` premium`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` boolean`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The on-chain state of the dataset should be updated by the data provider periodically, and the total space must not exceed `,_jsx(_components.code,{children:`reserved_space`}),`. The dataset can be in the following states:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`typescript`,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:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`enum`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` DatasetState`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // submitted by the data provider`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` SUBMITTED`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // the data being distributed by the network`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` IN_PREPARATION`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // served by the network`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` ACTIVE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // if the subscription fee`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // has not been provided for the duration of an epoch`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` COOLDOWN`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // if the dataset is no longer served by the network`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // and will be deleted`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` DISABLED`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`Scheduler`}),` changes the state to `,_jsx(_components.code,{children:`IN_PREPARATION`}),` and `,_jsx(_components.code,{children:`ACTIVE`}),` from `,_jsx(_components.code,{children:`SUBMITTED`}),`. The `,_jsx(_components.code,{children:`COOLDOWN`}),` and `,_jsx(_components.code,{children:`DISABLED`}),` states are activated automatically if subscription payments aren’t made.`]}),`\n`,_jsx(_components.p,{children:`At the initial stage of the network, the switch to disabling datasets is granted to Subsquid Labs GmbH, which is going to be replaced by auto payments at a later stage.`}),`\n`,_jsx(Heading,{level:`2`,id:`appendix-ii-—-rewards`,children:`Appendix II — Rewards`}),`\n`,_jsx(_components.p,{children:`The network rewards are paid out to workers and delegators for each epoch. The Reward Manager submits an on-chain claim commitment, from which each participant can claim.`}),`\n`,_jsxs(_components.p,{children:[`The rewards are allocated from the rewards pool. Each epoch, the rewards pool unlocks `,_jsx(_components.code,{children:`APY_D * S * EPOCH_LENGTH`}),` in rewards, where `,_jsx(_components.code,{children:`EPOCH_LENGTH`}),` is the length of the epoch in days, `,_jsx(_components.code,{children:`S`}),` is the total (bonded + delegated) amount of staked `,_jsx(_components.code,{children:`SQD`}),` during the epoch and `,_jsx(_components.code,{children:`APY_D`}),` is the (variable) base reward rate calculated for the epoch.`]}),`\n`,_jsx(Heading,{level:`3`,id:`rewards-pool`,children:`Rewards pool`}),`\n`,_jsx(_components.p,{children:`The SQD supply is fixed for the initial pool, and the rewards are distributed from a pool, to which 10% of the supply is allocated at TGE. The reward pool has a protective mechanism which caps the amount of rewards distributed per epoch, and it is subject to change via governance.`}),`\n`,_jsx(_components.p,{children:`During the initial 3-year bootstrapping phase, the reward cap and the total supply of SQD is fixed. Afterwards, the reward cap drops significantly until the governance motion concludes on the inflation schedule and new tokens are minted to replenish the reward pool.`}),`\n`,_jsx(_components.p,{children:`Unlike most projects who fix the inflation schedule before the launch, postponing this decision leaves a lot more flexibility and allows the community to analyze the historical 3-year data to make an informed decision on the future issuance of SQD.`}),`\n`,_jsx(Heading,{level:`3`,id:`reward-rate`,children:`Reward rate`}),`\n`,_jsx(_components.p,{children:`The reward rate depends on two factors: utilization of the network and staked supply. The network utilization rate is defined as`}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`u_rate = (target_capacity - actual_capacity)/target_capacity`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`The target capacity is calculated as`}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`target_capacity = sum([d.reserved_space * d.replication_factor])`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`where the sum is over the non-disabled datasets `,_jsx(_components.code,{children:`d`}),`.`]}),`\n`,_jsx(_components.p,{children:`The actual capacity is calculated as`}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`actual_capacity = num_of_active_workers() * WORKER_CAPCITY * CHURN`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`WORKER_CAPACITY`}),` is a fixed storage per worker, set to 1TB. `,_jsx(_components.code,{children:`CHURN`}),` is a discounting factor to account for the churn, set to 0.9.`]}),`\n`,_jsx(_components.p,{children:`The target APR (365-day-based rate) is then calculated as:`}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`rAPR = MIN(base_apr(u_rate), APR_CAP(total_staked))`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`base_apr`}),` is projected to be around 20% in the equilibrium state, when the actual worker capacity matches the desired network capacity, set externally. It is increased up to 70% to incentivize more workers to join the network until the target capacity is reached:`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/sqd-2119b3c3/7LuoJDkLWjfEi5PF/en/network/apr_chart.png?fit=max\u0026auto=format\u0026n=7LuoJDkLWjfEi5PF\u0026q=85\u0026s=58f13a785bd5830ffa7d297dc5d801aa`,alt:`APR calculation chart`,\"data-og-width\":`930`,width:`930`,\"data-og-height\":`524`,height:`524`,\"data-path\":`en/network/apr_chart.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/sqd-2119b3c3/7LuoJDkLWjfEi5PF/en/network/apr_chart.png?w=280\u0026fit=max\u0026auto=format\u0026n=7LuoJDkLWjfEi5PF\u0026q=85\u0026s=92f3861d5562623cac9700382fa65d2d 280w, https://mintcdn.com/sqd-2119b3c3/7LuoJDkLWjfEi5PF/en/network/apr_chart.png?w=560\u0026fit=max\u0026auto=format\u0026n=7LuoJDkLWjfEi5PF\u0026q=85\u0026s=4acdfe0dc5966f834b5ce8d7145eebf8 560w, https://mintcdn.com/sqd-2119b3c3/7LuoJDkLWjfEi5PF/en/network/apr_chart.png?w=840\u0026fit=max\u0026auto=format\u0026n=7LuoJDkLWjfEi5PF\u0026q=85\u0026s=71c5538aba69bf56a5ad99723519640e 840w, https://mintcdn.com/sqd-2119b3c3/7LuoJDkLWjfEi5PF/en/network/apr_chart.png?w=1100\u0026fit=max\u0026auto=format\u0026n=7LuoJDkLWjfEi5PF\u0026q=85\u0026s=f22a8d114e24754864f62fb9d1ae89ee 1100w, https://mintcdn.com/sqd-2119b3c3/7LuoJDkLWjfEi5PF/en/network/apr_chart.png?w=1650\u0026fit=max\u0026auto=format\u0026n=7LuoJDkLWjfEi5PF\u0026q=85\u0026s=2dc6bf6915d1b8ffce4f324dbc403c86 1650w, https://mintcdn.com/sqd-2119b3c3/7LuoJDkLWjfEi5PF/en/network/apr_chart.png?w=2500\u0026fit=max\u0026auto=format\u0026n=7LuoJDkLWjfEi5PF\u0026q=85\u0026s=cb3258f4208e9a9d3238e0a62a2b4133 2500w`})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`APR_CAP`}),` cut-off is added to cap the total rewards per epoch.\nOne defines first`]}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`total_staked = bonded + delegated`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`to be the total amount of reward-earning SQD locked by workers (bonded) and delegators (delegated) respectively.`}),`\n`,_jsx(_components.p,{children:`We then define`}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`APR_CAP(total_staked) = 0.3 * INITIAL_POOL_SIZE / total_staked`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The 0.3 coefficient (`,_jsx(_components.code,{children:`yearlyRewardCapCoefficient`}),` on the NetworkController contract) is a governance parameter. On Arbitrum One it currently reads 2,900 basis points (0.29); see `,_jsx(_components.a,{href:`/en/other/contracts#arbitrum-one-production`,children:`NetworkController`}),` for the deployed address. At the 0.3 design value, this caps cumulative payouts at 90% of the initial reward pool after the 3-year bootstrapping period; at the current 0.29 value, the same calculation caps it at about 87%.`]}),`\n`,_jsx(Heading,{level:`3`,id:`worker-reward-rate`,children:`Worker reward rate`}),`\n`,_jsxs(_components.p,{children:[`For each epoch, `,_jsx(_components.code,{children:`rAPR`}),` is calculated, and the total of`]}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`R = rAPR/365 * total_staked * EPOCH_LENGTH`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`is unlocked from the rewards pool.`}),`\n`,_jsx(_components.p,{children:`The rewards are then distributed between the workers and delegators, and the leftovers are split between the burn and the treasury.`}),`\n`,_jsxs(_components.p,{children:[`For a single worker and stakers for this token, the maximal reward is `,_jsx(_components.code,{children:`rAPR/365 * (bond + staked) * EPOCH_LENGTH`}),`. It is split into the worker liveness reward and the worker traffic reward.`]}),`\n`,_jsxs(_components.p,{children:[`Let `,_jsx(_components.code,{children:`S[i]`}),` be the stake for `,_jsx(_components.code,{children:`i`}),`-th worker and `,_jsx(_components.code,{children:`T[i]`}),` be the traffic units (defined below) processed by the worker. We define the relative weights as`]}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`5`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`s[i] = S[i]/sum(S[i])`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`t_scanned[i] = T_scanned[i]/sum(T_scanned[i])`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`t_e[i] = T_e[i]/sum(T_e[i])`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`t[i] = sqrt(t_scanned[i] * t_e[i])`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`In other words, `,_jsx(_components.code,{children:`s[i]`}),` and `,_jsx(_components.code,{children:`t[i]`}),` correspond to the contribution of the `,_jsx(_components.code,{children:`i`}),`-th worker to the total stake and to total traffic, respectively.`]}),`\n`,_jsxs(_components.p,{children:[`The traffic weight `,_jsx(_components.code,{children:`t[i]`}),` is a geometric average of the normalized scanned (`,_jsx(_components.code,{children:`t_scanned[i]`}),`) and the egress (`,_jsx(_components.code,{children:`t_e[i]`}),`) traffic processed by the worker. It is calculated by aggregating the logs of the queries processed by the worker during the epoch, and for each processed query, the worker reports the response size (egress) and the number of scanned data chunks.`]}),`\n`,_jsxs(_components.p,{children:[`The max potential yield for the epoch is given by `,_jsx(_components.code,{children:`rAPR`}),` described above:`]}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`r_max = rAPR/365 * EPOCH_LENGTH`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The actual yield `,_jsx(_components.code,{children:`r[i]`}),` for the `,_jsx(_components.code,{children:`i`}),`-th worker is discounted:`]}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`r[i] = r_max * D_liveness * D_traffic(t_i, s_i) * D_tenure`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`D_traffic`}),` is a Cobb-Douglas type discount factor defined as`]}),`\n`,_jsx(CodeBlock,{filename:``,nocopy:`true`,numberOfLines:`2`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`D_traffic(t_i, s_i) = min( (t_i/s_i)^alpha, 1 )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`with the elasticity parameter alpha set to 0.1.`}),`\n`,_jsx(_components.p,{children:`It has the following properties:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Always in the interval `,_jsx(_components.code,{children:`[0, 1]`})]}),`\n`,_jsxs(_components.li,{children:[`Goes to zero as `,_jsx(_components.code,{children:`t_i`}),` goes to zero`]}),`\n`,_jsxs(_components.li,{children:[`Neutral (i.e., close to 1) when `,_jsx(_components.code,{children:`s_i ~ t_i`}),`, that is, the stake contribution is fair (proportional to the traffic contribution)`]}),`\n`,_jsx(_components.li,{children:`Excess traffic contributes only sub-linearly to the reward`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`D_liveness`}),` is a liveness factor calculated as the percentage of the time the worker is self-reported as online. A worker sends a ping message every 10 seconds, and if there are no pings within a minute, the worker is deemed offline for this period of time. The liveness factor is the percentage of the time (with minute-based granularity) the network is live. We suggest a piecewise linear function with the following properties:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`It is 0 below a reasonably high threshold (set to 0.8)`}),`\n`,_jsx(_components.li,{children:`Sharply increases to near 1 in the “intermediary” regime 0.8-0.9`}),`\n`,_jsx(_components.li,{children:`The penalty around 1 is diminishing`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://user-images.githubusercontent.com/8627422/257277215-5c902bb4-2a90-4847-8a1f-1cd88e46fb54.png`,alt:`Liveness factor function chart`})}),`\n`,_jsxs(_components.p,{children:[`Finally, `,_jsx(_components.code,{children:`D_tenure`}),` is a long-range liveness factor incentivizing consistent liveness across the epochs. The rationale is that`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The probability of a worker failure decreases with the time the worker is live thus freshly spawned workers are rewarded less`}),`\n`,_jsx(_components.li,{children:`The discount for freshly spawned workers discourages the churn among workers and incentivizes longer-term commitments`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://user-images.githubusercontent.com/8627422/257228987-7863df56-8ad3-447d-a095-dae18c1027b3.png`,alt:`Tenure factor function chart`})}),`\n`,_jsx(Heading,{level:`3`,id:`distribution-between-the-worker-and-delegators`,children:`Distribution between the worker and delegators`}),`\n`,_jsxs(_components.p,{children:[`The total claimable reward for the `,_jsx(_components.code,{children:`i`}),`-th worker and the stakers is calculated simply as `,_jsx(_components.code,{children:`r[i] * s[i]`}),`. Clearly, `,_jsx(_components.code,{children:`s[i]`}),` is the sum of the (fixed) bond `,_jsx(_components.code,{children:`b[i]`}),` and the (variable) delegated stake `,_jsx(_components.code,{children:`d[i]`}),`. Thus, the delegator rewards account for `,_jsx(_components.code,{children:`r[i] * d[i]`}),`. This extra reward part is split between the worker and the delegators:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The worker gets: `,_jsx(_components.code,{children:`r[i] * b[i] + 0.5 * r[i] * s[i]`})]}),`\n`,_jsxs(_components.li,{children:[`The delegators get `,_jsx(_components.code,{children:`0.5 * r[i] * s[i]`}),`, effectively attaining `,_jsx(_components.code,{children:`0.5 * r[i]`}),` as the effectual reward rate.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The rationale for this split is:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Make the worker accountable for `,_jsx(_components.code,{children:`r[i]`})]}),`\n`,_jsx(_components.li,{children:`Incentivize the worker to attract stakers (the additional reward part)`}),`\n`,_jsxs(_components.li,{children:[`Incentivize the stakers to stake for a worker with high liveness (and, in general, high `,_jsx(_components.code,{children:`r[i]`}),`)`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`At an equilibrium, the stakers will get a 10% annual yield, while workers get anything between 20-30% depending on the staked funds. Note that the maximal stake is limited by the bond size.`}),`\n`,_jsx(Heading,{level:`2`,id:`references`,children:`References`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`[1]`}),` `,_jsx(_components.a,{href:`https://superdao.notion.site/Web3-Growth-Trends-2023-Superdao-Report-1b51a98ad10644afba94c1d9df1e5f99`,children:`SuperDAO Growth Trends report`})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`[2]`}),` Based on the estimate that read-only RPC queries constitute roughly 90% of the RPC provider traffic`]})]})}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":"SQD Network Whitepaper","sidebarTitle":"Whitepaper","description":"Technical design of SQD Network: workers, gateways, query validation, and rewards.","href":"/en/network/whitepaper"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Intro","slug":"intro","depth":2,"children":[]},{"title":"Design Overview","slug":"design-overview","depth":2,"children":[{"title":"Data Providers","slug":"data-providers","depth":3,"children":[]},{"title":"Scheduler","slug":"scheduler","depth":3,"children":[]},{"title":"Workers","slug":"workers","depth":3,"children":[]},{"title":"Logs collector","slug":"logs-collector","depth":3,"children":[]},{"title":"Reward Manager","slug":"reward-manager","depth":3,"children":[]},{"title":"Data Consumers","slug":"data-consumers","depth":3,"children":[]},{"title":"Boosters","slug":"boosters","depth":3,"children":[]}]},{"title":"Query Validation","slug":"query-validation","depth":2,"children":[]},{"title":"SQD Token","slug":"sqd-token","depth":2,"children":[]},{"title":"Appendix I — Metadata","slug":"appendix-i-—-metadata","depth":2,"children":[]},{"title":"Appendix II — Rewards","slug":"appendix-ii-—-rewards","depth":2,"children":[{"title":"Rewards pool","slug":"rewards-pool","depth":3,"children":[]},{"title":"Reward rate","slug":"reward-rate","depth":3,"children":[]},{"title":"Worker reward rate","slug":"worker-reward-rate","depth":3,"children":[]},{"title":"Distribution between the worker and delegators","slug":"distribution-between-the-worker-and-delegators","depth":3,"children":[]}]},{"title":"References","slug":"references","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/sqd-2119b3c3/b07d1838ac35ff9a/safari-toolbar.js"],"subdomain":"sqd-2119b3c3","siteName":"SQD Documentation","title":"SQD Network Whitepaper - SQD Documentation","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"contextualStarterQuestions":[{"_id":"6ad5f7ecf4ce48a16fad7b36","deploymentId":"6808b07179034f1572602b7f","questionText":"What are Web3 infrastructure layers?","status":"active","generatedBy":"contextual","path":"en/network/whitepaper","createdAt":"2026-10-19T10:58:52.234Z","updatedAt":"2026-10-19T10:58:52.234Z","__v":0},{"_id":"6ad5f7ecf4ce48a16fad7b35","deploymentId":"6808b07179034f1572602b7f","questionText":"How does data retrieval work?","status":"active","generatedBy":"contextual","path":"en/network/whitepaper","createdAt":"2026-10-19T10:58:52.234Z","updatedAt":"2026-10-19T10:58:52.234Z","__v":0},{"_id":"6ad5f7ecf4ce48a16fad7b34","deploymentId":"6808b07179034f1572602b7f","questionText":"What is the SQD Network?","status":"active","generatedBy":"contextual","path":"en/network/whitepaper","createdAt":"2026-10-19T10:58:52.234Z","updatedAt":"2026-10-19T10:58:52.234Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/network/whitepaper","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-10-19T10:58:36.826Z","originalFileLocation":"en/network/whitepaper.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=\"Technical design of SQD Network: workers, gateways, query validation, and rewards.\">\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=\"SQD Network Whitepaper - SQD Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Technical design of SQD Network: workers, gateways, query validation, and rewards.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SQD Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sqd.dev/en/network/whitepaper\">\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=Reference\u0026amp;title=SQD+Network+Whitepaper\u0026amp;description=Technical+design+of+SQD+Network%3A+workers%2C+gateways%2C+query+validation%2C+and+rewards.\u0026amp;theme=fdcf458c8520acc4daeceafb\u0026amp;signature=2a6557e0daa4c571896b584547c2a0961a4422db25dc9f9c9dde9f1c86849ca0\">\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=\"SQD Network Whitepaper - SQD Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Technical design of SQD Network: workers, gateways, query validation, and rewards.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sqd-2119b3c3.mintlify.app/_mintlify/api/og/v2?division=Reference\u0026amp;title=SQD+Network+Whitepaper\u0026amp;description=Technical+design+of+SQD+Network%3A+workers%2C+gateways%2C+query+validation%2C+and+rewards.\u0026amp;theme=fdcf458c8520acc4daeceafb\u0026amp;signature=2a6557e0daa4c571896b584547c2a0961a4422db25dc9f9c9dde9f1c86849ca0\">\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/network/whitepaper\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/network/whitepaper.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/network/whitepaper#webpage\",\"url\":\"https://docs.sqd.dev/en/network/whitepaper\",\"name\":\"SQD Network Whitepaper\",\"description\":\"Technical design of SQD Network: workers, gateways, query validation, and rewards.\",\"dateModified\":\"2026-10-19T10:58:36.826Z\",\"isPartOf\":{\"@id\":\"https://docs.sqd.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sqd.dev/en/network/whitepaper#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sqd.dev/en/network/whitepaper#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reference\",\"item\":\"https://docs.sqd.dev/en/network/tokenomics\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQD Network Whitepaper\",\"item\":\"https://docs.sqd.dev/en/network/whitepaper\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.sqd.dev/en/network/whitepaper#article\",\"headline\":\"SQD Network Whitepaper\",\"name\":\"SQD Network Whitepaper\",\"description\":\"Technical design of SQD Network: workers, gateways, query validation, and rewards.\",\"url\":\"https://docs.sqd.dev/en/network/whitepaper\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sqd.dev/en/network/whitepaper#webpage\"},\"dateModified\":\"2026-10-19T10:58:36.826Z\",\"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","pages":[{"title":"EVM","href":"/en/sdk/overview"}]},{"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"}]}],"pages":[{"title":"Build","href":"/en/sdk/overview"}]},{"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","groups":[{"group":"Documentation","pages":[{"title":"Glossary","href":"/en/other/glossary/glossary"},{"title":"Network, Portal and SDK FAQ","sidebarTitle":"FAQ","mode":"wide","href":"/en/other/faq"},{"title":"Contracts","href":"/en/other/contracts"}]},{"group":"Reference","pages":[{"title":"SQD Token Economics","sidebarTitle":"Tokenomics","description":"SQD token utility: node operator rewards, delegation, rate limits, and governance.","href":"/en/network/tokenomics"},{"title":"SQD Network Whitepaper","sidebarTitle":"Whitepaper","href":"/en/network/whitepaper"},{"title":"Getting SQD Tokens","description":"Buy SQD tokens to delegate, stake, or pay for SQD Network resources.","href":"/en/network/procuring-sqd"}]},{"group":"Case studies","pages":[{"title":"Case studies","sidebarTitle":"Case studies","url":"https://sqd.dev/customers","href":"/en/other/case-studies"}]}]},{"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":"SQD Network Whitepaper - SQD Documentation","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-PS-3COT9.js","DynamicMarkdown-BcnBltEQ.js","zoom-image-lightbox-B4-wUcHm.js","lightbox-handle-r17bVUz3.js"]}