Skip to content
This repository was archived by the owner on Mar 5, 2025. It is now read-only.

Commit 072a968

Browse files
Update formatTransaction to not delete data property (#6080)
* Remove deletion of data property in formatTransaction * Add input property to transaction sent in send_transaction integration tests * Update formatTransaction to add data property if only provided input and vice verse * Fix plugin unit tests * Update input/data logic in transaction builder * Add unit tests for coverage * Add test for coverage
1 parent 3006a57 commit 072a968

File tree

5 files changed

+55
-25
lines changed

5 files changed

+55
-25
lines changed

packages/web3-eth/src/utils/format_transaction.ts

+12-11
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,19 @@ export function formatTransaction<
4040

4141
formattedTransaction = format(options.transactionSchema, formattedTransaction, returnFormat);
4242

43-
if (
44-
!isNullish(formattedTransaction.data) &&
45-
!isNullish(formattedTransaction.input) &&
46-
formattedTransaction.data !== formattedTransaction.input
47-
)
48-
throw new TransactionDataAndInputError({
49-
data: bytesToHex(formattedTransaction.data),
50-
input: bytesToHex(formattedTransaction.input),
51-
});
52-
else if (!isNullish(formattedTransaction.data)) {
43+
if (!isNullish(formattedTransaction.data)) {
44+
if (
45+
!isNullish(formattedTransaction.input) &&
46+
formattedTransaction.data !== formattedTransaction.input
47+
)
48+
throw new TransactionDataAndInputError({
49+
data: bytesToHex(formattedTransaction.data),
50+
input: bytesToHex(formattedTransaction.input),
51+
});
52+
5353
formattedTransaction.input = formattedTransaction.data;
54-
delete formattedTransaction.data;
54+
} else if (!isNullish(formattedTransaction.input)) {
55+
formattedTransaction.data = formattedTransaction.input;
5556
}
5657

5758
if (!isNullish(formattedTransaction.gasLimit)) {

packages/web3-eth/src/utils/transaction_builder.ts

+20-12
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
TransactionDataAndInputError,
4545
UnableToPopulateNonceError,
4646
} from 'web3-errors';
47-
import { format } from 'web3-utils';
47+
import { bytesToHex, format } from 'web3-utils';
4848
import { NUMBER_DATA_FORMAT } from '../constants';
4949
// eslint-disable-next-line import/no-cycle
5050
import { getChainId, getTransactionCount } from '../rpc_method_wrappers';
@@ -158,20 +158,28 @@ export async function defaultTransactionBuilder<ReturnType = Transaction>(option
158158
populatedTransaction.value = '0x';
159159
}
160160

161-
if (!isNullish(populatedTransaction.data) && !isNullish(populatedTransaction.input)) {
162-
throw new TransactionDataAndInputError({
163-
data: populatedTransaction.data,
164-
input: populatedTransaction.input,
165-
});
166-
} else if (!isNullish(populatedTransaction.data)) {
161+
if (!isNullish(populatedTransaction.data)) {
162+
if (
163+
!isNullish(populatedTransaction.input) &&
164+
populatedTransaction.data !== populatedTransaction.input
165+
)
166+
throw new TransactionDataAndInputError({
167+
data: bytesToHex(populatedTransaction.data),
168+
input: bytesToHex(populatedTransaction.input),
169+
});
170+
171+
if (!populatedTransaction.data.startsWith('0x'))
172+
populatedTransaction.data = `0x${populatedTransaction.data}`;
173+
167174
populatedTransaction.input = populatedTransaction.data;
168-
delete populatedTransaction.data;
169-
}
175+
} else if (!isNullish(populatedTransaction.input)) {
176+
if (!populatedTransaction.input.startsWith('0x'))
177+
populatedTransaction.input = `0x${populatedTransaction.input}`;
170178

171-
if (isNullish(populatedTransaction.input) || populatedTransaction.input === '') {
179+
populatedTransaction.data = populatedTransaction.input;
180+
} else {
172181
populatedTransaction.input = '0x';
173-
} else if (!populatedTransaction.input.startsWith('0x')) {
174-
populatedTransaction.input = `0x${populatedTransaction.input}`;
182+
populatedTransaction.data = '0x';
175183
}
176184

177185
if (isNullish(populatedTransaction.common)) {

packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ describe('Web3Eth.sendTransaction', () => {
180180
const transaction: Transaction = {
181181
from: tempAcc.address,
182182
data: greeterContractDeploymentData,
183+
input: greeterContractDeploymentData,
183184
gas: BigInt('475520'),
184185
};
185186
const response = await web3Eth.sendTransaction(transaction);
@@ -203,6 +204,7 @@ describe('Web3Eth.sendTransaction', () => {
203204
from: tempAcc.address,
204205
to: greeterContractAddress,
205206
data: contractFunctionCall,
207+
input: contractFunctionCall,
206208
};
207209
const response = await web3Eth.sendTransaction(transaction);
208210
expect(response.status).toBe(BigInt(1));

packages/web3-eth/test/unit/default_transaction_builder.test.ts

+19-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { ethRpcMethods } from 'web3-rpc-methods';
2929

3030
import {
3131
Eip1559NotSupportedError,
32+
TransactionDataAndInputError,
3233
UnableToPopulateNonceError,
3334
UnsupportedTransactionTypeError,
3435
} from 'web3-errors';
@@ -210,28 +211,44 @@ describe('defaultTransactionBuilder', () => {
210211
});
211212
});
212213

213-
describe('should populate input', () => {
214+
describe('should populate input/data', () => {
214215
it('should populate with 0x', async () => {
215216
const input = { ...transaction };
216217
delete input.input;
218+
delete input.data;
217219

218220
const result = await defaultTransactionBuilder({
219221
transaction: input,
220222
web3Context,
221223
});
222224
expect(result.input).toBe('0x');
225+
expect(result.data).toBe('0x');
223226
});
224227

225228
it('should prefix with 0x', async () => {
226229
const input = { ...transaction };
227-
delete input.data;
228230
input.input = '123';
231+
input.data = '123';
229232

230233
const result = await defaultTransactionBuilder({
231234
transaction: input,
232235
web3Context,
233236
});
234237
expect(result.input).toBe('0x123');
238+
expect(result.data).toBe('0x123');
239+
});
240+
241+
it('should throw TransactionDataAndInputError', async () => {
242+
const input = { ...transaction };
243+
input.data = '0x3211';
244+
input.input = '0x1233';
245+
246+
await expect(
247+
defaultTransactionBuilder({
248+
transaction: input,
249+
web3Context,
250+
}),
251+
).rejects.toThrow(TransactionDataAndInputError);
235252
});
236253
});
237254

tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ describe('CustomRpcMethodsPlugin Tests', () => {
6969
params: [
7070
{
7171
input: '0x70a082310000000000000000000000008da5e39ec14b57fb9bcd9aa2b4500e909119795d',
72+
data: '0x70a082310000000000000000000000008da5e39ec14b57fb9bcd9aa2b4500e909119795d',
7273
to: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
7374
},
7475
'latest',
@@ -102,6 +103,7 @@ describe('CustomRpcMethodsPlugin Tests', () => {
102103
params: [
103104
{
104105
input: '0xa9059cbb0000000000000000000000004f641def1e7845caab95ac717c80416082430d0d000000000000000000000000000000000000000000000000000000000000002a',
106+
data: '0xa9059cbb0000000000000000000000004f641def1e7845caab95ac717c80416082430d0d000000000000000000000000000000000000000000000000000000000000002a',
105107
from: sender,
106108
gasPrice: expectedGasPrice,
107109
maxFeePerGas: undefined,

0 commit comments

Comments
 (0)