simonzgconnexframework
Version:
A library implements VeChain Connex interface
217 lines • 16 kB
JavaScript
;
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(`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) {
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,
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,
txsFeatures: V.optional(R.uint32)
};
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,
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: {
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,
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: () => ''
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLWd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZyYW1ld29yay9kcml2ZXItZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBaUM7QUFDakMsNkJBQTRCO0FBRTVCLFNBQWdCLGNBQWMsQ0FDMUIsTUFBcUIsRUFDckIsVUFBaUM7SUFHakMsTUFBTSxJQUFJLEdBQUcsQ0FBSSxHQUFNLEVBQUUsTUFBbUIsRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUMxRCxJQUFJO1lBQ0EsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ2hDO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLFVBQVUsRUFBRTtnQkFDWixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDbEI7aUJBQU07Z0JBQ0gsc0NBQXNDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTthQUNwRTtTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDZCxDQUFDLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDNUQsT0FBTztRQUNILE9BQU87UUFDUCxJQUFJLElBQUk7WUFDSixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNoRCxDQUFDO1FBQ0QsUUFBUTtZQUNKLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRTtpQkFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUNwRCxDQUFDO1FBQ0QsUUFBUSxDQUFDLFFBQVE7WUFDYixPQUFPLE1BQU0s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