UNPKG

36.4 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 return new (P || (P = Promise))(function (resolve, reject) {
4 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7 step((generator = generator.apply(thisArg, _arguments || [])).next());
8 });
9};
10var __generator = (this && this.__generator) || function (thisArg, body) {
11 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13 function verb(n) { return function (v) { return step([n, v]); }; }
14 function step(op) {
15 if (f) throw new TypeError("Generator is already executing.");
16 while (_) try {
17 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18 if (y = 0, t) op = [op[0] & 2, t.value];
19 switch (op[0]) {
20 case 0: case 1: t = op; break;
21 case 4: _.label++; return { value: op[1], done: false };
22 case 5: _.label++; y = op[1]; op = [0]; continue;
23 case 7: op = _.ops.pop(); _.trys.pop(); continue;
24 default:
25 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29 if (t[2]) _.ops.pop();
30 _.trys.pop(); continue;
31 }
32 op = body.call(thisArg, _);
33 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35 }
36};
37var __importDefault = (this && this.__importDefault) || function (mod) {
38 return (mod && mod.__esModule) ? mod : { "default": mod };
39};
40Object.defineProperty(exports, "__esModule", { value: true });
41var debug_1 = __importDefault(require("debug"));
42var client_1 = require("./client");
43var helpers_1 = require("./helpers");
44var loom_pb_1 = require("./proto/loom_pb");
45var address_1 = require("./address");
46var crypto_utils_1 = require("./crypto-utils");
47var log = debug_1.default('loom-provider');
48var error = debug_1.default('loom-provider:error');
49var bytesToHexAddrLC = function (bytes) {
50 return crypto_utils_1.bytesToHexAddr(bytes).toLowerCase();
51};
52var numberToHexLC = function (num) {
53 return crypto_utils_1.numberToHex(num).toLowerCase();
54};
55/**
56 * Web3 provider that interacts with EVM contracts deployed on Loom DAppChains.
57 */
58var LoomProvider = /** @class */ (function () {
59 /**
60 * Constructs the LoomProvider to bridges communication between Web3 and Loom DappChains
61 *
62 * @param client Client from LoomJS
63 * @param privateKey Account private key
64 */
65 function LoomProvider(client, privateKey) {
66 var _this = this;
67 this._client = client;
68 this.notificationCallbacks = new Array();
69 this.accounts = new Map();
70 this.accountsAddrList = new Array();
71 this._client.addListener(client_1.ClientEvent.Contract, function (msg) {
72 return _this._onWebSocketMessage(msg);
73 });
74 this.addDefaultEvents();
75 this.addAccounts([privateKey]);
76 }
77 /**
78 * Creates new accounts by passing the private key array
79 *
80 * Accounts will be available on public properties accounts and accountsAddrList
81 *
82 * @param accountsPrivateKey Array of private keys to create new accounts
83 */
84 LoomProvider.prototype.addAccounts = function (accountsPrivateKey) {
85 var _this = this;
86 accountsPrivateKey.forEach(function (accountPrivateKey) {
87 var publicKey = crypto_utils_1.publicKeyFromPrivateKey(accountPrivateKey);
88 var accountAddress = address_1.LocalAddress.fromPublicKey(publicKey).toString();
89 _this.accountsAddrList.push(accountAddress);
90 _this.accounts.set(accountAddress, accountPrivateKey);
91 log("New account added " + accountAddress);
92 });
93 };
94 // PUBLIC FUNCTION TO SUPPORT WEB3
95 LoomProvider.prototype.on = function (type, callback) {
96 switch (type) {
97 case 'data':
98 this.notificationCallbacks.push(callback);
99 break;
100 case 'connect':
101 this._client.addListener(client_1.ClientEvent.Connected, callback);
102 break;
103 case 'end':
104 this._client.addListener(client_1.ClientEvent.Disconnected, callback);
105 break;
106 case 'error':
107 this._client.addListener(client_1.ClientEvent.Error, callback);
108 break;
109 }
110 };
111 LoomProvider.prototype.addDefaultEvents = function () {
112 var _this = this;
113 this._client.addListener(client_1.ClientEvent.Disconnected, function () {
114 // reset all requests and callbacks
115 _this.reset();
116 });
117 };
118 LoomProvider.prototype.removeListener = function (type, callback) {
119 switch (type) {
120 case 'data':
121 this.notificationCallbacks = [];
122 break;
123 case 'connect':
124 this._client.removeListener(client_1.ClientEvent.Connected, callback);
125 break;
126 case 'end':
127 this._client.removeListener(client_1.ClientEvent.Disconnected, callback);
128 break;
129 case 'error':
130 this._client.removeListener(client_1.ClientEvent.Error, callback);
131 break;
132 }
133 };
134 LoomProvider.prototype.removeAllListeners = function (type, callback) {
135 var _this = this;
136 if (type === 'data') {
137 this.notificationCallbacks.forEach(function (cb, index) {
138 if (cb === callback) {
139 _this.notificationCallbacks.splice(index, 1);
140 }
141 });
142 }
143 };
144 LoomProvider.prototype.reset = function () {
145 this.notificationCallbacks = [];
146 };
147 LoomProvider.prototype.disconnect = function () {
148 this._client.disconnect();
149 };
150 // Adapter function for sendAsync from truffle provider
151 LoomProvider.prototype.sendAsync = function (payload, callback) {
152 return __awaiter(this, void 0, void 0, function () {
153 var _this = this;
154 return __generator(this, function (_a) {
155 switch (_a.label) {
156 case 0:
157 if (!callback) return [3 /*break*/, 2];
158 return [4 /*yield*/, this.send(payload, callback)];
159 case 1:
160 _a.sent();
161 return [3 /*break*/, 3];
162 case 2: return [2 /*return*/, new Promise(function (resolve, reject) {
163 _this.send(payload, function (err, result) {
164 if (err)
165 reject(err);
166 else
167 resolve(result);
168 });
169 })];
170 case 3: return [2 /*return*/];
171 }
172 });
173 });
174 };
175 /**
176 * Should be used to make async request
177 * This method is used internally by web3, so we adapt it to be used with loom contract
178 * when we are wrapping the evm on a DAppChain
179 * @param payload JSON payload generated by web3 which will be translated to loom transaction/call
180 * @param callback Triggered on end with (err, result)
181 */
182 LoomProvider.prototype.send = function (payload, callback) {
183 return __awaiter(this, void 0, void 0, function () {
184 var isArray, functionToExecute, f, result, err_1;
185 var _this = this;
186 return __generator(this, function (_a) {
187 switch (_a.label) {
188 case 0:
189 log('Request payload', JSON.stringify(payload, null, 2));
190 isArray = Array.isArray(payload);
191 if (isArray) {
192 payload = payload[0];
193 }
194 functionToExecute = function (method) {
195 switch (method) {
196 case 'eth_accounts':
197 return _this._ethAccounts;
198 case 'eth_blockNumber':
199 return _this._ethBlockNumber;
200 case 'eth_call':
201 return _this._ethCall;
202 case 'eth_estimateGas':
203 return _this._ethEstimateGas;
204 case 'eth_gasPrice':
205 return _this._ethGasPrice;
206 case 'eth_getBlockByHash':
207 return _this._ethGetBlockByHash;
208 case 'eth_getBlockByNumber':
209 return _this._ethGetBlockByNumber;
210 case 'eth_getCode':
211 return _this._ethGetCode;
212 case 'eth_getFilterChanges':
213 return _this._ethGetFilterChanges;
214 case 'eth_getLogs':
215 return _this._ethGetLogs;
216 case 'eth_getTransactionByHash':
217 return _this._ethGetTransactionByHash;
218 case 'eth_getTransactionReceipt':
219 return _this._ethGetTransactionReceipt;
220 case 'eth_newBlockFilter':
221 return _this._ethNewBlockFilter;
222 case 'eth_newFilter':
223 return _this._ethNewFilter;
224 case 'eth_newPendingTransactionFilter':
225 return _this._ethNewPendingTransactionFilter;
226 case 'eth_sendTransaction':
227 return _this._ethSendTransaction;
228 case 'eth_subscribe':
229 return _this._ethSubscribe;
230 case 'eth_uninstallFilter':
231 return _this._ethUninstallFilter;
232 case 'eth_unsubscribe':
233 return _this._ethUnsubscribe;
234 case 'net_version':
235 return _this._netVersion;
236 default:
237 throw Error("Method \"" + payload.method + "\" not supported on this provider");
238 }
239 };
240 _a.label = 1;
241 case 1:
242 _a.trys.push([1, 3, , 4]);
243 f = functionToExecute(payload.method).bind(this);
244 return [4 /*yield*/, f(payload)];
245 case 2:
246 result = _a.sent();
247 callback(null, this._okResponse(payload.id, result, isArray));
248 return [3 /*break*/, 4];
249 case 3:
250 err_1 = _a.sent();
251 error(err_1);
252 callback(err_1, null);
253 return [3 /*break*/, 4];
254 case 4: return [2 /*return*/];
255 }
256 });
257 });
258 };
259 // PRIVATE FUNCTIONS EVM CALLS
260 LoomProvider.prototype._ethAccounts = function () {
261 if (this.accountsAddrList.length === 0) {
262 throw Error('No account available');
263 }
264 return this.accountsAddrList;
265 };
266 LoomProvider.prototype._ethBlockNumber = function () {
267 return __awaiter(this, void 0, void 0, function () {
268 var blockNumber;
269 return __generator(this, function (_a) {
270 switch (_a.label) {
271 case 0: return [4 /*yield*/, this._client.getBlockHeightAsync()];
272 case 1:
273 blockNumber = _a.sent();
274 return [2 /*return*/, crypto_utils_1.numberToHex(blockNumber)];
275 }
276 });
277 });
278 };
279 LoomProvider.prototype._ethCall = function (payload) {
280 return __awaiter(this, void 0, void 0, function () {
281 var result;
282 return __generator(this, function (_a) {
283 switch (_a.label) {
284 case 0: return [4 /*yield*/, this._callStaticAsync(payload.params[0])];
285 case 1:
286 result = _a.sent();
287 return [2 /*return*/, result ? bytesToHexAddrLC(result) : '0x0'];
288 }
289 });
290 });
291 };
292 LoomProvider.prototype._ethEstimateGas = function () {
293 // Loom DAppChain doesn't estimate gas, because gas isn't necessary
294 return null; // Returns null to afford with Web3 calls
295 };
296 LoomProvider.prototype._ethGasPrice = function () {
297 // Loom DAppChain doesn't use gas price, because gas isn't necessary
298 return null; // Returns null to afford with Web3 calls
299 };
300 LoomProvider.prototype._ethGetBlockByHash = function (payload) {
301 return __awaiter(this, void 0, void 0, function () {
302 var blockHash, isFull, result;
303 return __generator(this, function (_a) {
304 switch (_a.label) {
305 case 0:
306 blockHash = payload.params[0];
307 isFull = payload.params[1] || true;
308 return [4 /*yield*/, this._client.getEvmBlockByHashAsync(blockHash, isFull)];
309 case 1:
310 result = _a.sent();
311 if (!result) {
312 return [2 /*return*/, null];
313 }
314 return [2 /*return*/, this._createBlockInfo(result, isFull)];
315 }
316 });
317 });
318 };
319 LoomProvider.prototype._ethGetBlockByNumber = function (payload) {
320 return __awaiter(this, void 0, void 0, function () {
321 var blockNumberToSearch, isFull, result;
322 return __generator(this, function (_a) {
323 switch (_a.label) {
324 case 0:
325 blockNumberToSearch = payload.params[0];
326 isFull = payload.params[1] || true;
327 return [4 /*yield*/, this._client.getEvmBlockByNumberAsync(blockNumberToSearch, isFull)];
328 case 1:
329 result = _a.sent();
330 if (!result) {
331 return [2 /*return*/, null];
332 }
333 return [2 /*return*/, this._createBlockInfo(result, isFull)];
334 }
335 });
336 });
337 };
338 LoomProvider.prototype._ethGetCode = function (payload) {
339 return __awaiter(this, void 0, void 0, function () {
340 var address, result;
341 return __generator(this, function (_a) {
342 switch (_a.label) {
343 case 0:
344 address = new address_1.Address(this._client.chainId, address_1.LocalAddress.fromHexString(payload.params[0]));
345 return [4 /*yield*/, this._client.getEvmCodeAsync(address)];
346 case 1:
347 result = _a.sent();
348 if (!result) {
349 throw Error('No code returned on eth_getCode');
350 }
351 return [2 /*return*/, bytesToHexAddrLC(result)];
352 }
353 });
354 });
355 };
356 LoomProvider.prototype._ethGetFilterChanges = function (payload) {
357 return __awaiter(this, void 0, void 0, function () {
358 var result;
359 return __generator(this, function (_a) {
360 switch (_a.label) {
361 case 0: return [4 /*yield*/, this._client.getEvmFilterChangesAsync(payload.params[0])];
362 case 1:
363 result = _a.sent();
364 if (!result) {
365 return [2 /*return*/, []];
366 }
367 return [2 /*return*/, [bytesToHexAddrLC(result)]];
368 }
369 });
370 });
371 };
372 LoomProvider.prototype._ethGetLogs = function (payload) {
373 return __awaiter(this, void 0, void 0, function () {
374 return __generator(this, function (_a) {
375 return [2 /*return*/, this._getLogs(payload.params[0])];
376 });
377 });
378 };
379 LoomProvider.prototype._ethGetTransactionByHash = function (payload) {
380 return __awaiter(this, void 0, void 0, function () {
381 return __generator(this, function (_a) {
382 return [2 /*return*/, this._getTransaction(payload.params[0])];
383 });
384 });
385 };
386 LoomProvider.prototype._ethGetTransactionReceipt = function (payload) {
387 return __awaiter(this, void 0, void 0, function () {
388 return __generator(this, function (_a) {
389 return [2 /*return*/, this._getReceipt(payload.params[0])];
390 });
391 });
392 };
393 LoomProvider.prototype._ethNewBlockFilter = function () {
394 return __awaiter(this, void 0, void 0, function () {
395 var result;
396 return __generator(this, function (_a) {
397 switch (_a.label) {
398 case 0: return [4 /*yield*/, this._client.newBlockEvmFilterAsync()];
399 case 1:
400 result = _a.sent();
401 if (!result) {
402 throw Error('New block filter unexpected result');
403 }
404 return [2 /*return*/, result];
405 }
406 });
407 });
408 };
409 LoomProvider.prototype._ethNewFilter = function (payload) {
410 return __awaiter(this, void 0, void 0, function () {
411 var result;
412 return __generator(this, function (_a) {
413 switch (_a.label) {
414 case 0: return [4 /*yield*/, this._client.newEvmFilterAsync(payload.params[0])];
415 case 1:
416 result = _a.sent();
417 if (!result) {
418 throw Error('Cannot create new filter on eth_newFilter');
419 }
420 return [2 /*return*/, result];
421 }
422 });
423 });
424 };
425 LoomProvider.prototype._ethNewPendingTransactionFilter = function () {
426 return __awaiter(this, void 0, void 0, function () {
427 var result;
428 return __generator(this, function (_a) {
429 switch (_a.label) {
430 case 0: return [4 /*yield*/, this._client.newPendingTransactionEvmFilterAsync()];
431 case 1:
432 result = _a.sent();
433 if (!result) {
434 throw Error('New pending transaction filter unexpected result');
435 }
436 return [2 /*return*/, result];
437 }
438 });
439 });
440 };
441 LoomProvider.prototype._ethSendTransaction = function (payload) {
442 return __awaiter(this, void 0, void 0, function () {
443 var result;
444 return __generator(this, function (_a) {
445 switch (_a.label) {
446 case 0:
447 if (!payload.params[0].to) return [3 /*break*/, 2];
448 return [4 /*yield*/, this._callAsync(payload.params[0])];
449 case 1:
450 result = _a.sent();
451 return [3 /*break*/, 4];
452 case 2: return [4 /*yield*/, this._deployAsync(payload.params[0])];
453 case 3:
454 result = _a.sent();
455 _a.label = 4;
456 case 4: return [2 /*return*/, bytesToHexAddrLC(result)];
457 }
458 });
459 });
460 };
461 LoomProvider.prototype._ethSubscribe = function (payload) {
462 return __awaiter(this, void 0, void 0, function () {
463 var method, filterObject, result;
464 return __generator(this, function (_a) {
465 switch (_a.label) {
466 case 0:
467 method = payload.params[0];
468 filterObject = payload.params[1] || {};
469 return [4 /*yield*/, this._client.evmSubscribeAsync(method, filterObject)];
470 case 1:
471 result = _a.sent();
472 if (!result) {
473 throw Error('Subscribe filter failed');
474 }
475 return [2 /*return*/, result];
476 }
477 });
478 });
479 };
480 LoomProvider.prototype._ethUninstallFilter = function (payload) {
481 return this._client.uninstallEvmFilterAsync(payload.params[0]);
482 };
483 LoomProvider.prototype._ethUnsubscribe = function (payload) {
484 return this._client.evmUnsubscribeAsync(payload.params[0]);
485 };
486 LoomProvider.prototype._netVersion = function () {
487 // Fixed network version 474747
488 return '474747';
489 };
490 // PRIVATE FUNCTIONS IMPLEMENTATIONS
491 LoomProvider.prototype._deployAsync = function (payload) {
492 return __awaiter(this, void 0, void 0, function () {
493 var caller, address, data, deployTx, msgTx, tx, ret, response, responseData;
494 return __generator(this, function (_a) {
495 switch (_a.label) {
496 case 0:
497 caller = new address_1.Address(this._client.chainId, address_1.LocalAddress.fromHexString(payload.from));
498 address = new address_1.Address(this._client.chainId, address_1.LocalAddress.fromHexString('0x0000000000000000000000000000000000000000'));
499 data = Buffer.from(payload.data.substring(2), 'hex');
500 deployTx = new loom_pb_1.DeployTx();
501 deployTx.setVmType(loom_pb_1.VMType.EVM);
502 deployTx.setCode(crypto_utils_1.bufferToProtobufBytes(data));
503 msgTx = new loom_pb_1.MessageTx();
504 msgTx.setFrom(caller.MarshalPB());
505 msgTx.setTo(address.MarshalPB());
506 msgTx.setData(deployTx.serializeBinary());
507 tx = new loom_pb_1.Transaction();
508 tx.setId(1);
509 tx.setData(msgTx.serializeBinary());
510 return [4 /*yield*/, this._commitTransaction(payload.from, tx)];
511 case 1:
512 ret = _a.sent();
513 response = loom_pb_1.DeployResponse.deserializeBinary(crypto_utils_1.bufferToProtobufBytes(ret));
514 responseData = loom_pb_1.DeployResponseData.deserializeBinary(crypto_utils_1.bufferToProtobufBytes(response.getOutput_asU8()));
515 return [2 /*return*/, responseData.getTxHash_asU8()];
516 }
517 });
518 });
519 };
520 LoomProvider.prototype._callAsync = function (payload) {
521 var caller = new address_1.Address(this._client.chainId, address_1.LocalAddress.fromHexString(payload.from));
522 var address = new address_1.Address(this._client.chainId, address_1.LocalAddress.fromHexString(payload.to));
523 var data = Buffer.from(payload.data.substring(2), 'hex');
524 var callTx = new loom_pb_1.CallTx();
525 callTx.setVmType(loom_pb_1.VMType.EVM);
526 callTx.setInput(crypto_utils_1.bufferToProtobufBytes(data));
527 var msgTx = new loom_pb_1.MessageTx();
528 msgTx.setFrom(caller.MarshalPB());
529 msgTx.setTo(address.MarshalPB());
530 msgTx.setData(callTx.serializeBinary());
531 var tx = new loom_pb_1.Transaction();
532 tx.setId(2);
533 tx.setData(msgTx.serializeBinary());
534 return this._commitTransaction(payload.from, tx);
535 };
536 LoomProvider.prototype._callStaticAsync = function (payload) {
537 var caller = new address_1.Address(this._client.chainId, address_1.LocalAddress.fromHexString(payload.from));
538 var address = new address_1.Address(this._client.chainId, address_1.LocalAddress.fromHexString(payload.to));
539 var data = Buffer.from(payload.data.substring(2), 'hex');
540 return this._client.queryAsync(address, data, loom_pb_1.VMType.EVM, caller);
541 };
542 LoomProvider.prototype._createBlockInfo = function (blockInfo, isFull) {
543 var _this = this;
544 var blockNumber = numberToHexLC(blockInfo.getNumber());
545 var transactionHash = bytesToHexAddrLC(blockInfo.getHash_asU8());
546 var parentHash = bytesToHexAddrLC(blockInfo.getParentHash_asU8());
547 var logsBloom = bytesToHexAddrLC(blockInfo.getLogsBloom_asU8());
548 var timestamp = blockInfo.getTimestamp();
549 var transactions = blockInfo.getTransactionsList_asU8().map(function (transaction) {
550 if (isFull) {
551 return _this._createReceiptResult(loom_pb_1.EvmTxReceipt.deserializeBinary(crypto_utils_1.bufferToProtobufBytes(transaction)));
552 }
553 else {
554 return bytesToHexAddrLC(transaction);
555 }
556 });
557 return {
558 blockNumber: blockNumber,
559 transactionHash: transactionHash,
560 parentHash: parentHash,
561 logsBloom: logsBloom,
562 timestamp: timestamp,
563 transactions: transactions
564 };
565 };
566 LoomProvider.prototype._createReceiptResult = function (receipt) {
567 var transactionHash = bytesToHexAddrLC(receipt.getTxHash_asU8());
568 var transactionIndex = numberToHexLC(receipt.getTransactionIndex());
569 var blockHash = bytesToHexAddrLC(receipt.getBlockHash_asU8());
570 var blockNumber = numberToHexLC(receipt.getBlockNumber());
571 var contractAddress = bytesToHexAddrLC(receipt.getContractAddress_asU8());
572 var logs = receipt.getLogsList().map(function (logEvent, index) {
573 var logIndex = numberToHexLC(index);
574 return {
575 logIndex: logIndex,
576 address: contractAddress,
577 blockHash: blockHash,
578 blockNumber: blockNumber,
579 transactionHash: bytesToHexAddrLC(logEvent.getTxHash_asU8()),
580 transactionIndex: transactionIndex,
581 type: 'mined',
582 data: bytesToHexAddrLC(logEvent.getEncodedBody_asU8()),
583 topics: logEvent.getTopicsList().map(function (topic) { return topic.toLowerCase(); })
584 };
585 });
586 return {
587 transactionHash: transactionHash,
588 transactionIndex: transactionIndex,
589 blockHash: blockHash,
590 blockNumber: blockNumber,
591 contractAddress: contractAddress,
592 gasUsed: numberToHexLC(receipt.getGasUsed()),
593 cumulativeGasUsed: numberToHexLC(receipt.getCumulativeGasUsed()),
594 logs: logs,
595 status: numberToHexLC(receipt.getStatus())
596 };
597 };
598 LoomProvider.prototype._getTransaction = function (txHash) {
599 return __awaiter(this, void 0, void 0, function () {
600 var data, transaction, hash, nonce, transactionIndex, blockHash, blockNumber, from, to, value, gasPrice, gas, input;
601 return __generator(this, function (_a) {
602 switch (_a.label) {
603 case 0:
604 data = Buffer.from(txHash.substring(2), 'hex');
605 return [4 /*yield*/, this._client.getEvmTxByHashAsync(crypto_utils_1.bufferToProtobufBytes(data))];
606 case 1:
607 transaction = _a.sent();
608 if (!transaction) {
609 throw Error('Transaction cannot be empty');
610 }
611 hash = bytesToHexAddrLC(transaction.getHash_asU8());
612 nonce = numberToHexLC(transaction.getNonce());
613 transactionIndex = numberToHexLC(transaction.getTransactionIndex());
614 blockHash = bytesToHexAddrLC(transaction.getBlockHash_asU8());
615 blockNumber = numberToHexLC(transaction.getBlockNumber());
616 from = bytesToHexAddrLC(transaction.getFrom_asU8());
617 to = bytesToHexAddrLC(transaction.getTo_asU8());
618 value = numberToHexLC(transaction.getValue());
619 gasPrice = numberToHexLC(transaction.getGasPrice());
620 gas = numberToHexLC(transaction.getGas());
621 input = '0x0';
622 return [2 /*return*/, {
623 hash: hash,
624 nonce: nonce,
625 blockHash: blockHash,
626 blockNumber: blockNumber,
627 transactionIndex: transactionIndex,
628 from: from,
629 to: to,
630 value: value,
631 gasPrice: gasPrice,
632 gas: gas,
633 input: input
634 }];
635 }
636 });
637 });
638 };
639 LoomProvider.prototype._getReceipt = function (txHash) {
640 return __awaiter(this, void 0, void 0, function () {
641 var data, receipt;
642 return __generator(this, function (_a) {
643 switch (_a.label) {
644 case 0:
645 data = Buffer.from(txHash.substring(2), 'hex');
646 return [4 /*yield*/, this._client.getEvmTxReceiptAsync(crypto_utils_1.bufferToProtobufBytes(data))];
647 case 1:
648 receipt = _a.sent();
649 if (!receipt) {
650 throw Error('Receipt cannot be empty');
651 }
652 return [2 /*return*/, this._createReceiptResult(receipt)];
653 }
654 });
655 });
656 };
657 LoomProvider.prototype._getLogs = function (filterObject) {
658 return __awaiter(this, void 0, void 0, function () {
659 var logsListAsyncResult, logList;
660 return __generator(this, function (_a) {
661 switch (_a.label) {
662 case 0: return [4 /*yield*/, this._client.getEvmLogsAsync(filterObject)];
663 case 1:
664 logsListAsyncResult = _a.sent();
665 if (!logsListAsyncResult) {
666 return [2 /*return*/, []];
667 }
668 logList = loom_pb_1.EthFilterLogList.deserializeBinary(crypto_utils_1.bufferToProtobufBytes(logsListAsyncResult));
669 return [2 /*return*/, logList.getEthBlockLogsList().map(function (log) {
670 return {
671 removed: log.getRemoved(),
672 logIndex: numberToHexLC(log.getLogIndex()),
673 transactionIndex: crypto_utils_1.numberToHex(log.getTransactionIndex()),
674 transactionHash: bytesToHexAddrLC(log.getTransactionHash_asU8()),
675 blockHash: bytesToHexAddrLC(log.getBlockHash_asU8()),
676 blockNumber: crypto_utils_1.numberToHex(log.getBlockNumber()),
677 address: bytesToHexAddrLC(log.getAddress_asU8()),
678 data: bytesToHexAddrLC(log.getData_asU8()),
679 topics: log.getTopicsList().map(function (topic) { return String.fromCharCode.apply(null, topic); })
680 };
681 })];
682 }
683 });
684 });
685 };
686 LoomProvider.prototype._onWebSocketMessage = function (msgEvent) {
687 if (msgEvent.data && msgEvent.id !== '0') {
688 log("Socket message arrived " + JSON.stringify(msgEvent));
689 this.notificationCallbacks.forEach(function (callback) {
690 var JSONRPCResult = {
691 jsonrpc: '2.0',
692 method: 'eth_subscription',
693 params: {
694 subscription: msgEvent.id,
695 result: {
696 transactionHash: bytesToHexAddrLC(msgEvent.transactionHashBytes),
697 logIndex: '0x0',
698 transactionIndex: '0x0',
699 blockHash: '0x0',
700 blockNumber: '0x0',
701 address: msgEvent.contractAddress.local.toString(),
702 type: 'mined',
703 data: bytesToHexAddrLC(msgEvent.data),
704 topics: msgEvent.topics
705 }
706 }
707 };
708 callback(JSONRPCResult);
709 });
710 }
711 };
712 LoomProvider.prototype._commitTransaction = function (fromPublicAddr, txTransaction) {
713 return __awaiter(this, void 0, void 0, function () {
714 var privateKey, middleware;
715 return __generator(this, function (_a) {
716 privateKey = this.accounts.get(fromPublicAddr);
717 if (!privateKey) {
718 throw Error("Account not found for address " + fromPublicAddr);
719 }
720 middleware = helpers_1.createDefaultTxMiddleware(this._client, privateKey);
721 return [2 /*return*/, this._client.commitTxAsync(txTransaction, { middleware: middleware })];
722 });
723 });
724 };
725 // Basic response to web3js
726 LoomProvider.prototype._okResponse = function (id, result, isArray) {
727 if (result === void 0) { result = 0; }
728 if (isArray === void 0) { isArray = false; }
729 var response = { id: id, jsonrpc: '2.0', result: result };
730 var ret = isArray ? [response] : response;
731 log('Response payload', JSON.stringify(ret, null, 2));
732 return ret;
733 };
734 return LoomProvider;
735}());
736exports.LoomProvider = LoomProvider;
737//# sourceMappingURL=loom-provider.js.map
\No newline at end of file