This guide explains how to become a resolver (Market Maker) in the Omniston protocol and integrate with its gRPC API.
A resolver is a service that provides token exchange rates and executes trades. To become a resolver, you need to:
Register by obtaining a Soul-Bound Token (SBT)
Connect to the gRPC API
Handle quote requests and trades
First, generate one or more Ed25519 key pairs that will be used for authentication:
For other languages, you can use any standard Ed25519 implementation library available in your preferred programming language
Create a JSON document containing:
Your resolver name
Your public key(s)
Example:
Your metadata will be stored in an SBT NFT collection
You'll receive your SBT stake address for API authentication
Create a connection payload:
Sign the payload:
Serialize the ConnectPayload
to bytes
Sign using your Ed25519 private key
Base64 encode the signature
Send a ConnectRequest
:
Example connection request:
The resolver API uses a bidirectional gRPC stream. After connecting:
You'll receive these events from the server:
Key events:
QuoteRequestedEvent
: New quote request from a trader
QuoteRequestCancelledEvent
: Trader cancelled their request
QuoteAcceptedEvent
: Your quote was accepted
QuoteRejectedEvent
: Your quote was rejected
QuoteInvalidatedEvent
: Confirmation of quote invalidation
You can send these requests to the server:
Key requests:
UpdateQuoteRequest
: Provide or update a quote
InvalidateQuoteRequest
: Cancel a previously provided quote
When you receive a QuoteRequestedEvent
:
Respond with an UpdateQuoteRequest
:
For swap settlement, include route information:
You receive QuoteRequestedEvent
You send UpdateQuoteRequest
The server validates your quote and responds with:
QuoteAcceptedEvent
: Your quote was validated and accepted, includes quote_id
.
QuoteRejectedEvent
: Your quote was rejected. The event includes a code
field from the QuoteRejectedCode
enum. Possible reasons include:
UNDEFINED
(0) - Uncategorized error
INVALID_PARAMETERS
(1) - Invalid value of a parameter
INVALID_AMOUNTS
(2) - Asset amount restrictions don't pass RFQ requirements
ROUTE_PROHIBITED
(3) - Route uses a prohibited intermediate asset
POOL_PROHIBITED
(4) - Route uses a unverified or prohibited liquidity pool
EMULATION_RESULT_MISMATCH
(5) - Transaction emulation produced a result different from the quote
INTERNAL_ERROR
(101) - Server errors
At any time, you can:
Send new UpdateQuoteRequest
to update the quote
Send InvalidateQuoteRequest
to cancel the quote
Sequence Numbers
Use monotonically increasing seqno
for your requests
Match reply_to
with event seqno
when responding
Track request/response correlation using seqno
Quote Management
Honor your quotes until trade_start_deadline
Invalidate quotes you can't fulfill
Include all fees in your quoted amounts
Error Handling
Reconnect on connection loss
Handle all event types
Log rejected quotes for monitoring
Performance
Maintain a single gRPC connection
Process events asynchronously
Buffer outgoing requests
Connect to: https://omni-grpc.ston.fi