AnjomanBeta
3 min readUpdated October 27, 2026

On-Chain Miner Requests (removed)

This rail no longer exists. SubnetFacet was deleted from the Diamond, and with it outboundSubnetMessage, the SubnetRequestOut and SubnetResponseIn events, getSubnetRequest and executeInboundSubnetMessage. Every on-chain request is now a job. Use On-Chain Jobs.

If you are reading this because a contract of yours calls outboundSubnetMessage, it will revert on a current deployment. Here is what to change.

What was different, and what it is now

Old miner requestJob (now)
Entry pointoutboundSubnetMessage(subnetId, endpoint, params, callback)createJob, createJobCapped, createJobAndPay or createJobForMiner
You targeta miner id and an endpoint keywordan intent (bytes32 hash of its canonical name)
Costgas onlyUSDC, from escrow or paid in the same call
Concurrencyone outstanding request protocol-widemany jobs in flight at once
Callbackmandatoryoptional
Request layoutthe miner's YAML on_chain.request blockthe intent's layout, the same for every miner
Answer layoutthe miner's YAML on_chain.fields blockthe intent's processed answer, the same for every miner
Failurecallback called with success = falsethe quorum fails the job, you are refunded, callback called with success = false

Moving a contract over

  1. Pick an intent instead of a miner. Find the intent your old miner served, for example from GET /engine/v1/intents/{intent}/miners. The intent id is keccak256 of its canonical name.
  2. Read the intent's layout. GET /engine/v1/intents/{intent} returns onchain.request (where each input goes) and onchain.response (where each answer field arrives). You no longer read a miner's YAML.
  3. Pay for it. Fund escrow and use createJobCapped, or approve the Diamond and use createJobAndPay.
  4. Keep your callback, change what it reads. The function is still subnetMessage(uint256,bool,OnChainData,string). success is now meaningful: false means the job failed and you were refunded. Read the answer by the intent's layout.
  5. Pin a miner if you must. createJobForMiner(intentId, miner, ...) tries one registration first and falls back to the intent's ranked miners, so a single miner outage does not fail your job.

Everything is explained step by step, with the reverts you may hit, in On-Chain Jobs.

A note on the subnet names

The callback keeps its legacy name, subnetMessage, and your callback contract may still implement ISubnetReceiverContract. Only the request side was removed. What subnet addresses is a miner, as everywhere else in the API.

Was this helpful?