Skip to content

Commit bbd4847

Browse files
committed
code refractored and added eip1559 private tx class
Signed-off-by: Nischal Sharma <[email protected]>
1 parent 6b6f97b commit bbd4847

File tree

14 files changed

+414
-300
lines changed

14 files changed

+414
-300
lines changed

abi/src/main/java/org/web3j/abi/TypeDecoder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,8 @@ private static <T extends Type> T decodeDynamicParameterFromStruct(
565565
value = decodeDynamicStruct(dynamicElementData, 0, TypeReference.create(declaredField));
566566
} else if (DynamicArray.class.isAssignableFrom(declaredField)) {
567567
if (parameter == null) {
568-
throw new RuntimeException("parameter can not be null, try to use annotation @Parameterized to specify the parameter type");
568+
throw new RuntimeException(
569+
"parameter can not be null, try to use annotation @Parameterized to specify the parameter type");
569570
}
570571
value =
571572
(T)

besu/src/main/java/org/web3j/protocol/besu/privacy/OnChainPrivacyTransactionBuilder.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.web3j.abi.datatypes.generated.Bytes32;
2525
import org.web3j.crypto.Credentials;
2626
import org.web3j.protocol.eea.crypto.PrivateTransactionEncoder;
27-
import org.web3j.protocol.eea.crypto.RawPrivateTransaction;
27+
import org.web3j.protocol.eea.crypto.transaction.type.LegacyPrivateTransaction;
2828
import org.web3j.tx.gas.BesuPrivacyGasProvider;
2929
import org.web3j.utils.Base64String;
3030
import org.web3j.utils.Numeric;
@@ -87,8 +87,8 @@ public String buildOnChainPrivateTransaction(
8787
Base64String enclaveKey,
8888
final BigInteger nonce,
8989
String call) {
90-
RawPrivateTransaction rawTransaction =
91-
RawPrivateTransaction.createTransaction(
90+
LegacyPrivateTransaction rawTransaction =
91+
LegacyPrivateTransaction.createTransaction(
9292
nonce,
9393
gasProvider.getGasPrice(),
9494
gasProvider.getGasLimit(),

besu/src/main/java/org/web3j/tx/PrivateTransactionManager.java

+36-36
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.web3j.protocol.core.methods.response.EthGetCode;
2626
import org.web3j.protocol.core.methods.response.EthSendTransaction;
2727
import org.web3j.protocol.eea.crypto.PrivateTxSignServiceImpl;
28-
import org.web3j.protocol.eea.crypto.RawPrivateTransaction;
28+
import org.web3j.protocol.eea.crypto.transaction.type.LegacyPrivateTransaction;
2929
import org.web3j.service.TxSignService;
3030
import org.web3j.tx.response.TransactionReceiptProcessor;
3131
import org.web3j.utils.Base64String;
@@ -138,11 +138,11 @@ public EthSendTransaction sendTransaction(
138138
.send()
139139
.getTransactionCount();
140140

141-
final RawPrivateTransaction transaction;
141+
final LegacyPrivateTransaction transaction;
142142

143143
if (privateFor != null) {
144144
transaction =
145-
RawPrivateTransaction.createTransaction(
145+
LegacyPrivateTransaction.createTransaction(
146146
nonce,
147147
gasPrice,
148148
gasLimit,
@@ -153,7 +153,7 @@ public EthSendTransaction sendTransaction(
153153
restriction);
154154
} else {
155155
transaction =
156-
RawPrivateTransaction.createTransaction(
156+
LegacyPrivateTransaction.createTransaction(
157157
nonce,
158158
gasPrice,
159159
gasLimit,
@@ -183,36 +183,36 @@ public EthSendTransaction sendEIP1559Transaction(
183183
.send()
184184
.getTransactionCount();
185185

186-
final RawPrivateTransaction transaction;
187-
if (privateFor != null) {
188-
transaction =
189-
RawPrivateTransaction.createTransaction(
190-
chainId,
191-
nonce,
192-
maxPriorityFeePerGas,
193-
maxFeePerGas,
194-
gasLimit,
195-
to,
196-
data,
197-
privateFrom,
198-
privateFor,
199-
restriction);
200-
} else {
201-
transaction =
202-
RawPrivateTransaction.createTransaction(
203-
chainId,
204-
nonce,
205-
maxPriorityFeePerGas,
206-
maxFeePerGas,
207-
gasLimit,
208-
to,
209-
data,
210-
privateFrom,
211-
privacyGroupId,
212-
restriction);
213-
}
186+
final LegacyPrivateTransaction transaction;
187+
// if (privateFor != null) {
188+
// transaction =
189+
// RawPrivateTransaction.createTransaction(
190+
// chainId,
191+
// nonce,
192+
// maxPriorityFeePerGas,
193+
// maxFeePerGas,
194+
// gasLimit,
195+
// to,
196+
// data,
197+
// privateFrom,
198+
// privateFor,
199+
// restriction);
200+
// } else {
201+
// transaction =
202+
// RawPrivateTransaction.createTransaction(
203+
// chainId,
204+
// nonce,
205+
// maxPriorityFeePerGas,
206+
// maxFeePerGas,
207+
// gasLimit,
208+
// to,
209+
// data,
210+
// privateFrom,
211+
// privacyGroupId,
212+
// restriction);
213+
// }
214214

215-
return signAndSend(transaction);
215+
return signAndSend(null);
216216
}
217217

218218
@Override
@@ -239,20 +239,20 @@ public EthGetCode getCode(
239239
.send();
240240
}
241241

242-
public String sign(final RawPrivateTransaction rawTransaction) {
242+
public String sign(final LegacyPrivateTransaction rawTransaction) {
243243

244244
final byte[] signedMessage = txSignService.sign(rawTransaction, chainId);
245245

246246
return Numeric.toHexString(signedMessage);
247247
}
248248

249-
public EthSendTransaction signAndSend(final RawPrivateTransaction rawTransaction)
249+
public EthSendTransaction signAndSend(final LegacyPrivateTransaction rawTransaction)
250250
throws IOException {
251251
final String hexValue = sign(rawTransaction);
252252
return this.besu.eeaSendRawTransaction(hexValue).send();
253253
}
254254

255-
public PrivateEnclaveKey signAndDistribute(RawPrivateTransaction rawTransaction)
255+
public PrivateEnclaveKey signAndDistribute(LegacyPrivateTransaction rawTransaction)
256256
throws IOException {
257257
String hexValue = sign(rawTransaction);
258258
return this.besu.privDistributeRawTransaction(hexValue).send();

eea/src/main/java/org/web3j/protocol/eea/crypto/PrivateTransactionDecoder.java

+34-7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import org.web3j.crypto.RawTransaction;
1919
import org.web3j.crypto.SignedRawTransaction;
2020
import org.web3j.crypto.TransactionDecoder;
21+
import org.web3j.protocol.eea.crypto.transaction.type.LegacyPrivateTransaction;
22+
import org.web3j.protocol.eea.crypto.transaction.type.PrivateTransactionType;
2123
import org.web3j.rlp.RlpDecoder;
2224
import org.web3j.rlp.RlpList;
2325
import org.web3j.rlp.RlpString;
@@ -30,25 +32,50 @@
3032

3133
public class PrivateTransactionDecoder {
3234

33-
public static RawPrivateTransaction decode(final String hexTransaction) {
35+
public static LegacyPrivateTransaction decode(final String hexTransaction) {
3436
final byte[] transaction = Numeric.hexStringToByteArray(hexTransaction);
37+
final PrivateTransactionType transactionType = getPrivateTransactionType(transaction);
38+
39+
switch (transactionType) {
40+
case PRIVATE_LEGACY:
41+
return decodeLegacyPrivateTransaction(transaction);
42+
default:
43+
throw new IllegalArgumentException("Unsupported private transaction type.");
44+
}
45+
}
46+
47+
private static PrivateTransactionType getPrivateTransactionType(final byte[] transaction) {
48+
// Determine the type of the private transaction, similar to TransactionDecoder.
49+
byte firstByte = transaction[0];
50+
// if (firstByte == PrivateTransactionType.PRIVATE_LEGACY.getRlpType())
51+
// return PrivateTransactionType.PRIVATE_LEGACY;
52+
53+
// Return LEGACY as default, or throw an exception depending on your needs
54+
return PrivateTransactionType.PRIVATE_LEGACY;
55+
}
56+
57+
private static LegacyPrivateTransaction decodeLegacyPrivateTransaction(
58+
final byte[] transaction) {
3559
final RlpList rlpList = RlpDecoder.decode(transaction);
3660
final RlpList temp = (RlpList) rlpList.getValues().get(0);
3761
final List<RlpType> values = temp.getValues();
3862

39-
final RawTransaction rawTransaction = TransactionDecoder.decode(hexTransaction);
63+
final RawTransaction rawTransaction =
64+
TransactionDecoder.decode(Numeric.toHexString(transaction));
4065

4166
if (values.size() == 9) {
4267
final Base64String privateFrom = extractBase64(values.get(6));
4368
final Restriction restriction = extractRestriction(values.get(8));
69+
4470
if (values.get(7) instanceof RlpList) {
45-
return new RawPrivateTransaction(
46-
rawTransaction, privateFrom, extractBase64List(values.get(7)), restriction);
71+
List<Base64String> privateForList = extractBase64List(values.get(7));
72+
return new LegacyPrivateTransaction(
73+
rawTransaction, privateFrom, privateForList, null, restriction);
4774
} else {
48-
return new RawPrivateTransaction(
49-
rawTransaction, privateFrom, extractBase64(values.get(7)), restriction);
75+
Base64String privacyGroupId = extractBase64(values.get(7));
76+
return new LegacyPrivateTransaction(
77+
rawTransaction, privateFrom, null, privacyGroupId, restriction);
5078
}
51-
5279
} else {
5380
final Base64String privateFrom = extractBase64(values.get(9));
5481
final Restriction restriction = extractRestriction(values.get(11));

eea/src/main/java/org/web3j/protocol/eea/crypto/PrivateTransactionEncoder.java

+8-16
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,21 @@
1313
package org.web3j.protocol.eea.crypto;
1414

1515
import java.nio.ByteBuffer;
16-
import java.util.ArrayList;
1716
import java.util.List;
1817

1918
import org.web3j.crypto.Credentials;
2019
import org.web3j.crypto.Sign;
2120
import org.web3j.crypto.TransactionEncoder;
21+
import org.web3j.protocol.eea.crypto.transaction.type.LegacyPrivateTransaction;
2222
import org.web3j.rlp.RlpEncoder;
2323
import org.web3j.rlp.RlpList;
24-
import org.web3j.rlp.RlpString;
2524
import org.web3j.rlp.RlpType;
26-
import org.web3j.utils.Base64String;
2725

2826
/** Create signed RLP encoded private transaction. */
2927
public class PrivateTransactionEncoder {
3028

3129
public static byte[] signMessage(
32-
final RawPrivateTransaction rawTransaction, final Credentials credentials) {
30+
final LegacyPrivateTransaction rawTransaction, final Credentials credentials) {
3331
final byte[] encodedTransaction = encode(rawTransaction);
3432
final Sign.SignatureData signatureData =
3533
Sign.signMessage(encodedTransaction, credentials.getEcKeyPair());
@@ -38,7 +36,7 @@ public static byte[] signMessage(
3836
}
3937

4038
public static byte[] signMessage(
41-
final RawPrivateTransaction rawTransaction,
39+
final LegacyPrivateTransaction rawTransaction,
4240
final long chainId,
4341
final Credentials credentials) {
4442
final byte[] encodedTransaction = encode(rawTransaction, chainId);
@@ -50,19 +48,20 @@ public static byte[] signMessage(
5048
return encode(rawTransaction, eip155SignatureData);
5149
}
5250

53-
public static byte[] encode(final RawPrivateTransaction rawTransaction) {
51+
public static byte[] encode(final LegacyPrivateTransaction rawTransaction) {
5452
return encode(rawTransaction, null);
5553
}
5654

57-
public static byte[] encode(final RawPrivateTransaction rawTransaction, final long chainId) {
55+
public static byte[] encode(final LegacyPrivateTransaction rawTransaction, final long chainId) {
5856
final Sign.SignatureData signatureData =
5957
new Sign.SignatureData(longToBytes(chainId), new byte[] {}, new byte[] {});
6058
return encode(rawTransaction, signatureData);
6159
}
6260

6361
private static byte[] encode(
64-
final RawPrivateTransaction rawTransaction, final Sign.SignatureData signatureData) {
65-
final List<RlpType> values = asRlpValues(rawTransaction, signatureData);
62+
final LegacyPrivateTransaction rawTransaction, final Sign.SignatureData signatureData) {
63+
// final List<RlpType> values = asRlpValues(rawTransaction, signatureData);
64+
final List<RlpType> values = rawTransaction.asRlpValues(signatureData);
6665
final RlpList rlpList = new RlpList(values);
6766
return RlpEncoder.encode(rlpList);
6867
}
@@ -72,11 +71,4 @@ private static byte[] longToBytes(long x) {
7271
buffer.putLong(x);
7372
return buffer.array();
7473
}
75-
76-
public static List<RlpType> asRlpValues(
77-
final RawPrivateTransaction privateTransaction,
78-
final Sign.SignatureData signatureData) {
79-
80-
return privateTransaction.asRlpValues(signatureData);
81-
}
8274
}

eea/src/main/java/org/web3j/protocol/eea/crypto/PrivateTxSignServiceImpl.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import org.web3j.crypto.Credentials;
1616
import org.web3j.crypto.RawTransaction;
17+
import org.web3j.protocol.eea.crypto.transaction.type.LegacyPrivateTransaction;
1718
import org.web3j.service.TxSignService;
1819
import org.web3j.tx.ChainId;
1920

@@ -26,27 +27,25 @@ public PrivateTxSignServiceImpl(Credentials credentials) {
2627
this.credentials = credentials;
2728
}
2829

29-
@Override
30-
public byte[] sign(RawTransaction rawTransaction, long chainId) {
31-
if (!(rawTransaction instanceof RawPrivateTransaction)) {
32-
throw new RuntimeException("Can only sign RawPrivateTransaction");
30+
public byte[] sign(RawTransaction privateTransaction, long chainId) {
31+
if (!(privateTransaction instanceof LegacyPrivateTransaction)) {
32+
throw new RuntimeException("Can only sign LegacyPrivateTransaction");
3333
}
3434

3535
final byte[] signedMessage;
3636

3737
if (chainId > ChainId.NONE) {
3838
signedMessage =
3939
PrivateTransactionEncoder.signMessage(
40-
(RawPrivateTransaction) rawTransaction, chainId, credentials);
40+
(LegacyPrivateTransaction) privateTransaction, chainId, credentials);
4141
} else {
4242
signedMessage =
4343
PrivateTransactionEncoder.signMessage(
44-
(RawPrivateTransaction) rawTransaction, credentials);
44+
(LegacyPrivateTransaction) privateTransaction, credentials);
4545
}
4646
return signedMessage;
4747
}
4848

49-
@Override
5049
public String getAddress() {
5150
return credentials.getAddress();
5251
}

eea/src/main/java/org/web3j/protocol/eea/crypto/SignedRawPrivateTransaction.java

+14-12
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@
1818
import org.web3j.crypto.Sign;
1919
import org.web3j.crypto.SignatureDataOperations;
2020
import org.web3j.crypto.SignedRawTransaction;
21+
import org.web3j.protocol.eea.crypto.transaction.type.LegacyPrivateTransaction;
2122
import org.web3j.utils.Base64String;
2223
import org.web3j.utils.Restriction;
2324

24-
public class SignedRawPrivateTransaction extends RawPrivateTransaction
25+
public class SignedRawPrivateTransaction extends LegacyPrivateTransaction
2526
implements SignatureDataOperations {
2627

2728
private final Sign.SignatureData signatureData;
@@ -55,23 +56,24 @@ public SignedRawPrivateTransaction(
5556
final Base64String privateFrom,
5657
final List<Base64String> privateFor,
5758
final Restriction restriction) {
58-
this(signedRawTransaction, privateFrom, privateFor, null, restriction);
59+
this(
60+
signedRawTransaction.getNonce(),
61+
signedRawTransaction.getGasPrice(),
62+
signedRawTransaction.getGasLimit(),
63+
signedRawTransaction.getTo(),
64+
signedRawTransaction.getData(),
65+
signedRawTransaction.getSignatureData(),
66+
privateFrom,
67+
privateFor,
68+
null,
69+
restriction);
5970
}
6071

6172
public SignedRawPrivateTransaction(
6273
final SignedRawTransaction signedRawTransaction,
6374
final Base64String privateFrom,
6475
final Base64String privacyGroupId,
6576
final Restriction restriction) {
66-
this(signedRawTransaction, privateFrom, null, privacyGroupId, restriction);
67-
}
68-
69-
private SignedRawPrivateTransaction(
70-
final SignedRawTransaction signedRawTransaction,
71-
final Base64String privateFrom,
72-
final List<Base64String> privateFor,
73-
final Base64String privacyGroupId,
74-
final Restriction restriction) {
7577
this(
7678
signedRawTransaction.getNonce(),
7779
signedRawTransaction.getGasPrice(),
@@ -80,7 +82,7 @@ private SignedRawPrivateTransaction(
8082
signedRawTransaction.getData(),
8183
signedRawTransaction.getSignatureData(),
8284
privateFrom,
83-
privateFor,
85+
null,
8486
privacyGroupId,
8587
restriction);
8688
}

0 commit comments

Comments
 (0)