@hyperlane-xyz/sdk
Version:
The official SDK for the Hyperlane Network
81 lines • 3.5 kB
JavaScript
import { Mailbox__factory } from '@hyperlane-xyz/core';
import { rootLogger } from '@hyperlane-xyz/utils';
import { ProviderType, } from './ProviderType.js';
import { protocolToDefaultProviderBuilder } from './providerBuilders.js';
export async function isRpcHealthy(metadata, rpcIndex) {
const rpc = metadata.rpcUrls[rpcIndex];
const builder = protocolToDefaultProviderBuilder[metadata.protocol];
const provider = builder([rpc], metadata.chainId);
if (provider.type === ProviderType.EthersV5)
return isEthersV5ProviderHealthy(provider.provider, metadata);
else if (provider.type === ProviderType.SolanaWeb3)
return isSolanaWeb3ProviderHealthy(provider.provider, metadata);
else if (provider.type === ProviderType.CosmJsWasm ||
provider.type === ProviderType.CosmJs ||
provider.type === ProviderType.CosmJsNative)
return isCosmJsProviderHealthy(provider.provider, metadata);
else if (provider.type === ProviderType.Starknet)
return isStarknetJsProviderHealthy(provider.provider, metadata);
else if (provider.type === ProviderType.Radix)
return isRadixProviderHealthy(provider.provider, metadata);
else
throw new Error(`Unsupported provider type ${provider.type}, new health check required`);
}
export async function isEthersV5ProviderHealthy(provider, metadata, mailboxAddress) {
const chainName = metadata.name;
const blockNumber = await provider.getBlockNumber();
if (!blockNumber || blockNumber < 0)
return false;
rootLogger.debug(`Block number is okay for ${chainName}`);
if (mailboxAddress) {
const mailbox = Mailbox__factory.createInterface();
const topics = mailbox.encodeFilterTopics(mailbox.events['DispatchId(bytes32)'], []);
rootLogger.debug(`Checking mailbox logs for ${chainName}`);
const mailboxLogs = await provider.getLogs({
address: mailboxAddress,
topics,
fromBlock: blockNumber - 99,
toBlock: blockNumber,
});
if (!mailboxLogs)
return false;
rootLogger.debug(`Mailbox logs okay for ${chainName}`);
}
return true;
}
export async function isSolanaWeb3ProviderHealthy(provider, metadata) {
const blockNumber = await provider.getBlockHeight();
if (!blockNumber || blockNumber < 0)
return false;
rootLogger.debug(`Block number is okay for ${metadata.name}`);
return true;
}
export async function isCosmJsProviderHealthy(provider, metadata) {
const readyProvider = await provider;
const blockNumber = await readyProvider.getHeight();
if (!blockNumber || blockNumber < 0)
return false;
rootLogger.debug(`Block number is okay for ${metadata.name}`);
return true;
}
export async function isStarknetJsProviderHealthy(provider, metadata) {
const blockNumber = await provider.getBlockNumber();
if (!blockNumber || blockNumber < 0)
return false;
rootLogger.debug(`Block number is okay for ${metadata.name}`);
return true;
}
export async function isRadixProviderHealthy(provider, metadata) {
try {
const healthy = await provider.isHealthy();
if (healthy) {
rootLogger.debug(`Gateway is healthy for ${metadata.name}`);
}
return healthy;
}
catch (err) {
rootLogger.warn(`Radix gateway health check threw for ${metadata.name}`, err);
return false;
}
}
//# sourceMappingURL=rpcHealthTest.js.map