injective-rfq-toolkit reference client. That repo is the ground truth for the Python examples used by these docs.
0. Before you start
MakerStream requires an auth challenge response before RFQ requests are forwarded. Configure
MakerStreamClient with auth_private_key, auth_evm_chain_id, and auth_contract_address. If the stream connects and pongs but never receives requests, debug the auth challenge first.1. Install the reference client
2. Configure .env
Create injective-rfq-toolkit/.env:
.env before running standalone scripts:
3. Verify wallet and subaccount balances
Each active wallet needs:- INJ for gas in the bank balance.
- USDC margin in the exchange subaccount used by RFQ settlement.
injerc20:0x0C382e685bbeeFE5d3d9C29e29E341fEE8E84C5dfor testnet USDC
injective-rfq-toolkit or query the Injective exchange module directly. The maker subaccount must match the registered maker_subaccount_nonce; if list_makers returns null, fund and quote with nonce 0.
4. Verify maker whitelist
Makers must be registered before MakerStream routes RFQ requests to them and before quotes can settle. The raw contract query checks only the first page:5. Verify and grant authz
Check maker grants:
If either response is empty or missing a required grant, run the script in Authorization setup. Submit grants sequentially and wait between transactions; parallel grant broadcasts commonly fail with account sequence errors.
6. Run smoke checks
This smoke verifies config loading, indexer reachability, chain reachability, and EIP-712 v2 quote signing. It does not fully prove the MakerStream challenge flow; the full E2E test does that.7. Run live AcceptQuote settlement
Use the reference script first:
- Taker connects to TakerStream.
- Maker connects to MakerStream and answers
MakerChallenge. - Taker sends an RFQ request and receives the indexer-assigned
rfq_id. - Maker waits for that same taker plus
rfq_id, signs a quote with EIP-712 v2, and sends it withsign_mode="v2". - Taker collects matching quotes.
- Taker submits
AcceptQuote. - Maker receives quote or settlement updates.
client_idshould be a UUID. The indexer assigns the realrfq_idin the ACK.- MakerStream can broadcast other takers’ RFQs. Filter by taker address plus the ACK-returned
rfq_id. quote_ackmeans “accepted by the indexer”, not “filled by the taker”.- Live quote expiry is intentionally short but must be at least 1500 ms. Longer expiries improve match odds, but increase stale-price exposure.
8. Run TP/SL signed-intent validation
TP/SL exits are taker-signed conditional orders. The taker signs aSignedTakerIntent, submits it through TakerStream, and the TP/SL executor executes AcceptSignedIntent when the trigger condition is satisfied.
Before testing:
- The taker has an open position to close.
- The executor wallet has INJ for gas if you are testing low-level executor submission.
- The executor can source a normal RFQ quote when the trigger fires. No maker-specific TP/SL setup is required beyond the standard MakerStream quote loop.
conditional_order_sign_mode="v2" and conditional_order_evm_chain_id when sign_mode and evm_chain_id are passed.
9. Cancel signed intents
UseCancelIntentLane to cancel all active intents for one (taker, market_id, subaccount_nonce) lane.
CancelAllIntents only when you need to invalidate every lane for the taker. Future intents must use the incremented epoch or lane_version.
Common blockers
For field-level details, see Protocol reference and Troubleshooting.

