diff --git a/packages/web3-core-method/lib/methods/transaction/AbstractObservedTransactionMethod.js b/packages/web3-core-method/lib/methods/transaction/AbstractObservedTransactionMethod.js index 04bb368b..46b83c25 100644 --- a/packages/web3-core-method/lib/methods/transaction/AbstractObservedTransactionMethod.js +++ b/packages/web3-core-method/lib/methods/transaction/AbstractObservedTransactionMethod.js @@ -112,7 +112,11 @@ export default class AbstractObservedTransactionMethod extends AbstractMethod { return; } - this.promiEvent.emit('confirmation', confirmations, this.afterExecution(receipt)); + this.promiEvent.emit( + 'confirmation', + confirmations, + this.formatters.outputTransactionFormatter(receipt) + ); }, (error) => { this.handleError(error, receipt, confirmations); diff --git a/packages/web3-core-method/src/methods/transaction/SendRawTransactionMethod.js b/packages/web3-core-method/src/methods/transaction/SendRawTransactionMethod.js index ecfeaaf9..a082ebd8 100644 --- a/packages/web3-core-method/src/methods/transaction/SendRawTransactionMethod.js +++ b/packages/web3-core-method/src/methods/transaction/SendRawTransactionMethod.js @@ -34,4 +34,17 @@ export default class SendRawTransactionMethod extends AbstractObservedTransactio constructor(utils, formatters, moduleInstance, transactionObserver) { super('eth_sendRawTransaction', 1, utils, formatters, moduleInstance, transactionObserver); } + + /** + * This method will be executed after the RPC request. + * + * @method afterExecution + * + * @param {Object} response + * + * @returns {Object} + */ + afterExecution(response) { + return this.formatters.outputTransactionFormatter(response); + } } diff --git a/packages/web3-core-method/src/methods/transaction/SendTransactionMethod.js b/packages/web3-core-method/src/methods/transaction/SendTransactionMethod.js index 1505dc64..1cf8017b 100644 --- a/packages/web3-core-method/src/methods/transaction/SendTransactionMethod.js +++ b/packages/web3-core-method/src/methods/transaction/SendTransactionMethod.js @@ -45,4 +45,17 @@ export default class SendTransactionMethod extends AbstractObservedTransactionMe beforeExecution(moduleInstance) { this.parameters[0] = this.formatters.inputTransactionFormatter(this.parameters[0], moduleInstance); } + + /** + * This method will be executed after the RPC request. + * + * @method afterExecution + * + * @param {Object} response + * + * @returns {Object} + */ + afterExecution(response) { + return this.formatters.outputTransactionFormatter(response); + } } diff --git a/packages/web3-core-method/src/observers/TransactionObserver.js b/packages/web3-core-method/src/observers/TransactionObserver.js index c89de33e..a99cb89b 100644 --- a/packages/web3-core-method/src/observers/TransactionObserver.js +++ b/packages/web3-core-method/src/observers/TransactionObserver.js @@ -150,7 +150,7 @@ export default class TransactionObserver { if (receipt) { if (this.lastBlock) { - const block = await this.getBlockByNumber(this.increaseBlockNumber(this.lastBlock.number)); + const block = await this.getBlockByNumber(this.lastBlock.number + 1); if (block && this.isValidConfirmation(block)) { this.lastBlock = block; @@ -164,8 +164,8 @@ export default class TransactionObserver { } if (this.isConfirmed()) { - clearInterval(interval); observer.complete(); + clearInterval(interval); } } @@ -269,17 +269,4 @@ export default class TransactionObserver { isTimeoutTimeExceeded() { return this.confirmationChecks === this.timeout; } - - /** - * Increases the blockNumber hash by one. - * - * @method increaseBlockNumber - * - * @param {String} blockNumber - * - * @returns {String} - */ - increaseBlockNumber(blockNumber) { - return '0x' + (parseInt(blockNumber, 16) + 1).toString(16); - } } diff --git a/packages/web3-core-method/tests/lib/methods/transaction/AbstractObservedTransactionMethodTest.js b/packages/web3-core-method/tests/lib/methods/transaction/AbstractObservedTransactionMethodTest.js index 741d87da..0ab0d108 100644 --- a/packages/web3-core-method/tests/lib/methods/transaction/AbstractObservedTransactionMethodTest.js +++ b/packages/web3-core-method/tests/lib/methods/transaction/AbstractObservedTransactionMethodTest.js @@ -1,8 +1,10 @@ +import {formatters} from 'web3-core-helpers'; import PromiEvent from '../../../../lib/PromiEvent'; import TransactionObserver from '../../../../src/observers/TransactionObserver'; import AbstractObservedTransactionMethod from '../../../../lib/methods/transaction/AbstractObservedTransactionMethod'; // Mocks +jest.mock('web3-core-helpers'); jest.mock('../../../../src/observers/TransactionObserver'); /** @@ -43,7 +45,7 @@ describe('AbstractObservedTransactionMethodTest', () => { 'rpcMethod', 5, {}, - {}, + formatters, moduleInstanceMock, transactionObserverMock ); @@ -68,6 +70,8 @@ describe('AbstractObservedTransactionMethodTest', () => { it('calls execute with event listeners and is emitting the expected values', (done) => { providerMock.send.mockReturnValueOnce(Promise.resolve('transactionHash')); + formatters.outputTransactionFormatter.mockReturnValue({status: false}); + observableMock.subscribe = jest.fn((next, error, complete) => { next({confirmations: 0, receipt: {status: true}}); @@ -88,7 +92,11 @@ describe('AbstractObservedTransactionMethodTest', () => { expect(transactionHashCallback).toHaveBeenCalledWith('transactionHash'); - expect(confirmationCallback).toHaveBeenCalledWith(0, {status: true}); + expect(confirmationCallback).toHaveBeenCalledWith(0, {status: false}); + + expect(formatters.outputTransactionFormatter).toHaveBeenNthCalledWith(1, {status: true}); + + expect(formatters.outputTransactionFormatter).toHaveBeenCalledTimes(1); done(); }); diff --git a/packages/web3-core-method/tests/src/methods/transaction/SendRawTransactionMethodTest.js b/packages/web3-core-method/tests/src/methods/transaction/SendRawTransactionMethodTest.js index a5b783c9..8622842d 100644 --- a/packages/web3-core-method/tests/src/methods/transaction/SendRawTransactionMethodTest.js +++ b/packages/web3-core-method/tests/src/methods/transaction/SendRawTransactionMethodTest.js @@ -1,5 +1,9 @@ import AbstractObservedTransactionMethod from '../../../../lib/methods/transaction/AbstractObservedTransactionMethod'; import SendRawTransactionMethod from '../../../../src/methods/transaction/SendRawTransactionMethod'; +import {formatters} from 'web3-core-helpers'; + +// Mocks +jest.mock('web3-core-helpers'); /** * SendRawTransactionMethod test @@ -8,7 +12,7 @@ describe('SendRawTransactionMethodTest', () => { let method; beforeEach(() => { - method = new SendRawTransactionMethod(null, null, null, {}); + method = new SendRawTransactionMethod(null, formatters, null, {}); }); it('constructor check', () => { @@ -16,4 +20,12 @@ describe('SendRawTransactionMethodTest', () => { expect(method.rpcMethod).toEqual('eth_sendRawTransaction'); }); + + it('calls afterExecution and returns the expected value', () => { + formatters.outputTransactionFormatter.mockReturnValueOnce({status: true}); + + expect(method.afterExecution({status: false})).toEqual({status: true}); + + expect(formatters.outputTransactionFormatter).toHaveBeenCalledWith({status: false}); + }); }); diff --git a/packages/web3-core-method/tests/src/methods/transaction/SendTransactionMethodTest.js b/packages/web3-core-method/tests/src/methods/transaction/SendTransactionMethodTest.js index 3ceb7acc..3c3292ea 100644 --- a/packages/web3-core-method/tests/src/methods/transaction/SendTransactionMethodTest.js +++ b/packages/web3-core-method/tests/src/methods/transaction/SendTransactionMethodTest.js @@ -6,9 +6,9 @@ import {formatters} from 'web3-core-helpers'; jest.mock('web3-core-helpers'); /** - * SendRawTransactionMethod test + * SendTransactionMethod test */ -describe('SendRawTransactionMethodTest', () => { +describe('SendTransactionMethodTest', () => { let method; beforeEach(() => { @@ -32,4 +32,12 @@ describe('SendRawTransactionMethodTest', () => { expect(formatters.inputTransactionFormatter).toHaveBeenCalledWith('tx', {}); }); + + it('calls afterExecution and returns the expected value', () => { + formatters.outputTransactionFormatter.mockReturnValueOnce({status: true}); + + expect(method.afterExecution({status: false})).toEqual({status: true}); + + expect(formatters.outputTransactionFormatter).toHaveBeenCalledWith({status: false}); + }); }); diff --git a/packages/web3-core-method/tests/src/observers/TransactionObserverTest.js b/packages/web3-core-method/tests/src/observers/TransactionObserverTest.js index 80121411..665382dc 100644 --- a/packages/web3-core-method/tests/src/observers/TransactionObserverTest.js +++ b/packages/web3-core-method/tests/src/observers/TransactionObserverTest.js @@ -189,9 +189,9 @@ describe('TransactionObserverTest', () => { providerMock.supportsSubscriptions.mockReturnValueOnce(false); - const receipt = {blockNumber: '0xa'}; - const blockOne = {number: '0xa', hash: '0x0'}; - const blockTwo = {number: '0xc', parentHash: '0x0'}; + const receipt = {blockNumber: 1}; + const blockOne = {number: 1, hash: '0x0'}; + const blockTwo = {number: 2, parentHash: '0x0'}; getTransactionReceiptMethodMock.execute .mockReturnValueOnce(Promise.resolve(receipt)) @@ -222,7 +222,7 @@ describe('TransactionObserverTest', () => { expect(getTransactionReceiptMethodMock.parameters).toEqual(['transactionHash']); - expect(getBlockByNumberMethodMock.parameters).toEqual(['0xb']); + expect(getBlockByNumberMethodMock.parameters).toEqual([2]); done(); } @@ -235,8 +235,8 @@ describe('TransactionObserverTest', () => { providerMock.supportsSubscriptions.mockReturnValueOnce(false); - const receipt = {blockNumber: '0xa'}; - const blockOne = {number: '0xa', hash: '0x0'}; + const receipt = {blockNumber: 1}; + const blockOne = {number: 1, hash: '0x0'}; getTransactionReceiptMethodMock.execute.mockReturnValueOnce(Promise.resolve(receipt)); diff --git a/packages/web3-eth-contract/src/methods/ContractDeployMethod.js b/packages/web3-eth-contract/src/methods/ContractDeployMethod.js index 6f38cdec..63903fe5 100644 --- a/packages/web3-eth-contract/src/methods/ContractDeployMethod.js +++ b/packages/web3-eth-contract/src/methods/ContractDeployMethod.js @@ -65,7 +65,7 @@ export default class ContractDeployMethod extends EthSendTransactionMethod { clonedContract.address = response.contractAddress; if (this.promiEvent.listenerCount('receipt') > 0) { - this.promiEvent.emit('receipt', response); + this.promiEvent.emit('receipt', super.afterExecution(response)); this.promiEvent.removeAllListeners('receipt'); } diff --git a/packages/web3-eth-contract/src/methods/SendContractMethod.js b/packages/web3-eth-contract/src/methods/SendContractMethod.js index 808c9437..93037d15 100644 --- a/packages/web3-eth-contract/src/methods/SendContractMethod.js +++ b/packages/web3-eth-contract/src/methods/SendContractMethod.js @@ -93,6 +93,6 @@ export default class SendContractMethod extends EthSendTransactionMethod { delete response.logs; } - return response; + return super.afterExecution(response); } } diff --git a/packages/web3-eth-contract/tests/src/methods/SendContractMethodTest.js b/packages/web3-eth-contract/tests/src/methods/SendContractMethodTest.js index 29aca937..af78ac4b 100644 --- a/packages/web3-eth-contract/tests/src/methods/SendContractMethodTest.js +++ b/packages/web3-eth-contract/tests/src/methods/SendContractMethodTest.js @@ -1,3 +1,4 @@ +import {formatters} from 'web3-core-helpers'; import {EthSendTransactionMethod} from 'web3-core-method'; import AbiModel from '../../../src/models/AbiModel'; import AllEventsLogDecoder from '../../../src/decoders/AllEventsLogDecoder'; @@ -7,6 +8,7 @@ import SendContractMethod from '../../../src/methods/SendContractMethod'; jest.mock('../../../src/decoders/AllEventsLogDecoder'); jest.mock('../../../src/models/AbiItemModel'); jest.mock('../../../src/models/AbiModel'); +jest.mock('web3-core-helpers'); /** * SendContractMethod test @@ -21,7 +23,7 @@ describe('SendContractMethodTest', () => { new AllEventsLogDecoder(); allEventsLogDecoderMock = AllEventsLogDecoder.mock.instances[0]; - sendContractMethod = new SendContractMethod({}, {}, {}, {}, {}, {}, allEventsLogDecoderMock, abiModelMock); + sendContractMethod = new SendContractMethod({}, formatters, {}, {}, {}, {}, allEventsLogDecoderMock, abiModelMock); }); it('constructor check', () => { @@ -58,11 +60,28 @@ describe('SendContractMethodTest', () => { allEventsLogDecoderMock.decode.mockReturnValueOnce({event: 'MyEvent'}); + formatters.outputTransactionFormatter.mockReturnValueOnce({ + events: { + 0: {event: true}, + MyEvent: [ + { + event: 'MyEvent' + }, + { + event: 'MyEvent' + }, + { + event: 'MyEvent' + } + ] + } + }); + const mappedResponse = sendContractMethod.afterExecution(response); expect(mappedResponse).toEqual({ events: { - 0: {event: false}, + 0: {event: true}, MyEvent: [ { event: 'MyEvent' @@ -84,5 +103,22 @@ describe('SendContractMethodTest', () => { expect(allEventsLogDecoderMock.decode).toHaveBeenNthCalledWith(3, abiModelMock, {event: 'MyEvent'}); expect(allEventsLogDecoderMock.decode).toHaveBeenNthCalledWith(4, abiModelMock, {event: 'MyEvent'}); + + expect(formatters.outputTransactionFormatter).toHaveBeenCalledWith({ + events: { + 0: {event: false}, + MyEvent: [ + { + event: 'MyEvent' + }, + { + event: 'MyEvent' + }, + { + event: 'MyEvent' + } + ] + } + }); }); }); diff --git a/packages/web3-utils/src/index.js b/packages/web3-utils/src/index.js index 70508302..12c3ba33 100644 --- a/packages/web3-utils/src/index.js +++ b/packages/web3-utils/src/index.js @@ -195,7 +195,7 @@ export const fromWei = (number, unit) => { unit = getUnitValue(unit); if (!utils.isBN(number) && !isString(number)) { - throw new Error('Please pass numbers as strings or BigNumber objects to avoid precision errors.'); + throw new Error('Please pass numbers as strings or BN objects to avoid precision errors.'); } return utils.isBN(number) ? ethjsUnit.fromWei(number, unit) : ethjsUnit.fromWei(number, unit).toString(10); @@ -229,7 +229,7 @@ export const toWei = (number, unit) => { unit = getUnitValue(unit); if (!utils.isBN(number) && !isString(number)) { - throw new Error('Please pass numbers as strings or BigNumber objects to avoid precision errors.'); + throw new Error('Please pass numbers as strings or BN objects to avoid precision errors.'); } return utils.isBN(number) ? ethjsUnit.toWei(number, unit) : ethjsUnit.toWei(number, unit).toString(10); diff --git a/packages/web3-utils/tests/src/UtilsTest.js b/packages/web3-utils/tests/src/UtilsTest.js index 11ea3416..797b0f11 100644 --- a/packages/web3-utils/tests/src/UtilsTest.js +++ b/packages/web3-utils/tests/src/UtilsTest.js @@ -461,7 +461,7 @@ describe('UtilsTest', () => { expect(() => { toWei(1, 'wei'); - }).toThrow('Please pass numbers as strings or BigNumber objects to avoid precision errors.'); + }).toThrow('Please pass numbers as strings or BN objects to avoid precision errors.'); }); it('calls utf8ToHex and returns the expected results', () => {