simonflex-framework
Version:
A library implements Meter Flex interface
327 lines • 22.8 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(`Flex-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));
},
getCandidates() {
return driver
.getCandidates()
.then((cs) => cs ? cs.map((c) => test(c, candidateScheme, 'getCandidate()')) : cs);
},
getBuckets() {
return driver
.getBuckets()
.then((bs) => bs ? bs.map((b) => test(b, bucketScheme, 'getBuckets()')) : bs);
},
getStakeholders() {
return driver
.getStakeholders()
.then((ss) => ss
? ss.map((s) => test(s, stakeholderScheme, 'getStakeholders()'))
: ss);
},
getAuction() {
return driver
.getAuction()
.then((a) => (a ? test(a, auctionScheme, 'getAuction()') : a));
},
getAuctionSummaries() {
return driver
.getAuctionSummaries()
.then((summaries) => summaries
? summaries.map((s) => test(s, auctionSummaryScheme, 'getAuctionSummaries()'))
: summaries);
},
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,
boundbalance: R.hexString,
boundenergy: 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,
};
const memberScheme = {
index: R.uint32,
pubKey: R.string,
netAddr: R.string,
};
const qcScheme = {
qcHeight: R.uint64,
qcRound: R.uint64,
voterBitArrayStr: R.string,
epochID: 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,
stateRoot: R.bytes32,
receiptsRoot: R.bytes32,
signer: R.address,
isTrunk: R.bool,
transactions: [R.bytes32],
lastKBlockHeight: R.uint32,
committee: [memberScheme],
qc: qcScheme,
nonce: R.uint64,
};
const txScheme = {
id: R.bytes32,
chainTag: R.uint8,
blockRef: R.bytes8,
expiration: R.uint32,
gasPriceCoef: R.uint8,
gas: R.uint64,
origin: R.address,
nonce: R.hexString,
dependsOn: V.nullable(R.bytes32),
size: R.uint32,
clauses: [
{
to: V.nullable(R.address),
value: R.hexString,
token: R.uint32,
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,
};
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: () => '',
};
const candidateScheme = {
name: R.string,
addr: R.string,
pubKey: R.string,
ipAddr: R.string,
port: R.uint32,
totalVotes: R.string,
buckets: [R.string],
};
const stakeholderScheme = {
holder: R.string,
totalStake: R.string,
buckets: [R.string],
};
const bucketScheme = {
id: R.string,
owner: R.string,
value: R.string,
token: R.uint32,
createTime: R.string,
unbounded: R.bool,
candidate: R.string,
option: R.uint32,
rate: R.uint32,
bonusVotes: R.string,
totalVotes: R.string,
};
const auctionTxScheme = {
addr: R.string,
amount: R.string,
count: R.uint64,
nonce: R.uint64,
lastTime: R.uint64,
};
const auctionScheme = {
auctionID: R.string,
startHeight: R.uint64,
endHeight: R.uint64,
releasedMTRG: R.string,
reservedPrice: R.string,
createTime: R.uint64,
receivedMTR: R.string,
auctionTxs: [auctionTxScheme],
};
const auctionSummaryScheme = {
auctionID: R.string,
startHeight: R.uint64,
endHeight: R.uint64,
releasedMTRG: R.string,
reservedPrice: R.string,
createTime: R.uint64,
receivedMTR: R.string,
actualPrice: R.string,
leftoverMTRG: R.string,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLWd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZyYW1ld29yay9kcml2ZXItZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBa0M7QUFDbEMsNkJBQTZCO0FBRTdCLFNBQWdCLGNBQWMsQ0FDNUIsTUFBbUIsRUFDbkIsVUFBaUM7SUFFakMsTUFBTSxJQUFJLEdBQUcsQ0FBSSxHQUFNLEVBQUUsTUFBbUIsRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUM1RCxJQUFJO1lBQ0YsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQy9CO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLFVBQVUsRUFBRTtnQkFDZCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakI7aUJBQU07Z0JBQ0wsc0NBQXNDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNqRTtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0QsT0FBTztRQUNMLE9BQU87UUFDUCxJQUFJLElBQUk7WUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsUUFBUTtZQUNOLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsUUFBUSxDQUFDLFFBQVE7WUFDZixPQUFPLE1B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
;