{
  "v": 1,
  "requestId": "366c07b1-50e4-4e5d-afee-3acb66a685fe",
  "chainId": 1,
  "window": {
    "toBlock": 26026607,
    "fromBlock": 26019451,
    "toBlockHash": "0x8a84f5aa1d5976b1d454cfe7b479740ae9b7e7015bfd4635b124cb47767cdec2"
  },
  "answerType": "uint256",
  "answer": "2769200000000000",
  "figure": "138460000000000000",
  "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": "Wei; ETH and WETH amounts are combined at 1:1, with no gas costs or currency conversion.",
    "counting": "Inclusive block endpoints. Count each distinct canonical event once by blockNumber and logIndex, even for repeat token sales; no extra marketplace, recipient, zone, or wash-trading filter.",
    "itemEligibility": "The ERC-721 item must have amount 1. Require exactly one offer item; for bids, all non-NFT consideration items must also be ETH or WETH. Other NFT item types and other payment currencies are excluded."
  },
  "recipe": {
    "kind": "panel",
    "source": "https://ethereum-rpc.publicnode.com"
  },
  "notes": "Scanned 12231 OrderFulfilled logs in four inclusive chunks: 50 qualifying sales (3 listings, 47 bids), total 138460000000000000 wei; floor(total/50) = 2769200000000000 wei. Chain and closing hash matched. Flashbots endpoint https://rpc.flashbots.net/fast was attempted but did not finish; all totals are from the source URL. The supplied scan.mjs was adapted in scratch to decode dynamic item arrays. This brief requires panel; the catalogue has no Seaport-average executable recipe. To reproduce using public RPC alone, save the following as an .mjs file and run with Node 22 from the directory containing artifacts/answer.json (no dependencies):\n\nimport {readFileSync} from 'node:fs';\nconst a=JSON.parse(readFileSync('artifacts/answer.json','utf8'));\nconst rpc=async(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 b=await r.json();if(b.error)throw Error(JSON.stringify(b.error));return b.result;};\nconst hex=n=>'0x'+n.toString(16);\nif(Number(await rpc('eth_chainId',[]))!==a.chainId)throw Error('chain mismatch');\nif((await rpc('eth_getBlockByNumber',[hex(a.window.toBlock),false])).hash!==a.window.toBlockHash)throw Error('pin mismatch');\nconst address=['0x00000000000000adc04c56bf30ac9d3c0aaf14dc','0x0000000000000068f116a894984e2db1123eb395'];\nconst topics=['0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31'];\nconst get=async(f,t)=>{try{const l=await rpc('eth_getLogs',[{address,topics,fromBlock:hex(f),toBlock:hex(t)}]);if(!Array.isArray(l)||l.length>=10000)throw Error('possible cap');return l;}catch(e){if(f===t)throw e;const m=Math.floor((f+t)/2);return [...await get(f,m),...await get(m+1,t)];}};\nlet sum=0n,count=0n,seen=new Set();\nconst coin=x=>x.type===0||(x.type===1&&x.token==='0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2');\nfor(let f=a.window.fromBlock;f<=a.window.toBlock;f+=2000){for(const l of await get(f,Math.min(f+1999,a.window.toBlock))){\nconst key=l.blockNumber+':'+l.logIndex;if(l.removed||seen.has(key))continue;seen.add(key);\nconst w=i=>BigInt('0x'+l.data.slice(2+64*i,66+64*i));\nconst arr=(i,stride)=>{const p=Number(w(i))/32;return Array.from({length:Number(w(p))},(_,j)=>{const q=p+1+j*stride;return {type:Number(w(q)),token:'0x'+w(q+1).toString(16).padStart(40,'0'),amount:w(q+3)};});};\nconst o=arr(2,4),c=arr(3,5),n=[...o,...c].filter(x=>x.type>=2);\nif(n.length!==1||n[0].type!==2||n[0].token!=='0x69235b0627c6d0d69db236e4794b5dd258734181'||n[0].amount!==1n||o.length!==1)continue;\nlet p;if(o[0]===n[0]&&c.every(coin))p=c.reduce((s,x)=>s+x.amount,0n);else if(coin(o[0])&&c.every(x=>x===n[0]||coin(x)))p=o[0].amount;else continue;\nsum+=p;count++;\n}}\nconsole.log(JSON.stringify({sales:String(count),totalWei:String(sum),answer:String(count?sum/count:0n)}));\n"
}
