{
  "v": 1,
  "requestId": "e06d0e24-82da-430d-a70c-3d1a42f3dc28",
  "chainId": 1,
  "window": {
    "toBlock": 26026607,
    "fromBlock": 26019451,
    "toBlockHash": "0x8a84f5aa1d5976b1d454cfe7b479740ae9b7e7015bfd4635b124cb47767cdec2"
  },
  "answerType": "uint256",
  "answer": "6121668427630400",
  "figure": "6121668427630400",
  "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": "Integer wei; native ETH and WETH amounts combined 1:1 without conversion or gas costs.",
    "window": "Both endpoint blocks are included: 26019451 through 26026607. Closing hash must match the pinned hash.",
    "counting": "One sale per qualifying non-removed OrderFulfilled log; duplicate RPC entries deduplicated by blockNumber and logIndex. Repeat sales of the same token and multiple qualifying logs in one transaction each count separately.",
    "marketplace": "OpenSea is defined solely by the two pinned Seaport emitters; no extra caller, zone, recipient, referrer or frontend filter.",
    "nftAmount": "The sole NFT must have itemType 2, the collection address and amount 1. Any additional itemType >= 2 excludes the fill.",
    "bidPayments": "For bids the offer must contain exactly one ETH/WETH item; every consideration item other than the sole NFT must also be ETH/WETH. Price is the gross offered amount, without adding consideration fees again."
  },
  "recipe": {
    "kind": "panel",
    "source": "https://rpc.flashbots.net/fast"
  },
  "notes": "Scanned using the supplied scan.mjs with a scratch fetch hook retaining logs for ABI reduction: 12231 unique logs in 8 chunks; 46 qualifying sales (20 listings, 26 bids); sum 281596747670998414 wei; floor(sum/46)=6121668427630400. Chain and pin also matched https://rpc.mevblocker.io/fast and https://ethereum-rpc.publicnode.com. The required panel recipe names the RPC; reproduce by saving the following as reproduce.mjs and running node reproduce.mjs beside artifacts/ (Node 22, no dependencies):\n\nimport {readFileSync} from 'node:fs';\nconst a=JSON.parse(readFileSync('artifacts/answer.json','utf8'));\nconst {fromBlock:F,toBlock:T,toBlockHash:H}=a.window;\nconst A=['0x00000000000000adc04c56bf30ac9d3c0aaf14dc','0x0000000000000068f116a894984e2db1123eb395'];\nconst C='0x50bffe9e65281a9ca84b114222f5788b658c825f',W='0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2';\nconst topic='0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31';\nconst hex=n=>'0x'+n.toString(16);\nasync function rpc(method,params){\n for(let k=0;k<3;k++){\n  try{\n   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(30000)});\n   if(!r.ok)throw Error('HTTP '+r.status);\n   const j=await r.json();if(j.error)throw Error(JSON.stringify(j.error));return j.result;\n  }catch(e){if(k===2)throw e;await new Promise(r=>setTimeout(r,1000*2**k));}\n }\n}\nasync function logs(f,t){\n try{const l=await rpc('eth_getLogs',[{address:A,topics:[topic],fromBlock:hex(f),toBlock:hex(t)}]);if(!Array.isArray(l)||l.length>=10000)throw Error('limit');return l;}\n catch(e){if(f===t)throw e;const m=Math.floor((f+t)/2);return [...await logs(f,m),...await logs(m+1,t)];}\n}\nfunction price(data){\n const w=data.slice(2).match(/.{64}/g).map(x=>BigInt('0x'+x));\n function items(index,stride){const p=Number(w[index]/32n),n=Number(w[p]);return Array.from({length:n},(_,j)=>{const q=p+1+j*stride;return {t:Number(w[q]),token:'0x'+w[q+1].toString(16).padStart(40,'0'),amount:w[q+3]};});}\n const o=items(2,4),c=items(3,5),all=[...o,...c],nfts=all.filter(x=>x.t>=2);\n const pay=x=>x.t===0||(x.t===1&&x.token===W);\n if(nfts.length!==1||nfts[0].t!==2||nfts[0].token!==C||nfts[0].amount!==1n||o.length!==1)return null;\n if(o[0].t===2&&c.every(pay))return c.reduce((s,x)=>s+x.amount,0n);\n if(pay(o[0])&&c.every(x=>x===nfts[0]||pay(x)))return o[0].amount;\n return null;\n}\nif(Number(await rpc('eth_chainId',[]))!==1)throw Error('chain');\nif((await rpc('eth_getBlockByNumber',[hex(T),false])).hash!==H)throw Error('pin');\nlet count=0n,sum=0n,scanned=0;const seen=new Set();\nfor(let f=F;f<=T;f+=1000)for(const l of await logs(f,Math.min(T,f+999))){\n const key=l.blockNumber+':'+l.logIndex;if(l.removed||seen.has(key))continue;seen.add(key);\n if(Number(l.blockNumber)<F||Number(l.blockNumber)>T||!A.includes(l.address.toLowerCase())||l.topics[0]!==topic)throw Error('filter');\n scanned++;const p=price(l.data);if(p!==null){count++;sum+=p;}\n}\nconsole.log(JSON.stringify({logs:scanned,sales:count.toString(),sumWei:sum.toString(),answer:(count?sum/count:0n).toString()}));\n"
}
