UNPKG

simonflex-framework

Version:

A library implements Meter Flex interface

327 lines 22.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 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)); }, getCandidates() { return driver .getCandidates() .then((cs) => cs ? cs.map((c) => test(c, candidateScheme, 'getCandidate()')) : 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({}, 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, }; 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 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, transactions: [R.bytes32], lastKBlockHeight: R.uint32, committee: [memberScheme], qc: qcScheme, nonce: R.uint64, }; 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({}, eventScheme, { meta: logMetaScheme }); const transferScheme = { sender: R.address, recipient: R.address, amount: R.hexString, meta: () => '', }; const transferWithMetaScheme = 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, meta: () => '', }, ], decoded: () => '', }; const candidateScheme = { name: R.string, addr: R.string, pubKey: R.string, ipAddr: R.string, port: R.uint32, totalVotes: R.string, 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, createTime: R.string, unbounded: R.bool, candidate: R.string, option: R.uint32, rate: R.uint32, bonusVotes: R.string, totalVotes: R.string, }; const auctionTxScheme = { addr: R.string, amount: R.string, count: R.uint64, nonce: R.uint64, lastTime: R.uint64, }; const auctionScheme = { auctionID: R.string, startHeight: R.uint64, endHeight: R.uint64, releasedMTRG: R.string, reservedPrice: R.string, createTime: R.uint64, receivedMTR: R.string, auctionTxs: [auctionTxScheme], }; const auctionSummaryScheme = { auctionID: R.string, startHeight: R.uint64, endHeight: R.uint64, releasedMTRG: R.string, reservedPrice: R.string, createTime: R.uint64, receivedMTR: R.string, actualPrice: R.string, leftoverMTRG: R.string, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLWd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZyYW1ld29yay9kcml2ZXItZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBa0M7QUFDbEMsNkJBQTZCO0FBRTdCLFNBQWdCLGNBQWMsQ0FDNUIsTUFBbUIsRUFDbkIsVUFBaUM7SUFFakMsTUFBTSxJQUFJLEdBQUcsQ0FBSSxHQUFNLEVBQUUsTUFBbUIsRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUM1RCxJQUFJO1lBQ0YsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQy9CO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLFVBQVUsRUFBRTtnQkFDZCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakI7aUJBQU07Z0JBQ0wsc0NBQXNDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNqRTtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0QsT0FBTztRQUNMLE9BQU87UUFDUCxJQUFJLElBQUk7WUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsUUFBUTtZQUNOLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsUUFBUSxDQUFDLFFBQVE7WUFDZixPQUFPLE1B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