@vechain/connex.driver-nodejs
Version:
Connex framework driver implementation in NodeJS
156 lines • 13 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const driver_no_vendor_1 = require("./driver-no-vendor");
const transaction_1 = require("thor-devkit/dist/transaction");
const certificate_1 = require("thor-devkit/dist/certificate");
const blake2b_1 = require("thor-devkit/dist/cry/blake2b");
const crypto_1 = require("crypto");
const options_1 = require("./options");
/** class fully implements Connex.Driver */
class Driver extends driver_no_vendor_1.DriverNoVendor {
constructor(net, genesis, initialHead, wallet) {
super(net, genesis, initialHead);
this.wallet = wallet;
/** params for tx construction */
this.txParams = {
expiration: 18,
gasPriceCoef: 0
};
}
/**
* create driver instance
* it will fetch config(genesis, head) via net as construction params
* @param net
* @param wallet
*/
static connect(net, wallet) {
return __awaiter(this, void 0, void 0, function* () {
const genesis = yield net.http('GET', 'blocks/0');
const best = yield net.http('GET', 'blocks/best', {
validateResponseHeader: headers => {
const xgid = headers['x-genesis-id'];
if (xgid && xgid !== genesis.id) {
throw new Error(`responded 'x-genesis-id' not matched`);
}
}
});
return new Driver(net, genesis, {
id: best.id,
number: best.number,
timestamp: best.timestamp,
parentID: best.parentID,
txsFeatures: best.txsFeatures
}, wallet);
});
}
signTx(msg, option) {
return __awaiter(this, void 0, void 0, function* () {
const key = this.findKey(option.signer);
const clauses = msg.map(c => ({ to: c.to, value: c.value, data: c.data }));
const gas = option.gas ||
(yield this.estimateGas(clauses, key.address));
const txBody = {
chainTag: Number.parseInt(this.genesis.id.slice(-2), 16),
blockRef: this.head.id.slice(0, 18),
expiration: this.txParams.expiration,
clauses,
gasPriceCoef: this.txParams.gasPriceCoef,
gas,
dependsOn: option.dependsOn || null,
nonce: '0x' + crypto_1.randomBytes(8).toString('hex')
};
let tx;
if (option.delegationHandler) {
const delegatedTx = new transaction_1.Transaction(Object.assign({}, txBody, { reserved: { features: 1 /* vip191 */ } }));
const originSig = yield key.sign(delegatedTx.signingHash());
try {
const result = yield option.delegationHandler({
raw: '0x' + delegatedTx.encode().toString('hex'),
origin: key.address
});
delegatedTx.signature = Buffer.concat([originSig, Buffer.from(result.signature.slice(2), 'hex')]);
tx = delegatedTx;
}
catch (err) {
if (!options_1.options.disableErrorLog) {
// tslint:disable-next-line: no-console
console.warn('tx delegation error: ', err);
}
// fallback to non-vip191 tx
}
}
if (!tx) {
tx = new transaction_1.Transaction(txBody);
tx.signature = yield key.sign(tx.signingHash());
}
const raw = '0x' + tx.encode().toString('hex');
if (this.onTxCommit) {
this.onTxCommit({
id: tx.id,
raw,
resend: () => __awaiter(this, void 0, void 0, function* () {
yield this.sendTx(raw);
})
});
}
yield this.sendTx(raw);
return {
txid: tx.id,
signer: key.address
};
});
}
signCert(msg, options) {
return __awaiter(this, void 0, void 0, function* () {
const key = this.findKey(options.signer);
const annex = {
domain: 'localhost',
timestamp: this.head.timestamp,
signer: key.address
};
const unsigned = certificate_1.Certificate.encode(Object.assign({}, msg, annex));
const signature = yield key.sign(blake2b_1.blake2b256(unsigned));
return {
annex,
signature: '0x' + signature.toString('hex')
};
});
}
isAddressOwned(addr) {
return Promise.resolve(this.wallet ? this.wallet.list.findIndex(k => k.address === addr) >= 0 : false);
}
findKey(addr) {
if (this.wallet) {
const keys = this.wallet.list;
const key = addr ? keys.find(k => k.address === addr) : keys[0];
if (key) {
return key;
}
}
throw new Error('empty wallet');
}
sendTx(raw) {
return this.httpPost('transactions', { raw });
}
estimateGas(clauses, caller) {
return __awaiter(this, void 0, void 0, function* () {
const outputs = yield this.explain({
clauses,
caller,
}, this.head.id);
const execGas = outputs.reduce((sum, out) => sum + out.gasUsed, 0);
const intrinsicGas = transaction_1.Transaction.intrinsicGas(clauses);
return intrinsicGas + (execGas ? (execGas + 15000) : 0);
});
}
}
exports.Driver = Driver;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RyaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQ0EseURBQW1EO0FBRW5ELDhEQUEwRDtBQUMxRCw4REFBMEQ7QUFDMUQsMERBQXlEO0FBQ3pELG1DQUFvQztBQUNwQyx1Q0FBbUM7QUFFbkMsMkNBQTJDO0FBQzNDLE1BQWEsTUFBTyxTQUFRLGlDQUFjO0lBdUN0QyxZQUNJLEdBQVEsRUFDUixPQUEwQixFQUMxQixXQUF3QyxFQUN2QixNQUFlO1FBRWhDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBRmYsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQVZwQyxpQ0FBaUM7UUFDMUIsYUFBUSxHQUFHO1lBQ2QsVUFBVSxFQUFFLEVBQUU7WUFDZCxZQUFZLEVBQUUsQ0FBQztTQUNsQixDQUFBO0lBU0QsQ0FBQztJQTdDRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBTyxPQUFPLENBQUMsR0FBUSxFQUFFLE1BQWU7O1lBQ2pELE1BQU0sT0FBTyxHQUFzQixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1lBQ3BFLE1BQU0sSUFBSSxHQUFzQixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtnQkFDakUsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQzlCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQTtvQkFDcEMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxFQUFFLEVBQUU7d0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtxQkFDMUQ7Z0JBQ0wsQ0FBQzthQUNKLENBQUMsQ0FBQTtZQUVGLE9BQU8sSUFBSSxNQUFNLENBQ2IsR0FBRyxFQUNILE9BQU8sRUFBRTtnQkFD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