@mutopad/connex-framework
Version:
A library implements VeChain Connex interface
200 lines • 14.8 kB
JavaScript
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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