UNPKG

@meterio/flex-framework

Version:

A library implements Meter Flex interface

383 lines 26.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.newDriverGuard = void 0; const V = require("validator-ts"); const R = require("./rules"); function newDriverGuard(driver, errHandler) { const test = (obj, scheme, path) => { try { V.validate(obj, scheme, path); } catch (err) { if (errHandler) { errHandler(err); } else { // tslint:disable-next-line:no-console console.warn(`Flex-Driver[MALFORMED RESPONSE]: ${err.message}`); } } return obj; }; const genesis = test(driver.genesis, blockScheme, 'genesis'); return { genesis, get head() { return test(driver.head, headScheme, 'head'); }, pollHead() { return driver.pollHead().then((h) => test(h, headScheme, 'getHead()')); }, getBlock(revision) { return driver .getBlock(revision) .then((b) => (b ? test(b, blockScheme, 'getBlock()') : b)); }, getCandidate(addr) { return driver .getCandidate(addr) .then((c) => (c ? test(c, candidateScheme, 'getCandidate()') : c)); }, getBucket(id) { return driver .getBucket(id) .then((b) => (b ? test(b, bucketScheme, 'getBucket()') : b)); }, getJaileds() { return driver .getJaileds() .then((js) => js ? js.map((j) => test(j, jailedScheme, 'getJaileds()')) : js); }, getCandidates() { return driver .getCandidates() .then((cs) => cs ? cs.map((c) => test(c, candidateScheme, 'getCandidates()')) : cs); }, getBuckets() { return driver .getBuckets() .then((bs) => bs ? bs.map((b) => test(b, bucketScheme, 'getBuckets()')) : bs); }, getStakeholders() { return driver .getStakeholders() .then((ss) => ss ? ss.map((s) => test(s, stakeholderScheme, 'getStakeholders()')) : ss); }, getAuction() { return driver .getAuction() .then((a) => (a ? test(a, auctionScheme, 'getAuction()') : a)); }, getAuctionSummaries() { return driver .getAuctionSummaries() .then((summaries) => summaries ? summaries.map((s) => test(s, auctionSummaryScheme, 'getAuctionSummaries()')) : summaries); }, getTransaction(id) { return driver .getTransaction(id) .then((tx) => (tx ? test(tx, txScheme, 'getTransaction()') : tx)); }, getReceipt(id) { return driver .getReceipt(id) .then((r) => (r ? test(r, receiptScheme, 'getReceipt()') : r)); }, getAccount(addr, revision) { return driver.getAccount(addr, revision).then((a) => test(a, { balance: R.hexString, energy: R.hexString, boundbalance: R.hexString, boundenergy: R.hexString, hasCode: R.bool, }, 'getAccount()')); }, getCode(addr, revision) { return driver.getCode(addr, revision).then((c) => test(c, { code: R.bytes, }, 'getCode()')); }, getStorage(addr, key, revision) { return driver.getStorage(addr, key, revision).then((s) => test(s, { value: R.bytes32, }, 'getStorage()')); }, explain(arg, revision) { return driver .explain(arg, revision) .then((r) => test(r, [vmOutputScheme], 'explain()')); }, filterEventLogs(arg) { return driver .filterEventLogs(arg) .then((r) => test(r, [eventWithMetaScheme], 'filterEventLogs()')); }, filterTransferLogs(arg) { return driver .filterTransferLogs(arg) .then((r) => test(r, [transferWithMetaScheme], 'filterTransferLogs()')); }, signTx(msg, option) { return driver .signTx(msg, Object.assign(Object.assign({}, option), { delegationHandler: option.delegationHandler ? (unsigned) => { test(unsigned, { raw: R.bytes, origin: R.address, }, 'delegationHandler.arg'); return option.delegationHandler(unsigned); } : undefined })) .then((r) => test(r, { txid: R.bytes32, signer: R.address, }, 'signTx()')); }, signCert(msg, option) { return driver.signCert(msg, option).then((r) => test(r, { annex: { domain: R.string, timestamp: R.uint64, signer: R.address, }, signature: (v) => (R.isHexBytes(v, 65) ? '' : 'expected 65 bytes'), }, 'signCert()')); }, isAddressOwned(addr) { return driver .isAddressOwned(addr) .then((r) => test(r, R.bool, 'isAddressOwned()')); }, }; } exports.newDriverGuard = newDriverGuard; const headScheme = { id: R.bytes32, number: R.uint32, timestamp: R.uint64, parentID: R.bytes32, epoch: R.uint64, }; const memberScheme = { index: R.uint32, pubKey: R.string, netAddr: R.string, }; const qcScheme = { qcHeight: R.uint64, qcRound: R.uint64, voterBitArrayStr: R.string, epochID: R.uint64, }; const powBlockScheme = { hash: R.string, prevBlock: R.string, height: R.uint32, beneficiary: R.string, }; const blockScheme = { id: R.bytes32, number: R.uint32, size: R.uint32, parentID: R.bytes32, timestamp: R.uint64, gasLimit: R.uint64, beneficiary: R.address, gasUsed: R.uint64, totalScore: R.uint64, txsRoot: R.bytes32, stateRoot: R.bytes32, receiptsRoot: R.bytes32, signer: R.address, isTrunk: R.bool, isKBlock: R.bool, transactions: [R.bytes32], lastKBlockHeight: R.uint32, committee: [memberScheme], qc: qcScheme, nonce: R.uint64, epoch: R.uint64, kblockData: [R.string], powBlocks: [powBlockScheme], }; const txScheme = { id: R.bytes32, chainTag: R.uint8, blockRef: R.bytes8, expiration: R.uint32, gasPriceCoef: R.uint8, gas: R.uint64, origin: R.address, nonce: R.hexString, dependsOn: V.nullable(R.bytes32), size: R.uint32, clauses: [ { to: V.nullable(R.address), value: R.hexString, token: R.uint32, data: R.bytes, }, ], meta: { blockID: R.bytes32, blockNumber: R.uint32, blockTimestamp: R.uint64, }, }; const logMetaScheme = { blockID: R.bytes32, blockNumber: R.uint32, blockTimestamp: R.uint64, txID: R.bytes32, txOrigin: R.address, }; const eventScheme = { address: R.address, topics: [R.bytes32], data: R.bytes, meta: () => '', decoded: () => '', }; const eventWithMetaScheme = Object.assign(Object.assign({}, eventScheme), { meta: logMetaScheme }); const transferScheme = { sender: R.address, recipient: R.address, amount: R.hexString, token: R.uint32, meta: () => '', }; const transferWithMetaScheme = Object.assign(Object.assign({}, transferScheme), { meta: logMetaScheme }); const receiptScheme = { gasUsed: R.uint64, gasPayer: R.address, paid: R.hexString, reward: R.hexString, reverted: R.bool, outputs: [ { contractAddress: V.nullable(R.address), events: [eventScheme], transfers: [transferScheme], }, ], meta: { blockID: R.bytes32, blockNumber: R.uint32, blockTimestamp: R.uint64, txID: R.bytes32, txOrigin: R.address, }, }; const vmOutputScheme = { data: R.bytes, vmError: R.string, gasUsed: R.uint64, reverted: R.bool, events: [ { address: R.address, topics: [R.bytes32], data: R.bytes, meta: () => '', decoded: () => '', }, ], transfers: [ { sender: R.address, recipient: R.address, amount: R.hexString, token: R.uint32, meta: () => '', }, ], decoded: () => '', }; const candidateScheme = { name: R.string, description: R.string, address: R.string, pubKey: R.string, ipAddr: R.string, port: R.uint32, totalVotes: R.string, commission: R.uint32, buckets: [R.string], }; const stakeholderScheme = { holder: R.string, totalStake: R.string, buckets: [R.string], }; const bucketScheme = { id: R.string, owner: R.string, value: R.string, token: R.uint32, nonce: R.uint64, autobid: R.uint8, createTime: R.string, unbounded: R.bool, candidate: R.string, option: R.uint32, rate: R.uint32, bonusVotes: R.uint64, totalVotes: R.string, matureTime: R.uint64, calcLastTime: R.uint64, }; const jailedScheme = { name: R.string, address: R.string, pubKey: R.string, totalPoints: R.uint32, bailAmount: R.uint64, jailedTime: R.uint64, }; const auctionTxScheme = { txid: R.string, address: R.string, amount: R.string, type: R.string, timestamp: R.uint64, nonce: R.uint64, }; const auctionScheme = { auctionID: R.string, startHeight: R.uint64, startEpoch: R.uint64, endHeight: R.uint64, endEpoch: R.uint64, releasedMTRG: R.string, reservedMTRG: R.string, reservedPrice: R.string, createTime: R.uint64, receivedMTR: R.string, auctionTxs: [auctionTxScheme], }; const distMTRGScheme = { addr: R.string, amount: R.string, }; const auctionSummaryScheme = { auctionID: R.string, startHeight: R.uint64, startEpoch: R.uint64, endHeight: R.uint64, endEpoch: R.uint64, sequence: R.uint64, releasedMTRG: R.string, reservedMTRG: R.string, reservedPrice: R.string, createTime: R.uint64, receivedMTR: R.string, actualPrice: R.string, auctionTxs: [auctionTxScheme], distMTRG: [distMTRGScheme], }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLWd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZyYW1ld29yay9kcml2ZXItZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQWtDO0FBQ2xDLDZCQUE2QjtBQUU3QixTQUFnQixjQUFjLENBQzVCLE1BQW1CLEVBQ25CLFVBQWlDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLENBQUksR0FBTSxFQUFFLE1BQW1CLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDNUQsSUFBSTtZQUNGLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMvQjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNMLHNDQUFzQztnQkFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDakU7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzdELE9BQU87UUFDTCxPQUFPO1FBQ1AsSUFBSSxJQUFJO1lBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELFFBQVE7WUFDTixPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELFFBQVEsQ0FBQyxRQUFRO1lBQ2YsT0FBTyxN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