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:
| Component | Weight | Description |
|---|---|---|
| Acceptance rate | 40% | Percentage of submitted solutions that are accepted by the auction. Measures solution quality. |
| Fulfillment rate | 30% | Percentage of won auctions where the solver successfully executes on-chain. Measures reliability. |
| Price improvement | 20% | Average improvement over the intent's min_amount_out. Measures competitiveness. |
| Activity | 10% | 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:
| Violation | Penalty |
|---|---|
| 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
| Parameter | Type | Description |
|---|---|---|
chain | string | Filter by supported chain |
intent_type | string | Filter by supported intent type |
min_reputation | number | Minimum reputation score |
status | string | Filter by status: active, suspended |
limit | number | Max results (default 50) |
offset | number | Pagination 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);