UNPKG

simonflex-framework

Version:

A library implements Meter Flex interface

164 lines 13.2 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("@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 }, 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({}, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlci9kcml2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLHlEQUFvRDtBQUVwRCxrRUFBK0Q7QUFDL0Qsa0VBQStEO0FBQy9ELDhEQUE4RDtBQUM5RCxtQ0FBcUM7QUFDckMsdUNBQW9DO0FBRXBDLHlDQUF5QztBQUN6QyxNQUFhLE1BQU8sU0FBUSxpQ0FBYztJQXdDeEMsWUFDRSxHQUFRLEVBQ1IsT0FBeUIsRUFDekIsV0FBdUMsRUFDdEIsTUFBZTtRQUVoQyxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUZoQixXQUFNLEdBQU4sTUFBTSxDQUFTO1FBVmxDLGlDQUFpQztRQUMxQixhQUFRLEdBQUc7WUFDaEIsVUFBVSxFQUFFLEVBQUU7WUFDZCxZQUFZLEVBQUUsQ0FBQztTQUNoQixDQUFDO0lBU0YsQ0FBQztJQTlDRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBTyxPQUFPLENBQUMsR0FBUSxFQUFFLE1BQWU7O1lBQ25ELE1BQU0sT0FBTyxHQUFxQixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxHQUFxQixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtnQkFDbEUsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQ2hDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDckMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxFQUFFLEVBQUU7d0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztxQkFDekQ7Z0JBQ0gsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxNQUFNLENBQ2YsR0FBRyxFQUNILE9B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