UNPKG

@mutopad/connex-framework

Version:
200 lines 14.8 kB
import * as V from 'validator-ts'; import * as R from './rules'; export 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()')); } }; } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLWd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXZlci1ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssQ0FBQyxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFNBQVMsQ0FBQTtBQUU1QixNQUFNLFVBQVUsY0FBYyxDQUMxQixNQUFxQixFQUNyQixVQUFpQztJQUdqQyxNQUFNLElBQUksR0FBRyxDQUFJLEdBQU0sRUFBRSxNQUFtQixFQUFFLElBQVksRUFBRSxFQUFFO1FBQzFELElBQUk7WUFDQSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7U0FDaEM7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNWLElBQUksVUFBVSxFQUFFO2dCQUNaLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUNsQjtpQkFBTTtnQkFDSCxzQ0FBc0M7Z0JBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO2FBQ3BFO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNkLENBQUMsQ0FBQTtJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUM1RCxPQUFPO1FBQ0gsT0FBTztRQUNQLElBQUksSUFBSTtZQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFDRCxRQUFRO1lBQ0osT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFO2lCQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3BELENBQUM7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