{
  "v": 1,
  "requestId": "e725b401-b915-4d72-9e17-4a5480b97e4e",
  "chainId": 1,
  "window": {
    "toBlock": 26026601,
    "fromBlock": 26019445,
    "toBlockHash": "0xa7f16ffaa132f03189bd821fe6466ae981a84e20ba3a5b6a2a2888019d925517"
  },
  "answerType": "uint256",
  "answer": "103084251400000000",
  "figure": "103084251400000000",
  "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 are counted at 1:1 without conversion or gas costs.",
    "window": "Inclusive fromBlock and toBlock. Deduplicate by blockNumber and logIndex; ignore removed logs. Each qualifying event counts separately, including repeated sales of the same token.",
    "nftQuantity": "The sole NFT item must have amount 1. NFT item types are 2 through 5; only type 2 of the requested collection qualifies.",
    "bidPayments": "For bids, consideration must contain the sole qualifying NFT and otherwise only native ETH or WETH. The gross offered amount is counted once, with no subtraction or addition of consideration fees.",
    "marketplace": "OpenSea is operationally the two specified Seaport emitters; no additional frontend, zone, recipient, or order origin restriction."
  },
  "recipe": {
    "kind": "panel",
    "source": "https://rpc.flashbots.net/fast"
  },
  "notes": "Computed using the supplied scan.mjs scanner, copied into scratch with exports for decoding dynamic Seaport arrays, via node test/scratch/compute.mjs. Flashbots returned 12242 events in 8 disjoint chunks; 35 sales (22 listings, 13 bids), total 3607948799000000000 wei. Flashbots and https://ethereum-rpc.publicnode.com both confirmed chain 1 and the closing hash. The brief requires panel; the catalogue has no filtered average recipe. The panel source is the public RPC; the following standalone Node script reproduces the computation using only that RPC and this answer file. Save the code as reproduce.cjs and run node reproduce.cjs. No dependencies.\n\nconst fs=require('node:fs');\nconst a=JSON.parse(fs.readFileSync('artifacts/answer.json'));\nconst url=a.recipe.source, h=n=>'0x'+n.toString(16);\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;}\n(async()=>{\nif(Number(await rpc('eth_chainId',[]))!==a.chainId)throw Error('chain');\nif((await rpc('eth_getBlockByNumber',[h(a.window.toBlock),false])).hash!==a.window.toBlockHash)throw Error('pin');\nconst address=['0x00000000000000adc04c56bf30ac9d3c0aaf14dc','0x0000000000000068f116a894984e2db1123eb395'];\nconst topic='0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31';\nasync function logs(lo,hi){try{const x=await rpc('eth_getLogs',[{address,topics:[topic],fromBlock:h(lo),toBlock:h(hi)}]);if(x.length>=10000)throw Error('possible cap');return x;}catch(e){if(lo===hi)throw e;const m=Math.floor((lo+hi)/2);return [...await logs(lo,m),...await logs(m+1,hi)];}}\nlet sum=0n,count=0;const seen=new Set();\nfor(let lo=a.window.fromBlock;lo<=a.window.toBlock;lo+=1000){for(const l of await logs(lo,Math.min(lo+999,a.window.toBlock))){\nconst key=l.blockNumber+':'+l.logIndex;if(l.removed||seen.has(key))continue;seen.add(key);\nconst w=l.data.slice(2).match(/.{64}/g),n=i=>BigInt('0x'+w[i]);\nconst arr=(head,stride)=>{const o=Number(n(head))/32;return Array.from({length:Number(n(o))},(_,j)=>{const p=o+1+j*stride;return {t:Number(n(p)),token:'0x'+w[p+1].slice(24),amount:n(p+3)};});};\nconst offer=arr(2,4),c=arr(3,5),nft=[...offer,...c].filter(x=>x.t>=2);\nif(offer.length!==1||nft.length!==1||nft[0].t!==2||nft[0].token!=='0x790b2cf29ed4f310bf7641f013c65d4560d28371'||nft[0].amount!==1n)continue;\nconst money=x=>x.t===0||(x.t===1&&x.token==='0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2');\nlet price;if(offer[0].t===2&&c.every(money))price=c.reduce((s,x)=>s+x.amount,0n);else if(money(offer[0])&&c.every(x=>x===nft[0]||money(x)))price=offer[0].amount;else continue;\nsum+=price;count++;\n}}\nconst average=count?sum/BigInt(count):0n;console.log(JSON.stringify({count,sum:String(sum),average:String(average)}));if(String(average)!==a.answer)throw Error('answer mismatch');\n})().catch(e=>{console.error(e);process.exitCode=1});\n"
}
