@hyperlane-xyz/sdk
Version:
The official SDK for the Hyperlane Network
67 lines • 2.48 kB
JavaScript
import { assertIsContractAddress, isContractAddress, } from '../../contracts/contracts.js';
// calling getCode until the creation block is found
export async function getContractCreationBlockFromRpc(chain, contractAddress, multiProvider) {
await assertIsContractAddress(multiProvider, chain, contractAddress);
const provider = multiProvider.getProvider(chain);
const latestBlock = await provider.getBlockNumber();
let low = 0;
let high = latestBlock;
let creationBlock = latestBlock;
while (low <= high) {
const mid = Math.floor((low + high) / 2);
const isContract = await isContractAddress(multiProvider, chain, contractAddress, mid);
if (isContract) {
creationBlock = mid;
high = mid - 1;
}
else {
low = mid + 1;
}
}
return creationBlock;
}
export async function getLogsFromRpc({ chain, contractAddress, multiProvider, fromBlock, topic, toBlock, range = 500, }) {
const provider = multiProvider.getProvider(chain);
let currentStartBlock = fromBlock;
const endBlock = toBlock ?? (await provider.getBlockNumber());
const logs = [];
while (currentStartBlock <= endBlock) {
const currentEndBlock = currentStartBlock + range < endBlock
? currentStartBlock + range
: endBlock;
const currentLogs = await provider.getLogs({
address: contractAddress,
fromBlock: currentStartBlock,
toBlock: currentEndBlock,
topics: [topic],
});
logs.push(...currentLogs);
// +1 because getLogs range is inclusive
currentStartBlock += range + 1;
}
return logs.map((rawLog) => {
return {
address: rawLog.address,
blockNumber: rawLog.blockNumber,
data: rawLog.data,
logIndex: rawLog.logIndex,
topics: rawLog.topics,
transactionHash: rawLog.transactionHash,
transactionIndex: rawLog.transactionIndex,
};
});
}
export function viemLogFromGetEventLogsResponse(log) {
return {
address: log.address,
data: log.data,
blockNumber: BigInt(log.blockNumber),
transactionHash: log.transactionHash,
logIndex: Number(log.logIndex),
transactionIndex: Number(log.transactionIndex),
topics: log.topics,
blockHash: null,
removed: false,
};
}
//# sourceMappingURL=utils.js.map