Solver Registration

Solvers compete to fill intents in the YoorQuezt marketplace. Each solver maintains a reputation score that determines priority in the auction. Higher-reputation solvers see intents first and receive preferential matching.

Reputation Scoring

Solver reputation is calculated from four weighted components:

ComponentWeightDescription
Acceptance rate40%Percentage of submitted solutions that are accepted by the auction. Measures solution quality.
Fulfillment rate30%Percentage of won auctions where the solver successfully executes on-chain. Measures reliability.
Price improvement20%Average improvement over the intent's min_amount_out. Measures competitiveness.
Activity10%Recency and volume of solver participation. Inactive solvers decay toward zero.

Reputation scores range from 0 to 100. New solvers start at 50.

Register as a Solver

POST /solver/register

Request Body

{
  "address": "0xSolverAddress",
  "chains": ["ethereum", "arbitrum", "base"],
  "intent_types": ["swap", "bridge"],
  "stake_tx": "0xStakeTransactionHash",
  "webhook_url": "https://your-solver.example.com/intents"
}

Response

{
  "solver_id": "solver_abc123",
  "address": "0xSolverAddress",
  "reputation": 50,
  "status": "active",
  "registered_at": "2026-03-15T00:00:00Z"
}

Submit a Solution

POST /intent/{id}/solve

Request Body

{
  "solver_id": "solver_abc123",
  "intent_id": "intent_xyz789",
  "solution": {
    "transactions": [
      {
        "to": "0xRouterAddress",
        "data": "0xcalldata...",
        "value": "0",
        "chain": "ethereum",
        "gas_limit": 250000
      }
    ],
    "amount_out": "2580000000",
    "execution_deadline": 1742068800
  }
}

Response

{
  "solution_id": "sol_def456",
  "status": "submitted",
  "rank": 1,
  "competing_solutions": 3
}

Penalties

Solvers are penalized for the following behaviors:

ViolationPenalty
Solution reverts on-chain-5 reputation, stake slashed 1%
Solution not submitted after winning auction-10 reputation, stake slashed 2%
Solution delivers less than min_amount_out-15 reputation, stake slashed 5%
Repeated failures (3+ in 24h)Temporary suspension (1 hour)
Repeated failures (10+ in 7d)Extended suspension (24 hours)

List Solvers

GET /solver/list

Query Parameters

ParameterTypeDescription
chainstringFilter by supported chain
intent_typestringFilter by supported intent type
min_reputationnumberMinimum reputation score
statusstringFilter by status: active, suspended
limitnumberMax results (default 50)
offsetnumberPagination offset

Response

{
  "solvers": [
    {
      "solver_id": "solver_abc123",
      "address": "0xSolverAddress",
      "reputation": 87,
      "chains": ["ethereum", "arbitrum"],
      "intent_types": ["swap", "bridge"],
      "intents_filled": 1243,
      "avg_price_improvement": "0.8%",
      "status": "active"
    }
  ],
  "total": 42,
  "limit": 50,
  "offset": 0
}

Code Examples

Register a Solver

const response = await fetch("https://api.yoorquezt.io/solver/register", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_API_KEY",
  },
  body: JSON.stringify({
    address: "0xSolverAddress",
    chains: ["ethereum", "arbitrum", "base"],
    intent_types: ["swap", "bridge"],
    stake_tx: "0xStakeTransactionHash",
    webhook_url: "https://your-solver.example.com/intents",
  }),
});

const solver = await response.json();
console.log(`Registered: ${solver.solver_id}, Reputation: ${solver.reputation}`);

Submit a Solution

const response = await fetch(`https://api.yoorquezt.io/intent/${intentId}/solve`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_API_KEY",
  },
  body: JSON.stringify({
    solver_id: "solver_abc123",
    intent_id: intentId,
    solution: {
      transactions: [
        {
          to: "0xRouterAddress",
          data: swapCalldata,
          value: "0",
          chain: "ethereum",
          gas_limit: 250000,
        },
      ],
      amount_out: "2580000000",
      execution_deadline: Math.floor(Date.now() / 1000) + 300,
    },
  }),
});

const result = await response.json();
console.log(`Solution rank: ${result.rank} of ${result.competing_solutions}`);

Listen for Intents (Webhook Handler)

import express from "express";

const app = express();
app.use(express.json());

app.post("/intents", async (req, res) => {
  const intent = req.body;

  console.log(`New intent: ${intent.intent_id}`);
  console.log(`Type: ${intent.type}, Chain: ${intent.source_chain}`);
  console.log(`Amount in: ${intent.amount_in}, Min out: ${intent.min_amount_out}`);

  // Evaluate if you can fill this intent profitably
  const quote = await getQuote(intent);

  if (BigInt(quote.amountOut) > BigInt(intent.min_amount_out)) {
    // Submit solution
    await submitSolution(intent.intent_id, quote);
    res.json({ status: "solving" });
  } else {
    res.json({ status: "skipped" });
  }
});

app.listen(3000);
Edit this page