UNPKG

@gear-js/api

Version:

A JavaScript library that provides functionality to connect GEAR Component APIs.

70 lines (67 loc) 2.49 kB
import { u8aToNumber } from '@polkadot/util'; import { ProgramDoesNotExistError, ProgramTerminatedError, ProgramExitedError, PausedProgramDoesNotExistError } from '../errors/program.errors.js'; class GearProgramStorage { _api; constructor(_api) { this._api = _api; } /** * ### Get program from chain * @param id Program id * @param at _(optional)_ Hash of block to query at * @returns */ async getProgram(id, at) { const api = at ? await this._api.at(at) : this._api; const programOption = (await api.query.gearProgram.programStorage(id)); if (programOption.isNone) { throw new ProgramDoesNotExistError(id); } const program = programOption.unwrap(); if (program.isTerminated) throw new ProgramTerminatedError(program.asTerminated.toHex()); if (program.isExited) throw new ProgramExitedError(program.asExited.toHex()); return program.asActive; } /** * Get list of pages for program * @param programId * @param gProg * @returns */ async getProgramPages(programId, program, at) { const pages = {}; const blockAt = at || (await this._api.rpc.chain.getHeader()).hash.toHex(); const apiAt = await this._api.at(blockAt); const keys = await apiAt.query.gearProgram.memoryPages.keys(programId, program.memoryInfix); const pageNumbers = keys.map((k) => { const u8aAddr = k.toU8a(); const page = u8aAddr.slice(u8aAddr.length - 4); return u8aToNumber(page, { isLe: true }); }); for (let i = 0; i < pageNumbers.length; i++) { const page = pageNumbers[i]; pages[page] = (await this._api.rpc.state.getStorage(keys[i].toHex(), blockAt)).toU8a(); } return pages; } /** * ### Get block number and hash of paused program * @param id paused program id * @param at _(optional)_ Hash of block to query at * @returns */ async getPausedProgramHashAndBlockNumber(id, at) { const storageOption = (await this._api.query.gearProgram.pausedProgramStorage(id, at)); if (storageOption.isNone) { throw new PausedProgramDoesNotExistError(id); } const storage = storageOption.unwrap(); return { blockNumber: storage[0], hash: storage[1], }; } } export { GearProgramStorage };