UNPKG

@hyperlane-xyz/sdk

Version:

The official SDK for the Hyperlane Network

56 lines 2.62 kB
import { assert, isNullish } from '@hyperlane-xyz/utils'; import { tryNormalizeNumericChainId } from './chainIdUtils.js'; // Builds a lightweight lookup helper for one metadata snapshot without // constructing a provider-backed registry. Numeric lookups follow SDK // domain-id semantics; string lookups also support chain-id strings. // Duplicate chainIds are valid across protocols/aliases, so ambiguous // chain-id aliases are left unresolved instead of throwing. export function createChainMetadataResolver(metadata) { const byDomainId = new Map(); const byChainId = new Map(); const ambiguousChainIds = new Set(); const assertUniqueDomainId = (existing, chainMetadata, domainId) => { assert(!existing || existing.name === chainMetadata.name, `Duplicate domainId detected: ${String(domainId)}`); }; const indexChainIdAlias = (key, chainMetadata) => { if (ambiguousChainIds.has(key)) return; const existing = byChainId.get(key); if (!existing) { byChainId.set(key, chainMetadata); return; } if (existing.name === chainMetadata.name) return; byChainId.delete(key); ambiguousChainIds.add(key); }; Object.values(metadata).forEach((chainMetadata) => { assertUniqueDomainId(byDomainId.get(chainMetadata.domainId), chainMetadata, chainMetadata.domainId); byDomainId.set(chainMetadata.domainId, chainMetadata); if (!isNullish(chainMetadata.chainId)) { indexChainIdAlias(chainMetadata.chainId, chainMetadata); const numericChainId = tryNormalizeNumericChainId(chainMetadata.chainId); if (numericChainId !== null) { indexChainIdAlias(numericChainId, chainMetadata); indexChainIdAlias(String(numericChainId), chainMetadata); } } }); const tryGetChainMetadata = (chain) => { if (typeof chain === 'string') { return metadata[chain] || byChainId.get(chain) || null; } return byDomainId.get(chain) || byChainId.get(chain) || null; }; return { metadata, getKnownChainNames: () => Object.keys(metadata), tryGetChainId: (chain) => tryGetChainMetadata(chain)?.chainId ?? null, tryGetChainMetadata, tryGetChainName: (chain) => tryGetChainMetadata(chain)?.name ?? null, tryGetDomainId: (chain) => tryGetChainMetadata(chain)?.domainId ?? null, tryGetProtocol: (chain) => tryGetChainMetadata(chain)?.protocol ?? null, }; } //# sourceMappingURL=ChainMetadataResolver.js.map