Skip to main content
Every maker quote is an EIP-712 v2 secp256k1 signature over the SignQuote typed-data payload. The contract verifies that signature during settlement.
This guide is EIP-712 v2 only. Quote payloads must include sign_mode: "v2" and evm_chain_id. Do not sign JSON strings, eth_sign messages, or generic wallet typed-data payloads unless you have reproduced the exact digest used by the protocol.
There are two different chain IDs in every v2 quote. EIP-712 uses a field named chainId, but that value is the numeric EVM chain ID: 1439 on testnet or 1776 on mainnet. The MakerStream quote payload uses snake_case: chain_id is the Cosmos chain ID, and evm_chain_id is the numeric EVM chain ID. Passing 1439 or 1776 as quote.chain_id is invalid.

1. Decide whether to quote

For each request, decide:
  • whether your maker is willing to fill it,
  • how much quantity and margin to provide,
  • what price to quote,
  • how long the quote remains valid,
  • and which maker subaccount nonce backs the quote.
Direction is from the taker’s perspective: Your quoted margin and quantity may be smaller than the taker’s request for partial fills.

2. Canonicalize decimals

Decimal fields are signed as exact UTF-8 strings. These are different signed messages:
  • "14.85"
  • "14.850"
  • "14.8500"
Apply one canonicalization helper to every decimal field before signing and sending: price, taker margin, taker quantity, maker margin, maker quantity, minimum fill quantity, trigger price, and worst price.
Never send locale commas, scientific notation, 1e18-scaled integers, or values with trailing zeros after quantization.

3. EIP-712 domain

Quotes use this EIP-712 domain: The domain chainId is the EVM chain ID. It is not the Cosmos chain ID. This is the main naming collision in RFQ: chainId in the EIP-712 domain is not the same field as quote.chain_id in the MakerStream payload. Current testnet RFQ contract:

4. SignQuote typed-data layout

The SignQuote message has 16 fields. Field order matters. The final digest is:
The helper derives bindingKind from whether taker is present. For current maker integrations, pass the taker address from the RFQ request. Do not add bindingKind to the quote payload, and do not pass a binding-kind helper argument for live taker-bound RFQs.

5. Sign with the helper

Use sign_quote_v2 from injective-rfq-toolkit.
The helper returns an 0x-prefixed 65-byte signature (r || s || v) with compact y-parity v=0/1.

6. Send the same values

Send the exact strings and numbers you signed.
chain_id is still the Cosmos chain ID. evm_chain_id is the EVM chain ID embedded in the EIP-712 domain. Do not send 1439 or 1776 in chain_id.

Common failures

Next: Sending quotes.
Last modified on May 28, 2026