UNPKG

simonzgconnexframework

Version:

A library implements VeChain Connex interface

156 lines 13 kB
"use strict"; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlci9kcml2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUNBLHlEQUFtRDtBQUVuRCw4REFBMEQ7QUFDMUQsOERBQTBEO0FBQzFELDBEQUF5RDtBQUN6RCxtQ0FBb0M7QUFDcEMsdUNBQW1DO0FBRW5DLDJDQUEyQztBQUMzQyxNQUFhLE1BQU8sU0FBUSxpQ0FBYztJQXVDdEMsWUFDSSxHQUFRLEVBQ1IsT0FBMEIsRUFDMUIsV0FBd0MsRUFDdkIsTUFBZTtRQUVoQyxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUZmLFdBQU0sR0FBTixNQUFNLENBQVM7UUFWcEMsaUNBQWlDO1FBQzFCLGFBQVEsR0FBRztZQUNkLFVBQVUsRUFBRSxFQUFFO1lBQ2QsWUFBWSxFQUFFLENBQUM7U0FDbEIsQ0FBQTtJQVNELENBQUM7SUE3Q0Q7Ozs7O09BS0c7SUFDSSxNQUFNLENBQU8sT0FBTyxDQUFDLEdBQVEsRUFBRSxNQUFlOztZQUNqRCxNQUFNLE9BQU8sR0FBc0IsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUNwRSxNQUFNLElBQUksR0FBc0IsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7Z0JBQ2pFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUM5QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7b0JBQ3BDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsRUFBRSxFQUFFO3dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7cUJBQzFEO2dCQUNMLENBQUM7YUFDSixDQUFDLENBQUE7WUFFRixPQUFPLElBQUksTUFBTSxDQUNiLEdBQUcsRUFDSCxPQUFP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