diff --git a/build.gradle b/build.gradle index 9d1e81913..9ebfba478 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ ext { webankJavaCryptoVersion = "1.0.3" junitVersion = '4.13.2' commonsCollections4Version = "4.4" - bcosSdkJniVersion = "3.6.0" + bcosSdkJniVersion = "3.7.0-SNAPSHOT" slf4jApiVerison = '1.7.36' mockitoVersion = '4.8.0' gsonVersion = '2.10.1' @@ -35,7 +35,7 @@ ext { // integrationTest.mustRunAfter test allprojects { group = 'org.fisco-bcos.java-sdk' - version = '3.6.0' + version = '3.7.0-SNAPSHOT' apply plugin: 'maven-publish' apply plugin: 'idea' diff --git a/src/integration-test/java/org/fisco/bcos/sdk/v3/test/transaction/decoder/HashCalculatorTest.java b/src/integration-test/java/org/fisco/bcos/sdk/v3/test/transaction/decoder/HashCalculatorTest.java index f0e654cf8..9c20f8b78 100644 --- a/src/integration-test/java/org/fisco/bcos/sdk/v3/test/transaction/decoder/HashCalculatorTest.java +++ b/src/integration-test/java/org/fisco/bcos/sdk/v3/test/transaction/decoder/HashCalculatorTest.java @@ -116,7 +116,7 @@ public void testTxHashCalculate() throws IOException { // abi byteArrayOutputStream.write(abi.getBytes()); - if (transactionResponse.getVersion() == TransactionVersion.V1.getValue()) { + if (transactionResponse.getVersion() >= TransactionVersion.V1.getValue()) { byteArrayOutputStream.write(transactionResponse.getValue().getBytes()); byteArrayOutputStream.write(transactionResponse.getGasPrice().getBytes()); byteArrayOutputStream.write( @@ -125,6 +125,10 @@ public void testTxHashCalculate() throws IOException { byteArrayOutputStream.write(transactionResponse.getMaxPriorityFeePerGas().getBytes()); } + if(transactionResponse.getVersion() >= TransactionVersion.V2.getValue()){ + byteArrayOutputStream.write(transactionResponse.getExtension()); + } + String hash = ""; if (client.getCryptoSuite().cryptoTypeConfig == CryptoType.ECDSA_TYPE) { hash = Keccak256.calculateHash(byteArrayOutputStream.toByteArray()); diff --git a/src/main/java/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.java b/src/main/java/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.java index 40ffa3f93..1586107eb 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.java @@ -29,6 +29,7 @@ import org.fisco.bcos.sdk.jni.utilities.tx.TransactionBuilderV1JniObj; import org.fisco.bcos.sdk.jni.utilities.tx.TransactionData; import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV1; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV2; import org.fisco.bcos.sdk.jni.utilities.tx.TransactionStructBuilderJniObj; import org.fisco.bcos.sdk.jni.utilities.tx.TransactionVersion; import org.fisco.bcos.sdk.v3.client.exceptions.ClientException; @@ -68,6 +69,9 @@ public class JsonTransactionResponse { private String maxFeePerGas = ""; private String maxPriorityFeePerGas = ""; + // Fields of v2 transaction + private byte[] extension = null; + public JsonTransactionResponse() {} public String getAbi() { @@ -232,6 +236,14 @@ public void setMaxPriorityFeePerGas(String maxPriorityFeePerGas) { this.maxPriorityFeePerGas = maxPriorityFeePerGas; } + public byte[] getExtension() { + return extension; + } + + public void setExtension(byte[] extension) { + this.extension = extension; + } + /** * This method is not correct, only can decode from method {@link #writeToHexString()}, which * not enable to send transaction to blockchain. @@ -304,6 +316,24 @@ public String calculateHash(CryptoSuite cryptoSuite) throws ClientException { */ public String calculateHash(int cryptoSuiteType) throws ClientException { try { + // FIXME: core dump in here + // return TransactionStructBuilderJniObj.calcTransactionDataStructHash( + // cryptoSuiteType, + // new TransactionDataV2() + // .buildExtension(getExtension()) + // .buildValue(getValue()) + // .buildGasPrice(getGasPrice()) + // .buildGasLimit(getGasLimit()) + // .buildMaxFeePerGas(getMaxFeePerGas()) + // .buildMaxPriorityFeePerGas(getMaxPriorityFeePerGas()) + // .buildVersion(getVersion()) + // .buildGroupId(getGroupID()) + // .buildChainId(getChainID()) + // .buildTo(getTo()) + // .buildNonce(new String(Hex.decode(getNonce()))) + // .buildInput(Hex.decode(getInput())) + // .buildAbi(getAbi()) + // .buildBlockLimit(getBlockLimit())); return TransactionBuilderV1JniObj.calcTransactionDataHashWithFullFields( cryptoSuiteType, (getVersion() == 0 ? TransactionVersion.V0 : TransactionVersion.V1), @@ -371,19 +401,24 @@ public byte[] encodeTransactionData() throws IOException { // abi byteArrayOutputStream.write(getAbi().getBytes()); - if (getVersion() == TransactionVersion.V1.getValue()) { + if (getVersion() >= TransactionVersion.V1.getValue()) { byteArrayOutputStream.write(getValue().getBytes()); byteArrayOutputStream.write(getGasPrice().getBytes()); byteArrayOutputStream.write(toBytesPadded(BigInteger.valueOf(getGasLimit()), 8)); byteArrayOutputStream.write(getMaxFeePerGas().getBytes()); byteArrayOutputStream.write(getMaxPriorityFeePerGas().getBytes()); } + + if (getVersion() >= TransactionVersion.V2.getValue()) { + byteArrayOutputStream.write(getExtension()); + } + return byteArrayOutputStream.toByteArray(); } public static JsonTransactionResponse decodeTransaction(String hexString) throws JniException { Transaction transactionV1 = - TransactionStructBuilderJniObj.decodeTransactionStructV1(hexString); + TransactionStructBuilderJniObj.decodeTransactionStructV2(hexString); TransactionData transactionData = transactionV1.getTransactionData(); JsonTransactionResponse jsonTransactionResponse = new JsonTransactionResponse(); jsonTransactionResponse.setVersion(transactionData.getVersion()); @@ -404,8 +439,7 @@ public static JsonTransactionResponse decodeTransaction(String hexString) throws Hex.toHexStringWithPrefixNullable(transactionV1.getSignature(), "")); jsonTransactionResponse.setImportTime(transactionV1.getImportTime()); - if (transactionData instanceof TransactionDataV1 - && transactionData.getVersion() == TransactionVersion.V1.getValue()) { + if (transactionData.getVersion() >= TransactionVersion.V1.getValue()) { TransactionDataV1 transactionDataV1 = (TransactionDataV1) transactionData; jsonTransactionResponse.setValue(transactionDataV1.getValue()); jsonTransactionResponse.setGasPrice(transactionDataV1.getGasPrice()); @@ -414,6 +448,11 @@ public static JsonTransactionResponse decodeTransaction(String hexString) throws jsonTransactionResponse.setMaxPriorityFeePerGas( transactionDataV1.getMaxPriorityFeePerGas()); } + + if (transactionData.getVersion() >= TransactionVersion.V2.getValue()) { + TransactionDataV2 transactionDataV2 = (TransactionDataV2) transactionData; + jsonTransactionResponse.setExtension(transactionDataV2.getExtension()); + } return jsonTransactionResponse; } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/contract/Contract.java b/src/main/java/org/fisco/bcos/sdk/v3/contract/Contract.java index 4e8e0a438..2b7694956 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/contract/Contract.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/contract/Contract.java @@ -56,7 +56,10 @@ import org.fisco.bcos.sdk.v3.transaction.codec.decode.ReceiptParser; import org.fisco.bcos.sdk.v3.transaction.manager.TransactionProcessor; import org.fisco.bcos.sdk.v3.transaction.manager.TransactionProcessorFactory; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.DefaultTransactionManager; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.TransactionManager; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils.TransactionRequestBuilder; import org.fisco.bcos.sdk.v3.transaction.model.dto.CallRequest; import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; import org.slf4j.Logger; @@ -560,6 +563,31 @@ protected String asyncExecuteTransaction(Function function, TransactionCallback function.getValue()); } + protected String asyncExecuteTransaction( + ContractWrapper contractWrapper, TransactionCallback callback) { + try { + TransactionManager txManager = this.transactionManager; + if (txManager == null) { + txManager = new DefaultTransactionManager(client); + } + AbiEncodedRequest abiEncodedRequest = + new TransactionRequestBuilder() + .setNonce(contractWrapper.getNonce()) + .setBlockLimit(contractWrapper.getBlockLimit()) + .setExtension(contractWrapper.getExtension()) + .setValue( + contractWrapper.getValue() != null + ? contractWrapper.getValue().toBigIntegerExact() + : null) + .buildAbiEncodedRequest( + this.functionEncoder.encode(contractWrapper.getFunction())); + return txManager.asyncSendTransaction(abiEncodedRequest, callback); + } catch (JniException | ContractException e) { + logger.error("sendTransaction failed, error info: {}", e.getMessage(), e); + } + return null; + } + protected TransactionReceipt executeTransaction(Function function) { if (transactionManager != null) { @@ -586,6 +614,31 @@ protected TransactionReceipt executeTransaction(Function function) { txAttribute); } + protected TransactionReceipt executeTransaction(ContractWrapper contractWrapper) { + TransactionManager txManager = this.transactionManager; + if (txManager == null) { + txManager = new DefaultTransactionManager(client); + } + TransactionReceipt transactionReceipt = null; + try { + AbiEncodedRequest abiEncodedRequest = + new TransactionRequestBuilder() + .setNonce(contractWrapper.getNonce()) + .setBlockLimit(contractWrapper.getBlockLimit()) + .setExtension(contractWrapper.getExtension()) + .setValue( + contractWrapper.getValue() != null + ? contractWrapper.getValue().toBigIntegerExact() + : null) + .buildAbiEncodedRequest( + this.functionEncoder.encode(contractWrapper.getFunction())); + transactionReceipt = txManager.sendTransaction(abiEncodedRequest); + } catch (JniException | ContractException e) { + logger.error("sendTransaction failed, error info: {}", e.getMessage(), e); + } + return transactionReceipt; + } + protected TransactionReceipt executeDeployTransaction(byte[] data, String abi) { if (transactionManager != null) { diff --git a/src/main/java/org/fisco/bcos/sdk/v3/contract/ContractWrapper.java b/src/main/java/org/fisco/bcos/sdk/v3/contract/ContractWrapper.java new file mode 100644 index 000000000..89794df3d --- /dev/null +++ b/src/main/java/org/fisco/bcos/sdk/v3/contract/ContractWrapper.java @@ -0,0 +1,78 @@ +package org.fisco.bcos.sdk.v3.contract; + +import java.math.BigDecimal; +import java.math.BigInteger; +import org.fisco.bcos.sdk.v3.codec.datatypes.Function; +import org.fisco.bcos.sdk.v3.model.TransactionReceipt; +import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback; + +public class ContractWrapper { + private final Contract contract; + private Function function; + private String nonce; + private BigInteger blockLimit; + private BigDecimal value; + private byte[] extension; + + public ContractWrapper(Contract contract) { + this.contract = contract; + } + + public ContractWrapper(Contract contract, Function function) { + this.contract = contract; + this.function = function; + } + + public Function getFunction() { + return function; + } + + public ContractWrapper setFunction(Function function) { + this.function = function; + return this; + } + + public String getNonce() { + return nonce; + } + + public ContractWrapper setNonce(String nonce) { + this.nonce = nonce; + return this; + } + + public BigInteger getBlockLimit() { + return blockLimit; + } + + public ContractWrapper setBlockLimit(BigInteger blockLimit) { + this.blockLimit = blockLimit; + return this; + } + + public BigDecimal getValue() { + return value; + } + + public ContractWrapper setValue(BigDecimal value) { + this.value = value; + return this; + } + + public byte[] getExtension() { + return extension; + } + + public ContractWrapper setExtension(byte[] extension) { + this.extension = extension; + return this; + } + + public TransactionReceipt send() { + return contract.executeTransaction(this); + } + + public String asyncSend(TransactionCallback callback) { + return contract.asyncExecuteTransaction(this, callback); + } +} diff --git a/src/main/java/org/fisco/bcos/sdk/v3/model/TransactionReceipt.java b/src/main/java/org/fisco/bcos/sdk/v3/model/TransactionReceipt.java index 99a13fd4d..9538b2469 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/model/TransactionReceipt.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/model/TransactionReceipt.java @@ -368,7 +368,7 @@ public byte[] encodeTransactionReceipt() throws IOException { byteArrayOutputStream.write(getContractAddress().getBytes()); byteArrayOutputStream.write(toBytesPadded(BigInteger.valueOf(getStatus()), 4)); byteArrayOutputStream.write(getOutput().getBytes()); - if (getVersion() == TransactionVersion.V1.getValue()) { + if (getVersion() >= TransactionVersion.V1.getValue()) { byteArrayOutputStream.write(getEffectiveGasPrice().getBytes()); } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.java index 9ac2d592e..accf9d254 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.java @@ -3,7 +3,13 @@ import java.io.ByteArrayOutputStream; import java.math.BigInteger; import org.fisco.bcos.sdk.jni.common.JniException; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionBuilderJniObj; import org.fisco.bcos.sdk.jni.utilities.tx.TransactionBuilderV1JniObj; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionData; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV1; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV2; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionStructBuilderJniObj; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionVersion; import org.fisco.bcos.sdk.jni.utilities.tx.TxPair; import org.fisco.bcos.sdk.v3.client.Client; import org.fisco.bcos.sdk.v3.client.protocol.model.TransactionAttribute; @@ -134,28 +140,13 @@ public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniExcep request.getBlockLimit() == null ? getNonceProvider().getBlockLimit(client) : request.getBlockLimit(); + EIP1559Struct eip1559Struct = null; if (getGasProvider().isEIP1559Enabled() || request.isEIP1559Enabled()) { - EIP1559Struct eip1559Struct = + eip1559Struct = request.getEip1559Struct() == null ? getGasProvider().getEIP1559Struct(methodId) : request.getEip1559Struct(); - return TransactionBuilderV1JniObj.createSignedEIP1559TransactionWithFullFields( - client.getCryptoSuite().getCryptoKeyPair().getJniKeyPair(), - client.getGroup(), - client.getChainId(), - request.getTo(), - nonce, - request.getEncodedData(), - request.isCreate() ? request.getAbi() : "", - blockLimit.longValue(), - Numeric.toHexString(request.getValue()), - Numeric.toHexString(eip1559Struct.getMaxFeePerGas()), - Numeric.toHexString(eip1559Struct.getMaxPriorityFeePerGas()), - eip1559Struct.getGasLimit().longValue(), - transactionAttribute, - client.getExtraData()); } - BigInteger gasPrice = request.getGasPrice() == null ? getGasProvider().getGasPrice(methodId) @@ -164,20 +155,55 @@ public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniExcep request.getGasLimit() == null ? getGasProvider().getGasLimit(methodId) : request.getGasLimit(); - return TransactionBuilderV1JniObj.createSignedTransactionWithFullFields( - client.getCryptoSuite().getCryptoKeyPair().getJniKeyPair(), - client.getGroup(), - client.getChainId(), - request.getTo(), - nonce, - request.getEncodedData(), - request.isCreate() ? request.getAbi() : "", - blockLimit.longValue(), - Numeric.toHexString(request.getValue()), - Numeric.toHexString(gasPrice), - gasLimit.longValue(), - transactionAttribute, - client.getExtraData()); + + TransactionData transactionData = + new TransactionData() + .buildGroupId(client.getGroup()) + .buildChainId(client.getChainId()) + .buildTo(request.getTo()) + .buildNonce(nonce) + .buildInput(request.getEncodedData()) + .buildAbi(request.isCreate() ? request.getAbi() : "") + .buildBlockLimit(blockLimit.longValue()); + if (request.getVersion().getValue() >= TransactionVersion.V1.getValue()) { + transactionData = + new TransactionDataV1(transactionData) + .buildGasLimit(gasLimit.longValue()) + .buildGasPrice( + eip1559Struct == null ? Numeric.toHexString(gasPrice) : "") + .buildValue(Numeric.toHexString(request.getValue())) + .buildMaxFeePerGas( + eip1559Struct == null + ? "" + : Numeric.toHexString(eip1559Struct.getMaxFeePerGas())) + .buildMaxPriorityFeePerGas( + eip1559Struct == null + ? "" + : Numeric.toHexString( + eip1559Struct.getMaxPriorityFeePerGas())); + } + if (request.getVersion().getValue() >= TransactionVersion.V2.getValue()) { + transactionData = + new TransactionDataV2((TransactionDataV1) transactionData) + .buildExtension(request.getExtension()); + } + String transactionDataHash = + TransactionStructBuilderJniObj.calcTransactionDataStructHash( + client.getCryptoSuite().getCryptoTypeConfig(), transactionData); + + String signature = + TransactionBuilderJniObj.signTransactionDataHash( + client.getCryptoSuite().getCryptoKeyPair().getJniKeyPair(), + transactionDataHash); + + String encodedTransaction = + TransactionStructBuilderJniObj.createEncodedTransaction( + transactionData, + signature, + transactionDataHash, + transactionAttribute, + client.getExtraData()); + return new TxPair(transactionDataHash, encodedTransaction); } /** diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/ProxySignTransactionManager.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/ProxySignTransactionManager.java index f05b32971..2957f19de 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/ProxySignTransactionManager.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/ProxySignTransactionManager.java @@ -6,6 +6,10 @@ import java.util.concurrent.TimeUnit; import org.fisco.bcos.sdk.jni.common.JniException; import org.fisco.bcos.sdk.jni.utilities.tx.TransactionBuilderV1JniObj; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionData; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV1; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV2; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionStructBuilderJniObj; import org.fisco.bcos.sdk.jni.utilities.tx.TransactionVersion; import org.fisco.bcos.sdk.jni.utilities.tx.TxPair; import org.fisco.bcos.sdk.v3.client.Client; @@ -172,26 +176,42 @@ public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniExcep ? getGasProvider().getGasLimit(methodId) : request.getGasLimit(); + TransactionData transactionData = + new TransactionData() + .buildGroupId(client.getGroup()) + .buildChainId(client.getChainId()) + .buildTo(request.getTo()) + .buildNonce(nonce) + .buildInput(request.getEncodedData()) + .buildAbi(request.isCreate() ? request.getAbi() : "") + .buildBlockLimit(blockLimit.longValue()); + + if (request.getVersion().getValue() >= TransactionVersion.V1.getValue()) { + transactionData = + new TransactionDataV1(transactionData) + .buildGasLimit(gasLimit.longValue()) + .buildGasPrice( + eip1559Struct == null ? Numeric.toHexString(gasPrice) : "") + .buildValue(Numeric.toHexString(request.getValue())) + .buildMaxFeePerGas( + eip1559Struct == null + ? "" + : Numeric.toHexString(eip1559Struct.getMaxFeePerGas())) + .buildMaxPriorityFeePerGas( + eip1559Struct == null + ? "" + : Numeric.toHexString( + eip1559Struct.getMaxPriorityFeePerGas())); + } + if (request.getVersion().getValue() >= TransactionVersion.V2.getValue()) { + transactionData = + new TransactionDataV2((TransactionDataV1) transactionData) + .buildExtension(request.getExtension()); + } String dataHash = - TransactionBuilderV1JniObj.calcTransactionDataHashWithFullFields( - cryptoType, - TransactionVersion.V1, - client.getGroup(), - client.getChainId(), - request.getTo(), - nonce, - request.getEncodedData(), - request.isCreate() ? request.getAbi() : "", - blockLimit.longValue(), - Numeric.toHexString(request.getValue()), - eip1559Struct == null ? Numeric.toHexString(gasPrice) : "", - gasLimit.longValue(), - eip1559Struct == null - ? "" - : Numeric.toHexString(eip1559Struct.getMaxFeePerGas()), - eip1559Struct == null - ? "" - : Numeric.toHexString(eip1559Struct.getMaxPriorityFeePerGas())); + TransactionStructBuilderJniObj.calcTransactionDataStructHash( + cryptoType, transactionData); + CompletableFuture signFuture = new CompletableFuture<>(); SignatureResult signatureResult; try { @@ -210,26 +230,10 @@ public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniExcep throw new JniException("Sign transaction failed, error message: " + e.getMessage()); } String signedTransactionWithSignature = - TransactionBuilderV1JniObj.createSignedTransactionWithSignature( - signatureResult.encode(), + TransactionStructBuilderJniObj.createEncodedTransaction( + transactionData, + Hex.toHexString(signatureResult.encode()), dataHash, - TransactionVersion.V1, - client.getGroup(), - client.getChainId(), - request.getTo(), - nonce, - request.getEncodedData(), - request.isCreate() ? request.getAbi() : "", - blockLimit.longValue(), - Numeric.toHexString(request.getValue()), - eip1559Struct == null ? Numeric.toHexString(gasPrice) : "", - gasLimit.longValue(), - eip1559Struct == null - ? "" - : Numeric.toHexString(eip1559Struct.getMaxFeePerGas()), - eip1559Struct == null - ? "" - : Numeric.toHexString(eip1559Struct.getMaxPriorityFeePerGas()), transactionAttribute, client.getExtraData()); return new TxPair(dataHash, signedTransactionWithSignature); diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicRequest.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicRequest.java index f4c32d450..aa6f357cb 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicRequest.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicRequest.java @@ -1,10 +1,12 @@ package org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto; import java.math.BigInteger; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionVersion; import org.fisco.bcos.sdk.v3.transaction.gasProvider.EIP1559Struct; public class BasicRequest { + protected TransactionVersion version = TransactionVersion.V0; protected String abi; protected String method; protected BigInteger blockLimit; @@ -110,6 +112,14 @@ public void setExtension(byte[] extension) { this.extension = extension; } + public TransactionVersion getVersion() { + return version; + } + + public void setVersion(TransactionVersion version) { + this.version = version; + } + public boolean isTransactionEssentialSatisfy() { return abi != null && method != null && to != null; } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/TransactionRequestBuilder.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/TransactionRequestBuilder.java index a490bee1a..d55ffaebf 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/TransactionRequestBuilder.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/TransactionRequestBuilder.java @@ -2,6 +2,7 @@ import java.math.BigInteger; import java.util.List; +import org.fisco.bcos.sdk.jni.utilities.tx.TransactionVersion; import org.fisco.bcos.sdk.v3.transaction.gasProvider.EIP1559Struct; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.DeployTransactionRequest; @@ -11,6 +12,8 @@ import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; public class TransactionRequestBuilder { + + private TransactionVersion version; private String abi; private String method; private String to; @@ -23,6 +26,8 @@ public class TransactionRequestBuilder { private EIP1559Struct eip1559Struct; private byte[] extension = null; + public TransactionRequestBuilder() {} + public TransactionRequestBuilder(String abi, String method, String to) { this.abi = abi; this.method = method; @@ -39,6 +44,11 @@ public TransactionRequestBuilder setMethod(String method) { return this; } + public TransactionRequestBuilder setAbi(String abi) { + this.abi = abi; + return this; + } + public TransactionRequestBuilder setTo(String to) { this.to = to; return this; @@ -56,26 +66,31 @@ public TransactionRequestBuilder setNonce(String nonce) { public TransactionRequestBuilder setValue(BigInteger value) { this.value = value; + if (value != null) this.version = TransactionVersion.V1; return this; } public TransactionRequestBuilder setGasPrice(BigInteger gasPrice) { this.gasPrice = gasPrice; + if (gasPrice != null) this.version = TransactionVersion.V1; return this; } public TransactionRequestBuilder setGasLimit(BigInteger gasLimit) { this.gasLimit = gasLimit; + if (gasLimit != null) this.version = TransactionVersion.V1; return this; } public TransactionRequestBuilder setEIP1559Struct(EIP1559Struct eip1559Struct) { this.eip1559Struct = eip1559Struct; + if (eip1559Struct != null) this.version = TransactionVersion.V1; return this; } public TransactionRequestBuilder setExtension(byte[] extension) { this.extension = extension; + if (extension != null && extension.length > 0) this.version = TransactionVersion.V2; return this; } @@ -100,6 +115,7 @@ public TransactionRequest buildRequest(List params) throws ContractExcep this.gasLimit, this.eip1559Struct, this.extension); + sendTransactionRequest.setVersion(version); sendTransactionRequest.setParams(params); return sendTransactionRequest; } @@ -121,6 +137,7 @@ public TransactionRequestWithStringParams buildStringParamsRequest(List this.gasLimit, this.eip1559Struct, this.extension); + request.setVersion(version); request.setStringParams(stringParams); return request; } @@ -148,6 +165,7 @@ public DeployTransactionRequest buildDeployRequest(List params) if (to != null) { request.setTo(to); } + request.setVersion(version); request.setParams(params); return request; } @@ -175,6 +193,7 @@ public DeployTransactionRequestWithStringParams buildDeployStringParamsRequest( if (to != null) { request.setTo(to); } + request.setVersion(version); request.setStringParams(stringParams); return request; } @@ -195,6 +214,7 @@ public AbiEncodedRequest buildAbiEncodedRequest(byte[] encodedParams) throws Con this.eip1559Struct, this.extension); abiEncodedDeployRequest.setEncodedData(encodedParams); + abiEncodedDeployRequest.setVersion(version); return abiEncodedDeployRequest; } }