When to use signed intents
Use a signed intent when you cannot be online to submit at the exact trigger moment, but you can decide the trigger and exit constraints in advance.- Take profit: exit long when mark price is greater than or equal to target, or exit short when mark price is less than or equal to target.
- Stop loss: exit long when mark price is less than or equal to stop, or exit short when mark price is greater than or equal to stop.
AcceptQuote.
End-to-end flow
The trigger is not latched. If the mark price moves back before the transaction lands, the contract can reject the settlement astrigger_not_satisfied.
Conditional order body
These fields are sent to the indexer and contract. The v2 signature covers theSignedTakerIntent typed-data fields; chain_id, contract_address, evm_chain_id, and unfilled_action are wire/runtime fields.
| Field | Type | Description |
|---|---|---|
version | uint8 | Use 1. This is the intent schema version, not the signing mode. |
chain_id | string | Cosmos chain ID, for example "injective-888" on testnet. Wire/runtime field. |
contract_address | string | RFQ contract address. Wire/runtime field; the signature binds the contract via the EIP-712 domain. |
taker | string | Taker inj1... address. |
epoch | uint64 | Current taker epoch. Incremented by global intent cancellation. |
rfq_id | uint64 | Taker-scoped order ID. Use a fresh timestamp or generated ID, and pair it with the taker address when routing or reconciling quotes. |
taker_nonce_time_window_ms | uint64 | Controls the freshness window used when executing signed intents with taker specific quote or quote_rfq_id. Default is 60000. |
market_id | string | Injective derivative market ID. |
subaccount_nonce | uint32 | Subaccount index, usually 0. |
lane_version | uint64 | Current (taker, market, subaccount) lane version. Incremented by lane cancellation and successful settlement. |
deadline_ms | uint64 | Unix millisecond deadline. Max 30 days from signing. |
direction | "long" | "short" | Exit trade direction (a closing trade is the opposite direction of the position you’re exiting). |
quantity | string | Quantity to close, as a canonical decimal string. |
margin | string | Use "0" for reduce-only trigger orders. |
worst_price | string | Worst acceptable quoted fill price. |
min_total_fill_quantity | string | Minimum aggregate fill quantity required for settlement. |
trigger_type | string | "mark_price_gte", "mark_price_lte", or "immediate". |
trigger_price | string | null | Trigger threshold. Use "0" or null for immediate, depending on the helper path. |
unfilled_action | null | Reserved field; pass null. Non-null values are not exposed in the current product. |
cid | string | null | Optional client identifier. Bound by the v2 signature. |
allowed_relayer | string | null | Optional executor/relayer address. This is the protocol field name and is bound by the v2 signature when set. |
evm_chain_id | uint64 | Wire field included in the order body; matches the EIP-712 domain chainId (1439 testnet, 1776 mainnet). |
EIP-712 domain
Signed intents use the same domain separator as maker quotes:| Field | Value |
|---|---|
name | "RFQ" |
version | "1" |
chainId testnet | 1439 |
chainId mainnet | 1776 |
verifyingContract | EVM form of the RFQ contract address |
chainId is the EVM chain ID, not the Cosmos chain ID.
Sign and submit a conditional order
Usesign_conditional_order_v2 from injective-rfq-toolkit to produce the EIP-712 v2 digest signature, then submit via TakerStreamClient.send_conditional_order. The helper returns a 0x-prefixed 65-byte signature; pass it through unchanged.
sign_conditional_order_v2 and the values in the order_body you submit must match exactly. Any drift (different price string, different lane_version, different evm_chain_id) will fail signature recovery at the indexer or contract.
For REST submissions, include the same signing mode explicitly:
Trigger types
direction field is the closing direction, opposite to the open position):
| Closing | Goal | trigger_type | When mark price |
|---|---|---|---|
| Long position | Take profit | mark_price_gte | rises to or above target |
| Long position | Stop loss | mark_price_lte | falls to or below stop |
| Short position | Take profit | mark_price_lte | falls to or below target |
| Short position | Stop loss | mark_price_gte | rises to or above stop |
trigger_not_satisfied; the executor should retry according to its trigger-order policy.
Epochs and lanes
Before signing, read the currentepoch and lane_version for the taker. A signed intent is valid only for the exact values it signs.
CancelAllIntentsincrements the taker’s epoch and invalidates every outstanding intent for that taker.CancelIntentLaneincrements the lane version for one(taker, market_id, subaccount_nonce)lane.- Successful settlement also advances the lane version, making trigger intents one-shot by construction.
Common failures
| Symptom | Fix |
|---|---|
| Missing conditional order signing mode | Send sign_mode: "v2" on REST or let send_conditional_order set it on TakerStream. |
| Invalid signature | Check EVM chainId, verifying contract, exact decimal strings, trigger fields, epoch, and lane_version. |
| Trigger not satisfied | The mark price moved back before settlement. The executor should retry according to its trigger-order policy. |
| Stale lane or epoch | Refresh state from the contract and sign a new intent. |
| Quote RFQ ID mismatch | Ensure the maker quote used for settlement is bound to the same taker plus rfq_id embedded in the signed intent. |
Next
- Accepting quotes covers the synchronous
AcceptQuotepath. - Trigger orders explains TP/SL behavior at the product level.
- Best practices covers expiry races, idempotency, and
cidusage.

