{"service_id":"yield-router","name":"Yield Router","category":"yield_optimisation","category_job":"Move idle liquidity","what_you_get":"A comparison of PancakeSwap v3 pools on BSC at the rates they were observed at, bounded by a set you can reproduce. The eligible universe is built from PancakeSwap's own explorer snapshot and stated in full: its size, its source, the moment it was read, the thresholds it was gated on, and every pool that did not make it together with the reason it was left out. Each pool in the set carries its fee rate net of the protocol's own reported cut — the gross figure overstates what a liquidity provider keeps by about half again — beside the gross one, with the window the rate was observed over and the TVL it is a rate against, plus liquidity, 24h volume and turnover. For every candidate you get a break-even: how many days the extra yield takes to repay what moving costs, against a stated horizon, with the arithmetic written out and the cost named as the input you supplied rather than a figure Docket derived. A pool with a higher rate whose break-even runs past that horizon is shown with that fact attached rather than dropped. Ordering is by one named observed metric and the payload says which, so no order here is an opinion Docket formed. The comparison needs no wallet; drafting a swap leg requires the wallet, token pair, amount and cap declared together. Nothing is signed, approved, submitted or moved. Acting on the comparison is an activation, and it builds the complete route rather than one leg: the owner's own approval of the position NFT to the session, scoped to that one token id; a decreaseLiquidity that burns the position with non-zero minimums taken from the pool's live price rather than left at zero; a collect of the tokens and whatever fees had accrued into the session; up to three bounded swap legs, each quoted live and floored, to reach the split the destination band needs at its current tick; an exact allowance to the position manager for each destination token, never an unlimited one; and a mint over a band of a stated number of ticks either side of that tick, aligned outward to the pool's own spacing, with the new position going to the owner rather than to the session. A read spec comes back with it: which log carries the new token id and the exact positions(tokenId) call that reads the result back, so the outcome can be checked without asking Docket. The route carries its own disclosure — both rates and when they were observed, the destination's liquidity and this position's share of it, the protocol risk, the gas that could be estimated and the calls that could not be, the slippage every step insists on, the payback period and the minimum holding period it implies, the whole transaction sequence in order, and the assumptions that would undo the case for moving if they do not hold. A position held by the farm is refused rather than planned around, because the owner cannot approve an NFT MasterChefV3 holds.","price_display":"0.50 USDT","price_atomic":"500000000000000000","asset":"0x55d398326f99059fF775485246999027B3197955","paid_stock":false,"stock_status":"preview","admission":{"fresh_paired_benchmark":false,"cold_canary":false,"decision_grade_presenter":true,"true_settlement":false},"admission_evidence":{"fresh_paired_benchmark":"no v3 family registered for yield-router is in a terminal state among ['complete_unscored', 'refuted', 'not_refuted']; no v1 experiment names yield-router on a complete pair of arms","cold_canary":"no canary run has ever been recorded for this service","decision_grade_presenter":"stated for this service in docket/hire/catalogue.py: it is a property of how a result is written, which nothing in the store observes","true_settlement":"no hire_payments row for yield-router has reached 'settled'. A row left at 'settlement_unknown' is a payment whose facilitator answer never came back and is not counted","window":"a paired benchmark stays fresh for 30 days from its own observation date; a canary for 129600 seconds from its finish"},"typical_seconds":12,"activation":"policy_action","activation_means":"One-shot activations return read-only reports. Funded sessions are separate: the runner checks your policy in software before submitting actions. The policy is not enforced by the session account on chain.","evidence_modality":"live_read","metrics":[{"name":"Pools clearing the stated gate","unit":"top-list pools considered","window":"single recorded read; no paired run against a person; one explorer top-pools snapshot","observed_at":"2026-08-22T16:05:30+00:00","method":"The catalogue yield-router runner read the PancakeSwap explorer top list and token allowlist at 2026-08-22T16:05:30+00:00, applied the stated TVL, turnover, token, and fee-data gates, and compared 26 eligible pools of 35 considered. The comparison-only path made no BSC eth_call, so it reports no chain block.","value":null,"numerator":26,"denominator":35,"display":"26 of 35 top-list pools considered"}],"agent_id":"56:0x8004a169fb4a3325136eb29fa0ceb6d2e539a432:311257","identity":"Bound to the BSC ERC-8004 agent 56:0x8004a169fb4a3325136eb29fa0ceb6d2e539a432:311257. This registration is not an endorsement, evidence of paid stock, or evidence that the service produced a result.","hire_method":"POST","hire_path":"/hire/yield-router","registration_uri":"https://docket.gudman.xyz/registrations/yield-router.json","input_schema":{"pool":{"type":"string","required":false,"description":"the pool id your capital is in, as the explorer spells it. With none given the first row of the eligible set stands in as the baseline and the response says so"},"wallet":{"type":"string","required":false,"description":"the recipient for an optional drafted swap leg. Supply it together with token_in, token_out, amount and cap; omit all five for comparison only"},"token_in":{"type":"string","required":false,"description":"the token the optional draft would spend; supply it with wallet, token_out, amount and cap"},"token_out":{"type":"string","required":false,"description":"the token the optional draft would buy; it must be held by the destination pool and supplied with wallet, token_in, amount and cap"},"amount":{"type":"integer","required":false,"description":"the exact atomic-unit input for the optional draft; supply it with wallet, token_in, token_out and cap"},"cap":{"type":"integer","required":false,"description":"the maximum atomic-unit input the optional draft may name; the amount is refused rather than trimmed when it exceeds this"},"position_size_usd":{"type":"number","required":false,"default":10000.0,"description":"the size the break-even is computed for, in USD"},"switching_cost_usd":{"type":"number","required":false,"default":15.0,"description":"what moving costs, in USD, covering gas on every leg plus the swap's own fee and price impact; supplied rather than derived, because Docket reads no BNB price here"},"horizon_days":{"type":"integer","required":false,"default":30,"description":"the horizon a break-even is judged against; every input is on the response, so another horizon can be applied without asking"},"pool_snapshot":{"type":"object","required":false,"description":"exact top-pools HTTP response bytes as base64 with URL, observation time and bare SHA-256; supplied together with token_list_snapshot"},"token_list_snapshot":{"type":"object","required":false,"description":"exact token-list HTTP response bytes as base64 with URL, observation time and bare SHA-256; supplied together with pool_snapshot"},"owner":{"type":"string","required":false,"description":"activation only: the address holding the v3 position NFT. It signs the one approval the session is not allowed to make, and it is the recipient the new position is minted to — never the session, whose revocation could otherwise strand it"},"session":{"type":"string","required":false,"description":"activation only: the bounded session address the tokens transit between the collect and the mint. Revoking it sweeps whatever is left, including the dust the conservative mint amounts leave behind"},"position_token_id":{"type":"integer","required":false,"description":"activation only: which PancakeSwap v3 position NFT to move. A position staked in MasterChefV3 is refused, because the farm owns the NFT and the owner cannot approve what they do not hold"},"band_width_ticks":{"type":"integer","required":false,"default":1000,"description":"activation only: the half-width of the destination band, in ticks either side of that pool's current tick. It is aligned outward to the pool's own spacing, so the band is never narrower than the one asked for"},"max_slippage_bps":{"type":"integer","required":false,"default":50,"description":"activation only: the bound applied to the withdrawal minimums, every swap leg's floor and the mint's own minimums, in basis points, 1 to 500. No step in the route carries a minimum of zero"},"session_policy_note":{"type":"string","required":false,"advanced":true,"description":"activation only, and not a field to send: before any of this runs the owner signs approve(session, tokenId) on the position manager themselves, scoped to the one position. That is the one authority a session cannot grant itself and it is a precondition rather than a step — the route reads it and refuses to build without it. The session itself has to allow the position manager and the router, and the four calls this route makes on them"}},"limitations":"PancakeSwap v3 pools on BSC, read from PancakeSwap's own explorer snapshot, and nothing else: no other venue, no v2 pools, no farms, no lending. Every rate is a 24h observation annualised by 365 — one day, not a forecast — and it is a rate over the pool's TVL rather than over any position, so a concentrated position earns at it only while it is in range and earns nothing while it is not. Clearing the plausibility gate is not an endorsement: the gate rejects figures that cannot be true and says nothing about figures that merely should not be leaned on. Every claim is bounded by the stated eligible set, so highest here always means highest within that set at that moment and never highest anywhere. The switching cost is supplied by the caller and is not derived — Docket reads no BNB price here and does not invent one — and a break-even is only as good as the number it was handed. A hire returns the comparison and at most one drafted swap leg. The complete move — withdraw, collect, up to three bounded swap legs, exact-amount allowances and a mint over a band aligned to the destination pool's own spacing — is built under an activation and needs a session the wallet's owner grants on chain, plus one approval the owner signs themselves for the position NFT: that authority is a precondition the route reads before it builds, not a step it can take. A position staked in MasterChefV3 is refused rather than planned around, because the farm owns the NFT. Impermanent loss is not modelled anywhere in the break-even, and the amounts the mint asks for are the conservative floors of the steps before it, so what the legs return above those floors stays in the session as dust until it is swept. Nothing is signed, submitted or held by a hire, and there is no execution guarantee of any kind: a drafted call is a record of what acting would commit to. A single recorded read; no paired run against a person stands behind the metrics on this card.","evidence":[{"kind":"advantage_task","url":"/services/yield-router","label":"Task 07 — single recorded read summary; the full committed JSON is docket/advantage/recorded_runs/07-yield-router-read.json and is not exposed by a public artifact route in this build"}],"agent_path":null,"identity_note":"The snapshot Docket serves does not hold this agent, so there is no /agents record to open for it here. Docket's default sweep covers the agents carrying at least one feedback record, which is a small slice of the registry — an identity outside that slice is registered on chain and is simply not in what Docket indexed."}