UNPKG

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