How to Become a Resolver

Step-by-step guide to integrate Omniston resolvers - implement smart routing for optimal swap execution

This guide explains how to become a resolver (Market Maker) in the Omniston protocol and integrate with its gRPC API.

Overview

A resolver is a service that provides token exchange rates and executes trades. To become a resolver, you need to:

  1. Register by obtaining a Soul-Bound Token (SBT)

  2. Connect to the gRPC API

  3. Handle quote requests and trades

Registration Process

Step 1: Generate Keys

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

Step 2: Prepare Metadata

Create a JSON document containing:

  • Your resolver name

  • Your public key(s)

Example:

Step 3: Submit Registration

  1. Your metadata will be stored in an SBT NFT collection

  2. You'll receive your SBT stake address for API authentication

Connecting to the API

Authentication

  1. Create a connection payload:

  1. Sign the payload:

  • Serialize the ConnectPayload to bytes

  • Sign using your Ed25519 private key

  • Base64 encode the signature

  1. Send a ConnectRequest:

Example connection request:

Message Flow

The resolver API uses a bidirectional gRPC stream. After connecting:

1. Incoming Events

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

2. Outgoing Requests

You can send these requests to the server:

Key requests:

  • UpdateQuoteRequest: Provide or update a quote

  • InvalidateQuoteRequest: Cancel a previously provided quote

Quote Flow

1. Receiving Quote Request Acknowledgment

When a trader sends a quote request, they will first receive a QuoteRequestAck containing the rfq_id that uniquely identifies their request.

2. Receiving Quote Requests

As a resolver, when you receive a QuoteRequestedEvent:

3. Providing Quotes

Respond with an UpdateQuoteRequest:

For swap settlement, include route information:

Important: When specifying the protocol in a SwapChunk, the gRPC API expects it as one of the strings "StonFiV1", "StonFiV2", "DeDust", or "TonCo". Currently, only extra_version = 1 is supported.

4. Quote Lifecycle

  1. You receive QuoteRequestedEvent

  2. You send UpdateQuoteRequest

  3. 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

  4. At any time, you can:

    • Send new UpdateQuoteRequest to update the quote

    • Send InvalidateQuoteRequest to cancel the quote

Best Practices

  1. Sequence Numbers

    • Use monotonically increasing seqno for your requests

    • Match reply_to with event seqno when responding

    • Track request/response correlation using seqno

  2. Quote Management

    • Honor your quotes until trade_start_deadline

    • Invalidate quotes you can't fulfill

    • Include all fees in your quoted amounts

  3. Error Handling

    • Reconnect on connection loss

    • Handle all event types

    • Log rejected quotes for monitoring

  4. Performance

    • Maintain a single gRPC connection

    • Process events asynchronously

    • Buffer outgoing requests

API Endpoints

Production:

  • gRPC: https://omni-grpc.ston.fi

Sandbox:

  • Demo site: https://omniston-sandbox.ston.fi/

  • WS API: wss://omni-ws-sandbox.ston.fi

  • gRPC API: https://omni-grpc-sandbox.ston.fi

See Also

Last updated