Skip to main content
POST
Returns an EIP-712 payload for a NAV, ready to sign. Sign it with a key authorized on the market’s oracle. Then pass the price and the signature as signedPrice on Open Loan, Borrow More, Withdraw Collateral, Repay or Liquidate Loan. The contract applies the price and the action in one transaction.
A signed price does not stay private to the transaction that carries it. When it lands, the oracle stores it, and every loan in the market is valued at it from then on. Sign only a price the market’s price authority stands behind.
This is the alternative to Sync Oracle Price. Signing costs no gas and writes nothing on-chain; the price lands only with the transaction that carries it. That suits a borrower who needs a fresh valuation without waiting for a scheduled push. A key that signs outside this instance can also post its signature to Record Price Attestation, which lets a later push submit it. An ORACLE-priced market reads an external feed and refuses every attested price. This endpoint refuses it with EXTERNAL_FEED_ACTIVE. A FIXED market’s oracle refuses every signed price too, so there is nothing to sign. This endpoint answers 409 FIXED_PRICE_ACTIVE with details.markDownOnly: true. The price authority can only mark a fixed price down, through Sync Oracle Price.

Path Parameters

string
required
The market’s record ID, as id on List Markets, not its contract address. See Market IDs.

Body Parameters

number
required
Net asset value per collateral token, denominated in the market’s borrow asset. Must be greater than zero, and a numeric string is accepted too. More decimal places than the borrow asset carries fail with SIGNING_FAILED.
integer
default:"300"
Signature lifetime in seconds. Values below 60 are raised to 60 and values above 3600 are lowered to 3600. Zero or a non-numeric value falls back to 300.
string
The wallet that will sign, when price authority sits with a key this instance does not hold. Supply it and the payload is built for that address and its authorization is checked against the oracle. Omit it and the signer is resolved in order: the price signer the market’s lender of record declared, then your instance’s first verified wallet. A value that is not a 0x-prefixed 40-character hex address is ignored.

Response Fields

object
No signature is returned. You produce it by signing typedData. The contract then reads price, timestamp, validUntil, and your signature. Pass the first three through unchanged.

Signature Structure

The signature is bound to one oracle on one chain through verifyingContract and chainId, and expires at validUntil. It carries no nonce and names no submitter, so anyone who holds it can submit it until it expires. It lands at most once, because the oracle only accepts a timestamp newer than the price it holds. Keep validitySeconds tight, and treat a signed price as a bearer credential over its lifetime.

What the Oracle Checks When the Price Lands

The oracle judges the signature again inside the transaction that carries it, and a refusal reverts that whole transaction. It refuses a signature past validUntil, one dated in the future or older than maxPriceAge, and one whose signer is neither an authorized signer nor the owner. It also refuses a price outside the deviation limit, both against the current price and against the price that opened the current one-hour window. The API runs both deviation checks before it builds the payload, whenever the oracle’s price can be read. A price outside them is refused with PRICE_DEVIATION_TOO_LARGE or PRICE_WINDOW_DEVIATION_TOO_LARGE, carrying the same fields as on Sync Oracle Price. A signed price dated no later than the price the oracle already holds is skipped rather than refused. The transaction then runs against the stored price, which must not be stale. Check a signature without spending gas using Verify Signed Price.

Error Codes

Every refusal from the signing step carries signerAddress in the error object. It names the rejected wallet on SIGNER_NOT_AUTHORIZED and is null otherwise.