Skip to main content
Debug RFQ issues in this order:
  1. Config: endpoint, contract, Cosmos chain ID, EIP-712 chain ID.
  2. Maker readiness: whitelist, subaccount nonce, margin, authz.
  3. Stream health: service path, ping/pong, MakerStream auth challenge.
  4. Signing: exact field order and exact decimal strings.
  5. Settlement: expiry, worst_price, margin, authz, market rules.
The Runbook walks through the same order with commands.

Connectivity and stream auth

SymptomLikely causeFix
WebSocket 503 or immediate closeWrong public service pathUse wss://testnet.rfq.ws.injective.network/injective_rfq_rpc.InjectiveRfqRPC/MakerStream or /TakerStream.
Stream connects and pongs but maker receives no requestsMaker did not answer MakerChallengeConfigure MakerStreamClient with auth_private_key, auth_evm_chain_id, and auth_contract_address.
Stream closes after auth replyChallenge signature mismatchSign StreamAuthChallenge with the same EIP-712 domain used for quotes; use raw challenge nonce bytes and reply before expiry.
Taker receives no quote messagesCollecting with wrong rfq_id or wrong request_addressUse the ACK-returned rfq_id; connect TakerStream with the taker’s Injective address.
Maker sees unrelated requestsMakerStream broadcasts eligible flow to whitelisted makersFilter by target taker plus rfq_id, then market and side, before signing.

Whitelist, authz, and balances

SymptomLikely causeFix
Maker is “not registered” but admin says it isFirst-page list_makers query missed the addressPage through list_makers with start_after or use ContractClient.is_maker_registered().
not_whitelistedMaker address not registered on the RFQ contractComplete Maker whitelist, then re-query.
authorization not found or unauthorizedMissing or expired authz grantRe-run Authorization setup; verify the RFQ contract is the grantee.
account sequence mismatch while granting authzMultiple grant transactions broadcast too quicklySubmit grants sequentially and wait around 3 seconds between broadcasts.
insufficient fundsBank gas balance or exchange subaccount margin is too lowFund INJ for gas and USDC margin in the settlement subaccount.
No quote was filled with otherwise valid quoteMaker subaccount nonce mismatchQuery list_makers and use its registered subaccount_nonce; if it is null, use 0.

Signing and quote validation

Error / symptomLikely causeFix
invalid_signatureSigned fields differ from sent fieldsLog the typed-data message and wire payload side by side; every signed decimal string must match exactly.
Signature rejected after adding evm_chain_idEVM chain ID placed in quote.chain_id or wrong domainUse quote.chain_id="injective-888" on testnet and evm_chain_id=1439 for EIP-712.
quote.chain_id is 1439 or 1776chainId from the EIP-712 domain was copied into the quote wire fieldPut the numeric ID in quote.evm_chain_id; put injective-888 or injective-1 in quote.chain_id.
Signature works locally but fails at settlementWrong contract address in the EIP-712 domainUse the active RFQ contract address from Testnet configuration.
BTC quotes fail tick or signature checksInteger-tick price sent as "76462.0"Canonicalize integer ticks as "76462" before signing and sending.
Quote expires before settlementExpiry too close, clock drift, or slow post-RFQ workUse NTP and avoid slow calls after RFQ receipt. Live quotes must be at least now_ms + 1_500; longer expiries improve match odds but increase stale-price risk.
worst price exceeds limitPrice or mark/index value read with the wrong scaleUse human-scale prices returned by v2 endpoints; do not apply 1e18 scaling.
Retail collects zero quotesMaker quote was rejected, expired, or for a different rfq_idCheck maker logs for quote_ack, quote error responses, and rfq_id correlation.

Settlement behavior

No. Makers sign quotes offchain and send them to the indexer. The taker submits AcceptQuote; the contract verifies the maker signature and settles atomically if the quote is still valid.
No. quote_ack.status="success" only means the indexer accepted and routed the quote. A fill is confirmed by onchain settlement or by a maker-side settlement_update.
Yes. The taker can submit multiple quotes, and the contract may skip invalid quotes while filling valid ones. Your quote also controls maker_quantity, maker_margin, and optional min_fill_quantity.
No quote means no trade for you and no onchain penalty. Response-rate metrics may still affect maker standing.
Settlement creates or updates derivative positions in the Injective exchange module for both parties’ subaccounts. Margin, PnL, liquidation, and funding then follow exchange-module rules.
Send margin: "0". No separate reduce-only flag is required; zero margin means the fill can only close or shrink existing exposure.

Signed-intent and TP/SL failures

Error / symptomLikely causeFix
TakerStream rejects conditional orderMissing v2 fieldsSend conditional_order_sign_mode="v2" and conditional_order_evm_chain_id; the toolkit sets them when sign_mode and evm_chain_id are passed.
invalid_intent_signatureSigned intent fields differ from submitted fieldsKeep deadline_ms, worst_price, trigger_type, trigger_price, epoch, and lane_version identical between signing and submission.
trigger_not_satisfiedMark-price condition was not true at executionRe-check trigger type and trigger price against current mark price.
intent expireddeadline_ms passed before relaySubmit a fresh intent with a new deadline.
rfq_id mismatchExecutor paired the intent with a quote for another RFQRe-request RFQ liquidity for the exact taker plus rfq_id embedded in the signed intent.
Intent was cancelled but still submittedepoch or lane_version changedRead current counters before signing new intents after CancelAllIntents or CancelIntentLane.
Conditional order accepted but never firesTrigger not reached, executor unavailable, or no executable RFQ quoteCheck trigger source, executor logs, and RFQ quote availability.

Fast triage checklist

  • Check Testnet configuration values first.
  • Confirm maker whitelist with a paginated helper, not only the first list_makers page.
  • Confirm authz grants for both maker and taker.
  • Confirm maker subaccount nonce and USDC margin.
  • Confirm MakerStream auth challenge is answered before waiting for RFQs.
  • Confirm quotes use sign_mode="v2" and evm_chain_id=1439 on testnet.
  • Confirm quote.chain_id remains injective-888, not 1439, and raw JSON uses snake_case field names.
  • Confirm the taker collects quotes for the ACK-returned rfq_id.
  • Confirm quote expiry is still in the future at settlement time.
  • Confirm worst_price, tick size, and signed decimal strings all match the selected market.
Last modified on June 2, 2026