Interledger Quoting Protocol (ILQP)

The Interledger Quoting Protocol is a method of getting quote information from a Connector in preparation for arranging transfers across two ledgers. The quote returned by a Connector is non-binding, but provides a basis for choosing which connectors to use.

There are two consumers of the ILQP: sending clients, and other connectors.

Background and Terminology

The quoting protocol returns the price of a hypothetical payment through the connector being queried. However, no part of the ILQP initiates or creates an actual payment. All the information in the ILQP is non-binding and advisory. ILQP only calculates and reports the expected cost of a payment.

Accounts ILQP are identified by their ILP Addresses. For a full explanation of ILP Addresses, see ILP Addresses.

ILP payments can be as simple as two transfers in different ledgers joined by a single connector. In other cases, they may be longer chains with multiple connectors across three or more ledgers. The response of an ILQP request combines the exchange rates of all links in the chain into one quote.

Ledgers:

  • The source ledger is where the sender and the connector both have accounts.
  • The destination ledger is where the receiver and the last connector both have accounts.

The source and destination ledger are different ledgers. Otherwise, there should be no reason to use ILQP.

Parties:

  • The sender is the party who would be debited on the source ledger by the hypothetical payment.
  • The receiver is the party being credited on the destination ledger by the hypothetical payment.
  • A connector forms the active link between an incoming transfer on one ledger and an outgoing transfer on the next.

In a multiple-hop payment, there are multiple connectors, each of which creates an outgoing transfer in response to an incoming transfer. If the first connector in the chain has full (cached) pricing information, it will respond to the sender's quote request immmediately. If not, it will forward the quote request along the chain, and then relay the response it gets back.

The following description of ILQP documents the current behaviour of nodes on the live Interledger, the majority of which are running ILP Kit software.

Get Quote

Quotes are sent through a request/response mechanism exposed by the ledger plugins or ledger layer.

A quote request's ilp property must be a QuoteLiquidityRequest, QuoteBySourceRequest, or QuoteByDestinationRequest. The response's ilp property must be a QuoteLiquidityResponse, QuoteBySourceResponse, or QuoteByDestinationResponse respectively. If an error occurs during quoting, ilp will be a IlpError instead.

ILQP Packets

See interledgerjs/ilp-packet for an example implementation of a packet serializer/deserializer.

QuoteLiquidityRequest

Field Type Short Description
type Byte Always 2
length Length Determinant One or more bytes, indicating how many bytes follow in the rest of the packet
destinationAccount Length-prefixed String Address corresponding to the destination account
destinationHoldDuration UInt32 How much time the receiver needs to fulfill the payment (in milliseconds)
extensions Length Determinant Always 0

QuoteLiquidityResponse

Field Type Short Description
type Byte Always 3
length Length Determinant One or more bytes, indicating how many bytes follow in the rest of the packet
liquidity LiquidityCurve Curve describing the liquidity for the quoted route
appliesToPrefix Length-prefixed String Common prefix of all addresses for which this liquidity curve applies.
sourceHoldDuration UInt32 How long the sender should put the money on hold (in milliseconds)
expiresAt GeneralizedTime Maximum time where the connector expects to be able to honor this liquidity curve. This MUST be expressed in the UTC + 0 (Z) timezone.
extensions Length Determinant Always 0

LiquidityCurve is encoded as a SEQUENCE OF SEQUENCE { x UInt64, y UInt64 }. This is a binary format, so for example the curve [ [0, 0], [10, 265] ] is equivalent to the base64-encoded string "AAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAkBAAA=".

See interledgerjs/ilp-routing.LiquidityCurve for an example implementation of a LiquidityCurve serializer/deserializer.

QuoteBySourceRequest

Field Type Short Description
type Byte Always 4
length Length Determinant One or more bytes, indicating how many bytes follow in the rest of the packet
destinationAccount Length-prefixed String Length-prefixed address corresponding to the destination account
sourceAmount UInt64 Amount the sender needs to send, denominated in the asset of the source ledger
destinationHoldDuration UInt32 How much time the receiver needs to fulfill the payment (in milliseconds)
extensions Length Determinant Always 0

QuoteBySourceResponse

Field Type Short Description
type Byte Always 5
length Length Determinant One or more bytes, indicating how many bytes follow in the rest of the packet
destinationAmount UInt64 Amount that will arrive at the receiver
sourceHoldDuration UInt32 How long the sender should put money on hold (in milliseconds)
extensions Length Determinant Always 0

QuoteByDestinationRequest

Field Type Short Description
type Byte Always 6
length Length Determinant One or more bytes, indicating how many bytes follow in the rest of the packet
destinationAccount Length-prefixed String Length-prefixed address corresponding to the destination account
destinationAmount UInt64 Amount that will arrive at the receiver
destinationHoldDuration UInt32 How much time the receiver needs to fulfill the payment (in milliseconds)
extensions Length Determinant Always 0

QuoteByDestinationResponse

Field Type Short Description
type Byte Always 7
length Length Determinant One or more bytes, indicating how many bytes follow in the rest of the packet
sourceAmount UInt64 Amount the sender needs to send, denominated in the asset of the source ledger
sourceHoldDuration UInt32 How long the sender should put money on hold (in milliseconds)
extensions Length Determinant Always 0

Next Steps

After getting a quote using ILQP, the client can display the quote to the user and optionally proceed to Preparing (also called Setting Up) the payment, for example using the Simple Payment Setup Protocol . That process actually sets money aside and creates the crypto-conditions that will release the money to the desired parties.

Appendix A: ASN.1 Module

The InterledgerQuotingProtocol.asn ASN.1 module describes the binary ILQP messages.