> ## Documentation Index
> Fetch the complete documentation index at: https://docs.goldsky.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Fanout

> A premium Edge RPC tier that cross-checks every read against multiple independent upstreams and verifies each response with deep data-integrity checks before returning it

export const FanoutFlow = () => {
  const GREEN = '#16A34A';
  const GOLD = '#D97706';
  const BLUE = '#2563EB';
  const PURPLE = '#7C3AED';
  const TEAL = '#0D9488';
  const ORANGE = '#EA580C';
  const BORDER = 'rgba(113,113,122,0.4)';
  const LANES = [{
    key: 'reads',
    color: BLUE,
    methods: 'eth_call · eth_getBalance · +7',
    policy: 'quorum agrees',
    nodes: 5,
    accent: GREEN
  }, {
    key: 'logs',
    color: PURPLE,
    methods: 'eth_getLogs · eth_getBlockReceipts',
    policy: 'largest wins',
    nodes: 3,
    accent: GREEN
  }, {
    key: 'fees',
    color: TEAL,
    methods: 'eth_gasPrice · +2',
    policy: 'highest wins',
    nodes: 4,
    accent: GOLD
  }, {
    key: 'cast',
    color: ORANGE,
    methods: 'eth_sendRawTransaction',
    policy: 'broadcast',
    nodes: 6,
    accent: GOLD
  }];
  const CHECKS = ['Structure & encoding', 'Commitments match', 'Per-item authenticity', 'Cross-block continuity'];
  const [step, setStep] = useState(0);
  const TOTAL = 7;
  useEffect(() => {
    const id = setInterval(() => setStep(p => (p + 1) % TOTAL), 900);
    return () => clearInterval(id);
  }, []);
  const laneOk = step >= 1;
  const checkOk = i => step >= i + 2;
  const verified = step >= 6;
  const laneY = [31, 71, 111, 151];
  const nodeX0 = 72;
  const gap = 9;
  const policyX = 140;
  const checkX = 224;
  const checkW = 100;
  return <div className="not-prose my-8">
      <svg viewBox="0 0 392 184" width="100%" xmlns="http://www.w3.org/2000/svg">
        {}
        <rect x="8" y="76" width="52" height="30" rx="6" fill="none" stroke={BORDER} strokeWidth="1.1" />
        <text x="34" y="94" textAnchor="middle" fill="currentColor" fontFamily="monospace" style={{
    fontSize: '8px',
    opacity: 0.92
  }}>request</text>

        {}
        {LANES.map((lane, li) => {
    const y = laneY[li];
    const ok = laneOk;
    return <g key={lane.key}>
              <path d={`M 60 91 C 67 91, 67 ${y}, ${nodeX0 - 4} ${y}`} fill="none" stroke={ok ? lane.color : 'currentColor'} strokeWidth={ok ? '1.9' : '1.3'} style={{
      opacity: ok ? 0.85 : 0.22,
      transition: 'all .3s'
    }} />
              <text x={nodeX0 - 4} y={y - 8.5} fill={lane.color} fontFamily="monospace" style={{
      fontSize: '5.5px',
      opacity: 0.9
    }}>{lane.methods}</text>
              {Array.from({
      length: lane.nodes
    }).map((_, ni) => <circle key={ni} cx={nodeX0 + ni * gap} cy={y} r="3.7" fill={ok ? lane.accent : 'currentColor'} style={{
      opacity: ok ? 1 : 0.3,
      transition: 'all .3s'
    }} />)}
              <text x={policyX} y={y + 2.4} fill="currentColor" fontFamily="monospace" style={{
      fontSize: '7px',
      opacity: ok ? 0.95 : 0.4,
      transition: 'opacity .3s'
    }}>{lane.policy}</text>
              <path d={`M 198 ${y} C 208 ${y}, 208 91, ${checkX - 4} 91`} fill="none" stroke={ok ? lane.color : 'currentColor'} strokeWidth={ok ? '1.5' : '1.1'} style={{
      opacity: ok ? 0.55 : 0.16,
      transition: 'all .3s'
    }} />
            </g>;
  })}

        {}
        <rect x={checkX} y="51" width={checkW} height="80" rx="5" fill="none" stroke={BORDER} strokeWidth="1.1" />
        <text x={checkX + 8} y="63" fill="currentColor" fontFamily="monospace" style={{
    fontSize: '5.5px',
    opacity: 0.6
  }}>data-integrity checks</text>
        {CHECKS.map((c, i) => {
    const y = 77 + i * 13;
    const ok = checkOk(i);
    return <g key={c}>
              <circle cx={checkX + 10} cy={y} r="3.4" fill={ok ? GREEN : 'none'} stroke={ok ? GREEN : 'currentColor'} strokeWidth="0.9" style={{
      opacity: ok ? 1 : 0.35,
      transition: 'all .3s'
    }} />
              {ok && <path d={`M ${checkX + 8} ${y} L ${checkX + 9.4} ${y + 1.4} L ${checkX + 11.9} ${y - 1.6}`} fill="none" stroke="#fff" strokeWidth="1.05" strokeLinecap="round" strokeLinejoin="round" />}
              <text x={checkX + 17} y={y + 2.2} fill="currentColor" fontFamily="monospace" style={{
      fontSize: '6px',
      opacity: ok ? 0.95 : 0.4,
      transition: 'opacity .3s'
    }}>{c}</text>
            </g>;
  })}

        {}
        <line x1={checkX + checkW} y1="91" x2="332" y2="91" stroke={verified ? GOLD : 'currentColor'} strokeWidth="1.7" style={{
    opacity: verified ? 0.9 : 0.2,
    transition: 'all .3s'
  }} />

        {}
        <g style={{
    transition: 'all .3s'
  }}>
          <rect x="330" y="80" width="58" height="22" rx="11" fill={verified ? GOLD : 'currentColor'} style={{
    opacity: verified ? 1 : 0.12
  }} />
          {verified && <path d="M 339 91.5 L 343 95.5 L 349 87.5" fill="none" stroke="#FFFFFF" strokeWidth="1.7" strokeLinecap="round" strokeLinejoin="round" />}
          <text x={verified ? 353 : 359} y="93.5" textAnchor={verified ? 'start' : 'middle'} fill={verified ? '#FFFFFF' : 'currentColor'} fontFamily="monospace" style={{
    fontSize: '7px',
    fontWeight: 700,
    opacity: verified ? 1 : 0.5
  }}>verified</text>
        </g>
      </svg>
    </div>;
};

export const FanoutCoverage = () => {
  const GOLD = '#D97706';
  const BORDER = 'rgba(17, 24, 39, 0.12)';
  const MUTED = '#6B7280';
  const CARD_BG = '#FCFCFB';
  const [status, setStatus] = useState('loading');
  const [error, setError] = useState('');
  const [payload, setPayload] = useState(null);
  const [expanded, setExpanded] = useState(() => new Set());
  const [didInit, setDidInit] = useState(false);
  const load = () => {
    setStatus('loading');
    setError('');
    fetch(`${window.location.origin}/data/fanout-coverage.json?t=${Date.now()}`, {
      cache: 'no-store'
    }).then(r => {
      if (!r.ok) throw new Error(`Could not load coverage (${r.status})`);
      return r.json();
    }).then(data => {
      if (!data?.rows?.length) throw new Error('Coverage data is empty');
      setPayload(data);
      setStatus('ready');
    }).catch(err => {
      setStatus('error');
      setError(err?.message || 'Failed to load');
    });
  };
  useEffect(() => {
    load();
  }, []);
  const COLOR = {
    strict: '#2563EB',
    larger: '#2563EB',
    highest: '#0D9488',
    broadcast: '#EA580C'
  };
  const RULE = {
    strict: 'consensus',
    larger: 'consensus',
    highest: 'highest value',
    broadcast: 'broadcast'
  };
  const LEGEND = [{
    kind: 'consensus',
    label: 'consensus',
    color: COLOR.strict,
    desc: 'The request goes to several independent upstreams; the answer is returned only when enough come back identical, so a lone wrong or stale node is outvoted.'
  }, {
    kind: 'highest',
    label: 'highest value',
    color: COLOR.highest,
    desc: 'We query several upstreams and keep the highest, freshest value, so a stale, too-low one never sticks you.'
  }, {
    kind: 'broadcast',
    label: 'broadcast',
    color: COLOR.broadcast,
    desc: 'We push it to every upstream in parallel for the widest, fastest propagation.'
  }];
  const ruleDiagram = (kind, color) => {
    const fill = `${color}22`;
    if (kind === 'consensus') {
      const bad = '#DC2626';
      const rows = [{
        y: 16,
        ok: true
      }, {
        y: 43,
        ok: true
      }, {
        y: 70,
        ok: false
      }, {
        y: 96,
        ok: true
      }];
      return <svg viewBox="0 0 640 112" width="100%" style={{
        display: 'block'
      }} aria-hidden="true">
          <circle cx="40" cy="56" r="8" fill={color} />
          {rows.map((r, i) => {
        const c = r.ok ? color : bad;
        return <g key={i}>
                <line x1="48" y1="56" x2="248" y2={r.y} stroke={c} strokeWidth="1.4" opacity={r.ok ? 0.5 : 0.4} />
                <rect x="250" y={r.y - 12} width="96" height="24" rx="5" fill={`${c}22`} stroke={c} strokeWidth="1.3" />
                <text x="298" y={r.y + 4.5} textAnchor="middle" fontSize="13" fontFamily="monospace" fill={c}>{r.ok ? '0x1a3f' : '0x9c2b'}</text>
                {r.ok ? <line x1="346" y1={r.y} x2="556" y2="56" stroke={color} strokeWidth="1.4" opacity="0.5" /> : <text x="360" y={r.y + 5.5} fontSize="16" fontWeight="700" fill={bad}>✗</text>}
              </g>;
      })}
          <circle cx="580" cy="56" r="15" fill={color} />
          <path d="M573 56 l5 5 l9 -11" stroke="#FFFFFF" strokeWidth="2.4" fill="none" strokeLinecap="round" strokeLinejoin="round" />
        </svg>;
    }
    if (kind === 'highest') {
      const rows = [{
        y: 16,
        v: '11'
      }, {
        y: 43,
        v: '9'
      }, {
        y: 70,
        v: '14',
        hi: true
      }, {
        y: 96,
        v: '8'
      }];
      return <svg viewBox="0 0 640 112" width="100%" style={{
        display: 'block'
      }} aria-hidden="true">
          <circle cx="40" cy="56" r="8" fill={color} />
          {rows.map((r, i) => <g key={i}>
              <line x1="48" y1="56" x2="248" y2={r.y} stroke={color} strokeWidth="1.4" opacity={r.hi ? 0.6 : 0.25} />
              <rect x="250" y={r.y - 12} width="70" height="24" rx="5" fill={r.hi ? fill : 'none'} stroke={color} strokeWidth={r.hi ? 1.6 : 1.1} opacity={r.hi ? 1 : 0.5} />
              <text x="285" y={r.y + 4.5} textAnchor="middle" fontSize="13" fontFamily="monospace" fontWeight={r.hi ? 700 : 400} fill={color} opacity={r.hi ? 1 : 0.55}>{r.v}</text>
              {r.hi && <line x1="320" y1={r.y} x2="556" y2="56" stroke={color} strokeWidth="1.6" />}
            </g>)}
          <rect x="556" y="42" width="48" height="28" rx="6" fill={fill} stroke={color} strokeWidth="1.6" />
          <text x="580" y="60" textAnchor="middle" fontSize="14" fontWeight="700" fontFamily="monospace" fill={color}>14</text>
        </svg>;
    }
    const gold = GOLD;
    return <svg viewBox="0 0 640 112" width="100%" style={{
      display: 'block'
    }} aria-hidden="true">
        <rect x="24" y="42" width="52" height="28" rx="6" fill={fill} stroke={color} strokeWidth="1.4" />
        <text x="50" y="60" textAnchor="middle" fontSize="13" fontFamily="monospace" fill={color}>tx</text>
        {[12, 30, 48, 66, 84, 100].map((y, i) => {
      const fast = i === 1;
      const c = fast ? gold : color;
      return <g key={i}>
              <line x1="76" y1="56" x2="558" y2={y} stroke={c} strokeWidth={fast ? 2.6 : 1.2} opacity={fast ? 1 : 0.4} />
              <circle cx="566" cy={y} r={fast ? 8 : 6.5} fill={c} opacity={fast ? 1 : 0.85} />
            </g>;
    })}
        <text x="300" y="28" textAnchor="middle" fontSize="11.5" fontWeight="700" fill={gold}>fastest</text>
      </svg>;
  };
  const CHECK = {
    eth_call: 'Run on several independent upstreams; only returned when a supermajority come back with the exact same result.',
    eth_getBalance: 'Cross-checked across upstreams; a supermajority must return the exact same balance.',
    eth_getCode: 'A supermajority must return the exact same contract bytecode.',
    eth_getStorageAt: 'A supermajority must return the exact same storage slot value.',
    eth_getProof: 'A supermajority must agree on the account and storage proof.',
    eth_getBlockByNumber: 'A supermajority must agree on the canonical block at that height.',
    eth_getBlockByHash: 'A supermajority must agree on the block for that hash.',
    eth_getTransactionByHash: 'A supermajority must agree on the transaction details.',
    eth_getTransactionReceipt: 'A supermajority must agree on the receipt — status, gas used, and logs.',
    eth_getLogs: 'Cross-checked across upstreams; a quorum must agree and the most complete log set wins, so silently dropped logs are caught.',
    eth_getBlockReceipts: 'A quorum must agree, and the most complete set of receipts wins.',
    eth_gasPrice: 'Fanned out to several upstreams, but gas price is a per-node estimate with no single correct value — so the highest, freshest price wins instead of a vote, and a stale, too-low quote never sticks you.',
    eth_maxPriorityFeePerGas: 'A per-node estimate too: fanned out, and the highest priority fee returned wins — there is no canonical value to agree on.',
    eth_getTransactionCount: 'Fanned out to several upstreams; the highest nonce wins, so a lagging node can’t hand back a stale, too-low value. Highest is the safe pick here, not a vote.',
    eth_sendRawTransaction: 'A write, not a read: broadcast to every upstream in parallel for the widest, fastest propagation. Nothing to cross-check — the tx hash is fixed by the signed bytes.'
  };
  const ORDER = Object.keys(CHECK);
  const methods = useMemo(() => {
    if (!payload?.rows) return [];
    const map = new Map();
    for (const row of payload.rows) {
      for (const name of row.matchMethod.split('|')) {
        if (!map.has(name)) map.set(name, {
          method: name,
          policyType: row.policyType,
          nets: new Map()
        });
        map.get(name).nets.set(row.chainId, {
          alias: row.alias,
          chainId: row.chainId,
          agree: row.agreementThreshold,
          fanout: row.maxParticipants
        });
      }
    }
    return [...map.values()].map(g => ({
      method: g.method,
      policyType: g.policyType,
      color: COLOR[g.policyType] || MUTED,
      check: CHECK[g.method] || '',
      networks: [...g.nets.values()].sort((a, b) => b.fanout - a.fanout || b.agree - a.agree || a.alias.localeCompare(b.alias))
    })).sort((a, b) => {
      const ia = ORDER.indexOf(a.method);
      const ib = ORDER.indexOf(b.method);
      return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib);
    });
  }, [payload]);
  const methodsByRule = useMemo(() => {
    const m = {
      consensus: [],
      highest: [],
      broadcast: []
    };
    for (const g of methods) {
      const k = g.policyType === 'highest' ? 'highest' : g.policyType === 'broadcast' ? 'broadcast' : 'consensus';
      m[k].push(g.method);
    }
    return m;
  }, [methods]);
  useEffect(() => {
    if (!didInit && methods.length) {
      setExpanded(new Set([methods[0].method]));
      setDidInit(true);
    }
  }, [methods, didInit]);
  const toggle = name => setExpanded(prev => {
    const next = new Set(prev);
    next.has(name) ? next.delete(name) : next.add(name);
    return next;
  });
  const HIGHEST_TERM = {
    eth_gasPrice: 'gas price',
    eth_maxPriorityFeePerGas: 'priority fee',
    eth_getTransactionCount: 'nonce'
  };
  const ruleSentence = (policyType, method, n) => {
    const X = v => <strong style={{
      color: GOLD,
      fontWeight: 700
    }}>{v}</strong>;
    if (policyType === 'highest') return <>Highest {HIGHEST_TERM[method] || 'value'} among {X(n.fanout)} nodes</>;
    if (policyType === 'broadcast') return <>Fastest propagation among {X(n.fanout)} nodes</>;
    return <>{X(n.agree)} nodes fully agree</>;
  };
  const AVATAR_COLORS = ['#2563EB', '#0D9488', '#EA580C', '#7C3AED', '#DB2777', '#0E7490', '#D97706', '#DC2626'];
  const avatar = alias => {
    const s = alias || '?';
    let h = 0;
    for (let i = 0; i < s.length; i++) h = h * 31 + s.charCodeAt(i) >>> 0;
    const c = AVATAR_COLORS[h % AVATAR_COLORS.length];
    return <span style={{
      flex: 'none',
      width: '24px',
      height: '24px',
      borderRadius: '7px',
      background: `${c}22`,
      border: `1px solid ${c}`,
      color: c,
      fontSize: '11.5px',
      fontWeight: 700,
      display: 'flex',
      alignItems: 'center',
      justifyContent: 'center',
      textTransform: 'uppercase'
    }}>{s[0]}</span>;
  };
  if (status === 'loading') {
    return <div className="not-prose my-8 rounded-2xl border p-8" style={{
      borderColor: BORDER
    }}>
        <div style={{
      fontSize: '14px',
      color: MUTED
    }}>Loading coverage…</div>
      </div>;
  }
  if (status === 'error') {
    return <div className="not-prose my-8 rounded-2xl border p-6 space-y-3" style={{
      borderColor: BORDER
    }}>
        <p style={{
      color: '#DC2626',
      fontSize: '14px'
    }}>{error}</p>
        <button type="button" onClick={load} style={{
      border: `1px solid ${BORDER}`,
      borderRadius: '999px',
      padding: '6px 14px',
      fontSize: '12px',
      color: MUTED,
      background: 'transparent',
      cursor: 'pointer'
    }}>
          Retry
        </button>
      </div>;
  }
  return <div className="not-prose my-8">
      <div style={{
    display: 'flex',
    flexDirection: 'column',
    gap: '10px',
    marginBottom: '22px'
  }}>
        {LEGEND.map(r => <div key={r.label} style={{
    border: `1px solid ${BORDER}`,
    borderLeft: `3px solid ${r.color}`,
    borderRadius: '12px',
    background: CARD_BG,
    padding: '14px 16px',
    display: 'flex',
    flexDirection: 'column',
    gap: '12px'
  }}>
            <div style={{
    display: 'flex',
    alignItems: 'center',
    gap: '14px',
    flexWrap: 'wrap'
  }}>
              <span style={{
    flex: 'none',
    fontSize: '10.5px',
    fontWeight: 700,
    textTransform: 'uppercase',
    letterSpacing: '0.04em',
    color: r.color,
    border: `1px solid ${r.color}`,
    borderRadius: '999px',
    padding: '3px 10px',
    whiteSpace: 'nowrap'
  }}>{r.label}</span>
              <span style={{
    flex: 1,
    minWidth: '200px',
    fontSize: '13px',
    color: MUTED,
    lineHeight: 1.55
  }}>{r.desc}</span>
            </div>
            {ruleDiagram(r.kind, r.color)}
            <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '6px'
  }}>
              {(methodsByRule[r.kind] || []).map(m => <code key={m} style={{
    fontSize: '11px',
    color: r.color,
    background: `${r.color}18`,
    border: `1px solid ${r.color}55`,
    borderRadius: '5px',
    padding: '1px 6px',
    fontFamily: 'monospace',
    whiteSpace: 'nowrap'
  }}>{m}</code>)}
            </div>
          </div>)}
      </div>
      <div style={{
    display: 'flex',
    flexDirection: 'column',
    gap: '10px'
  }}>
        {methods.map(g => {
    const isOpen = expanded.has(g.method);
    return <div key={g.method} style={{
      border: `1px solid ${BORDER}`,
      borderLeft: `3px solid ${g.color}`,
      borderRadius: '12px',
      background: CARD_BG,
      overflow: 'hidden'
    }}>
              <button type="button" onClick={() => toggle(g.method)} aria-expanded={isOpen} style={{
      width: '100%',
      textAlign: 'left',
      background: 'transparent',
      border: 'none',
      cursor: 'pointer',
      color: 'inherit',
      padding: '16px 18px',
      display: 'flex',
      flexDirection: 'column',
      gap: '9px'
    }}>
                <div style={{
      display: 'flex',
      alignItems: 'center',
      gap: '10px'
    }}>
                  <code style={{
      fontSize: '14.5px',
      fontWeight: 700
    }}>{g.method}</code>
                  <span style={{
      fontSize: '10.5px',
      fontWeight: 700,
      textTransform: 'uppercase',
      letterSpacing: '0.04em',
      color: g.color,
      border: `1px solid ${g.color}`,
      borderRadius: '999px',
      padding: '3px 10px',
      whiteSpace: 'nowrap'
    }}>
                    {RULE[g.policyType] || 'consensus'}
                  </span>
                  <span style={{
      marginLeft: 'auto',
      display: 'inline-block',
      color: MUTED,
      fontSize: '19px',
      transform: isOpen ? 'rotate(90deg)' : 'none',
      transition: 'transform 0.15s ease'
    }}>›</span>
                </div>
                <div style={{
      fontSize: '13.5px',
      color: MUTED,
      lineHeight: 1.6
    }}>{g.check}</div>
              </button>

              {isOpen && <div>
                  {g.networks.map(n => <div key={n.chainId} title={`chain ${n.chainId}`} style={{
      display: 'flex',
      alignItems: 'center',
      gap: '10px',
      padding: '10px 16px',
      borderTop: `1px solid ${BORDER}`
    }}>
                      {avatar(n.alias)}
                      <span style={{
      flex: 'none',
      width: '150px',
      fontWeight: 600,
      fontSize: '13px',
      whiteSpace: 'nowrap',
      overflow: 'hidden',
      textOverflow: 'ellipsis'
    }} title={n.alias}>{n.alias}</span>
                      <span style={{
      flex: 1,
      minWidth: 0,
      color: MUTED,
      fontSize: '12.5px',
      lineHeight: 1.5,
      textAlign: 'right'
    }}>{ruleSentence(g.policyType, g.method, n)}</span>
                    </div>)}
                </div>}
            </div>;
  })}
      </div>
    </div>;
};

Built for workloads that can't tolerate a wrong answer: DeFi, AI agents, accounting. A stale, buggy, or manipulated upstream is outvoted rather than served, and a genuine disagreement is returned as an error instead of a guess.

The Fanout tier is available on request. [Contact us](https://cal.com/team/goldsky/website-intro) or email [sales@goldsky.com](mailto:sales@goldsky.com) and we'll get you set up.

## Checks & coverage

The methods below are fanned out to multiple independent upstreams (the standard tier tries one at a time). How the answer is settled depends on the method; expand any one to see it per network.

<FanoutCoverage />

## Under the hood

The tier layers two independent protections: **cross-source consensus** and per-response **data-integrity checks**.

<FanoutFlow />

For reads with one canonical answer (state, blocks, logs, receipts), consensus sends the request to several independent upstreams in parallel via eRPC's [consensus failsafe](https://docs.erpc.cloud/config/failsafe/consensus) and only returns a value once a quorum agrees. Fields that legitimately differ between client implementations (block timestamps, L1 metadata) are ignored, so only meaningful disagreements count. When sources genuinely disagree it returns an error rather than guessing, routing around any upstream that returned wrong data. The quorum isn't hand-tuned: it's sized per network from how many independent upstreams it actually has.

Not everything has a single right answer to vote on. Gas price and priority-fee estimates are computed locally by each node, and `eth_sendRawTransaction` is a write, not a read. So the tier still **fans these out to multiple upstreams**, but applies the rule that fits: it keeps the **highest** value for `eth_gasPrice` / `eth_maxPriorityFeePerGas` / `eth_getTransactionCount` (so a stale, too-low estimate can't stick you), and **broadcasts** `eth_sendRawTransaction` to every upstream in parallel for the widest, fastest propagation.

Independently of agreement, every response runs through eRPC's data-integrity checks:

| Check                           | What it verifies                                                                                                                                                      |
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Structure, shape & encoding** | The response is well-formed and complete: correct structure, field shapes, and hex/RLP encoding.                                                                      |
| **Block tags & ranges**         | `latest` resolves to the highest block the network has (not a lagging node's view), tagged blocks are never null, and `eth_getLogs` stays within its requested range. |
| **Receipt integrity**           | Receipts carry the correct logs bloom, item counts, and index contiguity.                                                                                             |
| **Commitment recompute**        | State and receipt roots and block hashes are recomputed from the response and must match.                                                                             |
| **Per-item authenticity**       | Every transaction, receipt, and log is verified individually against its commitment.                                                                                  |
| **Cross-block continuity**      | Blocks chain correctly: parent hashes and numbers line up across the requested range.                                                                                 |
| **Authoritative fetch**         | Anything that can't be confirmed from data already on hand is force-fetched from an authoritative upstream and compared.                                              |

Can't find what you're looking for? Reach out to us at [support@goldsky.com](mailto:support@goldsky.com) for help.


## Related topics

- [S2](/turbo-pipelines/sinks/s2.md)
