zonder
Version:
Ergonomic multi-chain indexing framework with dual runtime support for Ponder and Envio.
48 lines (47 loc) • 1.69 kB
JavaScript
export function resolveStartBlock(startBlocks, chainName, contractName) {
// If no startBlocks config at all, default to 0
if (!startBlocks) {
return 0;
}
const chainStartBlocks = startBlocks[chainName];
// If no config for this chain, default to 0
if (!chainStartBlocks) {
return 0;
}
// Per-contract start blocks with default fallback (default to 0 if not specified)
return chainStartBlocks[contractName] ?? chainStartBlocks.default ?? 0;
}
/**
* Resolves the chain-level start blocks, returning a safe object with defaults
*/
export function resolveChainStartBlocks(startBlocks, chainName) {
if (!startBlocks || !startBlocks[chainName]) {
return { default: 0 };
}
const chainStartBlocks = startBlocks[chainName];
return {
...chainStartBlocks,
default: chainStartBlocks.default ?? 0,
};
}
/**
* Gets the minimum start block for a chain across all contracts
*/
export function resolveMinStartBlock(startBlocks, chainName, addresses) {
if (!startBlocks || !startBlocks[chainName] || !addresses) {
return 0;
}
const chainStartBlocks = startBlocks[chainName];
const defaultStartBlock = chainStartBlocks.default ?? 0;
let minStartBlock = defaultStartBlock;
// Check all contracts that have addresses on this chain
for (const [contractName, address] of Object.entries(addresses)) {
if (address) {
const contractStartBlock = chainStartBlocks[contractName] ?? defaultStartBlock;
if (contractStartBlock < minStartBlock) {
minStartBlock = contractStartBlock;
}
}
}
return minStartBlock;
}