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