I’m registered but receive no requests
Every cause is on the eligibility path, which runs before your endpoint is ever called:- Chain mismatch: you declared
chainIdsthat exclude the requests being made. Omitting the field entirely means “every chain”. - Debt token mismatch:
supportedTokensfilters on the request’s debt token only. A solver scoped to collateral assets it likes will silently match nothing. - Borrower blocked: a per-endpoint compliance blocklist excludes that borrower for your endpoint.
- Registry not refreshed yet: changes take up to 5 minutes to propagate.
I changed my registry entry and nothing happened
The coordinator caches the registry and refreshes it on a 5-minute interval. A new endpoint, a changed timeout, or widened token scope will not apply immediately. Wait out the interval before investigating further.My quotes are being dropped and I get no error
Validation failures are never returned to your endpoint: the quote is dropped and the round proceeds. Work through Validation in order; the most common causes are a signature over terms that diverged from the response, adeadline outside the two-minute window, and venueId sent as a bitmask instead of an index.
What does the signature actually cover?
The on-chainQuote struct, which mixes fields from the borrower’s request with fields from your quote. If you rebuild the request side from anything other than the request you were handed, recovery will produce a different address and the quote is dropped. Fields are listed in Get Started.
Why are two signatures required?
Iris.take() pulls your bond in the debt token, and you are not in the call path at that moment to approve it. The Permit2 signature travels with the quote so the taker can stage the pull. The Quote signature is what binds you to the terms.
Can I reuse a Permit2 signature?
No. It authorises exactly one quote’s bond amount, and Permit2 allowance nonces are sequential, so it is single-use by construction. If you quote concurrently in the same debt token, keep a standing ERC-20 approval toIris; take() tries that first and only falls back to Permit2.
Can I use a smart contract wallet?
Not yet. Signature verification is EOA-only: ERC-1271 signatures cannot currently be verified and will be rejected. Signatures must be 65-byter || s || v; 64-byte EIP-2098 compact signatures are deliberately rejected because they cannot be recovered.
How long do I have to respond?
5 seconds by default, measured to your last byte. A higher budget can be configured per solver during onboarding. Exceeding it abandons your quote for that round.Is it better to decline or to stay silent?
Decline explicitly: HTTP404 or bond: "0". Both are recorded as non-quotes rather than failures. Timing out or returning a malformed body counts against your endpoint’s health, while declining does not.
How is the winner chosen?
LowestfixedRate among quotes that survive validation. Nothing else is scored: not bond size, not latency, not response order.
Do I find out whether I won?
Not from the coordinator; it returns the result to the borrower, not to solvers. The winning quote is settled when the borrower callsIris.take(), so on-chain activity against your solver address is the signal. Loans you have underwritten are queryable by solver address; see Solver Book.
My quote won but take() reverted
Expected in some cases. Coordinator validation is convenience-grade: it drops definitively-unsubmittable quotes but skips checks it cannot run, and the contract is the real authority. The usual causes are an expired deadline, an insufficient bond that skipped validation, or your bond allowance no longer being available at settlement.

