diff --git a/src/main/java/org/fisco/bcos/sdk/v3/codec/datatypes/Function.java b/src/main/java/org/fisco/bcos/sdk/v3/codec/datatypes/Function.java index 53db64cc6..9dd14e22d 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/codec/datatypes/Function.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/codec/datatypes/Function.java @@ -12,6 +12,8 @@ public class Function { private List> outputParameters; private int transactionAttribute = 0; private BigInteger value; + private String nonce; + private BigInteger blockLimit; public Function( String name, List inputParameters, List> outputParameters) { @@ -42,6 +44,19 @@ public Function( this.value = value; } + public Function( + String name, + List inputParameters, + List> outputParameters, + int transactionAttribute, + BigInteger value, + String nonce, + BigInteger blockLimit) { + this(name, inputParameters, outputParameters, transactionAttribute, value); + this.nonce = nonce; + this.blockLimit = blockLimit; + } + public Function() { this.name = ""; this.inputParameters = Collections.emptyList(); @@ -75,4 +90,20 @@ public BigInteger getValue() { public void setValue(BigInteger value) { this.value = value; } + + public String getNonce() { + return nonce; + } + + public void setNonce(String nonce) { + this.nonce = nonce; + } + + public BigInteger getBlockLimit() { + return blockLimit; + } + + public void setBlockLimit(BigInteger blockLimit) { + this.blockLimit = blockLimit; + } } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.java index f3fb8bd42..70de3ac0f 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.java @@ -14,4 +14,6 @@ public interface ContractGasProvider { boolean isEIP1559Enabled(); EIP1559Struct getEIP1559Struct(String methodId); + + EIP1559Struct getEIP1559Struct(byte[] methodId); } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.java index bc2017cb7..590248411 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.java @@ -48,4 +48,9 @@ public boolean isEIP1559Enabled() { public EIP1559Struct getEIP1559Struct(String methodId) { return new EIP1559Struct(maxFeePerGas, maxPriorityFeePerGas, gasLimit); } + + @Override + public EIP1559Struct getEIP1559Struct(byte[] methodId) { + return new EIP1559Struct(maxFeePerGas, maxPriorityFeePerGas, gasLimit); + } } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.java index e05410240..65677e01c 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.java @@ -40,4 +40,9 @@ public boolean isEIP1559Enabled() { public EIP1559Struct getEIP1559Struct(String methodId) { return new EIP1559Struct(BigInteger.ZERO, BigInteger.ZERO, gasLimit); } + + @Override + public EIP1559Struct getEIP1559Struct(byte[] methodId) { + return new EIP1559Struct(BigInteger.ZERO, BigInteger.ZERO, gasLimit); + } } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.java index 798b38686..a9708131b 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.java @@ -17,6 +17,7 @@ import org.fisco.bcos.sdk.v3.transaction.codec.decode.ReceiptParser; import org.fisco.bcos.sdk.v3.transaction.codec.decode.TransactionDecoderInterface; import org.fisco.bcos.sdk.v3.transaction.codec.decode.TransactionDecoderService; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.BasicDeployRequest; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.BasicRequest; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.DeployTransactionRequest; @@ -99,16 +100,10 @@ public TransactionResponse sendTransaction(BasicRequest request) } else { throw new ContractCodecException("Request type error, please check."); } + AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request); + abiEncodedRequest.setEncodedData(encodeMethod); - TransactionReceipt receipt = - transactionManager.sendTransaction( - request.getTo(), - encodeMethod, - request.getValue(), - request.getGasPrice(), - request.getGasLimit(), - request.getAbi(), - false); + TransactionReceipt receipt = transactionManager.sendTransaction(abiEncodedRequest); if (Objects.nonNull(receipt) && (Objects.isNull(receipt.getInput()) || receipt.getInput().isEmpty())) { receipt.setInput(Hex.toHexStringWithPrefix(encodeMethod)); @@ -155,15 +150,10 @@ public TransactionResponse deployContract(BasicDeployRequest request) } else { throw new ContractCodecException("DeployRequest type error, please check."); } - TransactionReceipt receipt = - transactionManager.sendTransaction( - request.getTo(), - encodeConstructor, - request.getValue(), - request.getGasPrice(), - request.getGasLimit(), - request.getAbi(), - true); + AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request); + abiEncodedRequest.setEncodedData(encodeConstructor); + abiEncodedRequest.setCreate(true); + TransactionReceipt receipt = transactionManager.sendTransaction(abiEncodedRequest); if (Objects.nonNull(receipt) && (Objects.isNull(receipt.getInput()) || receipt.getInput().isEmpty())) { receipt.setInput(Hex.toHexStringWithPrefix(encodeConstructor)); @@ -210,15 +200,9 @@ public String asyncSendTransaction(BasicRequest request, TransactionCallback cal } else { throw new ContractCodecException("Request type error, please check."); } - return transactionManager.asyncSendTransaction( - request.getTo(), - encodeMethod, - request.getValue(), - request.getGasPrice(), - request.getGasLimit(), - request.getAbi(), - false, - callback); + AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request); + abiEncodedRequest.setEncodedData(encodeMethod); + return transactionManager.asyncSendTransaction(abiEncodedRequest, callback); } /** @@ -260,15 +244,10 @@ public String asyncDeployContract(BasicDeployRequest request, TransactionCallbac } else { throw new ContractCodecException("DeployRequest type error, please check."); } - return transactionManager.asyncSendTransaction( - request.getTo(), - encodeConstructor, - request.getValue(), - request.getGasPrice(), - request.getGasLimit(), - request.getAbi(), - true, - callback); + AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request); + abiEncodedRequest.setEncodedData(encodeConstructor); + abiEncodedRequest.setCreate(true); + return transactionManager.asyncSendTransaction(abiEncodedRequest, callback); } /** 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 2879682db..9ac2d592e 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 @@ -62,6 +62,124 @@ public void setNonceProvider(NonceAndBlockLimitProvider nonceProvider) { this.nonceProvider = nonceProvider; } + /** + * This method is used to send transaction. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @return An instance of TxPair which contains the signed transaction and the transaction hash. + * @throws JniException If there is an error during the JNI operation. + */ + @Override + public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException { + String signedTransaction = createSignedTransaction(request).getSignedTx(); + BcosTransactionReceipt bcosTransactionReceipt = + client.sendTransaction(signedTransaction, false); + return bcosTransactionReceipt.getTransactionReceipt(); + } + + /** + * This method is used to send transaction asynchronously. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @param callback callback when transaction receipt is returned + * @return transaction data hash + * @throws JniException If there is an error during the JNI operation. + */ + @Override + public String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback) + throws JniException { + TxPair txPair = createSignedTransaction(request); + client.sendTransactionAsync(txPair.getSignedTx(), false, callback); + return txPair.getTxHash(); + } + + /** + * This method is used to create a signed transaction. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @return An instance of TxPair which contains the signed transaction and the transaction hash. + * @throws JniException If there is an error during the JNI operation. + */ + @Override + public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException { + if (!request.isTransactionEssentialSatisfy()) { + throw new JniException( + "Transaction essential fields are not satisfied: encodedData, to."); + } + int transactionAttribute; + if (client.isWASM()) { + transactionAttribute = TransactionAttribute.LIQUID_SCALE_CODEC; + if (request.isCreate()) { + transactionAttribute |= TransactionAttribute.LIQUID_CREATE; + } + } else { + transactionAttribute = TransactionAttribute.EVM_ABI_CODEC; + } + byte[] methodId = new byte[4]; + if (!request.isCreate() && (request.getEncodedData().length >= 4)) { + System.arraycopy(request.getEncodedData(), 0, methodId, 0, 4); + } + String nonce = + request.getNonce() == null ? getNonceProvider().getNonce() : request.getNonce(); + BigInteger blockLimit = + request.getBlockLimit() == null + ? getNonceProvider().getBlockLimit(client) + : request.getBlockLimit(); + if (getGasProvider().isEIP1559Enabled() || request.isEIP1559Enabled()) { + 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) + : request.getGasPrice(); + BigInteger gasLimit = + 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()); + } + /** * Send tx with abi field * @@ -152,14 +270,6 @@ public TransactionReceipt sendTransaction( return bcosTransactionReceipt.getTransactionReceipt(); } - @Override - public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException { - String signedTransaction = createSignedTransaction(request).getSignedTx(); - BcosTransactionReceipt bcosTransactionReceipt = - client.sendTransaction(signedTransaction, false); - return bcosTransactionReceipt.getTransactionReceipt(); - } - /** * This method is used to create a signed transaction. * @@ -213,55 +323,6 @@ public String createSignedTransaction( return txPair.getSignedTx(); } - @Override - public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException { - if (!request.isTransactionEssentialSatisfy()) { - throw new JniException( - "Transaction essential fields are not satisfied: encodedData, to."); - } - int transactionAttribute; - if (client.isWASM()) { - transactionAttribute = TransactionAttribute.LIQUID_SCALE_CODEC; - if (request.isCreate()) { - transactionAttribute |= TransactionAttribute.LIQUID_CREATE; - } - } else { - transactionAttribute = TransactionAttribute.EVM_ABI_CODEC; - } - byte[] methodId = new byte[4]; - if (!request.isCreate() && (request.getEncodedData().length >= 4)) { - System.arraycopy(request.getEncodedData(), 0, methodId, 0, 4); - } - String nonce = - request.getNonce() == null ? getNonceProvider().getNonce() : request.getNonce(); - BigInteger blockLimit = - request.getBlockLimit() == null - ? getNonceProvider().getBlockLimit(client) - : request.getBlockLimit(); - BigInteger gasPrice = - request.getGasPrice() == null - ? getGasProvider().getGasPrice(methodId) - : request.getGasPrice(); - BigInteger gasLimit = - 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()); - } - /** * Send tx with abi field asynchronously * @@ -391,14 +452,6 @@ public String asyncSendTransaction( return txPair.getTxHash(); } - @Override - public String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback) - throws JniException { - TxPair txPair = createSignedTransaction(request); - client.sendTransactionAsync(txPair.getSignedTx(), false, callback); - return txPair.getTxHash(); - } - /** * Send tx with EIP1559 * 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 0f6bea5ce..f05b32971 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 @@ -87,6 +87,154 @@ public void setAsyncTransactionSigner(AsyncTransactionSignercInterface asyncTxSi this.asyncTxSigner = asyncTxSigner; } + /** + * This method is used to send transaction. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @return An instance of TxPair which contains the signed transaction and the transaction hash. + * @throws JniException If there is an error during the JNI operation. + */ + @Override + public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException { + TxPair txPair = createSignedTransaction(request); + return client.sendTransaction(txPair.getSignedTx(), false).getTransactionReceipt(); + } + + /** + * This method is used to send transaction asynchronously. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @param callback callback when transaction receipt is returned + * @return transaction data hash + * @throws JniException If there is an error during the JNI operation. + */ + @Override + public String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback) + throws JniException { + TxPair txPair = createSignedTransaction(request); + client.sendTransactionAsync(txPair.getSignedTx(), false, callback); + return txPair.getTxHash(); + } + + /** + * This method is used to create a signed transaction. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @return An instance of TxPair which contains the signed transaction and the transaction hash. + * @throws JniException If there is an error during the JNI operation. + */ + @Override + public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException { + if (!request.isTransactionEssentialSatisfy()) { + throw new JniException("Transaction essential fields are not satisfied"); + } + int transactionAttribute; + if (client.isWASM()) { + transactionAttribute = TransactionAttribute.LIQUID_SCALE_CODEC; + if (request.isCreate()) { + transactionAttribute |= TransactionAttribute.LIQUID_CREATE; + } + } else { + transactionAttribute = TransactionAttribute.EVM_ABI_CODEC; + } + byte[] methodId = new byte[4]; + if (!request.isCreate() && (request.getEncodedData().length >= 4)) { + System.arraycopy(request.getEncodedData(), 0, methodId, 0, 4); + } + String nonce = + request.getNonce() == null ? getNonceProvider().getNonce() : request.getNonce(); + BigInteger blockLimit = + request.getBlockLimit() == null + ? getNonceProvider().getBlockLimit(client) + : request.getBlockLimit(); + EIP1559Struct eip1559Struct = null; + if (getGasProvider().isEIP1559Enabled() || request.isEIP1559Enabled()) { + eip1559Struct = + request.getEip1559Struct() == null + ? getGasProvider().getEIP1559Struct(methodId) + : request.getEip1559Struct(); + } + BigInteger gasPrice = + request.getGasPrice() == null + ? getGasProvider().getGasPrice(methodId) + : request.getGasPrice(); + BigInteger gasLimit = + request.getGasLimit() == null + ? getGasProvider().getGasLimit(methodId) + : request.getGasLimit(); + + 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())); + CompletableFuture signFuture = new CompletableFuture<>(); + SignatureResult signatureResult; + try { + asyncTxSigner.signAsync( + Hex.decode(dataHash), + signature -> { + signFuture.complete(signature); + return 0; + }); + signatureResult = + signFuture.get( + client.getConfigOption().getNetworkConfig().getTimeout(), + TimeUnit.MILLISECONDS); + } catch (Exception e) { + logger.error("Sign transaction failed, error message: {}", e.getMessage(), e); + throw new JniException("Sign transaction failed, error message: " + e.getMessage()); + } + String signedTransactionWithSignature = + TransactionBuilderV1JniObj.createSignedTransactionWithSignature( + 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); + } + /** * Send tx with abi field * @@ -175,12 +323,6 @@ public TransactionReceipt sendTransaction( return client.sendTransaction(signedTransaction, false).getTransactionReceipt(); } - @Override - public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException { - TxPair txPair = createSignedTransaction(request); - return client.sendTransaction(txPair.getSignedTx(), false).getTransactionReceipt(); - } - /** * This method is used to create a signed transaction. * @@ -273,94 +415,6 @@ public String createSignedTransaction( client.getExtraData()); } - @Override - public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException { - if (!request.isTransactionEssentialSatisfy()) { - throw new JniException("Transaction essential fields are not satisfied"); - } - int transactionAttribute; - if (client.isWASM()) { - transactionAttribute = TransactionAttribute.LIQUID_SCALE_CODEC; - if (request.isCreate()) { - transactionAttribute |= TransactionAttribute.LIQUID_CREATE; - } - } else { - transactionAttribute = TransactionAttribute.EVM_ABI_CODEC; - } - byte[] methodId = new byte[4]; - if (!request.isCreate() && (request.getEncodedData().length >= 4)) { - System.arraycopy(request.getEncodedData(), 0, methodId, 0, 4); - } - String nonce = - request.getNonce() == null ? getNonceProvider().getNonce() : request.getNonce(); - BigInteger blockLimit = - request.getBlockLimit() == null - ? getNonceProvider().getBlockLimit(client) - : request.getBlockLimit(); - BigInteger gasPrice = - request.getGasPrice() == null - ? getGasProvider().getGasPrice(methodId) - : request.getGasPrice(); - BigInteger gasLimit = - request.getGasLimit() == null - ? getGasProvider().getGasLimit(methodId) - : request.getGasLimit(); - - 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()), - Numeric.toHexString(gasPrice), - gasLimit.longValue(), - "", - ""); - CompletableFuture signFuture = new CompletableFuture<>(); - SignatureResult signatureResult; - try { - asyncTxSigner.signAsync( - Hex.decode(dataHash), - signature -> { - signFuture.complete(signature); - return 0; - }); - signatureResult = - signFuture.get( - client.getConfigOption().getNetworkConfig().getTimeout(), - TimeUnit.MILLISECONDS); - } catch (Exception e) { - logger.error("Sign transaction failed, error message: {}", e.getMessage(), e); - throw new JniException("Sign transaction failed, error message: " + e.getMessage()); - } - String signedTransactionWithSignature = - TransactionBuilderV1JniObj.createSignedTransactionWithSignature( - signatureResult.encode(), - dataHash, - TransactionVersion.V1, - 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()); - return new TxPair(dataHash, signedTransactionWithSignature); - } - /** * Send tx with abi field asynchronously * @@ -570,14 +624,6 @@ public void onResponse(TransactionReceipt receipt) { return dataHash; } - @Override - public String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback) - throws JniException { - TxPair txPair = createSignedTransaction(request); - client.sendTransactionAsync(txPair.getSignedTx(), false, callback); - return txPair.getTxHash(); - } - /** * Send tx with EIP1559 * diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransactionManager.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransactionManager.java index 5a6c4b655..148c74bc4 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransactionManager.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/TransactionManager.java @@ -42,6 +42,45 @@ protected TransactionManager(Client client) { public abstract void setNonceProvider(NonceAndBlockLimitProvider nonceProvider); + /** + * This method is used to send transaction. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @return An instance of TxPair which contains the signed transaction and the transaction hash. + * @throws JniException If there is an error during the JNI operation. + */ + public abstract TransactionReceipt sendTransaction(AbiEncodedRequest request) + throws JniException; + + /** + * This method is used to send transaction asynchronously. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @param callback callback when transaction receipt is returned + * @return transaction data hash + * @throws JniException If there is an error during the JNI operation. + */ + public abstract String asyncSendTransaction( + AbiEncodedRequest request, TransactionCallback callback) throws JniException; + + /** + * This method is used to create a signed transaction. + * + * @param request An instance of AbiEncodedRequest which contains the necessary information to + * create a transaction: if it is a contract creation, request should setCreate(true), and + * the abi field should be set; if it is EIP1559 transaction, request should set + * EIP1559Struct. + * @return An instance of TxPair which contains the signed transaction and the transaction hash. + * @throws JniException If there is an error during the JNI operation. + */ + public abstract TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException; + /** * Simple send tx * @@ -118,9 +157,6 @@ public abstract TransactionReceipt sendTransaction( boolean constructor) throws JniException; - public abstract TransactionReceipt sendTransaction(AbiEncodedRequest request) - throws JniException; - /** * This method is used to create a signed transaction. * @@ -147,8 +183,6 @@ public abstract String createSignedTransaction( boolean constructor) throws JniException; - public abstract TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException; - /** * Simple send tx asynchronously * @@ -234,9 +268,6 @@ public abstract String asyncSendTransaction( TransactionCallback callback) throws JniException; - public abstract String asyncSendTransaction( - AbiEncodedRequest request, TransactionCallback callback) throws JniException; - /** * Send tx with EIP1559 * diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/AbiEncodedRequest.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/AbiEncodedRequest.java index 10fe9ffb4..fca251cda 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/AbiEncodedRequest.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/AbiEncodedRequest.java @@ -3,58 +3,49 @@ import java.math.BigInteger; import org.fisco.bcos.sdk.v3.transaction.gasProvider.EIP1559Struct; -public class AbiEncodedRequest { +public class AbiEncodedRequest extends BasicRequest { // required protected byte[] encodedData; - // required - protected String to; - // optional - protected String abi; - // optional - protected BigInteger blockLimit; - // optional - protected String nonce; - // optional - protected BigInteger value; - // optional - protected BigInteger gasPrice; - // optional - protected BigInteger gasLimit; - // optional - protected EIP1559Struct eip1559Struct; - - public AbiEncodedRequest(byte[] encodedData, String to) { - this.encodedData = encodedData; - this.to = to; - } + protected boolean isCreate = false; public AbiEncodedRequest( - byte[] encodedData, - String to, String abi, + String to, BigInteger blockLimit, String nonce, BigInteger value, BigInteger gasPrice, BigInteger gasLimit, - EIP1559Struct eip1559Struct) { - this.encodedData = encodedData; - this.to = to; - this.abi = abi; - this.blockLimit = blockLimit; - this.nonce = nonce; - this.value = value; - this.gasPrice = gasPrice; - this.gasLimit = gasLimit; - this.eip1559Struct = eip1559Struct; - } - + EIP1559Struct eip1559Struct, + byte[] extension) { + super(abi, "", to, blockLimit, nonce, value, gasPrice, gasLimit, eip1559Struct, extension); + } + + public AbiEncodedRequest(BasicRequest request) { + super( + request.getAbi(), + "", + request.getTo(), + request.getBlockLimit(), + request.getNonce(), + request.getValue(), + request.getGasPrice(), + request.getGasLimit(), + request.getEip1559Struct(), + request.getExtension()); + } + + @Override public boolean isTransactionEssentialSatisfy() { return encodedData != null && to != null; } public boolean isCreate() { - return this.abi != null && !this.abi.isEmpty(); + return isCreate; + } + + public void setCreate(boolean create) { + isCreate = create; } public byte[] getEncodedData() { @@ -64,68 +55,4 @@ public byte[] getEncodedData() { public void setEncodedData(byte[] encodedData) { this.encodedData = encodedData; } - - public BigInteger getBlockLimit() { - return blockLimit; - } - - public void setBlockLimit(BigInteger blockLimit) { - this.blockLimit = blockLimit; - } - - public String getNonce() { - return nonce; - } - - public void setNonce(String nonce) { - this.nonce = nonce; - } - - public String getTo() { - return to; - } - - public void setTo(String to) { - this.to = to; - } - - public String getAbi() { - return abi; - } - - public void setAbi(String abi) { - this.abi = abi; - } - - public BigInteger getValue() { - return value; - } - - public void setValue(BigInteger value) { - this.value = value; - } - - public BigInteger getGasPrice() { - return gasPrice; - } - - public void setGasPrice(BigInteger gasPrice) { - this.gasPrice = gasPrice; - } - - public BigInteger getGasLimit() { - return gasLimit; - } - - public void setGasLimit(BigInteger gasLimit) { - this.gasLimit = gasLimit; - } - - public EIP1559Struct getEip1559Struct() { - return eip1559Struct; - } - - public void setEip1559Struct(EIP1559Struct eip1559Struct) { - this.eip1559Struct = eip1559Struct; - } } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicDeployRequest.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicDeployRequest.java index ea1cad979..56e973b61 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicDeployRequest.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/BasicDeployRequest.java @@ -17,6 +17,18 @@ public BasicDeployRequest( this.bin = bin; } + public BasicDeployRequest( + String abi, + BigInteger blockLimit, + String nonce, + BigInteger value, + BigInteger gasPrice, + BigInteger gasLimit, + EIP1559Struct eip1559Struct, + byte[] extension) { + super(abi, "", "", blockLimit, nonce, value, gasPrice, gasLimit, eip1559Struct, extension); + } + public String getBin() { return bin; } 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 4237c4e90..f4c32d450 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 @@ -7,6 +7,10 @@ public class BasicRequest { protected String abi; protected String method; + protected BigInteger blockLimit; + protected String nonce; + // v2 + protected byte[] extension; protected String to; protected BigInteger value; @@ -31,6 +35,29 @@ public BasicRequest( this.eip1559Struct = eip1559Struct; } + public BasicRequest( + String abi, + String method, + String to, + BigInteger blockLimit, + String nonce, + BigInteger value, + BigInteger gasPrice, + BigInteger gasLimit, + EIP1559Struct eip1559Struct, + byte[] extension) { + this.abi = abi; + this.method = method; + this.blockLimit = blockLimit; + this.nonce = nonce; + this.extension = extension; + this.to = to; + this.value = value; + this.gasPrice = gasPrice; + this.gasLimit = gasLimit; + this.eip1559Struct = eip1559Struct; + } + public String getAbi() { return abi; } @@ -59,7 +86,35 @@ public EIP1559Struct getEip1559Struct() { return eip1559Struct; } + public BigInteger getBlockLimit() { + return blockLimit; + } + + public void setBlockLimit(BigInteger blockLimit) { + this.blockLimit = blockLimit; + } + + public String getNonce() { + return nonce; + } + + public void setNonce(String nonce) { + this.nonce = nonce; + } + + public byte[] getExtension() { + return extension; + } + + public void setExtension(byte[] extension) { + this.extension = extension; + } + public boolean isTransactionEssentialSatisfy() { return abi != null && method != null && to != null; } + + public boolean isEIP1559Enabled() { + return eip1559Struct != null; + } } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequest.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequest.java index 6d4f895f3..7854b0634 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequest.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequest.java @@ -18,6 +18,18 @@ public DeployTransactionRequest( super(abi, bin, value, gasPrice, gasLimit, eip1559Struct); } + public DeployTransactionRequest( + String abi, + BigInteger blockLimit, + String nonce, + BigInteger value, + BigInteger gasPrice, + BigInteger gasLimit, + EIP1559Struct eip1559Struct, + byte[] extension) { + super(abi, blockLimit, nonce, value, gasPrice, gasLimit, eip1559Struct, extension); + } + public void setParams(List params) { this.params = params; } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequestWithStringParams.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequestWithStringParams.java index f6d0f6809..56200c541 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequestWithStringParams.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/DeployTransactionRequestWithStringParams.java @@ -18,6 +18,18 @@ public DeployTransactionRequestWithStringParams( super(abi, bin, value, gasPrice, gasLimit, eip1559Struct); } + public DeployTransactionRequestWithStringParams( + String abi, + BigInteger blockLimit, + String nonce, + BigInteger value, + BigInteger gasPrice, + BigInteger gasLimit, + EIP1559Struct eip1559Struct, + byte[] extension) { + super(abi, blockLimit, nonce, value, gasPrice, gasLimit, eip1559Struct, extension); + } + public void setStringParams(List params) { this.stringParams = params; } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequest.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequest.java index 7509477d9..cf70e2510 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequest.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequest.java @@ -18,6 +18,30 @@ public TransactionRequest( super(abi, method, to, value, gasPrice, gasLimit, eip1559Struct); } + public TransactionRequest( + String abi, + String method, + String to, + BigInteger blockLimit, + String nonce, + BigInteger value, + BigInteger gasPrice, + BigInteger gasLimit, + EIP1559Struct eip1559Struct, + byte[] extension) { + super( + abi, + method, + to, + blockLimit, + nonce, + value, + gasPrice, + gasLimit, + eip1559Struct, + extension); + } + public void setParams(List params) { this.params = params; } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequestWithStringParams.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequestWithStringParams.java index d4373b422..4dbdfce94 100644 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequestWithStringParams.java +++ b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/dto/TransactionRequestWithStringParams.java @@ -19,6 +19,30 @@ public TransactionRequestWithStringParams( super(abi, method, to, value, gasPrice, gasLimit, eip1559Struct); } + public TransactionRequestWithStringParams( + String abi, + String method, + String to, + BigInteger blockLimit, + String nonce, + BigInteger value, + BigInteger gasPrice, + BigInteger gasLimit, + EIP1559Struct eip1559Struct, + byte[] extension) { + super( + abi, + method, + to, + blockLimit, + nonce, + value, + gasPrice, + gasLimit, + eip1559Struct, + extension); + } + public void setStringParams(List params) { this.stringParams = params; } diff --git a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/AbiEncodedRequestBuilder.java b/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/AbiEncodedRequestBuilder.java deleted file mode 100644 index 4aa0a7d80..000000000 --- a/src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/utils/AbiEncodedRequestBuilder.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils; - -import java.math.BigInteger; -import org.fisco.bcos.sdk.v3.transaction.gasProvider.EIP1559Struct; -import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest; - -public class AbiEncodedRequestBuilder { - private byte[] encodedData; - private String to; - private String abi; - private BigInteger blockLimit; - private String nonce; - private BigInteger value; - private BigInteger gasPrice; - private BigInteger gasLimit; - private EIP1559Struct eip1559Struct; - - public AbiEncodedRequestBuilder(byte[] encodedData, String to) { - this.encodedData = encodedData; - this.to = to; - } - - public AbiEncodedRequestBuilder(byte[] encodedData, String to, String abi) { - this.encodedData = encodedData; - this.to = to; - this.abi = abi; - } - - public AbiEncodedRequestBuilder setEncodedData(byte[] encodedData) { - this.encodedData = encodedData; - return this; - } - - public AbiEncodedRequestBuilder setTo(String to) { - this.to = to; - return this; - } - - public AbiEncodedRequestBuilder setAbi(String abi) { - this.abi = abi; - return this; - } - - public AbiEncodedRequestBuilder setBlockLimit(BigInteger blockLimit) { - this.blockLimit = blockLimit; - return this; - } - - public AbiEncodedRequestBuilder setNonce(String nonce) { - this.nonce = nonce; - return this; - } - - public AbiEncodedRequestBuilder setValue(BigInteger value) { - this.value = value; - return this; - } - - public AbiEncodedRequestBuilder setGasPrice(BigInteger gasPrice) { - this.gasPrice = gasPrice; - return this; - } - - public AbiEncodedRequestBuilder setGasLimit(BigInteger gasLimit) { - this.gasLimit = gasLimit; - return this; - } - - public AbiEncodedRequestBuilder setEIP1559Struct(EIP1559Struct eip1559Struct) { - this.eip1559Struct = eip1559Struct; - return this; - } - - public AbiEncodedRequest build() { - return new AbiEncodedRequest( - encodedData, to, abi, blockLimit, nonce, value, gasPrice, gasLimit, eip1559Struct); - } -} 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 4cc540a40..eda800735 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 @@ -3,6 +3,7 @@ import java.math.BigInteger; import java.util.List; 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; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.DeployTransactionRequestWithStringParams; import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.TransactionRequest; @@ -13,11 +14,14 @@ public class TransactionRequestBuilder { private String abi; private String method; private String to; + private BigInteger blockLimit; + private String nonce; private BigInteger value; private BigInteger gasPrice; private BigInteger gasLimit; private String bin; private EIP1559Struct eip1559Struct; + private byte[] extension = null; public TransactionRequestBuilder(String abi, String method, String to) { this.abi = abi; @@ -40,6 +44,16 @@ public TransactionRequestBuilder setTo(String to) { return this; } + public TransactionRequestBuilder setBlockLimit(BigInteger blockLimit) { + this.blockLimit = blockLimit; + return this; + } + + public TransactionRequestBuilder setNonce(String nonce) { + this.nonce = nonce; + return this; + } + public TransactionRequestBuilder setValue(BigInteger value) { this.value = value; return this; @@ -60,6 +74,11 @@ public TransactionRequestBuilder setEIP1559Struct(EIP1559Struct eip1559Struct) { return this; } + public TransactionRequestBuilder setExtension(byte[] extension) { + this.extension = extension; + return this; + } + public TransactionRequestBuilder setBin(String bin) { this.bin = bin; return this; @@ -74,10 +93,13 @@ public TransactionRequest buildRequest(List params) throws ContractExcep this.abi, this.method, this.to, + this.blockLimit, + this.nonce, this.value, this.gasPrice, this.gasLimit, - this.eip1559Struct); + this.eip1559Struct, + this.extension); sendTransactionRequest.setParams(params); return sendTransactionRequest; } @@ -92,10 +114,13 @@ public TransactionRequestWithStringParams buildStringParamsRequest(List this.abi, this.method, this.to, + this.blockLimit, + this.nonce, this.value, this.gasPrice, this.gasLimit, - this.eip1559Struct); + this.eip1559Struct, + this.extension); request.setStringParams(stringParams); return request; } @@ -112,11 +137,13 @@ public DeployTransactionRequest buildDeployRequest(List params) DeployTransactionRequest request = new DeployTransactionRequest( this.abi, - this.bin, + this.blockLimit, + this.nonce, this.value, this.gasPrice, this.gasLimit, - this.eip1559Struct); + this.eip1559Struct, + this.extension); if (to != null) { request.setTo(to); } @@ -136,15 +163,36 @@ public DeployTransactionRequestWithStringParams buildDeployStringParamsRequest( DeployTransactionRequestWithStringParams request = new DeployTransactionRequestWithStringParams( this.abi, - this.bin, + this.blockLimit, + this.nonce, this.value, this.gasPrice, this.gasLimit, - this.eip1559Struct); + this.eip1559Struct, + this.extension); if (to != null) { request.setTo(to); } request.setStringParams(stringParams); return request; } + + public AbiEncodedRequest buildAbiEncodedRequest(byte[] encodedParams) throws ContractException { + if (encodedParams == null) { + throw new ContractException("SendTransaction params is null, please set it manually."); + } + AbiEncodedRequest abiEncodedDeployRequest = + new AbiEncodedRequest( + this.abi, + this.to, + this.blockLimit, + this.nonce, + this.value, + this.gasPrice, + this.gasLimit, + this.eip1559Struct, + this.extension); + abiEncodedDeployRequest.setEncodedData(encodedParams); + return abiEncodedDeployRequest; + } }