Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent’s RFQ protocol.
This page is the compact protocol reference. Read it when you need to debug a message flow, map SDK fields to onchain settlement, or confirm which identifier belongs in which part of the RFQ stack.For conceptual background, start with SDK architecture. For runnable commands, use the Runbook.
quote_ack.status="success" means the indexer accepted and routed a syntactically valid quote. It is not a fill signal. The fill signal is either the onchain transaction result observed by the taker or the maker-side settlement_update.
TP/SL orders are pre-signed taker intents. The taker can go offline after submission; the executor fires the exit when the trigger condition is satisfied.Makers do not need to distinguish this from any other RFQ request. The TP/SL-specific state is owned by the taker and executor. For taker-side fields and signing, see Signed intents.
The contract processes submitted quotes and skips quotes that fail quote-level validation. Settlement succeeds only if the selected valid quotes satisfy the taker’s fill constraints.
Check
Failure result
Maker signature verifies against the exact submitted fields
Quote skipped
Quote sign_mode is v2 and evm_chain_id matches the EIP-712 domain
Quote skipped
Quote taker plus rfq_id matches the request or signed intent
Quote skipped or rfq_id mismatch
Quote has not expired at settlement block time
Quote skipped
Maker is whitelisted and uses the registered maker_subaccount_nonce
Quote skipped or no fill
Maker and taker authz grants exist for the RFQ contract
Transaction fails with authorization error
Maker and taker subaccounts have enough margin
Quote skipped or transaction fails
Price satisfies taker worst_price and mark-band checks
Quote skipped
Min-fill and unfilled-action rules are satisfied
Partial fill or no fill
Signed-intent trigger, deadline_ms, epoch, and lane_version are valid
For integer-tick markets such as BTC/USDC, canonicalize prices without a decimal point. "76462" is valid; "76462.0" can fail signature or tick validation depending on where it is introduced.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TrueCurrent Docs","description":"TrueCurrent allows you to trade markets without limits.","colors":{"primary":"#fd9a00","light":"#ecaa83","dark":"#000000"},"logo":{"light":"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-light.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=f7446d955d9b68fa400415f663de20d1","dark":"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=7c10937abcc9d1b46db1ed3b71bb9288"},"favicon":"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=7c10937abcc9d1b46db1ed3b71bb9288","search":{"prompt":"Search TrueCurrent docs..."},"seo":{"metatags":{"og:type":"website","og:site_name":"TrueCurrent Docs","canonical":"https://docs.tc.xyz"},"indexing":"all"},"styling":{"eyebrows":"breadcrumbs","latex":true},"metadata":{"timestamp":true},"navigation":{"languages":[{"language":"en","href":""}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"injectivelabs-2","hasAudioNarration":false,"actualSubdomain":"injectivelabs-2","customDomains":["docs.tc.xyz"],"gitSource":{"type":"github","owner":"truecurrent","repo":"truecurrent-docs","deployBranch":"main","contentDirectory":"mintlify","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af4808a911eab1428db6e5e","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"en","tag":"TRUECURRENT","count":68},{"language":"en","tag":"SDK Trading","count":22},{"language":"en","tag":"Trading","count":14},{"language":"en","tag":"Mobile","count":9},{"language":"en","tag":"Makers","count":8},{"language":"en","tag":"Takers","count":6},{"language":"en","tag":"Technical","count":6},{"language":"en","tag":"Getting Started","count":4},{"language":"en","tag":"Overview","count":3},{"language":"en","tag":"Predictions","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"sdk-trading/protocol-reference","slug":"/sdk-trading/protocol-reference","pageMetadata":{"title":"Protocol reference","description":"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent's RFQ protocol.","updatedAt":"2026-05-27","href":"/sdk-trading/protocol-reference"},"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: \"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent’s RFQ protocol.\"\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`,hr:`hr`,li:`li`,p:`p`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Mermaid,Table,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This page is the compact protocol reference. Read it when you need to debug a message flow, map SDK fields to onchain settlement, or confirm which identifier belongs in which part of the RFQ stack.`}),`\n`,_jsxs(_components.p,{children:[`For conceptual background, start with `,_jsx(_components.a,{href:`/sdk-trading/architecture`,children:`SDK architecture`}),`. For runnable commands, use the `,_jsx(_components.a,{href:`/sdk-trading/runbook`,children:`Runbook`}),`.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`actors`,children:`Actors`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Actor`}),_jsx(_components.th,{children:`Runs where`}),_jsx(_components.th,{children:`Responsibility`}),_jsx(_components.th,{children:`Trust boundary`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Taker`}),_jsx(_components.td,{children:`Client or trading service`}),_jsx(_components.td,{children:`Requests quotes, selects quotes, submits settlement`}),_jsx(_components.td,{children:`Owns taker key and taker margin`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Maker`}),_jsx(_components.td,{children:`Market-maker service`}),_jsx(_components.td,{children:`Receives RFQs, signs executable quotes, manages maker inventory`}),_jsx(_components.td,{children:`Owns maker key and maker margin`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`RFQ indexer / executor`}),_jsx(_components.td,{children:`TrueCurrent service`}),_jsxs(_components.td,{children:[`Routes requests and quotes, assigns `,_jsx(_components.code,{children:`rfq_id`}),`, monitors signed intents, emits ordinary RFQs when triggers fire`]}),_jsx(_components.td,{children:`Cannot change signed fields or settle without valid signatures`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`RFQ contract`}),_jsx(_components.td,{children:`Injective CosmWasm`}),_jsx(_components.td,{children:`Verifies signatures, authz, expiries, constraints, then settles`}),_jsx(_components.td,{children:`Onchain enforcement point`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Injective exchange module`}),_jsx(_components.td,{children:`Injective chain`}),_jsx(_components.td,{children:`Opens, closes, and liquidates derivative positions`}),_jsx(_components.td,{children:`Final position and margin ledger`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsxs(Heading,{level:`2`,id:`live-rfq-path-acceptquote`,children:[`Live RFQ path (`,_jsx(_components.code,{children:`AcceptQuote`}),`)`]}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n participant Taker\n participant Indexer as RFQ Indexer\n participant Maker\n participant Contract as RFQ Contract\n participant Exchange as Injective Exchange\n\n Maker->>Indexer: Connect MakerStream\n Indexer-->>Maker: MakerChallenge\n Maker->>Indexer: MakerAuth(EIP-712 v2 signature)\n Indexer-->>Maker: Auth accepted\n\n Taker->>Indexer: TakerStream RFQ request(client_id, market, side, size, worst_price)\n Indexer-->>Taker: ACK(rfq_id)\n Indexer->>Maker: RFQ request(rfq_id)\n Maker->>Maker: Price and sign SignQuote(EIP-712 v2)\n Maker->>Indexer: Quote(sign_mode=\"v2\", evm_chain_id, signature)\n Indexer-->>Maker: quote_ack(status=\"success\")\n Indexer->>Taker: Signed quote(s)\n Taker->>Contract: AcceptQuote(rfq_id, selected quote(s))\n Contract->>Contract: Verify quote signature, expiry, authz, price constraints\n Contract->>Exchange: Atomic position and margin updates\n Exchange-->>Contract: Settlement result\n Contract-->>Taker: Tx result\n Indexer-->>Maker: settlement_update`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`quote_ack.status=\"success\"`}),` means the indexer accepted and routed a syntactically valid quote. It is not a fill signal. The fill signal is either the onchain transaction result observed by the taker or the maker-side `,_jsx(_components.code,{children:`settlement_update`}),`.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsxs(Heading,{level:`2`,id:`signed-intent-path-acceptsignedintent`,children:[`Signed-intent path (`,_jsx(_components.code,{children:`AcceptSignedIntent`}),`)`]}),`\n`,_jsx(_components.p,{children:`TP/SL orders are pre-signed taker intents. The taker can go offline after submission; the executor fires the exit when the trigger condition is satisfied.`}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n participant Taker\n participant Indexer as Indexer / Executor\n participant Maker\n participant Contract as RFQ Contract\n participant Exchange as Injective Exchange\n\n Taker->>Indexer: SignedTakerIntent(trigger, worst_price, quantity, deadline)\n Indexer->>Indexer: Persist intent and monitor trigger source\n Indexer->>Maker: Standard RFQ request\n Maker->>Indexer: Standard signed RFQ quote\n Indexer->>Contract: AcceptSignedIntent(intent, quote)\n Contract->>Contract: Verify taker sig, trigger, deadline, quote sig, authz\n Contract->>Exchange: Atomic reduce-only settlement\n Exchange-->>Contract: Settlement result`}),`\n`,_jsxs(_components.p,{children:[`Makers do not need to distinguish this from any other RFQ request. The TP/SL-specific state is owned by the taker and executor. For taker-side fields and signing, see `,_jsx(_components.a,{href:`/sdk-trading/signed-intents`,children:`Signed intents`}),`.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`settlement-checks`,children:`Settlement checks`}),`\n`,_jsx(_components.p,{children:`The contract processes submitted quotes and skips quotes that fail quote-level validation. Settlement succeeds only if the selected valid quotes satisfy the taker’s fill constraints.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Check`}),_jsx(_components.th,{children:`Failure result`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Maker signature verifies against the exact submitted fields`}),_jsx(_components.td,{children:`Quote skipped`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Quote `,_jsx(_components.code,{children:`sign_mode`}),` is `,_jsx(_components.code,{children:`v2`}),` and `,_jsx(_components.code,{children:`evm_chain_id`}),` matches the EIP-712 domain`]}),_jsx(_components.td,{children:`Quote skipped`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Quote taker plus `,_jsx(_components.code,{children:`rfq_id`}),` matches the request or signed intent`]}),_jsxs(_components.td,{children:[`Quote skipped or `,_jsx(_components.code,{children:`rfq_id mismatch`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Quote has not expired at settlement block time`}),_jsx(_components.td,{children:`Quote skipped`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Maker is whitelisted and uses the registered `,_jsx(_components.code,{children:`maker_subaccount_nonce`})]}),_jsx(_components.td,{children:`Quote skipped or no fill`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Maker and taker authz grants exist for the RFQ contract`}),_jsx(_components.td,{children:`Transaction fails with authorization error`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Maker and taker subaccounts have enough margin`}),_jsx(_components.td,{children:`Quote skipped or transaction fails`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Price satisfies taker `,_jsx(_components.code,{children:`worst_price`}),` and mark-band checks`]}),_jsx(_components.td,{children:`Quote skipped`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Min-fill and unfilled-action rules are satisfied`}),_jsx(_components.td,{children:`Partial fill or no fill`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Signed-intent trigger, `,_jsx(_components.code,{children:`deadline_ms`}),`, `,_jsx(_components.code,{children:`epoch`}),`, and `,_jsx(_components.code,{children:`lane_version`}),` are valid`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`AcceptSignedIntent`}),` fails`]})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`identifier-reference`,children:`Identifier reference`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Assigned by`}),_jsx(_components.th,{children:`Used in`}),_jsx(_components.th,{children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`client_id`})}),_jsx(_components.td,{children:`Taker`}),_jsx(_components.td,{children:`TakerStream request only`}),_jsx(_components.td,{children:`UUID correlation key for the client. It is not signed and is not the settlement nonce.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`rfq_id`})}),_jsx(_components.td,{children:`Indexer`}),_jsx(_components.td,{children:`Request ACK, maker request, quote signature, settlement`}),_jsx(_components.td,{children:`Use the ACK-returned value. Do not invent it locally.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`chain_id`})}),_jsx(_components.td,{children:`Environment config`}),_jsx(_components.td,{children:`Quote wire payload`}),_jsxs(_components.td,{children:[`Cosmos chain ID: `,_jsx(_components.code,{children:`injective-888`}),` on testnet, `,_jsx(_components.code,{children:`injective-1`}),` on mainnet.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`evm_chain_id`})}),_jsx(_components.td,{children:`Environment config`}),_jsx(_components.td,{children:`EIP-712 domain and v2 wire fields`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`1439`}),` on testnet, `,_jsx(_components.code,{children:`1776`}),` on mainnet. Do not put this value in `,_jsx(_components.code,{children:`quote.chain_id`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`contract_address`})}),_jsx(_components.td,{children:`Environment config`}),_jsx(_components.td,{children:`Quote wire payload and EIP-712 domain`}),_jsx(_components.td,{children:`Bech32 RFQ contract address on the wire; converted to EVM address inside the typed-data domain.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`maker_subaccount_nonce`})}),_jsx(_components.td,{children:`Maker registration`}),_jsx(_components.td,{children:`Quote signature and settlement`}),_jsxs(_components.td,{children:[`If `,_jsx(_components.code,{children:`list_makers`}),` returns `,_jsx(_components.code,{children:`null`}),`, quote with nonce `,_jsx(_components.code,{children:`0`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`expiry`})}),_jsx(_components.td,{children:`Maker`}),_jsx(_components.td,{children:`Quote signature and settlement`}),_jsxs(_components.td,{children:[`Milliseconds. Live quotes must use `,_jsx(_components.code,{children:`now_ms + 2_000`}),` for 2 seconds of validity.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`epoch`})}),_jsx(_components.td,{children:`Contract state`}),_jsx(_components.td,{children:`Signed intents`}),_jsxs(_components.td,{children:[`Bumped by `,_jsx(_components.code,{children:`CancelAllIntents`}),`; invalidates all older taker intents.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`lane_version`})}),_jsx(_components.td,{children:`Contract state`}),_jsx(_components.td,{children:`Signed intents`}),_jsxs(_components.td,{children:[`Bumped by `,_jsx(_components.code,{children:`CancelIntentLane`}),`; invalidates one `,_jsx(_components.code,{children:`(taker, market_id, subaccount_nonce)`}),` lane.`]})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`testnet-markets`,children:`Testnet markets`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Market`}),_jsx(_components.th,{children:`Symbol`}),_jsx(_components.th,{children:`Market ID`}),_jsx(_components.th,{children:`Price tick`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`INJ/USDC PERP`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`INJ/USDC PERP`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0xdc70164d7120529c3cd84278c98df4151210c0447a65a2aab03459cf328de41e`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0.01`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`BTC/USDC PERP`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`BTC/USDC PERP`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0xfd704649cf3a516c0c145ab0111717c44640d8dbe52a462ae35cadf2f6df1515`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`LINK/USDC PERP`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`LINK/USDC PERP`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0xdbb9bb072015238096f6e821ee9aab7affd741f8662a71acc14ac30ee6b687a5`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0.001`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`ETH/USDC PERP`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ETH/USDC PERP`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x135de28700392fb1c17d40d5170a74f30055a4ad522feddafec42fbbbb780897`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0.1`})})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`For integer-tick markets such as BTC/USDC, canonicalize prices without a decimal point. `,_jsx(_components.code,{children:`\"76462\"`}),` is valid; `,_jsx(_components.code,{children:`\"76462.0\"`}),` can fail signature or tick validation depending on where it is introduced.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`related-implementation-pages`,children:`Related implementation pages`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/sdk-trading/testnet-configuration`,children:`Testnet configuration`}),` lists endpoints, contract address, EVM chain IDs, and token denom.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/sdk-trading/signing-quotes`,children:`Building and signing quotes`}),` documents the exact EIP-712 v2 `,_jsx(_components.code,{children:`SignQuote`}),` field order.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/sdk-trading/sending-quotes`,children:`Sending quotes`}),` explains MakerStream quote payloads and ACK semantics.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/sdk-trading/troubleshooting`,children:`Troubleshooting`}),` maps common errors to fixes.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Protocol reference","description":"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent's RFQ protocol.","updatedAt":"2026-05-27","href":"/sdk-trading/protocol-reference"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Actors","slug":"actors","depth":2,"children":[]},{"title":"Live RFQ path (AcceptQuote)","slug":"live-rfq-path-acceptquote","depth":2,"children":[]},{"title":"Signed-intent path (AcceptSignedIntent)","slug":"signed-intent-path-acceptsignedintent","depth":2,"children":[]},{"title":"Settlement checks","slug":"settlement-checks","depth":2,"children":[]},{"title":"Identifier reference","slug":"identifier-reference","depth":2,"children":[]},{"title":"Testnet markets","slug":"testnet-markets","depth":2,"children":[]},{"title":"Related implementation pages","slug":"related-implementation-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"injectivelabs-2","siteName":"TrueCurrent Docs","title":"Protocol reference - TrueCurrent Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/sdk-trading/protocol-reference","matchLevel":0}}},"lastModified":"2026-08-28T21:46:55.633Z","gitLastModified":"2026-08-28T21:35:31.000Z","originalFileLocation":"sdk-trading/protocol-reference.md","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=\"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent\u0026#x27;s RFQ protocol.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TrueCurrent Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=TAi2KoKzFwI2tA_y\u0026amp;q=85\u0026amp;s=7c10937abcc9d1b46db1ed3b71bb9288\">\u003cmeta data-mint-head property=\"og:title\" content=\"Protocol reference - TrueCurrent Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent\u0026#x27;s RFQ protocol.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TrueCurrent Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tc.xyz/sdk-trading/protocol-reference\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://injectivelabs-2.mintlify.site/_mintlify/api/og/v2?division=SDK+Trading\u0026amp;title=Protocol+reference\u0026amp;description=Sequence+diagrams%2C+identifiers%2C+settlement+checks%2C+and+testnet+market+reference+for+TrueCurrent%27s+RFQ+protocol.\u0026amp;theme=e3bdd70339167c669e270528\u0026amp;signature=529836ecfb3a411449369a6e294852c8600b40d819f72ea05fc72685d834737a\">\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=\"Protocol reference - TrueCurrent Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent\u0026#x27;s RFQ protocol.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://injectivelabs-2.mintlify.site/_mintlify/api/og/v2?division=SDK+Trading\u0026amp;title=Protocol+reference\u0026amp;description=Sequence+diagrams%2C+identifiers%2C+settlement+checks%2C+and+testnet+market+reference+for+TrueCurrent%27s+RFQ+protocol.\u0026amp;theme=e3bdd70339167c669e270528\u0026amp;signature=529836ecfb3a411449369a6e294852c8600b40d819f72ea05fc72685d834737a\">\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=\"https://mintlify.s3.us-west-1.amazonaws.com/injectivelabs-2/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TrueCurrent Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#fd9a00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tc.xyz/sdk-trading/protocol-reference\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/sdk-trading/protocol-reference.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.tc.xyz/#organization\",\"name\":\"TrueCurrent Docs\",\"url\":\"https://docs.tc.xyz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/injectivelabs-2/TAi2KoKzFwI2tA_y/img/logo-light.png?fit=max\u0026auto=format\u0026n=TAi2KoKzFwI2tA_y\u0026q=85\u0026s=f7446d955d9b68fa400415f663de20d1\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tc.xyz#website\",\"name\":\"TrueCurrent Docs\",\"url\":\"https://docs.tc.xyz\",\"publisher\":{\"@id\":\"https://docs.tc.xyz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tc.xyz/sdk-trading/protocol-reference#webpage\",\"url\":\"https://docs.tc.xyz/sdk-trading/protocol-reference\",\"name\":\"Protocol reference\",\"description\":\"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent's RFQ protocol.\",\"dateModified\":\"2026-08-28T21:35:31.000Z\",\"isPartOf\":{\"@id\":\"https://docs.tc.xyz#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tc.xyz/sdk-trading/protocol-reference#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tc.xyz/sdk-trading/protocol-reference#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"TRUECURRENT\",\"item\":\"https://docs.tc.xyz\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SDK Trading\",\"item\":\"https://docs.tc.xyz/sdk-trading/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Protocol reference\",\"item\":\"https://docs.tc.xyz/sdk-trading/protocol-reference\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.tc.xyz/sdk-trading/protocol-reference#article\",\"headline\":\"Protocol reference\",\"name\":\"Protocol reference\",\"description\":\"Sequence diagrams, identifiers, settlement checks, and testnet market reference for TrueCurrent's RFQ protocol.\",\"url\":\"https://docs.tc.xyz/sdk-trading/protocol-reference\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tc.xyz/sdk-trading/protocol-reference#webpage\"},\"dateModified\":\"2026-08-28T21:35:31.000Z\",\"publisher\":{\"@id\":\"https://docs.tc.xyz/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tc.xyz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TrueCurrent Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"TrueCurrent Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/sdk-trading/protocol-reference.md","siteName":"TrueCurrent Docs","nav":{"global":null,"languages":[{"language":"en","groups":[{"group":"TRUECURRENT","pages":[{"title":"About TrueCurrent","href":""},{"group":"Overview","icon":"","expanded":false,"pages":[{"title":"How TrueCurrent works","href":"/overview/how-it-works"},{"title":"Why TrueCurrent","href":"/overview/why-truecurrent"},{"title":"RFQ explained","href":"/overview/rfq-explained"}]},{"group":"Getting Started","icon":"","expanded":false,"pages":[{"title":"Connect your wallet","href":"/getting-started/connect-wallet"},{"title":"Deposit funds","href":"/getting-started/deposit-funds"},{"title":"Your first trade","href":"/getting-started/first-trade"},{"title":"How referrals work","hidden":true,"href":"/getting-started/how-referrals-work"}]},{"group":"Mobile","expanded":false,"pages":[{"title":"TrueCurrent Mobile","href":"/mobile/overview"},{"title":"Download \u0026 install","href":"/mobile/download-and-install"},{"title":"Create an account \u0026 sign in","href":"/mobile/create-account"},{"title":"Navigating the app","href":"/mobile/app-navigation"},{"title":"Trading on mobile","href":"/mobile/trading"},{"title":"Deposits \u0026 withdrawals","href":"/mobile/deposits-and-withdrawals"},{"title":"Push notifications","href":"/mobile/notifications"},{"title":"Security \u0026 settings","href":"/mobile/security"},{"title":"Mobile FAQ","href":"/mobile/faq"}]},{"group":"Predictions","icon":"","expanded":false,"pages":[{"title":"Enable Predictions","href":"/predictions/enable-predictions"},{"title":"Fund Your Prediction Account","href":"/predictions/fund-account"},{"title":"Make a Prediction","href":"/predictions/make-a-prediction"}]},{"group":"Trading","icon":"","expanded":false,"pages":[{"title":"How to trade","href":"/trading/how-to-trade"},{"title":"Understanding quotes","href":"/trading/understanding-quotes"},{"title":"Order types","href":"/trading/order-types"},{"title":"Perpetual markets","href":"/trading/perpetual-markets"},{"title":"Oracle feed sources","href":"/trading/oracle-feed-sources"},{"title":"Roll Schedules","href":"/trading/roll-schedules"},{"title":"Index, mark, and quoted prices","href":"/trading/prices"},{"title":"Trigger orders (TP/SL)","href":"/trading/trigger-orders"},{"title":"Funding rates","href":"/trading/funding-rates"},{"title":"Fees","href":"/trading/fees"},{"title":"Margin trading","href":"/trading/margin-trading"},{"title":"Liquidation","href":"/trading/liquidation"},{"title":"Auto-deleveraging (ADL)","href":"/trading/adl"},{"title":"Price tolerance","href":"/trading/slippage-and-worst-price"}]},{"group":"Social","icon":"","expanded":false,"pages":[{"title":"Discover traders","href":"/social/leaderboard"},{"title":"Create your public profile","href":"/social/create-profile"},{"title":"View and follow traders","href":"/social/trader-profiles"}]},{"group":"SDK Trading","icon":"","expanded":false,"pages":[{"title":"Intro to SDK Trading","href":"/sdk-trading/overview"},{"title":"SDK architecture","href":"/sdk-trading/architecture"},{"title":"Testnet configuration","href":"/sdk-trading/testnet-configuration"},{"title":"Authorization setup","href":"/sdk-trading/authz"},{"title":"Runbook","href":"/sdk-trading/runbook"},{"group":"Takers","icon":"","expanded":false,"pages":[{"title":"Taker SDK trading","href":"/sdk-trading/takers"},{"title":"Quickstart","href":"/sdk-trading/taker-quickstart"},{"title":"TakerStream","href":"/sdk-trading/taker-stream"},{"title":"Accepting quotes","href":"/sdk-trading/accepting-quotes"},{"title":"Signed taker intents (TP/SL)","href":"/sdk-trading/signed-intents"},{"title":"Taker best practices","href":"/sdk-trading/taker-best-practices"}]},{"group":"Makers","icon":"","expanded":false,"pages":[{"title":"Maker SDK trading","href":"/sdk-trading/makers"},{"title":"Maker whitelist","href":"/sdk-trading/maker-whitelist"},{"title":"Maker setup","href":"/sdk-trading/maker-setup"},{"title":"MakerStream","href":"/sdk-trading/maker-stream"},{"title":"RFQ requests","href":"/sdk-trading/rfq-requests"},{"title":"Building \u0026 signing quotes","href":"/sdk-trading/signing-quotes"},{"title":"Sending quotes","href":"/sdk-trading/sending-quotes"},{"title":"Quoting guidelines","description":"Best practices for TrueCurrent makers covering spread management, volatility-based pricing, inventory hedging, response rate optimization, and avoiding common pitfalls like stale prices and signature errors.","href":"/sdk-trading/quoting-guidelines"}]},{"title":"Protocol reference","href":"/sdk-trading/protocol-reference"},{"title":"Reference implementations","description":"Python, TypeScript, and Go reference implementation guide for TrueCurrent RFQ maker and taker integrations.","href":"/sdk-trading/reference-implementations"},{"title":"Troubleshooting","href":"/sdk-trading/troubleshooting"}]},{"group":"Technical","icon":"","expanded":false,"pages":[{"title":"Architecture","href":"/technical/architecture"},{"title":"How RFQ works","href":"/technical/how-rfq-works"},{"title":"Smart contract","href":"/technical/smart-contract"},{"title":"WebSocket streams","href":"/technical/websocket-streams"},{"title":"Authorization model","href":"/technical/authz-model"},{"title":"Error reference","href":"/technical/error-reference"}]},{"title":"Frequently asked questions","href":"/faq"},{"title":"Glossary","href":"/glossary"},{"title":"Support","href":"/support"},{"group":"TrueCurrent News","icon":"newspaper","expanded":false,"pages":[]}]}]}]},"basePath":"","title":"Protocol reference - TrueCurrent Docs","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":[],"chunks":[]}