@enjin-io/snap
Version:
MetaMask snap for interacting with Enjin dApps
54 lines (50 loc) • 1.68 kB
text/typescript
import type { ApiPromise } from '@polkadot/api';
import type { BlockId, BlockInfo } from '@enjin-io/metamask-enjin-types';
import type { BlockHash } from '@polkadot/types/interfaces';
async function _getBlock(blockHash: BlockHash | string, api: ApiPromise): Promise<BlockInfo> {
const signedBlock = await api.rpc.chain.getBlock(blockHash);
return {
hash: signedBlock.block.hash.toHex(),
number: signedBlock.block.header.number.toString()
};
}
async function _getBlockById(blockId: number, api: ApiPromise): Promise<BlockInfo | null> {
const blockHash = await api.rpc.chain.getBlockHash(blockId);
if (!blockHash.isEmpty) {
return await _getBlock(blockHash, api);
}
return null;
}
/**
* Returns block based on blockTag passed as param.
*
* Supported tags are:
* block id (as string or number)
* block hash (as hex string starting with "0x")
* "latest" (returning latest block)
*
* @param blockTag
* @param api
*/
export async function getBlock(blockTag: BlockId, api: ApiPromise): Promise<BlockInfo | null> {
switch (typeof blockTag) {
case 'number':
// get block by id sent as number
return await _getBlockById(blockTag, api);
case 'string':
if (blockTag === 'latest') {
// get latest block
const { hash } = await api.rpc.chain.getHeader();
return await _getBlock(hash, api);
}
if (blockTag.startsWith('0x')) {
// get block by hash
return await _getBlock(blockTag, api);
}
// get block by id sent as string
if (parseInt(blockTag)) {
return await _getBlockById(parseInt(blockTag), api);
}
}
return null;
}