@gear-js/api
Version:
A JavaScript library that provides functionality to connect GEAR Component APIs.
85 lines (81 loc) • 2.98 kB
JavaScript
;
var util = require('@polkadot/util');
var generate = require('../utils/generate.js');
var prefixes = require('../utils/prefixes.js');
var validate = require('../utils/validate.js');
require('@polkadot/api');
require('@polkadot/util-crypto');
require('@polkadot/types');
require('assert');
require('../default/index.js');
require('../metadata/programMetadata.js');
var program_errors = require('../errors/program.errors.js');
var Transaction = require('./Transaction.js');
var reply = require('../wasm/reply.js');
class GearCode extends Transaction.GearTransaction {
/**
* ### Submit code without initialization
* @param code
* @returns Code hash
*/
async upload(code) {
const codeHash = generate.generateCodeHash(code);
await validate.validateCodeId(codeHash, this._api);
const codeBytes = this._api.createType('Bytes', Array.from(code));
this.extrinsic = this._api.tx.gear.uploadCode(codeBytes);
return { codeHash, submitted: this.extrinsic, extrinsic: this.extrinsic };
}
/**
* ### Check that codeId exists on chain
* @param codeId
*/
async exists(codeId) {
const codeMetadata = await this._api.query.gearProgram.codeMetadataStorage(codeId);
return codeMetadata.isSome;
}
/**
* ### Get code storage
* @param codeId
*/
async storage(codeId) {
return this._api.query.gearProgram.codeMetadataStorage(codeId);
}
/**
* ### Get static pages of code
* @param codeId
*/
async staticPages(codeId) {
const storage = await this.storage(codeId);
return storage.isSome ? storage.unwrap().staticPages.toNumber() : null;
}
/**
* ### Get all ids of codes uploaded on connected chain
* @returns array of code ids uploaded on chain
*/
async all(count) {
const prefix = this._api.query.gearProgram.codeMetadataStorage.keyPrefix();
const keys = await this._api.rpc.state.getKeysPaged(prefix, count || 1000);
if (count === undefined) {
let nextKeysBatch = 1000;
while (nextKeysBatch === 1000) {
const _endKeys = await this._api.rpc.state.getKeysPaged(prefix, nextKeysBatch, keys[keys.length - 1]);
keys.push(..._endKeys);
nextKeysBatch = _endKeys.length;
}
}
return prefixes.getIdsFromKeys(keys, prefix);
}
async metaHash(codeId) {
const code = (await this._api.query.gearProgram.originalCodeStorage(codeId));
if (code.isNone) {
throw new program_errors.CodeDoesNotExistError(codeId);
}
const metahash = await reply.getGrReply(code.unwrap().toHex(), 'metahash');
return util.u8aToHex(metahash);
}
async metaHashFromWasm(wasm) {
const metahash = await reply.getGrReply(wasm, 'metahash');
return util.u8aToHex(metahash);
}
}
exports.GearCode = GearCode;