@hyperlane-xyz/sdk
Version:
The official SDK for the Hyperlane Network
56 lines • 2.62 kB
JavaScript
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