{
  "v": 1,
  "requestId": "45871336-47e3-4f4c-99c6-ebbcd230073b",
  "chainId": 1,
  "window": {
    "toBlock": 26026608,
    "fromBlock": 26019452,
    "toBlockHash": "0x84272223fc64b8c836b51b2c341b61a03bfe7728fa6d655347f56dbf837fbf3f"
  },
  "answerType": "uint256",
  "answer": "44781259259259259",
  "figure": "44781259259259259",
  "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",
    "denomination": "ETH and WETH amounts are combined 1:1 in wei; no fiat conversion or gas cost.",
    "window": "Inclusive fromBlock and toBlock; the supplied closing hash is verified before scanning.",
    "counting": "One sale per qualifying OrderFulfilled log, deduplicated by blockNumber and logIndex; removed logs excluded. Repeated sales of a token count separately. NFT amount must be 1.",
    "marketplace": "OpenSea means both specified Seaport emitters, without extra zone, recipient, router, or frontend attribution filters.",
    "bidFees": "For bids, non-NFT consideration must be ETH or WETH; use the entire single offer amount without subtracting or adding consideration fees."
  },
  "recipe": {
    "kind": "panel",
    "source": "https://rpc.flashbots.net/fast"
  },
  "notes": "Computed using the supplied scan.mjs scanning and keccak routines via a scratch-only extension for dynamic ABI decoding. Four inclusive chunks returned 12232 unique OrderFulfilled logs: 26 listing sales and 1 bid sale. Total 1209094000000000000 wei / 27 = 44781259259259259 wei rounded down. Independent Python decoding of the same logs agreed. https://rpc.mevblocker.io/fast also confirmed chain 1 and the closing hash; https://ethereum-rpc.publicnode.com was probed for chain id only. The brief requires panel, so source names the RPC; the catalogue has no native Seaport average reduction. To reproduce from public RPC alone, save the following JavaScript as an .mjs file and run with Node 22 from the directory containing artifacts/answer.json (no dependencies; optional RPC_URL override). The event has indexed offerer and zone; data words 2 and 3 are the offer and consideration byte offsets.\n\nimport {readFileSync} from 'node:fs';\nconst a=JSON.parse(readFileSync('artifacts/answer.json','utf8'));\nconst url=process.env.RPC_URL || a.recipe.source;\nasync function rpc(method,params){const r=await fetch(url,{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));return j.result;}\nconst hex=n=>'0x'+n.toString(16);\nif(Number(await rpc('eth_chainId',[]))!==a.chainId)throw Error('chain');\nif((await rpc('eth_getBlockByNumber',[hex(a.window.toBlock),false])).hash!==a.window.toBlockHash)throw Error('pin');\nconst address=['0x00000000000000adc04c56bf30ac9d3c0aaf14dc','0x0000000000000068f116a894984e2db1123eb395'];\nconst topics=['0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31'];\nasync function scan(f,t){try{return await rpc('eth_getLogs',[{address,topics,fromBlock:hex(f),toBlock:hex(t)}]);}catch(e){if(f===t)throw e;const m=Math.floor((f+t)/2);return [...await scan(f,m),...await scan(m+1,t)];}}\nconst money=x=>x.type===0 || (x.type===1 && x.token==='0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2');\nlet sum=0n,count=0;const seen=new Set();\nfor(let f=a.window.fromBlock;f<=a.window.toBlock;f+=2000){\n for(const l of await scan(f,Math.min(f+1999,a.window.toBlock))){\n  const key=l.blockNumber+':'+l.logIndex;if(l.removed || seen.has(key))continue;seen.add(key);\n  const w=l.data.slice(2).match(/.{64}/g),u=i=>BigInt('0x'+w[i]);\n  function arr(k,s){const b=Number(u(k))/32;return Array.from({length:Number(u(b))},(_,i)=>{const p=b+1+i*s;return {type:Number(u(p)),token:'0x'+w[p+1].slice(24),amount:u(p+3)};});}\n  const o=arr(2,4),c=arr(3,5),n=[...o,...c].filter(x=>x.type>=2);\n  if(o.length!==1 || n.length!==1 || n[0].type!==2 || n[0].token!=='0x357b9d3a18f7516f8f3c36991af3140840f0f626' || n[0].amount!==1n)continue;\n  let p;if(o[0]===n[0] && c.every(money))p=c.reduce((s,x)=>s+x.amount,0n);\n  else if(money(o[0]) && c.every(x=>x===n[0] || money(x)))p=o[0].amount;else continue;\n  sum+=p;count++;\n }\n}\nconst answer=count?(sum/BigInt(count)).toString():'0';\nconsole.log(JSON.stringify({count,sum:sum.toString(),answer}));\nif(answer!==a.answer)throw Error('answer mismatch');\n"
}
