UNPKG

@mutopad/connex-framework

Version:
204 lines 14.9 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(`Connex-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); }, getTransaction(id, allowPending) { return driver.getTransaction(id, allowPending) .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, 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, options) { return driver.signTx(msg, options) .then(r => test(r, { txid: R.bytes32, signer: R.address }, 'signTx()')); }, signCert(msg, options) { return driver.signCert(msg, options) .then(r => test(r, { annex: { domain: R.string, timestamp: R.uint64, signer: R.address }, signature: v => R.isHexBytes(v, 65) ? '' : 'expected 65 bytes' }, 'signCert()')); } }; } exports.newDriverGuard = newDriverGuard; const headScheme = { id: R.bytes32, number: R.uint32, timestamp: R.uint64, parentID: R.bytes32, txsFeatures: V.optional(R.uint32), gasLimit: 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, txsFeatures: V.optional(R.uint32), stateRoot: R.bytes32, receiptsRoot: R.bytes32, signer: R.address, com: V.optional(R.bool), isFinalized: V.optional(R.bool), isTrunk: R.bool, transactions: [R.bytes32] }; const txScheme = { id: R.bytes32, chainTag: R.uint8, blockRef: R.bytes8, expiration: R.uint32, gasPriceCoef: R.uint8, gas: R.uint64, origin: R.address, delegator: V.nullable(V.optional(R.address)), nonce: R.hexString, dependsOn: V.nullable(R.bytes32), size: R.uint32, clauses: [{ to: V.nullable(R.address), value: R.hexString, data: R.bytes }], meta: V.nullable({ 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, clauseIndex: R.uint32 }; const eventScheme = { address: R.address, topics: [R.bytes32], data: R.bytes, }; const eventWithMetaScheme = Object.assign(Object.assign({}, eventScheme), { meta: logMetaScheme }); const transferScheme = { sender: R.address, recipient: R.address, amount: R.hexString, }; 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, revertReason: () => '', events: [{ address: R.address, topics: [R.bytes32], data: R.bytes, }], transfers: [{ sender: R.address, recipient: R.address, amount: R.hexString, }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLWd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXZlci1ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrQ0FBaUM7QUFDakMsNkJBQTRCO0FBRTVCLFNBQWdCLGNBQWMsQ0FDMUIsTUFBcUIsRUFDckIsVUFBaUM7SUFHakMsTUFBTSxJQUFJLEdBQUcsQ0FBSSxHQUFNLEVBQUUsTUFBbUIsRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUMxRCxJQUFJO1lBQ0EsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ2hDO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLFVBQVUsRUFBRTtnQkFDWixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDbEI7aUJBQU07Z0JBQ0gsc0NBQXNDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTthQUNwRTtTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDZCxDQUFDLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDNUQsT0FBTztRQUNILE9BQU87UUFDUCxJQUFJLElBQUk7WUFDSixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNoRCxDQUFDO1FBQ0QsUUFBUTtZQUNKLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRTtpQkFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUNwRCxDQUFDO1FBQ0QsUUFBUSxDQUFDLFFBQVE7WUFDYixPQUFPLE1BQU0sQ0FBQyxRQUFRLENB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