{
  "v": 1,
  "requestId": "6d2c8770-bf36-4449-a76e-0e602904cdbc",
  "chainId": 1,
  "window": {
    "toBlock": 26026608,
    "fromBlock": 26019452,
    "toBlockHash": "0x84272223fc64b8c836b51b2c341b61a03bfe7728fa6d655347f56dbf837fbf3f"
  },
  "answerType": "uint256",
  "answer": "15842292307692307",
  "figure": "15842292307692307",
  "definitions": {
    "sale": "an OrderFulfilled event emitted by Seaport 1.5 (0x00000000000000adc04c56bf30ac9d3c0aaf14dc) or Seaport 1.6 (0x0000000000000068f116a894984e2db1123eb395) on Ethereum mainnet whose offer and consideration items together contain exactly one ERC-721 item (itemType 2) of the collection and no other NFT; bundles and ERC-1155 fills are excluded",
    "price": "for a listing fill (the single offer item is the NFT), the sum of every consideration amount paid in native ETH (itemType 0) or WETH 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 (itemType 1), fees included, and only if every consideration item is ETH or WETH; for a bid fill (the single offer item is ETH or WETH), the offer amount; fills paid in any other token are excluded",
    "source": "the chain itself: eth_getLogs for the OrderFulfilled topic on both Seaport contracts over exactly the pinned blocks, decoded with the Seaport ABI",
    "average": "the arithmetic mean, rounded down to an integer number of wei, of the price of every qualifying sale in the pinned block window; 0 only if there was no qualifying sale",
    "collection": "0x0c56f29b8d90eea71d57cadeb3216b4ef7494abc",
    "weth": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
    "seaport15": "0x00000000000000adc04c56bf30ac9d3c0aaf14dc",
    "seaport16": "0x0000000000000068f116a894984e2db1123eb395",
    "topic0": "0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31",
    "denomination": "Integer wei; native ETH and WETH are combined at 1:1, with no fiat conversion. Listing price includes every consideration payment; bid price is the gross offer amount without adding consideration fees again.",
    "windowBounds": "Both block bounds are inclusive; no additional timestamp filter is applied.",
    "counting": "Each distinct, non-removed OrderFulfilled log is one fill; repeated RPC copies are deduplicated by block hash and log index. Separate fills in one transaction count separately. No wallet, zone, conduit, aggregator, or wash-trade filter is applied.",
    "eligibility": "Exactly one itemType 2 NFT with amount 1 at the collection address across both arrays; all other NFT types and bundles are excluded. Offer must have one item. Every other item must be native ETH or WETH, including any bid consideration fee. Zero-priced eligible fills are included.",
    "abi": "OrderFulfilled(bytes32,address,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[]). Offerer and zone are indexed. Data words 2 and 3 hold byte offsets to offer and consideration arrays; their tuples contain 4 and 5 words respectively."
  },
  "recipe": {
    "kind": "panel",
    "source": "https://rpc.flashbots.net/fast"
  },
  "notes": "Computed using the supplied scan.mjs with 500-block chunks and concurrency 2, capturing successful eth_getLogs responses for ABI decoding. Flashbots returned 12,232 distinct events across 15 chunks. Both https://rpc.flashbots.net/fast and https://rpc.mevblocker.io/fast confirmed chain 1 and the closing hash. Qualifying sales: 21 listings totaling 363899600000000000 wei and 5 bids totaling 48000000000000000 wei. Total 411899600000000000 / 26 gives 15842292307692307 wei, remainder 18. The pinned evidence mode requires panel; its source is the public RPC. Reproduce with Node 22+ by saving the following code as reproduce.mjs and running node reproduce.mjs from the directory containing artifacts/answer.json. No dependencies or removed inputs are needed.\n```js\nimport{readFileSync}from'node:fs';\nconst a=JSON.parse(readFileSync('artifacts/answer.json','utf8')),d=a.definitions,w=a.window;\nconst hex=n=>'0x'+n.toString(16);\nasync function rpc(method,params){const r=await fetch(a.recipe.source,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({jsonrpc:'2.0',id:1,method,params}),signal:AbortSignal.timeout(60000)});if(!r.ok)throw Error('HTTP '+r.status);const j=await r.json();if(j.error)throw Error(JSON.stringify(j.error));if(j.result===undefined)throw Error('missing result');return j.result;}\nif(Number(await rpc('eth_chainId',[]))!==a.chainId)throw Error('chain');\nif((await rpc('eth_getBlockByNumber',[hex(w.toBlock),false])).hash!==w.toBlockHash)throw Error('pin');\nconst addresses=[d.seaport15,d.seaport16],seen=new Set();let n=0n,sum=0n;\nconst money=x=>x[0]===0n||(x[0]===1n&&x[1]===BigInt(d.weth));\nfunction consume(l){if(l.removed)return;if(Number(l.blockNumber)<w.fromBlock||Number(l.blockNumber)>w.toBlock||!addresses.includes(l.address.toLowerCase())||l.topics[0]!==d.topic0)throw Error('log filter');const key=l.blockHash+':'+l.logIndex;if(seen.has(key))return;seen.add(key);\nconst words=l.data.slice(2).match(/.{64}/g).map(x=>BigInt('0x'+x));\nfunction items(slot,size){if(words[slot]%32n)throw Error('offset');const p=Number(words[slot]/32n),len=Number(words[p]);if(!Number.isSafeInteger(len)||len<0||p+1+len*size>words.length)throw Error('ABI');return Array.from({length:len},(_,i)=>words.slice(p+1+i*size,p+1+(i+1)*size));}\nconst o=items(2,4),c=items(3,5),nf=[...o,...c].filter(x=>x[0]>=2n);\nif(nf.length!==1||nf[0][0]!==2n||nf[0][1]!==BigInt(d.collection)||nf[0][3]!==1n||o.length!==1)return;\nlet price;if(o[0]===nf[0]&&c.every(money))price=c.reduce((s,x)=>s+x[3],0n);else if(money(o[0])&&c.every(x=>x===nf[0]||money(x)))price=o[0][3];else return;\nn++;sum+=price;}\nasync function scan(lo,hi){let logs;try{logs=await rpc('eth_getLogs',[{address:addresses,topics:[d.topic0],fromBlock:hex(lo),toBlock:hex(hi)}]);if(!Array.isArray(logs)||logs.length>=10000)throw Error('range');}catch(e){if(lo===hi)throw e;const mid=Math.floor((lo+hi)/2);await new Promise(r=>setTimeout(r,500));await scan(lo,mid);await scan(mid+1,hi);return;}for(const l of logs)consume(l);}\nfor(let b=w.fromBlock;b<=w.toBlock;b+=500)await scan(b,Math.min(b+499,w.toBlock));\nif((await rpc('eth_getBlockByNumber',[hex(w.toBlock),false])).hash!==w.toBlockHash)throw Error('pin changed');\nconsole.log(JSON.stringify({logs:seen.size,count:n.toString(),sum:sum.toString(),answer:(n?sum/n:0n).toString()}));\n```"
}
