diff --git a/packages/web3-eth/src/utils/format_transaction.ts b/packages/web3-eth/src/utils/format_transaction.ts index d8447dcfde2..ac97f45b3a0 100644 --- a/packages/web3-eth/src/utils/format_transaction.ts +++ b/packages/web3-eth/src/utils/format_transaction.ts @@ -40,18 +40,19 @@ export function formatTransaction< formattedTransaction = format(options.transactionSchema, formattedTransaction, returnFormat); - if ( - !isNullish(formattedTransaction.data) && - !isNullish(formattedTransaction.input) && - formattedTransaction.data !== formattedTransaction.input - ) - throw new TransactionDataAndInputError({ - data: bytesToHex(formattedTransaction.data), - input: bytesToHex(formattedTransaction.input), - }); - else if (!isNullish(formattedTransaction.data)) { + if (!isNullish(formattedTransaction.data)) { + if ( + !isNullish(formattedTransaction.input) && + formattedTransaction.data !== formattedTransaction.input + ) + throw new TransactionDataAndInputError({ + data: bytesToHex(formattedTransaction.data), + input: bytesToHex(formattedTransaction.input), + }); + formattedTransaction.input = formattedTransaction.data; - delete formattedTransaction.data; + } else if (!isNullish(formattedTransaction.input)) { + formattedTransaction.data = formattedTransaction.input; } if (!isNullish(formattedTransaction.gasLimit)) { diff --git a/packages/web3-eth/src/utils/transaction_builder.ts b/packages/web3-eth/src/utils/transaction_builder.ts index 310a16fa401..eff5eb6a023 100644 --- a/packages/web3-eth/src/utils/transaction_builder.ts +++ b/packages/web3-eth/src/utils/transaction_builder.ts @@ -44,7 +44,7 @@ import { TransactionDataAndInputError, UnableToPopulateNonceError, } from 'web3-errors'; -import { format } from 'web3-utils'; +import { bytesToHex, format } from 'web3-utils'; import { NUMBER_DATA_FORMAT } from '../constants'; // eslint-disable-next-line import/no-cycle import { getChainId, getTransactionCount } from '../rpc_method_wrappers'; @@ -158,20 +158,28 @@ export async function defaultTransactionBuilder(option populatedTransaction.value = '0x'; } - if (!isNullish(populatedTransaction.data) && !isNullish(populatedTransaction.input)) { - throw new TransactionDataAndInputError({ - data: populatedTransaction.data, - input: populatedTransaction.input, - }); - } else if (!isNullish(populatedTransaction.data)) { + if (!isNullish(populatedTransaction.data)) { + if ( + !isNullish(populatedTransaction.input) && + populatedTransaction.data !== populatedTransaction.input + ) + throw new TransactionDataAndInputError({ + data: bytesToHex(populatedTransaction.data), + input: bytesToHex(populatedTransaction.input), + }); + + if (!populatedTransaction.data.startsWith('0x')) + populatedTransaction.data = `0x${populatedTransaction.data}`; + populatedTransaction.input = populatedTransaction.data; - delete populatedTransaction.data; - } + } else if (!isNullish(populatedTransaction.input)) { + if (!populatedTransaction.input.startsWith('0x')) + populatedTransaction.input = `0x${populatedTransaction.input}`; - if (isNullish(populatedTransaction.input) || populatedTransaction.input === '') { + populatedTransaction.data = populatedTransaction.input; + } else { populatedTransaction.input = '0x'; - } else if (!populatedTransaction.input.startsWith('0x')) { - populatedTransaction.input = `0x${populatedTransaction.input}`; + populatedTransaction.data = '0x'; } if (isNullish(populatedTransaction.common)) { diff --git a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts index 33271ae3101..4a208fb9795 100644 --- a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts +++ b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts @@ -180,6 +180,7 @@ describe('Web3Eth.sendTransaction', () => { const transaction: Transaction = { from: tempAcc.address, data: greeterContractDeploymentData, + input: greeterContractDeploymentData, gas: BigInt('475520'), }; const response = await web3Eth.sendTransaction(transaction); @@ -203,6 +204,7 @@ describe('Web3Eth.sendTransaction', () => { from: tempAcc.address, to: greeterContractAddress, data: contractFunctionCall, + input: contractFunctionCall, }; const response = await web3Eth.sendTransaction(transaction); expect(response.status).toBe(BigInt(1)); diff --git a/packages/web3-eth/test/unit/default_transaction_builder.test.ts b/packages/web3-eth/test/unit/default_transaction_builder.test.ts index a07eae51ee8..c4df9973786 100644 --- a/packages/web3-eth/test/unit/default_transaction_builder.test.ts +++ b/packages/web3-eth/test/unit/default_transaction_builder.test.ts @@ -29,6 +29,7 @@ import { ethRpcMethods } from 'web3-rpc-methods'; import { Eip1559NotSupportedError, + TransactionDataAndInputError, UnableToPopulateNonceError, UnsupportedTransactionTypeError, } from 'web3-errors'; @@ -210,28 +211,44 @@ describe('defaultTransactionBuilder', () => { }); }); - describe('should populate input', () => { + describe('should populate input/data', () => { it('should populate with 0x', async () => { const input = { ...transaction }; delete input.input; + delete input.data; const result = await defaultTransactionBuilder({ transaction: input, web3Context, }); expect(result.input).toBe('0x'); + expect(result.data).toBe('0x'); }); it('should prefix with 0x', async () => { const input = { ...transaction }; - delete input.data; input.input = '123'; + input.data = '123'; const result = await defaultTransactionBuilder({ transaction: input, web3Context, }); expect(result.input).toBe('0x123'); + expect(result.data).toBe('0x123'); + }); + + it('should throw TransactionDataAndInputError', async () => { + const input = { ...transaction }; + input.data = '0x3211'; + input.input = '0x1233'; + + await expect( + defaultTransactionBuilder({ + transaction: input, + web3Context, + }), + ).rejects.toThrow(TransactionDataAndInputError); }); }); diff --git a/tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts b/tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts index f5998f5ab1f..0351a695e53 100644 --- a/tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts +++ b/tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts @@ -69,6 +69,7 @@ describe('CustomRpcMethodsPlugin Tests', () => { params: [ { input: '0x70a082310000000000000000000000008da5e39ec14b57fb9bcd9aa2b4500e909119795d', + data: '0x70a082310000000000000000000000008da5e39ec14b57fb9bcd9aa2b4500e909119795d', to: '0xdAC17F958D2ee523a2206206994597C13D831ec7', }, 'latest', @@ -102,6 +103,7 @@ describe('CustomRpcMethodsPlugin Tests', () => { params: [ { input: '0xa9059cbb0000000000000000000000004f641def1e7845caab95ac717c80416082430d0d000000000000000000000000000000000000000000000000000000000000002a', + data: '0xa9059cbb0000000000000000000000004f641def1e7845caab95ac717c80416082430d0d000000000000000000000000000000000000000000000000000000000000002a', from: sender, gasPrice: expectedGasPrice, maxFeePerGas: undefined,