{"service_id":"grid-operator","name":"Grid Operator","category":"grid_trading","category_job":"Run a capped grid","what_you_get":"A deterministic PancakeSwap V2 grid, built from a band you give it — or drawn around the pair's current price if you give it none — and quoted against BSC mainnet as it stands right now. No order rests on chain: V2 is an automated market maker and holds no order book, so a level here is a price Docket watches. The first observation that crosses it fires one bounded swap at whatever the pool quotes at that moment, and cancelling costs no gas because nothing was ever placed anywhere. Between two observations a level can be crossed and uncrossed without firing, which an order book would have filled. That is the honest cost of running a grid on an AMM and it is stated on every record this returns. A hire returns the read-only preview: the exact price levels and their spacing, which token each level spends and how much of it, the condition each level fires on, and for every level the full action record that acting would commit to — the router's own live quote for that trade, the minimum output the action insists on, a hash of the exact calldata that binds it, a deadline, a gas ceiling and a slippage bound. Nothing is signed, approved, submitted or held, and the object that produces it holds no session key, no signer and no submitter. Running the same grid is an activation with five operations over its life. Create fixes the band, the level count, the amount per level, the total cap, the expiry, the slippage bound and an optional shutdown threshold. Status returns the levels still open, every fill read back off the chain's own ERC-20 Transfer logs rather than assumed, and the amount committed against the cap. Pause stops firing and keeps every level. Cancel retires every remaining level and leaves the funds where they are, because retiring a strategy is not a decision about the money. Revoke requests a sweep of the session back to the owner; the runner also starts that path after expiry. The shutdown threshold is Docket's own observation and not a stop order held by a venue: it retires the remaining levels and sells nothing. Acting needs an owner-authorized, separately funded session EOA. Docket's runner holds the session key, never the owner's wallet key. Spend caps, call allowlists and expiry are off-chain checks before each send, not an on-chain session validator. The funded float is at risk if the runner or session key is compromised; fund only what you can afford to lose. Revocation and expiry rely on the runner to sweep the remaining balance, and close only after balance reads return zero. Every figure comes back with the block it was read at, so you can check any of it against the chain yourself.","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 grid-operator is in a terminal state among ['complete_unscored', 'refuted', 'not_refuted']; no v1 experiment names grid-operator 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 grid-operator 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":25,"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":"Levels quoted and hash-bound","unit":"requested grid levels","window":"single recorded read; no paired run against a person; one 6-level grid preview","observed_at":"2026-08-22T16:05:45.744877+00:00","method":"The catalogue grid-operator runner built its deterministic WBNB/USDT band, asked PancakeSwap V2 Router.getAmountsOut for the observation and each level, and hash-bound every usable action; the service reported BSC block 117453016.","value":null,"numerator":6,"denominator":6,"display":"6 of 6 requested grid levels"}],"agent_id":"56:0x8004a169fb4a3325136eb29fa0ceb6d2e539a432:311255","identity":"Bound to the BSC ERC-8004 agent 56:0x8004a169fb4a3325136eb29fa0ceb6d2e539a432:311255. This registration is not an endorsement, evidence of paid stock, or evidence that the service produced a result.","hire_method":"POST","hire_path":"/hire/grid-operator","registration_uri":"https://docket.gudman.xyz/registrations/grid-operator.json","input_schema":{"wallet":{"type":"string","required":true,"default":"0xe55816904796341bf8535e25f6c8b647927fc946","example_note":"Docket's own controlled wallet — replace with your address","description":"the 0x-prefixed BSC address the previewed swaps name as recipient; it is read and never touched"},"lower":{"type":"integer","required":false,"description":"bottom of the band, in atomic units of the quote token per one whole base token; defaults to 10% below the observed price"},"upper":{"type":"integer","required":false,"description":"top of the band, same units; defaults to 10% above the observed price"},"levels":{"type":"integer","required":false,"default":6,"description":"how many price levels the band is divided into, at least two"},"size_per_level":{"type":"integer","required":false,"default":25000000000000000000,"description":"what each level commits, in atomic units of the quote token; a sell level commits what that is worth in the base token at its own price"},"base":{"type":"string","required":false,"default":"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c","description":"the token being priced"},"quote":{"type":"string","required":false,"default":"0x55d398326f99059fF775485246999027B3197955","description":"the token it is priced in"},"base_decimals":{"type":"integer","required":false,"default":18,"description":"decimals of the base token; 18 for WBNB, and 18 for USDT on BSC"},"reference":{"type":"integer","required":false,"description":"the price levels are sided against — below it they buy, above it they sell; defaults to the observed price"},"filled":{"type":"array","items":{"type":"integer"},"required":false,"description":"level indexes already filled, which are not drafted again"},"price_lower":{"type":"integer","required":false,"description":"activation only: bottom of the band a running grid is fixed to, in atomic units of the quote token per one whole base token. The one-shot preview above takes the same figure as lower"},"price_upper":{"type":"integer","required":false,"description":"activation only: top of the band, same units; upper in the one-shot preview"},"amount_per_level_atomic":{"type":"integer","required":false,"description":"activation only: what each level commits, in atomic units of the quote token. A sell level commits what that is worth in the base token at its own price, so every level puts the same value to work rather than the same quantity; size_per_level in the preview"},"total_cap_atomic":{"type":"integer","required":false,"description":"activation only: the most this grid may commit over its whole life, in the same quote-token units. It moves when a level fires rather than when it fills, and a level that would pass it is refused rather than trimmed to what is left"},"expires_at":{"type":"integer","required":false,"description":"activation only: the unix second the grid stops. Passing it sweeps the session back to the owner rather than merely halting, because a session outliving the spec that justified it is what an expiry is for"},"max_slippage_bps":{"type":"integer","required":false,"default":50,"description":"activation only: how far below the router's live quote a fill may land, in basis points, 1 to 500. It is written into the swap as amountOutMin, so no level is ever sent with a floor of zero"},"stop_price":{"type":"integer","required":false,"description":"activation only: a shutdown threshold outside the band. An observation reaching it retires every remaining level and sends nothing — it is Docket's own observation, not a stop order held by a venue, and it is only as fast as the next observation"},"direction_rule":{"type":"string","required":false,"default":"buy_below_sell_above","description":"activation only: how levels are sided against the price observed when the grid started. The set is closed and holds one entry, so a second rule has to be added deliberately"},"session_policy_note":{"type":"string","required":false,"advanced":true,"description":"activation only, and not a field to send: the session this grid runs under has to allow approve (0x095ea7b3) as well as swapExactTokensForTokens (0x38ed1739), and both the base and the quote token. The router pulls the input token out of the session with transferFrom, so a session granted the swap and not the approval can draft a level it can never settle"}},"limitations":"PancakeSwap V2 exact-input swaps on BSC mainnet and nothing else: no V3, no adding or removing liquidity, and no resting orders of any kind. A V2 pool is an automated market maker and holds no order book, so a level here is a price Docket watches: the first observation that crosses it fires one bounded swap at whatever the pool quotes then, a level can be crossed and uncrossed between two observations without firing, and the shutdown threshold is Docket's own observation rather than a stop order held by a venue. What a hire returns is a preview and structurally only a preview — the object that produces it holds no session key, no signer and no submitter and has no method that sends a transaction, so it cannot move anything, and every figure in it is a read. Running the grid is an activation with create, status, pause, cancel and revoke over its life, and acting needs an owner-authorized, separately funded session EOA. Docket's runner holds the session key, never the owner's wallet key. Spend caps, call allowlists and expiry are off-chain checks before each send, not an on-chain session validator. The funded float is at risk if the runner or session key is compromised; fund only what you can afford to lose. Revocation and expiry rely on the runner to sweep the remaining balance, and close only after balance reads return zero. Each level's floor comes from a live router quote less the slippage the plan allows, and an action whose simulation disagrees with its own bounds is not submitted — but a level filling is a fill and not a gain. A confirmed transaction shows the action executed as it was authorised and shows nothing about whether it was worth taking. A single recorded read; no paired run against a person stands behind the metrics on this card. And the grid is deterministic rather than adaptive: it divides the band it was given, and it does not decide the band was wrong.","evidence":[{"kind":"advantage_task","url":"/services/grid-operator","label":"Task 06 — single recorded read summary; the full committed JSON is docket/advantage/recorded_runs/06-grid-preview-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."}