From 5dbeb4600637157b23cf426b95536599092e71f5 Mon Sep 17 00:00:00 2001 From: Everton Fraga Date: Thu, 9 Nov 2017 17:13:39 -0500 Subject: [PATCH] Overriding eth_getTransactionReceipt call --- .../ipc/methods/eth_getTransactionReceipt.js | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 modules/ipc/methods/eth_getTransactionReceipt.js diff --git a/modules/ipc/methods/eth_getTransactionReceipt.js b/modules/ipc/methods/eth_getTransactionReceipt.js new file mode 100644 index 000000000..46b4f8549 --- /dev/null +++ b/modules/ipc/methods/eth_getTransactionReceipt.js @@ -0,0 +1,60 @@ +const _ = global._; +const BaseProcessor = require('./base'); +const eth = require('ethereumjs-util'); + +/** + * Process method: eth_getTransactionReceipt + */ + +module.exports = class extends BaseProcessor { + + sanitizeRequestPayload(conn, payload, isPartOfABatch) { + return super.sanitizeRequestPayload(conn, payload, isPartOfABatch); + } + + async exec(conn, payload) { + const txHash = payload.params[0]; + + // Sends regular eth_getTransactionReceipt request + const ret = await conn.socket.send(payload, { + fullResult: true + }); + + // If that contains a contractAddress already, fine. + if (ret.result.result.contractAddress != null) { + return ret.result; + } + + // Due to a geth's light client v1 bug, it does not return + // contractAddress value on the receipts. Let's fix that. + // 1. GET TRANSACTION from AND nonce VALUES + const transactionInfo = await conn.socket.send({ + jsonrpc: '2.0', + id: _.uuid(), + method: 'eth_getTransactionByHash', + params: [txHash] + }, { fullResult: true }); + + + const fromAddress = transactionInfo.result.result.from; + const nonce = parseInt(transactionInfo.result.result.nonce, 16); + const possibleContractAddress = `0x${eth.generateAddress(fromAddress, nonce).toString('hex')}`; + + + // 2. GET CODE FROM ADDRESS + const contractCode = await conn.socket.send({ + jsonrpc: '2.0', + id: _.uuid(), + method: 'eth_getCode', + params: [possibleContractAddress, 'latest'] + }, { fullResult: true }); + const contractCodeResult = contractCode.result.result; + + // 3. IF IT EXISTS, ASSIGN TO RETURN VALUE + if (contractCodeResult && contractCodeResult.length > 2) { + ret.result.result.contractAddress = possibleContractAddress; + } + + return ret.result; + } +};