UNPKG

@meterio/flex-framework

Version:

A library implements Meter Flex interface

167 lines 13.4 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Driver = void 0; const driver_no_vendor_1 = require("./driver-no-vendor"); const transaction_1 = require("@meterio/devkit/dist/transaction"); const certificate_1 = require("@meterio/devkit/dist/certificate"); const blake2b_1 = require("@meterio/devkit/dist/cry/blake2b"); const crypto_1 = require("crypto"); const options_1 = require("./options"); /** class fully implements Flex.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, epoch: best.epoch, }, 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, token: c.token, })); 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(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(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlci9kcml2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEseURBQW9EO0FBRXBELGtFQUErRDtBQUMvRCxrRUFBK0Q7QUFDL0QsOERBQThEO0FBQzlELG1DQUFxQztBQUNyQyx1Q0FBb0M7QUFFcEMseUNBQXlDO0FBQ3pDLE1BQWEsTUFBTyxTQUFRLGlDQUFjO0lBeUN4QyxZQUNFLEdBQVEsRUFDUixPQUF5QixFQUN6QixXQUF1QyxFQUN0QixNQUFlO1FBRWhDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRmhCLFdBQU0sR0FBTixNQUFNLENBQVM7UUFWbEMsaUNBQWlDO1FBQzFCLGFBQVEsR0FBRztZQUNoQixVQUFVLEVBQUUsRUFBRTtZQUNkLFlBQVksRUFBRSxDQUFDO1NBQ2hCLENBQUM7SUFTRixDQUFDO0lBL0NEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFPLE9BQU8sQ0FBQyxHQUFRLEVBQUUsTUFBZTs7WUFDbkQsTUFBTSxPQUFPLEdBQXFCLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDcEUsTUFBTSxJQUFJLEdBQXFCLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFO2dCQUNsRSxzQkFBc0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNsQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ3JDLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsRUFBRSxFQUFFO3dCQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7cUJBQ3pEO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksTUFBTSxDQUNmLEdBQUcs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