From be9d37be1c8395ee0dc022a082b879eefc276b04 Mon Sep 17 00:00:00 2001 From: Michael Heinrichs Date: Thu, 23 Feb 2023 13:38:00 +0100 Subject: [PATCH] Simplified pre-handle with focus on signature verification Signed-off-by: Michael Heinrichs --- .../admin/impl/handlers/FreezeHandler.java | 2 +- .../com/hedera/node/app/spi/CallContext.java | 37 ---- .../app/spi/meta/TransactionMetadata.java | 48 ++--- .../{meta => workflows}/PreHandleContext.java | 145 +++++++-------- .../{ => workflows}/PreHandleDispatcher.java | 18 +- .../src/main/java/module-info.java | 3 +- .../test/meta/TransactionMetadataTest.java | 88 +++++---- .../PreHandleContextListUpdatesTest.java | 32 +++- .../PreHandleContextTest.java | 7 +- .../meta/TransactionMetadataAssert.java | 131 -------------- .../src/testFixtures/java/module-info.java | 2 - .../node/app/signature/SignaturePreparer.java | 20 +-- .../dispatcher/ReadableStoreFactory.java | 85 +++++++++ .../workflows/dispatcher/StoreFactory.java | 120 ------------- .../dispatcher/TransactionDispatcher.java | 123 ++++++------- .../prehandle/PreHandleWorkflowImpl.java | 170 +++++++++--------- .../app/workflows/query/QueryDispatcher.java | 14 +- .../workflows/query/QueryWorkflowImpl.java | 4 +- ...est.java => ReadableStoreFactoryTest.java} | 8 +- .../dispatcher/TransactionDispatcherTest.java | 10 +- .../prehandle/PreHandleWorkflowImplTest.java | 20 +-- .../workflows/query/QueryDispatcherTest.java | 14 +- .../handlers/ConsensusCreateTopicHandler.java | 2 +- .../handlers/ConsensusDeleteTopicHandler.java | 2 +- .../ConsensusSubmitMessageHandler.java | 2 +- .../handlers/ConsensusUpdateTopicHandler.java | 2 +- ...ConsensusCreateTopicHandlerParityTest.java | 2 +- .../ConsensusCreateTopicHandlerTest.java | 2 +- .../ConsensusDeleteTopicHandlerTest.java | 2 +- .../test/handlers/ConsensusTestUtils.java | 2 +- .../file/impl/handlers/FileAppendHandler.java | 2 +- .../file/impl/handlers/FileCreateHandler.java | 2 +- .../file/impl/handlers/FileDeleteHandler.java | 2 +- .../handlers/FileSystemDeleteHandler.java | 2 +- .../handlers/FileSystemUndeleteHandler.java | 2 +- .../file/impl/handlers/FileUpdateHandler.java | 2 +- .../NetworkUncheckedSubmitHandler.java | 2 +- .../handlers/AbstractScheduleHandler.java | 26 +-- .../impl/handlers/ScheduleCreateHandler.java | 8 +- .../impl/handlers/ScheduleDeleteHandler.java | 2 +- .../impl/handlers/ScheduleSignHandler.java | 7 +- .../handlers/ScheduleCreateHandlerTest.java | 165 ++++++----------- .../ScheduleDeleteHandlerParityTest.java | 2 +- .../handlers/ScheduleDeleteHandlerTest.java | 37 ++-- .../handlers/ScheduleHandlerTestBase.java | 23 +-- .../handlers/ScheduleSignHandlerTest.java | 62 +++---- .../impl/handlers/ContractCallHandler.java | 2 +- .../impl/handlers/ContractCreateHandler.java | 2 +- .../impl/handlers/ContractDeleteHandler.java | 2 +- .../handlers/ContractSystemDeleteHandler.java | 2 +- .../ContractSystemUndeleteHandler.java | 2 +- .../impl/handlers/ContractUpdateHandler.java | 2 +- .../handlers/EtherumTransactionHandler.java | 2 +- .../handlers/ContractCallHandlerTest.java | 2 +- .../ContractCreateHandlerParityTest.java | 2 +- .../handlers/ContractCreateHandlerTest.java | 2 +- .../ContractDeleteHandlerParityTest.java | 2 +- .../handlers/ContractHandlerTestBase.java | 2 +- .../ContractUpdateHandlerParityTest.java | 2 +- .../handlers/CryptoAddLiveHashHandler.java | 2 +- .../CryptoApproveAllowanceHandler.java | 2 +- .../impl/handlers/CryptoCreateHandler.java | 2 +- .../CryptoDeleteAllowanceHandler.java | 2 +- .../impl/handlers/CryptoDeleteHandler.java | 2 +- .../handlers/CryptoDeleteLiveHashHandler.java | 2 +- .../impl/handlers/CryptoTransferHandler.java | 2 +- .../impl/handlers/CryptoUpdateHandler.java | 2 +- .../handlers/TokenAccountWipeHandler.java | 2 +- .../TokenAssociateToAccountHandler.java | 2 +- .../token/impl/handlers/TokenBurnHandler.java | 2 +- .../impl/handlers/TokenCreateHandler.java | 2 +- .../impl/handlers/TokenDeleteHandler.java | 2 +- .../TokenDissociateFromAccountHandler.java | 2 +- .../TokenFeeScheduleUpdateHandler.java | 2 +- .../handlers/TokenFreezeAccountHandler.java | 2 +- .../TokenGrantKycToAccountHandler.java | 2 +- .../token/impl/handlers/TokenMintHandler.java | 2 +- .../impl/handlers/TokenPauseHandler.java | 2 +- .../TokenRevokeKycFromAccountHandler.java | 2 +- .../handlers/TokenUnfreezeAccountHandler.java | 2 +- .../impl/handlers/TokenUnpauseHandler.java | 2 +- .../impl/handlers/TokenUpdateHandler.java | 2 +- .../CryptoApproveAllowanceHandlerTest.java | 2 +- .../handlers/CryptoCreateHandlerTest.java | 2 +- .../CryptoDeleteAllowanceHandlerTest.java | 2 +- .../handlers/CryptoDeleteHandlerTest.java | 2 +- .../test/handlers/CryptoHandlerTestBase.java | 2 +- .../CryptoTransferHandlerParityTest.java | 2 +- .../handlers/CryptoUpdateHandlerTest.java | 2 +- .../handlers/TokenAccountWipeHandlerTest.java | 6 +- .../TokenAssociateToAccountHandlerTest.java | 6 +- .../handlers/TokenBurnHandlerParityTest.java | 6 +- .../handlers/TokenCreateHandleParityTest.java | 2 +- .../TokenDeleteHandlerParityTest.java | 2 +- ...TokenDissociateFromAccountHandlerTest.java | 2 +- ...kenFeeScheduleUpdateHandlerParityTest.java | 2 +- .../TokenFreezeAccountHandlerTest.java | 5 +- .../TokenGrantKycToAccountHandlerTest.java | 2 +- .../handlers/TokenMintHandlerParityTest.java | 2 +- .../TokenRevokeKycFromAccountHandlerTest.java | 2 +- ...TokenUnfreezeAccountHandlerParityTest.java | 2 +- .../TokenUpdateHandlerParityTest.java | 2 +- .../token/impl/test/util/MetaAssertion.java | 2 +- .../util/impl/handlers/UtilPrngHandler.java | 2 +- 104 files changed, 653 insertions(+), 941 deletions(-) delete mode 100644 hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/CallContext.java rename hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/{meta => workflows}/PreHandleContext.java (72%) rename hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/{ => workflows}/PreHandleDispatcher.java (61%) rename hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/{test/meta => workflows}/PreHandleContextListUpdatesTest.java (92%) rename hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/{test/meta => workflows}/PreHandleContextTest.java (94%) delete mode 100644 hedera-node/hedera-app-spi/src/testFixtures/java/com/hedera/node/app/spi/fixtures/meta/TransactionMetadataAssert.java create mode 100644 hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/ReadableStoreFactory.java delete mode 100644 hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/StoreFactory.java rename hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/{StoreFactoryTest.java => ReadableStoreFactoryTest.java} (88%) diff --git a/hedera-node/hedera-admin-service-impl/src/main/java/com/hedera/node/app/service/admin/impl/handlers/FreezeHandler.java b/hedera-node/hedera-admin-service-impl/src/main/java/com/hedera/node/app/service/admin/impl/handlers/FreezeHandler.java index aaf41b9e7523..86e85d5718a5 100644 --- a/hedera-node/hedera-admin-service-impl/src/main/java/com/hedera/node/app/service/admin/impl/handlers/FreezeHandler.java +++ b/hedera-node/hedera-admin-service-impl/src/main/java/com/hedera/node/app/service/admin/impl/handlers/FreezeHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/CallContext.java b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/CallContext.java deleted file mode 100644 index 6ec8adc4d36e..000000000000 --- a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/CallContext.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2022-2023 Hedera Hashgraph, LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hedera.node.app.spi; - -import com.hedera.node.app.spi.meta.TransactionMetadata; -import com.hederahashgraph.api.proto.java.AccountID; -import com.hederahashgraph.api.proto.java.TransactionBody; -import edu.umd.cs.findbugs.annotations.NonNull; - -/** The {@code CallContext} provides access to all services without leaking the underlying state. */ -public interface CallContext { - - /** - * Dispatch a pre-handle request. The transaction is forwarded to the correct handler, which - * takes care of the specific functionality - * - * @param transactionBody the {@link TransactionBody} of the request - * @param payer the {@link AccountID} of the payer - * @throws NullPointerException if one of the arguments is {@code null} - */ - @NonNull - TransactionMetadata preHandle(@NonNull TransactionBody transactionBody, @NonNull AccountID payer); -} diff --git a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/meta/TransactionMetadata.java b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/meta/TransactionMetadata.java index 3321024fb96b..7164dbd70fb5 100644 --- a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/meta/TransactionMetadata.java +++ b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/meta/TransactionMetadata.java @@ -19,14 +19,15 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.spi.key.HederaKey; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; +import com.hederahashgraph.api.proto.java.SignatureMap; import com.hederahashgraph.api.proto.java.TransactionBody; import com.swirlds.common.crypto.TransactionSignature; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import java.util.List; -import java.util.Set; /** * Metadata collected when transactions are handled as part of "pre-handle". This happens with @@ -40,51 +41,47 @@ * @param payerKey payer key required to sign the transaction. It is null if payer is missing * @param requiredNonPayerKeys list of keys that are required to sign the transaction, in addition * to payer key - * @param handlerMetadata arbitrary data that a handler can pass between pre-handle and handle * @param payerSignature {@link TransactionSignature} of the payer * @param otherSignatures lit {@link TransactionSignature} of other keys that need to sign - * @param readKeys the keys that were read during pre-handle + * @param innerMetadata {@link TransactionMetadata} of the inner transaction (where appropriate) */ public record TransactionMetadata( @Nullable TransactionBody txnBody, @Nullable AccountID payer, + @Nullable SignatureMap signatureMap, @NonNull ResponseCodeEnum status, @Nullable HederaKey payerKey, @NonNull List requiredNonPayerKeys, - @Nullable Object handlerMetadata, @Nullable TransactionSignature payerSignature, @NonNull List otherSignatures, - @NonNull List readKeys) { + @Nullable TransactionMetadata innerMetadata) { public TransactionMetadata { requireNonNull(status); requireNonNull(requiredNonPayerKeys); requireNonNull(otherSignatures); - requireNonNull(readKeys); } public TransactionMetadata( @NonNull final PreHandleContext context, + @NonNull final SignatureMap signatureMap, @Nullable final TransactionSignature payerSignature, @NonNull final List otherSignatures, - @NonNull final List readKeys) { + @Nullable final TransactionMetadata innerMetadata) { this( requireNonNull(context).getTxn(), context.getPayer(), + requireNonNull(signatureMap), context.getStatus(), context.getPayerKey(), context.getRequiredNonPayerKeys(), - context.getHandlerMetadata(), payerSignature, otherSignatures, - readKeys); + innerMetadata); } - public TransactionMetadata( - @Nullable final TransactionBody txBody, - @Nullable final AccountID payerID, - @NonNull final ResponseCodeEnum status) { - this(txBody, payerID, status, null, List.of(), null, null, List.of(), List.of()); + public TransactionMetadata(@NonNull final ResponseCodeEnum status) { + this(null, null, null, status, null, List.of(), null, List.of(), null); } /** @@ -95,27 +92,4 @@ public TransactionMetadata( public boolean failed() { return status != ResponseCodeEnum.OK; } - - /** - * An entry of read keys for a single {@link com.hedera.node.app.spi.state.ReadableKVState} - * - *

Each entry in the list consists of the {@code statesKey} (which identifies the {@link - * com.hedera.node.app.spi.state.ReadableStates}), the {@code stateKey} (which identifies the - * {@link com.hedera.node.app.spi.state.ReadableKVState}), and the {@link Set} of keys, that - * were read. - * - * @param statesKey index that identifies the {@link - * com.hedera.node.app.spi.state.ReadableStates} - * @param stateKey index that identifies the {@link - * com.hedera.node.app.spi.state.ReadableKVState} - * @param readKeys {@link Set} of all keys that were read - */ - public record ReadKeys( - @NonNull String statesKey, @NonNull String stateKey, @NonNull Set> readKeys) { - public ReadKeys { - requireNonNull(statesKey); - requireNonNull(stateKey); - requireNonNull(readKeys); - } - } } diff --git a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/meta/PreHandleContext.java b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/PreHandleContext.java similarity index 72% rename from hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/meta/PreHandleContext.java rename to hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/PreHandleContext.java index 2c3a30723de2..aded5622bc7e 100644 --- a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/meta/PreHandleContext.java +++ b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/PreHandleContext.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.hedera.node.app.spi.meta; +package com.hedera.node.app.spi.workflows; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_PAYER_ACCOUNT_ID; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; @@ -33,10 +33,11 @@ import java.util.List; /** - * Context of a single {@code preHandle()}-call. Contains all information that needs to be exchanged - * between the pre-handle workflow and the {@code preHandle()}-method of a {@link - * com.hedera.node.app.spi.workflows.TransactionHandler}. + * Context of a single {@code preHandle()}-call. Contains all information that needs to be exchanged between the + * pre-handle workflow and the {@code preHandle()}-method of a + * {@link com.hedera.node.app.spi.workflows.TransactionHandler}. */ +@SuppressWarnings("UnusedReturnValue") public class PreHandleContext { private final AccountKeyLookup keyLookup; @@ -45,26 +46,42 @@ public class PreHandleContext { private final AccountID payer; private final List requiredNonPayerKeys = new ArrayList<>(); - private ResponseCodeEnum status = OK; + private ResponseCodeEnum status; private HederaKey payerKey; - private Object handlerMetadata; + private PreHandleContext innerContext; + + public PreHandleContext(@NonNull final AccountKeyLookup keyLookup, @NonNull final TransactionBody txn) { + this(keyLookup, txn, txn.getTransactionID().getAccountID(), OK); + } public PreHandleContext( @NonNull final AccountKeyLookup keyLookup, @NonNull final TransactionBody txn, @NonNull final AccountID payer) { + this(keyLookup, txn, payer, OK); + } + + public PreHandleContext( + @NonNull final AccountKeyLookup keyLookup, + @NonNull final TransactionBody txn, + @NonNull final ResponseCodeEnum status) { + this(keyLookup, txn, txn.getTransactionID().getAccountID(), status); + } + + public PreHandleContext( + @NonNull final AccountKeyLookup keyLookup, + @NonNull final TransactionBody txn, + @NonNull final AccountID payer, + @NonNull final ResponseCodeEnum status) { this.keyLookup = requireNonNull(keyLookup); this.txn = requireNonNull(txn); this.payer = requireNonNull(payer); + this.status = requireNonNull(status); final var lookedUpPayerKey = keyLookup.getKey(payer); addToKeysOrFail(lookedUpPayerKey, INVALID_PAYER_ACCOUNT_ID, true); } - public PreHandleContext(@NonNull final AccountKeyLookup keyLookup, @NonNull final TransactionBody txn) { - this(keyLookup, txn, txn.getTransactionID().getAccountID()); - } - /** * Getter for the {@link TransactionBody} * @@ -113,10 +130,9 @@ public boolean failed() { } /** - * Sets status on {@link PreHandleContext}. It will be {@link ResponseCodeEnum#OK} if there is - * no failure. + * Sets status on {@link PreHandleContext}. It will be {@link ResponseCodeEnum#OK} if there is no failure. * - * @param status status to be set on {@link TransactionMetadata} + * @param status status of the pre-handle workflow * @return {@code this} object */ @NonNull @@ -135,27 +151,6 @@ public HederaKey getPayerKey() { return payerKey; } - /** - * Getter for the metadata set by the handler - * - * @return the metadata set by the handler - */ - public Object getHandlerMetadata() { - return handlerMetadata; - } - - /** - * Sets the handler specific metadata - * - * @param handlerMetadata an arbitrary object that gets passed to the handler method - * @return builder object - */ - @NonNull - public PreHandleContext handlerMetadata(@NonNull final Object handlerMetadata) { - this.handlerMetadata = handlerMetadata; - return this; - } - /** * Add a keys to required keys list * @@ -169,10 +164,10 @@ public PreHandleContext addAllReqKeys(@NonNull final List keys) { } /** - * Adds given key to required non-payer keys in {@link PreHandleContext}. If the status is - * already failed, or if the payer's key is not added, given keys will not be added to - * requiredNonPayerKeys list. This method is used when the payer's key is already fetched, and - * we want to add other keys from {@link TransactionBody} to required keys to sign. + * Adds given key to required non-payer keys in {@link PreHandleContext}. If the status is already failed, or if the + * payer's key is not added, given keys will not be added to requiredNonPayerKeys list. This method is used when the + * payer's key is already fetched, and we want to add other keys from {@link TransactionBody} to required keys to + * sign. * * @param key key to be added * @return {@code this} object @@ -186,9 +181,9 @@ public PreHandleContext addToReqNonPayerKeys(@NonNull final HederaKey key) { } /** - * Checks if the accountId is same as payer or the status of the metadata is already failed. If - * either of the above is true, doesn't look up the keys for given account. Else, looks up the - * keys for account. If the lookup fails, sets the default failureReason given in the result. + * Checks if the accountId is same as payer or the status of the metadata is already failed. If either of the above + * is true, doesn't look up the keys for given account. Else, looks up the keys for account. If the lookup fails, + * sets the default failureReason given in the result. * * @param id given accountId * @return {@code this} object @@ -199,10 +194,10 @@ public PreHandleContext addNonPayerKey(@NonNull final AccountID id) { } /** - * Checks if the accountId is same as payer or the status of the metadata is already failed. If - * either of the above is true, doesn't look up the keys for given account. Else, looks up the - * keys for account. If the lookup fails, sets the given failure reason on the metadata. If the - * failureReason is null, sets the default failureReason given in the result. + * Checks if the accountId is same as payer or the status of the metadata is already failed. If either of the above + * is true, doesn't look up the keys for given account. Else, looks up the keys for account. If the lookup fails, + * sets the given failure reason on the metadata. If the failureReason is null, sets the default failureReason given + * in the result. * * @param id given accountId * @param failureStatusToUse failure status to be set if there is failure @@ -230,11 +225,10 @@ public PreHandleContext addNonPayerKey(@NonNull final ContractID id) { } /** - * Checks if the accountId is same as payer or the status of the metadata is already failed. If - * either of the above is true, doesn't look up the keys for given account. Else, looks up the - * keys for account if receiverSigRequired is true on the account. If the lookup fails, sets the - * given failure reason on the metadata. If the failureReason is null, sets the default - * failureReason given in the result. + * Checks if the accountId is same as payer or the status of the metadata is already failed. If either of the above + * is true, doesn't look up the keys for given account. Else, looks up the keys for account if receiverSigRequired + * is true on the account. If the lookup fails, sets the given failure reason on the metadata. If the failureReason + * is null, sets the default failureReason given in the result. * * @param id given accountId * @param failureStatusToUse failure status to be set if there is failure @@ -260,30 +254,31 @@ public PreHandleContext addNonPayerKeyIfReceiverSigRequired(@NonNull final Contr return this; } + public PreHandleContext getInnerContext() { + return innerContext; + } + + public void setInnerContext(PreHandleContext innerContext) { + this.innerContext = innerContext; + } + @Override public String toString() { - return "PreHandleContext{" - + "txn=" - + txn - + ", payer=" - + payer - + ", requiredNonPayerKeys=" - + requiredNonPayerKeys - + ", status=" - + status - + ", payerKey=" - + payerKey - + ", handlerMetadata=" - + handlerMetadata - + '}'; + return "PreHandleContext{" + "keyLookup=" + + keyLookup + ", txn=" + + txn + ", payer=" + + payer + ", requiredNonPayerKeys=" + + requiredNonPayerKeys + ", status=" + + status + ", payerKey=" + + payerKey + ", innerContext=" + + innerContext + '}'; } /* ---------- Helper methods ---------- */ /** - * Checks if the account given is same as payer or if the metadata is already failed. In either - * case, no need to look up that account's key. If the payer key has not been set we don't add - * other keys. + * Checks if the account given is same as payer or if the metadata is already failed. In either case, no need to + * look up that account's key. If the payer key has not been set we don't add other keys. * * @param id given account * @return true if the lookup is not needed, false otherwise @@ -297,8 +292,8 @@ private boolean isNotNeeded(@NonNull final AccountID id) { } /** - * Checks if the metadata is already failed. In this case no need to look up that contract's key - * If the payer key has not been set we don't add other keys. + * Checks if the metadata is already failed. In this case no need to look up that contract's key If the payer key + * has not been set we don't add other keys. * * @param id given contract * @return true if the lookup is not needed, false otherwise @@ -337,9 +332,9 @@ private boolean designatesContractRemoval(@NonNull final ContractID id) { } /** - * Given a successful key lookup, adds its key to the required signers. Given a failed key - * lookup, sets this {@link PreHandleContext}'s status to either the failure reason of the - * lookup; or (if it is non-null), the requested failureStatus parameter. + * Given a successful key lookup, adds its key to the required signers. Given a failed key lookup, sets this + * {@link PreHandleContext}'s status to either the failure reason of the lookup; or (if it is non-null), the + * requested failureStatus parameter. * * @param result key lookup result * @param failureStatus failure reason for the lookup @@ -358,4 +353,10 @@ private void addToKeysOrFail( } } } + + @NonNull + public PreHandleContext createNestedContext( + @NonNull final TransactionBody nestedTxn, @NonNull final AccountID payerForNested) { + return new PreHandleContext(keyLookup, nestedTxn, payerForNested); + } } diff --git a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/PreHandleDispatcher.java b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/PreHandleDispatcher.java similarity index 61% rename from hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/PreHandleDispatcher.java rename to hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/PreHandleDispatcher.java index a03a6ae29747..09f6f17b45ef 100644 --- a/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/PreHandleDispatcher.java +++ b/hedera-node/hedera-app-spi/src/main/java/com/hedera/node/app/spi/workflows/PreHandleDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2023 Hedera Hashgraph, LLC + * Copyright (C) 2023 Hedera Hashgraph, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,26 +14,20 @@ * limitations under the License. */ -package com.hedera.node.app.spi; +package com.hedera.node.app.spi.workflows; -import com.hedera.node.app.spi.meta.TransactionMetadata; -import com.hederahashgraph.api.proto.java.AccountID; -import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; /** - * A {@code PreHandleDispatcher} takes a validated transaction and dispatches it to the correct - * handler + * A {@code PreHandleDispatcher} takes a validated transaction and dispatches it to the correct handler */ @FunctionalInterface public interface PreHandleDispatcher { /** - * Dispatch a request. It is forwarded to the correct handler, which takes care of the specific - * functionality + * Dispatch a request. It is forwarded to the correct handler, which takes care of the specific functionality * - * @param transactionBody the {@link TransactionBody} of the request - * @param payer payer of the transaction + * @param context the {@link PreHandleContext} for the dispatched transaction * @throws NullPointerException if {@code transactionBody} is {@code null} */ - TransactionMetadata dispatch(@NonNull TransactionBody transactionBody, @NonNull AccountID payer); + void dispatch(@NonNull PreHandleContext context); } diff --git a/hedera-node/hedera-app-spi/src/main/java/module-info.java b/hedera-node/hedera-app-spi/src/main/java/module-info.java index 6facd2337ccb..b4dab23c227f 100644 --- a/hedera-node/hedera-app-spi/src/main/java/module-info.java +++ b/hedera-node/hedera-app-spi/src/main/java/module-info.java @@ -13,7 +13,8 @@ exports com.hedera.node.app.spi.workflows; opens com.hedera.node.app.spi to - com.hedera.node.app.spi.test, + com.hedera.node.app.service.mono.testFixtures; + opens com.hedera.node.app.spi.workflows to com.hedera.node.app.service.mono.testFixtures; exports com.hedera.node.app.spi.config; diff --git a/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/TransactionMetadataTest.java b/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/TransactionMetadataTest.java index 0ade6d3f321e..2d2b239dbf8d 100644 --- a/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/TransactionMetadataTest.java +++ b/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/TransactionMetadataTest.java @@ -16,26 +16,26 @@ package com.hedera.node.app.spi.test.meta; -import static com.hedera.node.app.spi.fixtures.meta.TransactionMetadataAssert.assertThat; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.when; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; -import com.hederahashgraph.api.proto.java.*; +import com.hedera.node.app.spi.workflows.PreHandleContext; +import com.hederahashgraph.api.proto.java.AccountID; +import com.hederahashgraph.api.proto.java.SignatureMap; +import com.hederahashgraph.api.proto.java.TransactionBody; import com.swirlds.common.crypto.TransactionSignature; import java.util.List; -import java.util.Set; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -@SuppressWarnings("JUnitMalformedDeclaration") @ExtendWith(MockitoExtension.class) class TransactionMetadataTest { @@ -52,23 +52,18 @@ class TransactionMetadataTest { void testDefaultConstructorWithInvalidArguments() { // given final List hederaKeys = List.of(otherKey); - final List readKeys = List.of(); final List signatures = List.of(); - assertThatCode(() -> - new TransactionMetadata(null, null, OK, null, hederaKeys, null, null, signatures, readKeys)) + assertThatCode(() -> new TransactionMetadata(null, null, null, OK, null, hederaKeys, null, signatures, null)) .doesNotThrowAnyException(); assertThatThrownBy(() -> new TransactionMetadata( - txBody, payer, null, payerKey, hederaKeys, null, null, signatures, readKeys)) + txBody, payer, null, null, payerKey, hederaKeys, null, signatures, null)) .isInstanceOf(NullPointerException.class); - assertThatThrownBy(() -> - new TransactionMetadata(txBody, payer, OK, payerKey, null, null, null, signatures, readKeys)) + assertThatThrownBy( + () -> new TransactionMetadata(txBody, payer, null, OK, payerKey, null, null, signatures, null)) .isInstanceOf(NullPointerException.class); - assertThatThrownBy(() -> - new TransactionMetadata(txBody, payer, OK, payerKey, hederaKeys, null, null, null, readKeys)) - .isInstanceOf(NullPointerException.class); - assertThatThrownBy(() -> - new TransactionMetadata(txBody, payer, OK, payerKey, hederaKeys, null, null, signatures, null)) + assertThatThrownBy( + () -> new TransactionMetadata(txBody, payer, null, OK, payerKey, hederaKeys, null, null, null)) .isInstanceOf(NullPointerException.class); } @@ -78,69 +73,70 @@ void testPreHandleContextConstructor( @Mock TransactionSignature payerSignature, @Mock TransactionSignature otherSignature) { // given - final var meta = new Object(); when(context.getTxn()).thenReturn(txBody); when(context.getPayer()).thenReturn(payer); when(context.getStatus()).thenReturn(OK); when(context.getPayerKey()).thenReturn(payerKey); when(context.getRequiredNonPayerKeys()).thenReturn(List.of(otherKey)); - when(context.getHandlerMetadata()).thenReturn(meta); - final TransactionMetadata.ReadKeys readKeys = - new TransactionMetadata.ReadKeys("myStatesKey", "myStateKey", Set.of("myReadKey")); + final var signatureMap = SignatureMap.newBuilder().build(); + final var innerMetadata = new TransactionMetadata(null, null, null, OK, null, List.of(), null, List.of(), null); // when final var metadata = - new TransactionMetadata(context, payerSignature, List.of(otherSignature), List.of(readKeys)); + new TransactionMetadata(context, signatureMap, payerSignature, List.of(otherSignature), innerMetadata); // then - assertThat(metadata) - .hasTxnBody(txBody) - .hasPayer(payer) - .hasStatus(OK) - .hasPayerKey(payerKey) - .hasRequiredNonPayerKeys(List.of(otherKey)) - .hasHandlerMetadata(meta) - .hasPayerSignature(payerSignature) - .hasOtherSignatures(List.of(otherSignature)) - .hasReadKeys(List.of(readKeys)); + assertThat(metadata.txnBody()).isEqualTo(txBody); + assertThat(metadata.payer()).isEqualTo(payer); + assertThat(metadata.signatureMap()).isEqualTo(signatureMap); + assertThat(metadata.status()).isEqualTo(OK); + assertThat(metadata.payerKey()).isEqualTo(payerKey); + assertThat(metadata.requiredNonPayerKeys()).containsExactly(otherKey); + assertThat(metadata.payerSignature()).isEqualTo(payerSignature); + assertThat(metadata.otherSignatures()).containsExactly(otherSignature); } @SuppressWarnings("ConstantConditions") @Test void testPreHandleContextConstructorWithIllegalArguments(@Mock PreHandleContext context) { // given - final List readKeys = List.of(); + when(context.getTxn()).thenReturn(txBody); + when(context.getPayer()).thenReturn(payer); + when(context.getStatus()).thenReturn(OK); + when(context.getRequiredNonPayerKeys()).thenReturn(List.of(otherKey)); + final var signatureMap = SignatureMap.newBuilder().build(); final List signatures = List.of(); // then - assertThatThrownBy(() -> new TransactionMetadata(null, null, signatures, readKeys)) + assertThatCode(() -> new TransactionMetadata(context, signatureMap, null, signatures, null)) + .doesNotThrowAnyException(); + assertThatThrownBy(() -> new TransactionMetadata(null, signatureMap, null, signatures, null)) .isInstanceOf(NullPointerException.class); - assertThatThrownBy(() -> new TransactionMetadata(context, null, null, readKeys)) + assertThatThrownBy(() -> new TransactionMetadata(context, null, null, signatures, null)) .isInstanceOf(NullPointerException.class); - assertThatThrownBy(() -> new TransactionMetadata(context, null, signatures, null)) + assertThatThrownBy(() -> new TransactionMetadata(context, signatureMap, null, null, null)) .isInstanceOf(NullPointerException.class); } @Test void testErrorConstructor() { // when - final var metadata = new TransactionMetadata(txBody, payer, INVALID_ACCOUNT_ID); + final var metadata = new TransactionMetadata(INVALID_ACCOUNT_ID); // then - assertThat(metadata) - .hasTxnBody(txBody) - .hasPayer(payer) - .hasStatus(INVALID_ACCOUNT_ID) - .hasPayerKey(null) - .hasRequiredNonPayerKeys(List.of()) - .hasHandlerMetadata(null) - .hasReadKeys(List.of()); + assertThat(metadata.txnBody()).isNull(); + assertThat(metadata.payer()).isNull(); + assertThat(metadata.signatureMap()).isNull(); + assertThat(metadata.status()).isEqualTo(INVALID_ACCOUNT_ID); + assertThat(metadata.payerKey()).isNull(); + assertThat(metadata.requiredNonPayerKeys()).isEmpty(); + assertThat(metadata.payerSignature()).isNull(); + assertThat(metadata.otherSignatures()).isEmpty(); } @SuppressWarnings("ConstantConditions") @Test void testErrorConstructorWithInvalidArguments() { - assertThatCode(() -> new TransactionMetadata(null, null, OK)).doesNotThrowAnyException(); - assertThatThrownBy(() -> new TransactionMetadata(txBody, payer, null)).isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> new TransactionMetadata(null)).isInstanceOf(NullPointerException.class); } } diff --git a/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/PreHandleContextListUpdatesTest.java b/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/workflows/PreHandleContextListUpdatesTest.java similarity index 92% rename from hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/PreHandleContextListUpdatesTest.java rename to hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/workflows/PreHandleContextListUpdatesTest.java index 690d57cb6ad6..58322f4f0312 100644 --- a/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/PreHandleContextListUpdatesTest.java +++ b/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/workflows/PreHandleContextListUpdatesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2023 Hedera Hashgraph, LLC + * Copyright (C) 2023 Hedera Hashgraph, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,20 +14,37 @@ * limitations under the License. */ -package com.hedera.node.app.spi.test.meta; +package com.hedera.node.app.spi.workflows; import static com.hedera.node.app.spi.KeyOrLookupFailureReason.withFailureReason; import static com.hedera.node.app.spi.KeyOrLookupFailureReason.withKey; -import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.*; -import static org.junit.jupiter.api.Assertions.*; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ALLOWANCE_OWNER_ID; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_CONTRACT_ID; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_PAYER_ACCOUNT_ID; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertIterableEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.BDDMockito.given; import com.google.protobuf.ByteString; import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.KeyOrLookupFailureReason; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; -import com.hederahashgraph.api.proto.java.*; +import com.hederahashgraph.api.proto.java.AccountID; +import com.hederahashgraph.api.proto.java.ContractID; +import com.hederahashgraph.api.proto.java.CryptoCreateTransactionBody; +import com.hederahashgraph.api.proto.java.Key; +import com.hederahashgraph.api.proto.java.KeyList; +import com.hederahashgraph.api.proto.java.ThresholdKey; +import com.hederahashgraph.api.proto.java.Timestamp; +import com.hederahashgraph.api.proto.java.TransactionBody; +import com.hederahashgraph.api.proto.java.TransactionID; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -95,7 +112,8 @@ void nullInputToBuilderArgumentsThrows() { assertThrows(NullPointerException.class, () -> new PreHandleContext(null, createAccountTransaction(), payer)); assertThrows(NullPointerException.class, () -> new PreHandleContext(keyLookup, null, payer)); assertThrows( - NullPointerException.class, () -> new PreHandleContext(keyLookup, createAccountTransaction(), null)); + NullPointerException.class, + () -> new PreHandleContext(keyLookup, createAccountTransaction(), (AccountID) null)); assertThrows(NullPointerException.class, () -> subject.status(null)); assertThrows(NullPointerException.class, () -> subject.addNonPayerKey((AccountID) null)); assertThrows(NullPointerException.class, () -> subject.addNonPayerKeyIfReceiverSigRequired(null, null)); diff --git a/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/PreHandleContextTest.java b/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/workflows/PreHandleContextTest.java similarity index 94% rename from hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/PreHandleContextTest.java rename to hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/workflows/PreHandleContextTest.java index af091276a80f..35852cf00524 100644 --- a/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/test/meta/PreHandleContextTest.java +++ b/hedera-node/hedera-app-spi/src/test/java/com/hedera/node/app/spi/workflows/PreHandleContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2023 Hedera Hashgraph, LLC + * Copyright (C) 2023 Hedera Hashgraph, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.hedera.node.app.spi.test.meta; +package com.hedera.node.app.spi.workflows; -import static com.hedera.node.app.spi.test.meta.PreHandleContextListUpdatesTest.A_COMPLEX_KEY; +import static com.hedera.node.app.spi.workflows.PreHandleContextListUpdatesTest.A_COMPLEX_KEY; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -26,7 +26,6 @@ import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.KeyOrLookupFailureReason; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.CryptoCreateTransactionBody; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; diff --git a/hedera-node/hedera-app-spi/src/testFixtures/java/com/hedera/node/app/spi/fixtures/meta/TransactionMetadataAssert.java b/hedera-node/hedera-app-spi/src/testFixtures/java/com/hedera/node/app/spi/fixtures/meta/TransactionMetadataAssert.java deleted file mode 100644 index 51041e6ee9cb..000000000000 --- a/hedera-node/hedera-app-spi/src/testFixtures/java/com/hedera/node/app/spi/fixtures/meta/TransactionMetadataAssert.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2023 Hedera Hashgraph, LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hedera.node.app.spi.fixtures.meta; - -import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.TransactionMetadata; -import com.hederahashgraph.api.proto.java.AccountID; -import com.hederahashgraph.api.proto.java.ResponseCodeEnum; -import com.hederahashgraph.api.proto.java.TransactionBody; -import com.swirlds.common.crypto.TransactionSignature; -import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.Nullable; -import java.util.List; -import java.util.Objects; -import org.assertj.core.api.AbstractAssert; - -@SuppressWarnings({"UnusedReturnValue", "unused"}) -public class TransactionMetadataAssert extends AbstractAssert { - - public TransactionMetadataAssert(@Nullable TransactionMetadata metadata) { - super(metadata, TransactionMetadataAssert.class); - } - - @NonNull - public static TransactionMetadataAssert assertThat(@Nullable TransactionMetadata actual) { - return new TransactionMetadataAssert(actual); - } - - @NonNull - public TransactionMetadataAssert hasTxnBody(@Nullable TransactionBody txnBody) { - isNotNull(); - if (!Objects.equals(actual.txnBody(), txnBody)) { - failWithMessage("Expected metadata's txnBody to be <%s> but was <%s>", txnBody, actual.txnBody()); - } - return this; - } - - @NonNull - public TransactionMetadataAssert hasPayer(@Nullable AccountID payer) { - isNotNull(); - if (!Objects.equals(actual.payer(), payer)) { - failWithMessage("Expected TransactionMetadata's payer to be <%s> but was <%s>", payer, actual.payer()); - } - return this; - } - - @NonNull - public TransactionMetadataAssert hasStatus(@Nullable ResponseCodeEnum status) { - isNotNull(); - if (actual.status() != status) { - failWithMessage("Expected TransactionMetadata's status to be <%s> but was <%s>", status, actual.status()); - } - return this; - } - - @NonNull - public TransactionMetadataAssert hasPayerKey(@Nullable HederaKey payerKey) { - isNotNull(); - if (!Objects.equals(actual.payerKey(), payerKey)) { - failWithMessage( - "Expected TransactionMetadata's payerKey to be <%s> but was <%s>", payerKey, actual.payerKey()); - } - return this; - } - - @NonNull - public TransactionMetadataAssert hasRequiredNonPayerKeys(@Nullable List requiredNonPayerKeys) { - isNotNull(); - if (!Objects.equals(actual.requiredNonPayerKeys(), requiredNonPayerKeys)) { - failWithMessage( - "Expected TransactionMetadata's requiredNonPayerKeys to be <%s> but was <%s>", - requiredNonPayerKeys, actual.requiredNonPayerKeys()); - } - return this; - } - - @NonNull - public TransactionMetadataAssert hasHandlerMetadata(@Nullable Object handlerMetadata) { - isNotNull(); - if (!Objects.equals(actual.handlerMetadata(), handlerMetadata)) { - failWithMessage( - "Expected TransactionMetadata's handlerMetadata to be <%s> but was <%s>", - handlerMetadata, actual.handlerMetadata()); - } - return this; - } - - public TransactionMetadataAssert hasPayerSignature(@Nullable final TransactionSignature payerSignature) { - isNotNull(); - if (!Objects.equals(actual.payerSignature(), payerSignature)) { - failWithMessage( - "Expected TransactionMetadata's payerSignature to be <%s> but was <%s>", - payerSignature, actual.payerSignature()); - } - return this; - } - - public TransactionMetadataAssert hasOtherSignatures(@Nullable final List otherSignature) { - isNotNull(); - if (!Objects.equals(actual.otherSignatures(), otherSignature)) { - failWithMessage( - "Expected TransactionMetadata's otherSignature to be <%s> but was <%s>", - otherSignature, actual.otherSignatures()); - } - return this; - } - - @NonNull - public TransactionMetadataAssert hasReadKeys(@Nullable List readKeys) { - isNotNull(); - if (!Objects.equals(actual.readKeys(), readKeys)) { - failWithMessage( - "Expected TransactionMetadata's readKeys to be <%s> but was <%s>", readKeys, actual.readKeys()); - } - return this; - } -} diff --git a/hedera-node/hedera-app-spi/src/testFixtures/java/module-info.java b/hedera-node/hedera-app-spi/src/testFixtures/java/module-info.java index cb1660648d0e..4f48f26d5d5a 100644 --- a/hedera-node/hedera-app-spi/src/testFixtures/java/module-info.java +++ b/hedera-node/hedera-app-spi/src/testFixtures/java/module-info.java @@ -3,6 +3,4 @@ requires com.hedera.node.app.spi; requires static com.github.spotbugs.annotations; - requires org.assertj.core; - requires com.swirlds.common; } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/signature/SignaturePreparer.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/signature/SignaturePreparer.java index 08357eec3e32..5aa7d731cb7b 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/signature/SignaturePreparer.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/signature/SignaturePreparer.java @@ -32,12 +32,8 @@ public interface SignaturePreparer { *

Please note: The parameter list is preliminary and very likely to change once we implement * the real {@link SignaturePreparer}. * - * @param state the {@link HederaState} that should be used to read the state. In the final - * interface we need to replace this with something that tracks which state has been read - * (e.g. {@link com.hedera.node.app.workflows.dispatcher.StoreFactory}). - * @param transactionBytes the {@code byte[]} of the {@link - * com.hederahashgraph.api.proto.java.Transaction}. In the final interface it may be - * sufficient to pass the buffer of the {@link + * @param state the {@link HederaState} that should be used to read the state + * @param txBodyBytes the {@code byte[]} of the {@link * com.hederahashgraph.api.proto.java.TransactionBody} * @param signatureMap the {@link SignatureMap} that is included in the transaction * @param accountID the {@link AccountID} for which the signature data needs to be prepared @@ -46,7 +42,7 @@ public interface SignaturePreparer { @NonNull TransactionSignature prepareSignature( @NonNull HederaState state, - @NonNull byte[] transactionBytes, + @NonNull byte[] txBodyBytes, @NonNull SignatureMap signatureMap, @NonNull AccountID accountID); @@ -56,12 +52,8 @@ TransactionSignature prepareSignature( *

Please note: The parameter list is preliminary and very likely to change once we implement * the real {@link SignaturePreparer}. * - * @param state the {@link HederaState} that should be used to read the state. In the final - * interface we need to replace this with something that tracks which state has been read - * (e.g. {@link com.hedera.node.app.workflows.dispatcher.StoreFactory}). - * @param transactionBytes the {@code byte[]} of the {@link - * com.hederahashgraph.api.proto.java.Transaction}. In the final interface it may be - * sufficient to pass the buffer of the {@link + * @param state the {@link HederaState} that should be used to read the state + * @param txBodyBytes the {@code byte[]} of the {@link * com.hederahashgraph.api.proto.java.TransactionBody} * @param signatureMap the {@link SignatureMap} that is included in the transaction * @param keys the list of {@link HederaKey}s for which the signature data needs to be prepared @@ -70,7 +62,7 @@ TransactionSignature prepareSignature( @NonNull List prepareSignatures( @NonNull HederaState state, - @NonNull byte[] transactionBytes, + @NonNull byte[] txBodyBytes, @NonNull SignatureMap signatureMap, @NonNull List keys); } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/ReadableStoreFactory.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/ReadableStoreFactory.java new file mode 100644 index 000000000000..69728491b1f7 --- /dev/null +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/ReadableStoreFactory.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.node.app.workflows.dispatcher; + +import static java.util.Objects.requireNonNull; + +import com.hedera.node.app.service.consensus.ConsensusService; +import com.hedera.node.app.service.consensus.impl.ReadableTopicStore; +import com.hedera.node.app.service.schedule.ScheduleService; +import com.hedera.node.app.service.schedule.impl.ReadableScheduleStore; +import com.hedera.node.app.service.token.TokenService; +import com.hedera.node.app.service.token.impl.ReadableAccountStore; +import com.hedera.node.app.service.token.impl.ReadableTokenStore; +import com.hedera.node.app.state.HederaState; +import edu.umd.cs.findbugs.annotations.NonNull; + +/** + * Factory for all readable stores. + */ +public class ReadableStoreFactory { + + private final HederaState state; + + public ReadableStoreFactory(@NonNull final HederaState state) { + this.state = requireNonNull(state); + } + + /** + * Get a {@link ReadableAccountStore} + * + * @return a new {@link ReadableAccountStore} + */ + @NonNull + public ReadableAccountStore createAccountStore() { + final var tokenStates = state.createReadableStates(TokenService.NAME); + return new ReadableAccountStore(tokenStates); + } + + /** + * Get a {@link ReadableTopicStore} + * + * @return a new {@link ReadableTopicStore} + */ + @NonNull + public ReadableTopicStore createTopicStore() { + final var topicStates = state.createReadableStates(ConsensusService.NAME); + return new ReadableTopicStore(topicStates); + } + + /** + * Get a {@link ReadableScheduleStore} + * + * @return a new {@link ReadableScheduleStore} + */ + @NonNull + public ReadableScheduleStore createScheduleStore() { + final var scheduleStates = state.createReadableStates(ScheduleService.NAME); + return new ReadableScheduleStore(scheduleStates); + } + + /** + * Get a {@link ReadableTokenStore} + * + * @return a new {@link ReadableTokenStore} + */ + @NonNull + public ReadableTokenStore createTokenStore() { + final var tokenStates = state.createReadableStates(TokenService.NAME); + return new ReadableTokenStore(tokenStates); + } +} diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/StoreFactory.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/StoreFactory.java deleted file mode 100644 index 7d829cfc0801..000000000000 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/StoreFactory.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2023 Hedera Hashgraph, LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hedera.node.app.workflows.dispatcher; - -import static java.util.Objects.requireNonNull; - -import com.hedera.node.app.service.consensus.ConsensusService; -import com.hedera.node.app.service.consensus.impl.ReadableTopicStore; -import com.hedera.node.app.service.schedule.ScheduleService; -import com.hedera.node.app.service.schedule.impl.ReadableScheduleStore; -import com.hedera.node.app.service.token.TokenService; -import com.hedera.node.app.service.token.impl.ReadableAccountStore; -import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.state.ReadableStates; -import com.hedera.node.app.state.HederaState; -import edu.umd.cs.findbugs.annotations.NonNull; -import java.util.HashMap; -import java.util.Map; - -/** - * Factory for all stores. Besides providing helpers to create stores, this class also tracks, which - * {@link ReadableStates} have been used. - */ -public class StoreFactory { - - private final HederaState hederaState; - private final Map usedStates = new HashMap<>(); - - /** - * Constructor of {@link StoreFactory} - * - * @param hederaState the {@link HederaState} that all stores are based upon - * @throws NullPointerException if one of the parameters is {@code null} - */ - public StoreFactory(@NonNull final HederaState hederaState) { - this.hederaState = requireNonNull(hederaState); - } - - /** - * Get a {@link Map} of all {@link ReadableStates} that have been used to construct stores. The key of the - * {@code Map} is the key of the particular {@code ReadableStates}. - * - * @return a {@link Map} that contains all {@link ReadableStates} that have been used - */ - @NonNull - public Map getUsedStates() { - return usedStates; - } - - /** - * Get a specific {@link ReadableStates}. If the {@code ReadableStates} does not exist yet, a new one is created. - * - * @param key the {@code key} of the {@link ReadableStates} - * @return the {@link ReadableStates}, either one that was created earlier or a new one - * @throws NullPointerException if one of the parameters is {@code null} - */ - @NonNull - public ReadableStates getReadableStates(@NonNull final String key) { - requireNonNull(key); - return usedStates.computeIfAbsent(key, hederaState::createReadableStates); - } - - /** - * Get a {@link ReadableAccountStore} - * - * @return a new {@link ReadableAccountStore} - */ - @NonNull - public ReadableAccountStore getAccountStore() { - final var tokenStates = getReadableStates(TokenService.NAME); - return new ReadableAccountStore(tokenStates); - } - - /** - * Get a {@link com.hedera.node.app.service.consensus.impl.ReadableTopicStore} - * - * @return a new {@link ReadableTopicStore} - */ - @NonNull - public ReadableTopicStore getTopicStore() { - final var topicStates = getReadableStates(ConsensusService.NAME); - return new ReadableTopicStore(topicStates); - } - - /** - * Get a {@link ReadableScheduleStore} - * - * @return a new {@link ReadableScheduleStore} - */ - @NonNull - public ReadableScheduleStore getScheduleStore() { - final var scheduleStates = getReadableStates(ScheduleService.NAME); - return new ReadableScheduleStore(scheduleStates); - } - - /** - * Get a {@link ReadableTokenStore} - * - * @return a new {@link ReadableTokenStore} - */ - @NonNull - public ReadableTokenStore getTokenStore() { - final var tokenStates = getReadableStates(TokenService.NAME); - return new ReadableTokenStore(tokenStates); - } -} diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcher.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcher.java index 3ad9ee358321..a81eab2d4c04 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcher.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcher.java @@ -20,14 +20,10 @@ import com.hedera.node.app.service.token.CryptoSignatureWaivers; import com.hedera.node.app.service.token.impl.CryptoSignatureWaiversImpl; -import com.hedera.node.app.spi.PreHandleDispatcher; -import com.hedera.node.app.spi.meta.PreHandleContext; -import com.hedera.node.app.spi.meta.TransactionMetadata; import com.hedera.node.app.spi.numbers.HederaAccountNumbers; -import com.hederahashgraph.api.proto.java.AccountID; -import com.hederahashgraph.api.proto.java.TransactionBody; +import com.hedera.node.app.spi.workflows.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleDispatcher; import edu.umd.cs.findbugs.annotations.NonNull; -import java.util.List; /** * A {@code TransactionDispatcher} provides functionality to forward pre-check, pre-handle, and handle-transaction @@ -57,93 +53,93 @@ public TransactionDispatcher( * Dispatch a pre-handle request. It is forwarded to the correct handler, which takes care of the specific * functionality * - * @param handlerContext the context of the pre-handle workflow + * @param storeFactory the {@link ReadableStoreFactory} to get required stores + * @param context the context of the pre-handle workflow * @throws NullPointerException if one of the arguments is {@code null} */ + @SuppressWarnings("java:S1479") // ignore too many branches warning public void dispatchPreHandle( - @NonNull final StoreFactory storeFactory, @NonNull final PreHandleContext handlerContext) { + @NonNull final ReadableStoreFactory storeFactory, @NonNull final PreHandleContext context) { requireNonNull(storeFactory); - requireNonNull(handlerContext); + requireNonNull(context); - final var txBody = handlerContext.getTxn(); + final var txBody = context.getTxn(); switch (txBody.getDataCase()) { - case CONSENSUSCREATETOPIC -> handlers.consensusCreateTopicHandler().preHandle(handlerContext); - case CONSENSUSUPDATETOPIC -> handlers.consensusUpdateTopicHandler().preHandle(handlerContext); + case CONSENSUSCREATETOPIC -> handlers.consensusCreateTopicHandler().preHandle(context); + case CONSENSUSUPDATETOPIC -> handlers.consensusUpdateTopicHandler().preHandle(context); case CONSENSUSDELETETOPIC -> handlers.consensusDeleteTopicHandler() - .preHandle(handlerContext, storeFactory.getTopicStore()); + .preHandle(context, storeFactory.createTopicStore()); case CONSENSUSSUBMITMESSAGE -> handlers.consensusSubmitMessageHandler() - .preHandle(handlerContext); + .preHandle(context); - case CONTRACTCREATEINSTANCE -> handlers.contractCreateHandler().preHandle(handlerContext); - case CONTRACTUPDATEINSTANCE -> handlers.contractUpdateHandler().preHandle(handlerContext); - case CONTRACTCALL -> handlers.contractCallHandler().preHandle(handlerContext); - case CONTRACTDELETEINSTANCE -> handlers.contractDeleteHandler().preHandle(handlerContext); - case ETHEREUMTRANSACTION -> handlers.etherumTransactionHandler().preHandle(handlerContext); + case CONTRACTCREATEINSTANCE -> handlers.contractCreateHandler().preHandle(context); + case CONTRACTUPDATEINSTANCE -> handlers.contractUpdateHandler().preHandle(context); + case CONTRACTCALL -> handlers.contractCallHandler().preHandle(context); + case CONTRACTDELETEINSTANCE -> handlers.contractDeleteHandler().preHandle(context); + case ETHEREUMTRANSACTION -> handlers.etherumTransactionHandler().preHandle(context); - case CRYPTOCREATEACCOUNT -> handlers.cryptoCreateHandler().preHandle(handlerContext); - case CRYPTOUPDATEACCOUNT -> handlers.cryptoUpdateHandler() - .preHandle(handlerContext, cryptoSignatureWaivers); + case CRYPTOCREATEACCOUNT -> handlers.cryptoCreateHandler().preHandle(context); + case CRYPTOUPDATEACCOUNT -> handlers.cryptoUpdateHandler().preHandle(context, cryptoSignatureWaivers); case CRYPTOTRANSFER -> handlers.cryptoTransferHandler() - .preHandle(handlerContext, storeFactory.getAccountStore(), storeFactory.getTokenStore()); - case CRYPTODELETE -> handlers.cryptoDeleteHandler().preHandle(handlerContext); + .preHandle(context, storeFactory.createAccountStore(), storeFactory.createTokenStore()); + case CRYPTODELETE -> handlers.cryptoDeleteHandler().preHandle(context); case CRYPTOAPPROVEALLOWANCE -> handlers.cryptoApproveAllowanceHandler() - .preHandle(handlerContext); + .preHandle(context); case CRYPTODELETEALLOWANCE -> handlers.cryptoDeleteAllowanceHandler() - .preHandle(handlerContext); - case CRYPTOADDLIVEHASH -> handlers.cryptoAddLiveHashHandler().preHandle(handlerContext); - case CRYPTODELETELIVEHASH -> handlers.cryptoDeleteLiveHashHandler().preHandle(handlerContext); + .preHandle(context); + case CRYPTOADDLIVEHASH -> handlers.cryptoAddLiveHashHandler().preHandle(context); + case CRYPTODELETELIVEHASH -> handlers.cryptoDeleteLiveHashHandler().preHandle(context); - case FILECREATE -> handlers.fileCreateHandler().preHandle(handlerContext); - case FILEUPDATE -> handlers.fileUpdateHandler().preHandle(handlerContext); - case FILEDELETE -> handlers.fileDeleteHandler().preHandle(handlerContext); - case FILEAPPEND -> handlers.fileAppendHandler().preHandle(handlerContext); + case FILECREATE -> handlers.fileCreateHandler().preHandle(context); + case FILEUPDATE -> handlers.fileUpdateHandler().preHandle(context); + case FILEDELETE -> handlers.fileDeleteHandler().preHandle(context); + case FILEAPPEND -> handlers.fileAppendHandler().preHandle(context); - case FREEZE -> handlers.freezeHandler().preHandle(handlerContext); + case FREEZE -> handlers.freezeHandler().preHandle(context); - case UNCHECKEDSUBMIT -> handlers.networkUncheckedSubmitHandler().preHandle(handlerContext); + case UNCHECKEDSUBMIT -> handlers.networkUncheckedSubmitHandler().preHandle(context); case SCHEDULECREATE -> handlers.scheduleCreateHandler() - .preHandle(handlerContext, setupPreHandleDispatcher(storeFactory)); + .preHandle(context, setupPreHandleDispatcher(storeFactory)); case SCHEDULESIGN -> handlers.scheduleSignHandler() - .preHandle(handlerContext, storeFactory.getScheduleStore(), setupPreHandleDispatcher(storeFactory)); + .preHandle(context, storeFactory.createScheduleStore(), setupPreHandleDispatcher(storeFactory)); case SCHEDULEDELETE -> handlers.scheduleDeleteHandler() - .preHandle(handlerContext, storeFactory.getScheduleStore()); - - case TOKENCREATION -> handlers.tokenCreateHandler().preHandle(handlerContext); - case TOKENUPDATE -> handlers.tokenUpdateHandler().preHandle(handlerContext, storeFactory.getTokenStore()); - case TOKENMINT -> handlers.tokenMintHandler().preHandle(handlerContext, storeFactory.getTokenStore()); - case TOKENBURN -> handlers.tokenBurnHandler().preHandle(handlerContext, storeFactory.getTokenStore()); - case TOKENDELETION -> handlers.tokenDeleteHandler().preHandle(handlerContext, storeFactory.getTokenStore()); - case TOKENWIPE -> handlers.tokenAccountWipeHandler() - .preHandle(handlerContext, storeFactory.getTokenStore()); + .preHandle(context, storeFactory.createScheduleStore()); + + case TOKENCREATION -> handlers.tokenCreateHandler().preHandle(context); + case TOKENUPDATE -> handlers.tokenUpdateHandler().preHandle(context, storeFactory.createTokenStore()); + case TOKENMINT -> handlers.tokenMintHandler().preHandle(context, storeFactory.createTokenStore()); + case TOKENBURN -> handlers.tokenBurnHandler().preHandle(context, storeFactory.createTokenStore()); + case TOKENDELETION -> handlers.tokenDeleteHandler().preHandle(context, storeFactory.createTokenStore()); + case TOKENWIPE -> handlers.tokenAccountWipeHandler().preHandle(context, storeFactory.createTokenStore()); case TOKENFREEZE -> handlers.tokenFreezeAccountHandler() - .preHandle(handlerContext, storeFactory.getTokenStore()); + .preHandle(context, storeFactory.createTokenStore()); case TOKENUNFREEZE -> handlers.tokenUnfreezeAccountHandler() - .preHandle(handlerContext, storeFactory.getTokenStore()); + .preHandle(context, storeFactory.createTokenStore()); case TOKENGRANTKYC -> handlers.tokenGrantKycToAccountHandler() - .preHandle(handlerContext, storeFactory.getTokenStore()); + .preHandle(context, storeFactory.createTokenStore()); case TOKENREVOKEKYC -> handlers.tokenRevokeKycFromAccountHandler() - .preHandle(handlerContext, storeFactory.getTokenStore()); - case TOKENASSOCIATE -> handlers.tokenAssociateToAccountHandler().preHandle(handlerContext); - case TOKENDISSOCIATE -> handlers.tokenDissociateFromAccountHandler().preHandle(handlerContext); + .preHandle(context, storeFactory.createTokenStore()); + case TOKENASSOCIATE -> handlers.tokenAssociateToAccountHandler().preHandle(context); + case TOKENDISSOCIATE -> handlers.tokenDissociateFromAccountHandler().preHandle(context); case TOKEN_FEE_SCHEDULE_UPDATE -> handlers.tokenFeeScheduleUpdateHandler() - .preHandle(handlerContext, storeFactory.getTokenStore()); - case TOKEN_PAUSE -> handlers.tokenPauseHandler().preHandle(handlerContext); - case TOKEN_UNPAUSE -> handlers.tokenUnpauseHandler().preHandle(handlerContext); + .preHandle(context, storeFactory.createTokenStore()); + case TOKEN_PAUSE -> handlers.tokenPauseHandler().preHandle(context); + case TOKEN_UNPAUSE -> handlers.tokenUnpauseHandler().preHandle(context); - case UTIL_PRNG -> handlers.utilPrngHandler().preHandle(handlerContext); + case UTIL_PRNG -> handlers.utilPrngHandler().preHandle(context); case SYSTEMDELETE -> { switch (txBody.getSystemDelete().getIdCase()) { - case CONTRACTID -> handlers.contractSystemDeleteHandler().preHandle(handlerContext); - case FILEID -> handlers.fileSystemDeleteHandler().preHandle(handlerContext); + case CONTRACTID -> handlers.contractSystemDeleteHandler().preHandle(context); + case FILEID -> handlers.fileSystemDeleteHandler().preHandle(context); case ID_NOT_SET -> throw new IllegalArgumentException("SystemDelete without IdCase"); } } case SYSTEMUNDELETE -> { switch (txBody.getSystemUndelete().getIdCase()) { - case CONTRACTID -> handlers.contractSystemUndeleteHandler().preHandle(handlerContext); - case FILEID -> handlers.fileSystemUndeleteHandler().preHandle(handlerContext); + case CONTRACTID -> handlers.contractSystemUndeleteHandler().preHandle(context); + case FILEID -> handlers.fileSystemUndeleteHandler().preHandle(context); case ID_NOT_SET -> throw new IllegalArgumentException("SystemUndelete without IdCase"); } } @@ -152,12 +148,7 @@ public void dispatchPreHandle( } } - private PreHandleDispatcher setupPreHandleDispatcher(@NonNull final StoreFactory storeFactory) { - return (TransactionBody innerTxn, AccountID innerPayer) -> { - final var accountStore = storeFactory.getAccountStore(); - final var handlerContext = new PreHandleContext(accountStore, innerTxn, innerPayer); - dispatchPreHandle(storeFactory, handlerContext); - return new TransactionMetadata(handlerContext, null, List.of(), List.of()); - }; + private PreHandleDispatcher setupPreHandleDispatcher(@NonNull final ReadableStoreFactory storeFactory) { + return context -> dispatchPreHandle(storeFactory, context); } } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImpl.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImpl.java index 88952483d4ac..c51f30137800 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImpl.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImpl.java @@ -20,15 +20,20 @@ import com.hedera.node.app.SessionContext; import com.hedera.node.app.signature.SignaturePreparer; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; -import com.hedera.node.app.spi.state.ReadableStates; import com.hedera.node.app.spi.workflows.PreCheckException; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.state.HederaState; -import com.hedera.node.app.workflows.dispatcher.StoreFactory; +import com.hedera.node.app.workflows.dispatcher.ReadableStoreFactory; import com.hedera.node.app.workflows.dispatcher.TransactionDispatcher; +import com.hedera.node.app.workflows.onset.OnsetResult; import com.hedera.node.app.workflows.onset.WorkflowOnset; -import com.hederahashgraph.api.proto.java.*; +import com.hederahashgraph.api.proto.java.Query; +import com.hederahashgraph.api.proto.java.ResponseCodeEnum; +import com.hederahashgraph.api.proto.java.SignatureMap; +import com.hederahashgraph.api.proto.java.SignedTransaction; +import com.hederahashgraph.api.proto.java.Transaction; +import com.hederahashgraph.api.proto.java.TransactionBody; import com.swirlds.common.crypto.Cryptography; import com.swirlds.common.crypto.TransactionSignature; import com.swirlds.common.system.events.Event; @@ -36,13 +41,9 @@ import edu.umd.cs.findbugs.annotations.Nullable; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,7 +64,7 @@ public class PreHandleWorkflowImpl implements PreHandleWorkflow { private final TransactionDispatcher dispatcher; private final SignaturePreparer signaturePreparer; private final Cryptography cryptography; - private final Function, CompletableFuture> runner; + private final Function> runner; /** * Constructor of {@code PreHandleWorkflowImpl} @@ -87,7 +88,7 @@ public PreHandleWorkflowImpl( this.onset = requireNonNull(onset); this.signaturePreparer = requireNonNull(signaturePreparer); this.cryptography = requireNonNull(cryptography); - this.runner = supplier -> CompletableFuture.supplyAsync(supplier, exe); + this.runner = runnable -> CompletableFuture.runAsync(runnable, exe); } // Used only for testing @@ -96,7 +97,7 @@ public PreHandleWorkflowImpl( @NonNull final WorkflowOnset onset, @NonNull final SignaturePreparer signaturePreparer, @NonNull final Cryptography cryptography, - @NonNull final Function, CompletableFuture> runner) { + @NonNull final Function> runner) { this.dispatcher = requireNonNull(dispatcher); this.onset = requireNonNull(onset); this.signaturePreparer = requireNonNull(signaturePreparer); @@ -113,12 +114,14 @@ public synchronized void start(@NonNull final HederaState state, @NonNull final // from the executor service. The Future representing that work is stored on the // platform transaction. The HandleTransactionWorkflow will pull this future back // out and use it to block until the pre handle work is done, if needed. - final ArrayList> futures = new ArrayList<>(); + final ArrayList> futures = new ArrayList<>(); final var itr = event.transactionIterator(); while (itr.hasNext()) { final var platformTx = itr.next(); - final var future = runner.apply(() -> preHandle(state, platformTx)); - platformTx.setMetadata(future); + final var future = runner.apply(() -> { + final var metadata = securePreHandle(state, platformTx); + platformTx.setMetadata(metadata); + }); futures.add(future); } @@ -127,94 +130,95 @@ public synchronized void start(@NonNull final HederaState state, @NonNull final CompletableFuture.allOf(array).join(); } - private TransactionMetadata preHandle( + private TransactionMetadata securePreHandle( final HederaState state, final com.swirlds.common.system.transaction.Transaction platformTx) { - TransactionBody txBody = null; - AccountID payerID = null; try { - final var ctx = SESSION_CONTEXT_THREAD_LOCAL.get(); - final var txBytes = platformTx.getContents(); - - // 1. Parse the Transaction and check the syntax - final var onsetResult = onset.parseAndCheck(ctx, txBytes); - txBody = onsetResult.txBody(); - payerID = txBody.getTransactionID().getAccountID(); - - // 2. Call PreTransactionHandler to do transaction-specific checks, get list of required - // keys, and prefetch required data - final var storeFactory = new StoreFactory(state); - final var accountStore = storeFactory.getAccountStore(); - final var context = new PreHandleContext(accountStore, txBody); - dispatcher.dispatchPreHandle(storeFactory, context); - - // 3. Prepare signature-data - final var payerSignature = context.getPayerKey() == null - ? null - : signaturePreparer.prepareSignature( - state, txBytes, onsetResult.signatureMap(), context.getPayer()); - final var otherSignatures = signaturePreparer.prepareSignatures( - state, txBytes, onsetResult.signatureMap(), context.getRequiredNonPayerKeys()); - - // 4. Verify signatures - // This is done synchronously, because preHandle() is already executed asynchronously - if (payerSignature != null) { - cryptography.verifySync(payerSignature); - } - cryptography.verifySync(otherSignatures); - - // 5. Return TransactionMetadata - return createTransactionMetadata(context, payerSignature, otherSignatures, storeFactory.getUsedStates()); - - } catch (PreCheckException preCheckException) { - return createInvalidTransactionMetadata(txBody, payerID, preCheckException.responseCode()); + return preHandle(state, platformTx); } catch (Exception ex) { // Some unknown and unexpected failure happened. If this was non-deterministic, I could // end up with an ISS. It is critical that I log whatever happened, because we should // have caught all legitimate failures in another catch block. LOG.error("An unexpected exception was thrown during pre-handle", ex); - return createInvalidTransactionMetadata(txBody, payerID, ResponseCodeEnum.UNKNOWN); + return createInvalidTransactionMetadata(ResponseCodeEnum.UNKNOWN); } } - @NonNull - private static TransactionMetadata createTransactionMetadata( + private TransactionMetadata preHandle( + final HederaState state, final com.swirlds.common.system.transaction.Transaction platformTx) { + final OnsetResult onsetResult; + try { + // Parse the Transaction and check the syntax + final var ctx = SESSION_CONTEXT_THREAD_LOCAL.get(); + onsetResult = onset.parseAndCheck(ctx, platformTx.getContents()); + } catch (PreCheckException preCheckException) { + return createInvalidTransactionMetadata(preCheckException.responseCode()); + } + final var signatureMap = onsetResult.signatureMap(); + + // Call PreTransactionHandler to do transaction-specific checks and get list of required keys + final var storeFactory = new ReadableStoreFactory(state); + final var accountStore = storeFactory.createAccountStore(); + final var context = new PreHandleContext(accountStore, onsetResult.txBody(), onsetResult.errorCode()); + dispatcher.dispatchPreHandle(storeFactory, context); + + // Prepare and verify signature-data + final var txBodyBytes = onsetResult.bodyBytes(); + final var payerSignature = verifyPayerSignature(state, context, txBodyBytes, signatureMap); + final var otherSignatures = verifyOtherSignatures(state, context, txBodyBytes, signatureMap); + + // Eventually prepare and verify signatures of inner transaction + final var innerContext = context.getInnerContext(); + TransactionMetadata innerMetadata = null; + if (innerContext != null) { + final var innerTxBodyBytes = innerContext.getTxn().toByteArray(); + final var innerPayerSignature = verifyPayerSignature(state, innerContext, innerTxBodyBytes, signatureMap); + final var innerOtherSignatures = verifyOtherSignatures(state, innerContext, innerTxBodyBytes, signatureMap); + innerMetadata = createTransactionMetadata( + innerContext, signatureMap, innerPayerSignature, innerOtherSignatures, null); + } + + // 5. Return TransactionMetadata + return createTransactionMetadata(context, signatureMap, payerSignature, otherSignatures, innerMetadata); + } + + @Nullable + private TransactionSignature verifyPayerSignature( + @NonNull final HederaState state, @NonNull final PreHandleContext context, - @Nullable final TransactionSignature payerSignature, - @NonNull final List otherSignatures, - @NonNull final Map usedStates) { - final List readKeys = extractAllReadKeys(usedStates); - return new TransactionMetadata(context, payerSignature, otherSignatures, readKeys); + @NonNull byte[] txBytes, + @NonNull SignatureMap signatureMap) { + if (context.getPayerKey() == null) { + return null; + } + final var payerSignature = signaturePreparer.prepareSignature(state, txBytes, signatureMap, context.getPayer()); + cryptography.verifySync(payerSignature); + return payerSignature; } @NonNull - private static TransactionMetadata createInvalidTransactionMetadata( - @Nullable final TransactionBody txBody, - @Nullable final AccountID payerID, - @NonNull final ResponseCodeEnum responseCode) { - return new TransactionMetadata(txBody, payerID, responseCode); + private List verifyOtherSignatures( + @NonNull final HederaState state, + @NonNull final PreHandleContext context, + @NonNull final byte[] txBodyBytes, + @NonNull final SignatureMap signatureMap) { + final var otherSignatures = signaturePreparer.prepareSignatures( + state, txBodyBytes, signatureMap, context.getRequiredNonPayerKeys()); + cryptography.verifySync(otherSignatures); + return otherSignatures; } @NonNull - private static List extractAllReadKeys( - @NonNull final Map usedStates) { - return usedStates.entrySet().stream() - .flatMap(entry -> { - final String statesKey = entry.getKey(); - final ReadableStates readableStates = entry.getValue(); - return extractReadKeysFromReadableStates(statesKey, readableStates); - }) - .toList(); + private static TransactionMetadata createTransactionMetadata( + @NonNull final PreHandleContext context, + @NonNull final SignatureMap signatureMap, + @Nullable final TransactionSignature payerSignature, + @NonNull final List otherSignatures, + @Nullable final TransactionMetadata innerMetadata) { + return new TransactionMetadata(context, signatureMap, payerSignature, otherSignatures, innerMetadata); } @NonNull - private static Stream extractReadKeysFromReadableStates( - @NonNull final String statesKey, @NonNull final ReadableStates readableStates) { - return readableStates.stateKeys().stream() - .map(stateKey -> { - final Set> readKeys = - readableStates.get(stateKey).readKeys(); - return new TransactionMetadata.ReadKeys(statesKey, stateKey, readKeys); - }) - .filter(listEntry -> !listEntry.readKeys().isEmpty()); + private static TransactionMetadata createInvalidTransactionMetadata(@NonNull final ResponseCodeEnum responseCode) { + return new TransactionMetadata(responseCode); } } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryDispatcher.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryDispatcher.java index bcb352c4bf61..30bdc17ce306 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryDispatcher.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryDispatcher.java @@ -21,7 +21,7 @@ import com.hedera.node.app.spi.meta.QueryContext; import com.hedera.node.app.spi.workflows.PreCheckException; import com.hedera.node.app.spi.workflows.QueryHandler; -import com.hedera.node.app.workflows.dispatcher.StoreFactory; +import com.hedera.node.app.workflows.dispatcher.ReadableStoreFactory; import com.hederahashgraph.api.proto.java.Query; import com.hederahashgraph.api.proto.java.Response; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; @@ -101,18 +101,18 @@ public QueryHandler getHandler(@NonNull final Query query) { /** * Validates the query by dispatching the query to its specific handlers. * - * @param storeFactory the {@link StoreFactory} that keeps all stores which are eventually needed + * @param storeFactory the {@link ReadableStoreFactory} that keeps all stores which are eventually needed * @param query the {@link Query} of the request * @throws NullPointerException if one of the arguments is {@code null} */ - public ResponseCodeEnum validate(@NonNull final StoreFactory storeFactory, @NonNull final Query query) + public ResponseCodeEnum validate(@NonNull final ReadableStoreFactory storeFactory, @NonNull final Query query) throws PreCheckException { requireNonNull(storeFactory); requireNonNull(query); return switch (query.getQueryCase()) { case CONSENSUSGETTOPICINFO -> handlers.consensusGetTopicInfoHandler() - .validate(query, storeFactory.getTopicStore()); + .validate(query, storeFactory.createTopicStore()); case GETBYSOLIDITYID -> handlers.contractGetBySolidityIDHandler().validate(query); case CONTRACTCALLLOCAL -> handlers.contractCallLocalHandler().validate(query); @@ -158,14 +158,14 @@ public ResponseCodeEnum validate(@NonNull final StoreFactory storeFactory, @NonN /** * Gets the response for a given query by dispatching its respective handlers. * - * @param storeFactory the {@link StoreFactory} that keeps all stores which are eventually needed + * @param storeFactory the {@link ReadableStoreFactory} that keeps all stores which are eventually needed * @param query the actual {@link Query} * @param header the {@link ResponseHeader} that should be used in the response, if it is successful * @param queryContext * @return the {@link Response} with the requested answer */ public Response getResponse( - @NonNull final StoreFactory storeFactory, + @NonNull final ReadableStoreFactory storeFactory, @NonNull final Query query, @NonNull final ResponseHeader header, @NonNull final QueryContext queryContext) { @@ -176,7 +176,7 @@ public Response getResponse( return switch (query.getQueryCase()) { case CONSENSUSGETTOPICINFO -> handlers.consensusGetTopicInfoHandler() - .findResponse(query, header, storeFactory.getTopicStore(), queryContext); + .findResponse(query, header, storeFactory.createTopicStore(), queryContext); case GETBYSOLIDITYID -> handlers.contractGetBySolidityIDHandler().findResponse(query, header); case CONTRACTCALLLOCAL -> handlers.contractCallLocalHandler().findResponse(query, header); diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryWorkflowImpl.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryWorkflowImpl.java index 545d192c3afe..abbd67612167 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryWorkflowImpl.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/query/QueryWorkflowImpl.java @@ -41,7 +41,7 @@ import com.hedera.node.app.spi.workflows.PreCheckException; import com.hedera.node.app.state.HederaState; import com.hedera.node.app.throttle.ThrottleAccumulator; -import com.hedera.node.app.workflows.dispatcher.StoreFactory; +import com.hedera.node.app.workflows.dispatcher.ReadableStoreFactory; import com.hedera.node.app.workflows.ingest.SubmissionManager; import com.hederahashgraph.api.proto.java.HederaFunctionality; import com.hederahashgraph.api.proto.java.Query; @@ -201,7 +201,7 @@ public void handleQuery( } // 4. Check validity - final var storeFactory = new StoreFactory(state); + final var storeFactory = new ReadableStoreFactory(state); final var validity = dispatcher.validate(storeFactory, query); // 5. Submit payment to platform diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/StoreFactoryTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/ReadableStoreFactoryTest.java similarity index 88% rename from hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/StoreFactoryTest.java rename to hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/ReadableStoreFactoryTest.java index 5972bc1ddc7f..814e102db9a8 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/StoreFactoryTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/ReadableStoreFactoryTest.java @@ -28,8 +28,8 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class StoreFactoryTest { - private StoreFactory subject; +class ReadableStoreFactoryTest { + private ReadableStoreFactory subject; @Mock private HederaState state; @@ -39,13 +39,13 @@ class StoreFactoryTest { @BeforeEach void setUp() { - subject = new StoreFactory(state); + subject = new ReadableStoreFactory(state); } @Test void returnsTopicStore() { given(state.createReadableStates("ConsensusService")).willReturn(readableStates); - final var store = subject.getTopicStore(); + final var store = subject.createTopicStore(); assertNotNull(store); } } diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcherTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcherTest.java index 3fa11ebbe3a2..bf6f3d269d27 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcherTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcherTest.java @@ -72,9 +72,9 @@ import com.hedera.node.app.service.util.impl.handlers.UtilPrngHandler; import com.hedera.node.app.spi.KeyOrLookupFailureReason; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.numbers.HederaAccountNumbers; import com.hedera.node.app.spi.state.ReadableStates; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.state.HederaState; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.ConsensusCreateTopicTransactionBody; @@ -359,7 +359,7 @@ void testConstructorWithIllegalParameters() { void testDispatchWithIllegalParameters() { // given final var payer = AccountID.newBuilder().build(); - final var tracker = new StoreFactory(state); + final var tracker = new ReadableStoreFactory(state); final var validContext = new PreHandleContext( accountStore, TransactionBody.newBuilder() @@ -395,7 +395,7 @@ void testDataNotSetFails() { // given final var txBody = TransactionBody.newBuilder().build(); final var payer = AccountID.newBuilder().build(); - final var tracker = new StoreFactory(state); + final var tracker = new ReadableStoreFactory(state); final var context = new PreHandleContext(accountStore, txBody, payer); // then @@ -410,7 +410,7 @@ void testNodeStakeUpdateFails() { .setNodeStakeUpdate(NodeStakeUpdateTransactionBody.getDefaultInstance()) .build(); final var payer = AccountID.newBuilder().build(); - final var tracker = new StoreFactory(state); + final var tracker = new ReadableStoreFactory(state); final var context = new PreHandleContext(accountStore, txBody, payer); // then @@ -424,7 +424,7 @@ void testPreHandleWithPayer( final TransactionBody txBody, final BiConsumer verification) { // given final var payer = AccountID.newBuilder().build(); - final var tracker = new StoreFactory(state); + final var tracker = new ReadableStoreFactory(state); final var context = new PreHandleContext(accountStore, txBody, payer); // when diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImplTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImplTest.java index a27b8d26166c..1ac94ea44cfb 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImplTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/prehandle/PreHandleWorkflowImplTest.java @@ -23,7 +23,10 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mock.Strictness.LENIENT; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import com.hedera.node.app.signature.SignaturePreparer; import com.hedera.node.app.spi.meta.TransactionMetadata; @@ -43,7 +46,6 @@ import com.swirlds.common.system.events.Event; import com.swirlds.common.system.transaction.Transaction; import com.swirlds.common.system.transaction.internal.SwirldTransaction; -import java.time.Duration; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -51,7 +53,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.function.Function; -import java.util.function.Supplier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -85,8 +86,10 @@ class PreHandleWorkflowImplTest { private PreHandleWorkflowImpl workflow; - private static final Function, CompletableFuture> RUN_INSTANTLY = - supplier -> CompletableFuture.completedFuture(supplier.get()); + private static final Function> RUN_INSTANTLY = runnable -> { + runnable.run(); + return CompletableFuture.completedFuture(null); + }; @BeforeEach void setup(@Mock ReadableStates readableStates) throws PreCheckException { @@ -186,12 +189,9 @@ void testPreHandleOnsetCatastrophicFail(@Mock WorkflowOnset localOnset) throws P workflow.start(state, event); // then - final ArgumentCaptor> captor = ArgumentCaptor.forClass(Future.class); + final ArgumentCaptor captor = ArgumentCaptor.forClass(TransactionMetadata.class); verify(transaction).setMetadata(captor.capture()); - assertThat(captor.getValue()) - .succeedsWithin(Duration.ofMillis(100)) - .isInstanceOf(TransactionMetadata.class) - .hasFieldOrPropertyWithValue("status", INVALID_TRANSACTION); + assertThat(captor.getValue()).hasFieldOrPropertyWithValue("status", INVALID_TRANSACTION); verify(dispatcher, never()).dispatchPreHandle(any(), any()); } diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/query/QueryDispatcherTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/query/QueryDispatcherTest.java index 70e0a64c2433..23535f7c04be 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/query/QueryDispatcherTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/workflows/query/QueryDispatcherTest.java @@ -49,7 +49,7 @@ import com.hedera.node.app.spi.meta.QueryContext; import com.hedera.node.app.spi.workflows.PreCheckException; import com.hedera.node.app.spi.workflows.QueryHandler; -import com.hedera.node.app.workflows.dispatcher.StoreFactory; +import com.hedera.node.app.workflows.dispatcher.ReadableStoreFactory; import com.hederahashgraph.api.proto.java.ConsensusGetTopicInfoQuery; import com.hederahashgraph.api.proto.java.ContractCallLocalQuery; import com.hederahashgraph.api.proto.java.ContractGetBytecodeQuery; @@ -232,7 +232,7 @@ void testGetHandler(final Query query, final Function ignore, final Verification verifyValidate) throws PreCheckException { // given - final var storeFactory = mock(StoreFactory.class); + final var storeFactory = mock(ReadableStoreFactory.class); // when dispatcher.validate(storeFactory, query); @@ -268,7 +268,7 @@ void testValidate( @SuppressWarnings("ConstantConditions") @Test - void testDispatchFindResponseWithIllegalParameters(@Mock final StoreFactory storeFactory) { + void testDispatchFindResponseWithIllegalParameters(@Mock final ReadableStoreFactory storeFactory) { // given final var query = Query.newBuilder().build(); final var header = ResponseHeader.newBuilder().build(); @@ -285,7 +285,7 @@ void testDispatchFindResponseWithIllegalParameters(@Mock final StoreFactory stor } @Test - void testDispatchFindResponseWithNoQuerySet(@Mock final StoreFactory storeFactory) { + void testDispatchFindResponseWithNoQuerySet(@Mock final ReadableStoreFactory storeFactory) { // given final var query = Query.newBuilder().build(); final var header = ResponseHeader.newBuilder().build(); @@ -304,7 +304,7 @@ void testFindResponse( final Verification verifyFindResponse) throws PreCheckException { // given - final var storeFactory = mock(StoreFactory.class); + final var storeFactory = mock(ReadableStoreFactory.class); final var header = ResponseHeader.newBuilder().build(); // when diff --git a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusCreateTopicHandler.java b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusCreateTopicHandler.java index 27f28851d953..89d08b7d85f5 100644 --- a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusCreateTopicHandler.java +++ b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusCreateTopicHandler.java @@ -19,8 +19,8 @@ import static com.hedera.node.app.service.mono.Utils.asHederaKey; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import com.hederahashgraph.api.proto.java.TransactionBody; diff --git a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusDeleteTopicHandler.java b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusDeleteTopicHandler.java index afc5bc8134bf..db8a44633974 100644 --- a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusDeleteTopicHandler.java +++ b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusDeleteTopicHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.consensus.impl.ReadableTopicStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusSubmitMessageHandler.java b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusSubmitMessageHandler.java index 1e00de531a34..fb5611418f0b 100644 --- a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusSubmitMessageHandler.java +++ b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusSubmitMessageHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusUpdateTopicHandler.java b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusUpdateTopicHandler.java index 9a8cf03c6212..3e7c17a7d4c8 100644 --- a/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusUpdateTopicHandler.java +++ b/hedera-node/hedera-consensus-service-impl/src/main/java/com/hedera/node/app/service/consensus/impl/handlers/ConsensusUpdateTopicHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerParityTest.java b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerParityTest.java index 931c5e3de17d..88f5e57b1a02 100644 --- a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerParityTest.java +++ b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerParityTest.java @@ -37,7 +37,7 @@ import com.hedera.node.app.service.consensus.impl.handlers.ConsensusCreateTopicHandler; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; diff --git a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerTest.java b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerTest.java index a8acc4646d70..eecfd8cc9891 100644 --- a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerTest.java +++ b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusCreateTopicHandlerTest.java @@ -30,8 +30,8 @@ import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.KeyOrLookupFailureReason; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.test.utils.IdUtils; import com.hedera.test.utils.KeyUtils; import com.hederahashgraph.api.proto.java.AccountID; diff --git a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusDeleteTopicHandlerTest.java b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusDeleteTopicHandlerTest.java index a1710913c800..7f7b4b208507 100644 --- a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusDeleteTopicHandlerTest.java +++ b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusDeleteTopicHandlerTest.java @@ -37,7 +37,7 @@ import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.KeyOrLookupFailureReason; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.test.utils.IdUtils; import com.hedera.test.utils.KeyUtils; import com.hederahashgraph.api.proto.java.AccountID; diff --git a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusTestUtils.java b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusTestUtils.java index d0cf126e36ea..e466cec071f1 100644 --- a/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusTestUtils.java +++ b/hedera-node/hedera-consensus-service-impl/src/test/java/com/hedera/node/app/service/consensus/impl/test/handlers/ConsensusTestUtils.java @@ -28,7 +28,7 @@ import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.KeyOrLookupFailureReason; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.test.factories.scenarios.TxnHandlingScenario; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.Key; diff --git a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileAppendHandler.java b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileAppendHandler.java index 55c6651b93f7..8c59169177ea 100644 --- a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileAppendHandler.java +++ b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileAppendHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileCreateHandler.java b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileCreateHandler.java index 9074086258a0..94cface70945 100644 --- a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileCreateHandler.java +++ b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileCreateHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileDeleteHandler.java b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileDeleteHandler.java index 55da74297263..985387108337 100644 --- a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileDeleteHandler.java +++ b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileDeleteHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemDeleteHandler.java b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemDeleteHandler.java index d41a9e87b521..7a71f849c484 100644 --- a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemDeleteHandler.java +++ b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemDeleteHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemUndeleteHandler.java b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemUndeleteHandler.java index 6f7173a4c79e..3d9c4c721f02 100644 --- a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemUndeleteHandler.java +++ b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileSystemUndeleteHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileUpdateHandler.java b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileUpdateHandler.java index 959aebf5a296..7cea6959e3b5 100644 --- a/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileUpdateHandler.java +++ b/hedera-node/hedera-file-service-impl/src/main/java/com/hedera/node/app/service/file/impl/handlers/FileUpdateHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-network-service-impl/src/main/java/com/hedera/node/app/service/network/impl/handlers/NetworkUncheckedSubmitHandler.java b/hedera-node/hedera-network-service-impl/src/main/java/com/hedera/node/app/service/network/impl/handlers/NetworkUncheckedSubmitHandler.java index 0e9df03a8428..672153dd35cc 100644 --- a/hedera-node/hedera-network-service-impl/src/main/java/com/hedera/node/app/service/network/impl/handlers/NetworkUncheckedSubmitHandler.java +++ b/hedera-node/hedera-network-service-impl/src/main/java/com/hedera/node/app/service/network/impl/handlers/NetworkUncheckedSubmitHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/AbstractScheduleHandler.java b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/AbstractScheduleHandler.java index 81a9f026ec0b..2b67542636d7 100644 --- a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/AbstractScheduleHandler.java +++ b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/AbstractScheduleHandler.java @@ -22,8 +22,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.UNRESOLVABLE_REQUIRED_SIGNERS; import com.hedera.node.app.service.mono.exceptions.UnknownHederaFunctionality; -import com.hedera.node.app.spi.PreHandleDispatcher; -import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleDispatcher; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.HederaFunctionality; import com.hederahashgraph.api.proto.java.TransactionBody; @@ -33,23 +33,29 @@ * ScheduleSignHandler}. */ abstract class AbstractScheduleHandler { - protected TransactionMetadata preHandleScheduledTxn( - final TransactionBody scheduledTxn, final AccountID payerForNested, final PreHandleDispatcher dispatcher) { + protected void preHandleScheduledTxn( + final PreHandleContext context, + final TransactionBody scheduledTxn, + final AccountID payerForNested, + final PreHandleDispatcher dispatcher) { + final var innerContext = context.createNestedContext(scheduledTxn, payerForNested); + context.setInnerContext(innerContext); final HederaFunctionality scheduledFunction; try { scheduledFunction = functionOf(scheduledTxn); } catch (UnknownHederaFunctionality ex) { - return new TransactionMetadata(scheduledTxn, payerForNested, SCHEDULED_TRANSACTION_NOT_IN_WHITELIST); + innerContext.status(SCHEDULED_TRANSACTION_NOT_IN_WHITELIST); + return; } if (!isSchedulable(scheduledFunction)) { - return new TransactionMetadata(scheduledTxn, payerForNested, SCHEDULED_TRANSACTION_NOT_IN_WHITELIST); + innerContext.status(SCHEDULED_TRANSACTION_NOT_IN_WHITELIST); + return; } - final var meta = dispatcher.dispatch(scheduledTxn, payerForNested); - if (meta.failed()) { - return new TransactionMetadata(scheduledTxn, payerForNested, UNRESOLVABLE_REQUIRED_SIGNERS); + dispatcher.dispatch(innerContext); + if (innerContext.failed()) { + innerContext.status(UNRESOLVABLE_REQUIRED_SIGNERS); } - return meta; } } diff --git a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleCreateHandler.java b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleCreateHandler.java index 1a80d2f4ba92..12702195c9ab 100644 --- a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleCreateHandler.java +++ b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleCreateHandler.java @@ -20,9 +20,9 @@ import static com.hedera.node.app.service.mono.utils.MiscUtils.asOrdinary; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.PreHandleDispatcher; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleDispatcher; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; @@ -74,9 +74,7 @@ public void preHandle(@NonNull final PreHandleContext context, @NonNull final Pr // FUTURE: Once we allow schedule transactions to be scheduled inside, we need a check here // to see // if provided payer is same as payer in the inner transaction. - - final var innerMeta = preHandleScheduledTxn(scheduledTxn, payerForNested, dispatcher); - context.handlerMetadata(innerMeta); + preHandleScheduledTxn(context, scheduledTxn, payerForNested, dispatcher); } /** diff --git a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleDeleteHandler.java b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleDeleteHandler.java index a3343c4c8dc8..6ee56f9cf3fb 100644 --- a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleDeleteHandler.java +++ b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleDeleteHandler.java @@ -21,8 +21,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.schedule.impl.ReadableScheduleStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleSignHandler.java b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleSignHandler.java index 6c6a898f64ae..0a95e06fcfa9 100644 --- a/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleSignHandler.java +++ b/hedera-node/hedera-schedule-service-impl/src/main/java/com/hedera/node/app/service/schedule/impl/handlers/ScheduleSignHandler.java @@ -20,9 +20,9 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.schedule.impl.ReadableScheduleStore; -import com.hedera.node.app.spi.PreHandleDispatcher; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleDispatcher; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; @@ -71,8 +71,7 @@ public void preHandle( final var payerForNested = optionalPayer.orElse(scheduledTxn.getTransactionID().getAccountID()); - final var innerMeta = preHandleScheduledTxn(scheduledTxn, payerForNested, dispatcher); - context.handlerMetadata(innerMeta); + preHandleScheduledTxn(context, scheduledTxn, payerForNested, dispatcher); } /** diff --git a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleCreateHandlerTest.java b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleCreateHandlerTest.java index bcc0e57f693f..7ba5d80222c7 100644 --- a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleCreateHandlerTest.java +++ b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleCreateHandlerTest.java @@ -16,26 +16,23 @@ package com.hedera.node.app.service.schedule.impl.test.handlers; -import static com.hedera.node.app.service.mono.utils.MiscUtils.asOrdinary; import static com.hedera.test.factories.txns.ScheduledTxnFactory.scheduleCreateTxnWith; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_PAYER_ACCOUNT_ID; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SCHEDULED_TRANSACTION_NOT_IN_WHITELIST; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.UNRESOLVABLE_REQUIRED_SIGNERS; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import com.hedera.node.app.service.mono.utils.MiscUtils; import com.hedera.node.app.service.schedule.impl.handlers.ScheduleCreateHandler; import com.hedera.node.app.spi.KeyOrLookupFailureReason; -import com.hedera.node.app.spi.meta.PreHandleContext; -import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.Timestamp; import com.hederahashgraph.api.proto.java.TransactionBody; @@ -44,27 +41,14 @@ import org.junit.jupiter.api.Test; class ScheduleCreateHandlerTest extends ScheduleHandlerTestBase { - private TransactionBody txn; - private ScheduleCreateHandler subject = new ScheduleCreateHandler(); @Test void preHandleScheduleCreateVanilla() { + final var subject = new ScheduleCreateHandler(); final var txn = scheduleCreateTransaction(payer); - final var scheduledTxn = - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - scheduler, - OK, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); - given(dispatcher.dispatch(scheduledTxn, payer)).willReturn(scheduledMeta); + given(keyLookup.getKey(payer)).willReturn(KeyOrLookupFailureReason.withKey(payerKey)); final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, dispatcher); @@ -72,30 +56,23 @@ void preHandleScheduleCreateVanilla() { basicContextAssertions(context, 1, false, OK); assertEquals(schedulerKey, context.getPayerKey()); assertEquals(List.of(adminKey), context.getRequiredNonPayerKeys()); - assertEquals(scheduledMeta, context.getHandlerMetadata()); - verify(dispatcher).dispatch(scheduledTxn, payer); + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, false, OK); + assertEquals(payer, innerContext.getPayer()); + assertEquals(payerKey, innerContext.getPayerKey()); + + verify(dispatcher).dispatch(innerContext); } @Test void preHandleScheduleCreateVanillaNoAdmin() { + final var subject = new ScheduleCreateHandler(); final var txn = scheduleCreateTxnWith(null, "", payer, scheduler, MiscUtils.asTimestamp(Instant.ofEpochSecond(1L))); - final var scheduledTxn = - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - scheduler, - OK, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); - given(dispatcher.dispatch(scheduledTxn, payer)).willReturn(scheduledMeta); + given(keyLookup.getKey(payer)).willReturn(KeyOrLookupFailureReason.withKey(payerKey)); final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, dispatcher); @@ -103,51 +80,41 @@ void preHandleScheduleCreateVanillaNoAdmin() { basicContextAssertions(context, 0, false, OK); assertEquals(schedulerKey, context.getPayerKey()); assertEquals(List.of(), context.getRequiredNonPayerKeys()); - assertEquals(scheduledMeta, context.getHandlerMetadata()); - verify(dispatcher).dispatch(scheduledTxn, payer); + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, false, OK); + assertEquals(payer, innerContext.getPayer()); + assertEquals(payerKey, innerContext.getPayerKey()); + + verify(dispatcher).dispatch(innerContext); } @Test void preHandleScheduleCreateFailsOnMissingPayer() { - givenSetupForScheduleCreate(payer); + final var subject = new ScheduleCreateHandler(); + final var txn = scheduleCreateTransaction(payer); + given(keyLookup.getKey(scheduler)) .willReturn(KeyOrLookupFailureReason.withFailureReason(INVALID_PAYER_ACCOUNT_ID)); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - scheduler, - OK, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); - given(dispatcher.dispatch(scheduledTxn, payer)).willReturn(scheduledMeta); + given(keyLookup.getKey(payer)).willReturn(KeyOrLookupFailureReason.withKey(payerKey)); final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, dispatcher); basicContextAssertions(context, 0, true, INVALID_PAYER_ACCOUNT_ID); - assertEquals(scheduledMeta, context.getHandlerMetadata()); - verify(dispatcher).dispatch(scheduledTxn, payer); + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, false, OK); + assertEquals(payer, innerContext.getPayer()); + assertEquals(payerKey, innerContext.getPayerKey()); + + verify(dispatcher).dispatch(innerContext); } @Test void preHandleScheduleCreateUsesSamePayerIfScheduledPayerNotSet() { - givenSetupForScheduleCreate(null); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - scheduler, - OK, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); - given(dispatcher.dispatch(eq(scheduledTxn), any())).willReturn(scheduledMeta); + final var subject = new ScheduleCreateHandler(); + final var txn = scheduleCreateTransaction(null); given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); final var context = new PreHandleContext(keyLookup, txn, scheduler); @@ -156,26 +123,19 @@ void preHandleScheduleCreateUsesSamePayerIfScheduledPayerNotSet() { basicContextAssertions(context, 1, false, OK); assertEquals(schedulerKey, context.getPayerKey()); assertEquals(List.of(adminKey), context.getRequiredNonPayerKeys()); - assertEquals(scheduledMeta, context.getHandlerMetadata()); - verify(dispatcher).dispatch(scheduledTxn, scheduler); + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, false, OK); + assertEquals(scheduler, innerContext.getPayer()); + assertEquals(schedulerKey, innerContext.getPayerKey()); + + verify(dispatcher).dispatch(innerContext); } @Test void failsWithScheduleTransactionsNotRecognized() { + final var subject = new ScheduleCreateHandler(); final var txn = scheduleTxnNotRecognized(); - final var scheduledTxn = - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - scheduler, - OK, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); @@ -183,30 +143,24 @@ void failsWithScheduleTransactionsNotRecognized() { subject.preHandle(context, dispatcher); basicContextAssertions(context, 0, false, OK); - basicMetaAssertions( - (TransactionMetadata) context.getHandlerMetadata(), 0, true, SCHEDULED_TRANSACTION_NOT_IN_WHITELIST); assertEquals(schedulerKey, context.getPayerKey()); assertEquals(List.of(), context.getRequiredNonPayerKeys()); - assertEquals(null, ((TransactionMetadata) context.getHandlerMetadata()).payerKey()); - assertEquals(List.of(), ((TransactionMetadata) context.getHandlerMetadata()).requiredNonPayerKeys()); - verify(dispatcher, never()).dispatch(scheduledTxn, payer); + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, true, SCHEDULED_TRANSACTION_NOT_IN_WHITELIST); + assertEquals(scheduler, innerContext.getPayer()); + assertEquals(schedulerKey, innerContext.getPayerKey()); + + verify(dispatcher, never()).dispatch(any()); } @Test void innerTxnFailsSetsStatus() { - givenSetupForScheduleCreate(payer); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - payer, - INVALID_ACCOUNT_ID, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); - given(dispatcher.dispatch(any(), any())).willReturn(scheduledMeta); + final var subject = new ScheduleCreateHandler(); + final var txn = scheduleCreateTransaction(payer); + + given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); + given(keyLookup.getKey(payer)).willReturn(KeyOrLookupFailureReason.withFailureReason(INVALID_ACCOUNT_ID)); final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, dispatcher); @@ -215,13 +169,12 @@ void innerTxnFailsSetsStatus() { assertEquals(schedulerKey, context.getPayerKey()); assertEquals(List.of(adminKey), context.getRequiredNonPayerKeys()); - verify(dispatcher).dispatch(scheduledTxn, payer); - assertEquals(UNRESOLVABLE_REQUIRED_SIGNERS, ((TransactionMetadata) context.getHandlerMetadata()).status()); - assertEquals(payer, ((TransactionMetadata) context.getHandlerMetadata()).payer()); - assertEquals(List.of(), ((TransactionMetadata) context.getHandlerMetadata()).requiredNonPayerKeys()); - assertEquals( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - ((TransactionMetadata) context.getHandlerMetadata()).txnBody()); + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, true, UNRESOLVABLE_REQUIRED_SIGNERS); + assertEquals(payer, innerContext.getPayer()); + assertNull(innerContext.getPayerKey()); + + verify(dispatcher).dispatch(innerContext); } private TransactionBody scheduleCreateTransaction(final AccountID payer) { @@ -232,12 +185,4 @@ private TransactionBody scheduleCreateTransaction(final AccountID payer) { scheduler, Timestamp.newBuilder().setSeconds(1_234_567L).build()); } - - private void givenSetupForScheduleCreate(final AccountID payer) { - txn = scheduleCreateTransaction(payer); - scheduledTxn = asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()); - - given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); - lenient().when(dispatcher.dispatch(scheduledTxn, payer)).thenReturn(scheduledMeta); - } } diff --git a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerParityTest.java b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerParityTest.java index 97219f74f133..e705969d1208 100644 --- a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerParityTest.java +++ b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerParityTest.java @@ -34,10 +34,10 @@ import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.fixtures.state.MapReadableKVState; import com.hedera.node.app.spi.fixtures.state.MapReadableStates; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.state.ReadableKVState; import com.hedera.node.app.spi.state.ReadableKVStateBase; import com.hedera.node.app.spi.state.ReadableStates; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.test.factories.keys.KeyTree; import com.hedera.test.factories.scenarios.TxnHandlingScenario; import com.hedera.test.utils.IdUtils; diff --git a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerTest.java b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerTest.java index 64d9ae2f9d5d..ea4b80e7cff1 100644 --- a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerTest.java +++ b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleDeleteHandlerTest.java @@ -16,8 +16,9 @@ package com.hedera.node.app.service.schedule.impl.test.handlers; -import static com.hedera.node.app.service.mono.utils.MiscUtils.asOrdinary; -import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.*; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_SCHEDULE_ID; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; +import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SCHEDULE_IS_IMMUTABLE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.BDDMockito.given; @@ -26,10 +27,14 @@ import com.hedera.node.app.service.schedule.impl.ReadableScheduleStore; import com.hedera.node.app.service.schedule.impl.handlers.ScheduleDeleteHandler; import com.hedera.node.app.spi.KeyOrLookupFailureReason; -import com.hedera.node.app.spi.meta.PreHandleContext; -import com.hedera.node.app.spi.meta.TransactionMetadata; import com.hedera.node.app.spi.state.ReadableKVStateBase; -import com.hederahashgraph.api.proto.java.*; +import com.hedera.node.app.spi.workflows.PreHandleContext; +import com.hederahashgraph.api.proto.java.AccountID; +import com.hederahashgraph.api.proto.java.CryptoCreateTransactionBody; +import com.hederahashgraph.api.proto.java.ScheduleDeleteTransactionBody; +import com.hederahashgraph.api.proto.java.ScheduleID; +import com.hederahashgraph.api.proto.java.TransactionBody; +import com.hederahashgraph.api.proto.java.TransactionID; import java.util.List; import java.util.Optional; import org.apache.commons.codec.DecoderException; @@ -52,6 +57,8 @@ class ScheduleDeleteHandlerTest extends ScheduleHandlerTestBase { private final AccountID scheduleDeleter = AccountID.newBuilder().setAccountNum(3001L).build(); + protected TransactionBody scheduledTxn; + @BeforeEach void setUp() { given(states.get("SCHEDULES_BY_ID")).willReturn(schedulesById); @@ -108,16 +115,16 @@ private void givenSetupForScheduleDelete(TransactionBody txn) { TransactionID.newBuilder().setAccountID(scheduler).build()) .setCryptoCreateAccount(CryptoCreateTransactionBody.getDefaultInstance()) .build(); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - scheduler, - OK, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); + // scheduledMeta = new TransactionMetadata( + // asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), + // scheduler, + // OK, + // schedulerKey, + // List.of(), + // null, + // null, + // List.of(), + // List.of()); } private TransactionBody scheduleDeleteTransaction() { diff --git a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleHandlerTestBase.java b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleHandlerTestBase.java index 04eb2bdfc4f3..309f7db3ac82 100644 --- a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleHandlerTestBase.java +++ b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleHandlerTestBase.java @@ -18,15 +18,13 @@ import static com.hedera.node.app.service.mono.Utils.asHederaKey; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import com.google.protobuf.ByteString; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.PreHandleDispatcher; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; -import com.hedera.node.app.spi.meta.TransactionMetadata; import com.hedera.node.app.spi.state.ReadableStates; +import com.hedera.node.app.spi.workflows.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleDispatcher; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.Key; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; @@ -46,12 +44,13 @@ class ScheduleHandlerTestBase { protected HederaKey adminKey = asHederaKey(key).get(); protected AccountID scheduler = AccountID.newBuilder().setAccountNum(1001L).build(); protected AccountID payer = AccountID.newBuilder().setAccountNum(2001L).build(); - protected TransactionBody scheduledTxn; - protected TransactionMetadata scheduledMeta; @Mock protected AccountKeyLookup keyLookup; + @Mock + protected HederaKey payerKey; + @Mock protected HederaKey schedulerKey; @@ -61,23 +60,13 @@ class ScheduleHandlerTestBase { @Mock protected ReadableStates states; - protected void basicMetaAssertions( - final TransactionMetadata meta, - final int nonPayerKeysSize, - final boolean failed, - final ResponseCodeEnum failureStatus) { - assertEquals(nonPayerKeysSize, meta.requiredNonPayerKeys().size()); - assertTrue(failed ? meta.failed() : !meta.failed()); - assertEquals(failureStatus, meta.status()); - } - protected void basicContextAssertions( final PreHandleContext context, final int nonPayerKeysSize, final boolean failed, final ResponseCodeEnum failureStatus) { assertEquals(nonPayerKeysSize, context.getRequiredNonPayerKeys().size()); - assertTrue(failed ? context.failed() : !context.failed()); + assertEquals(failed, context.failed()); assertEquals(failureStatus, context.getStatus()); } diff --git a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleSignHandlerTest.java b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleSignHandlerTest.java index 77f6c53281c4..7b20ac787734 100644 --- a/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleSignHandlerTest.java +++ b/hedera-node/hedera-schedule-service-impl/src/test/java/com/hedera/node/app/service/schedule/impl/test/handlers/ScheduleSignHandlerTest.java @@ -16,13 +16,14 @@ package com.hedera.node.app.service.schedule.impl.test.handlers; -import static com.hedera.node.app.service.mono.utils.MiscUtils.asOrdinary; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_SCHEDULE_ID; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.SCHEDULED_TRANSACTION_NOT_IN_WHITELIST; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import com.hedera.node.app.service.mono.legacy.core.jproto.JKey; @@ -31,9 +32,8 @@ import com.hedera.node.app.service.schedule.impl.ReadableScheduleStore; import com.hedera.node.app.service.schedule.impl.handlers.ScheduleSignHandler; import com.hedera.node.app.spi.KeyOrLookupFailureReason; -import com.hedera.node.app.spi.meta.PreHandleContext; -import com.hedera.node.app.spi.meta.TransactionMetadata; import com.hedera.node.app.spi.state.ReadableKVStateBase; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.CryptoCreateTransactionBody; import com.hederahashgraph.api.proto.java.ScheduleCreateTransactionBody; import com.hederahashgraph.api.proto.java.ScheduleID; @@ -60,6 +60,8 @@ class ScheduleSignHandlerTest extends ScheduleHandlerTestBase { protected ReadableScheduleStore scheduleStore; + private TransactionBody scheduledTxn; + @BeforeEach void setUp() { given(states.get("SCHEDULES_BY_ID")).willReturn(schedulesById); @@ -72,14 +74,17 @@ void setUp() { void scheduleSignVanillaNoExplicitPayer() { final var txn = scheduleSignTransaction(); givenSetupForScheduleSign(txn); - given(dispatcher.dispatch(scheduledTxn, scheduler)).willReturn(scheduledMeta); + final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, scheduleStore, dispatcher); assertEquals(scheduler, context.getPayer()); assertEquals(schedulerKey, context.getPayerKey()); assertEquals(List.of(), context.getRequiredNonPayerKeys()); - assertEquals(scheduledMeta, context.getHandlerMetadata()); - assertEquals(OK, context.getStatus()); + + PreHandleContext innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, false, OK); + assertEquals(scheduler, innerContext.getPayer()); + assertEquals(schedulerKey, innerContext.getPayerKey()); } @Test @@ -90,31 +95,34 @@ void scheduleSignFailsIfScheduleMissing() { final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, scheduleStore, dispatcher); assertEquals(scheduler, context.getPayer()); - assertEquals(null, context.getHandlerMetadata()); + assertNull(context.getInnerContext()); assertEquals(INVALID_SCHEDULE_ID, context.getStatus()); + + verify(dispatcher, never()).dispatch(any()); } @Test void scheduleSignVanillaWithOptionalPayerSet() { final var txn = scheduleSignTransaction(); givenSetupForScheduleSign(txn); - scheduledMeta = - new TransactionMetadata(scheduledTxn, payer, OK, adminKey, List.of(), null, null, List.of(), List.of()); given(schedule.hasExplicitPayer()).willReturn(true); given(schedule.payer()).willReturn(EntityId.fromGrpcAccountId(payer)); given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); - given(dispatcher.dispatch(scheduledTxn, payer)).willReturn(scheduledMeta); + given(keyLookup.getKey(payer)).willReturn(KeyOrLookupFailureReason.withKey(adminKey)); final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, scheduleStore, dispatcher); assertEquals(scheduler, context.getPayer()); assertEquals(schedulerKey, context.getPayerKey()); - assertEquals(scheduledMeta, context.getHandlerMetadata()); - assertEquals(adminKey, ((TransactionMetadata) context.getHandlerMetadata()).payerKey()); - assertEquals(OK, context.getStatus()); - verify(dispatcher).dispatch(scheduledTxn, payer); + + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, false, OK); + assertEquals(payer, innerContext.getPayer()); + assertEquals(adminKey, innerContext.getPayerKey()); + + verify(dispatcher).dispatch(innerContext); } @Test @@ -134,16 +142,14 @@ void scheduleSignForNotSchedulableFails() { final var context = new PreHandleContext(keyLookup, txn, scheduler); subject.preHandle(context, scheduleStore, dispatcher); + basicContextAssertions(context, 0, false, OK); assertEquals(scheduler, context.getPayer()); assertEquals(schedulerKey, context.getPayerKey()); - assertEquals(List.of(), context.getRequiredNonPayerKeys()); - assertTrue(context.getHandlerMetadata() instanceof TransactionMetadata); - assertTrue( - ((TransactionMetadata) context.getHandlerMetadata()).txnBody().hasScheduleCreate()); - assertEquals( - SCHEDULED_TRANSACTION_NOT_IN_WHITELIST, ((TransactionMetadata) context.getHandlerMetadata()).status()); - assertEquals(scheduler, ((TransactionMetadata) context.getHandlerMetadata()).payer()); - assertEquals(OK, context.getStatus()); + + final var innerContext = context.getInnerContext(); + basicContextAssertions(innerContext, 0, true, SCHEDULED_TRANSACTION_NOT_IN_WHITELIST); + assertEquals(scheduler, innerContext.getPayer()); + assertEquals(schedulerKey, innerContext.getPayerKey()); } @Test @@ -163,16 +169,6 @@ private TransactionBody givenSetupForScheduleSign(TransactionBody txn) { TransactionID.newBuilder().setAccountID(scheduler).build()) .setCryptoCreateAccount(CryptoCreateTransactionBody.getDefaultInstance()) .build(); - scheduledMeta = new TransactionMetadata( - asOrdinary(txn.getScheduleCreate().getScheduledTransactionBody(), txn.getTransactionID()), - scheduler, - OK, - schedulerKey, - List.of(), - null, - null, - List.of(), - List.of()); given(schedulesById.get(scheduleID.getScheduleNum())).willReturn(schedule); given(keyLookup.getKey(scheduler)).willReturn(KeyOrLookupFailureReason.withKey(schedulerKey)); given(schedule.ordinaryViewOfScheduledTxn()).willReturn(scheduledTxn); diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCallHandler.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCallHandler.java index 93a58d4541f6..4b5754a890ae 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCallHandler.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCallHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCreateHandler.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCreateHandler.java index 1137b5590713..0149e6649c17 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCreateHandler.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractCreateHandler.java @@ -20,8 +20,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.mono.legacy.core.jproto.JKey; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractDeleteHandler.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractDeleteHandler.java index a043006f4a04..837812fdbc3c 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractDeleteHandler.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractDeleteHandler.java @@ -19,8 +19,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_TRANSFER_ACCOUNT_ID; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemDeleteHandler.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemDeleteHandler.java index d32180250f0d..fd6b2f752918 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemDeleteHandler.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemDeleteHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemUndeleteHandler.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemUndeleteHandler.java index 2d4769b52c30..23fee34675ff 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemUndeleteHandler.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractSystemUndeleteHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractUpdateHandler.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractUpdateHandler.java index 6b5efabd7cb8..9a5b055c8a4d 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractUpdateHandler.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/ContractUpdateHandler.java @@ -20,8 +20,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_AUTORENEW_ACCOUNT; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.ContractUpdateTransactionBody; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/EtherumTransactionHandler.java b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/EtherumTransactionHandler.java index 53578c8f1a45..c41efe331ba3 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/EtherumTransactionHandler.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/handlers/EtherumTransactionHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCallHandlerTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCallHandlerTest.java index 258aeec4fed8..c09fd31a9699 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCallHandlerTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCallHandlerTest.java @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat; import com.hedera.node.app.service.contract.impl.handlers.ContractCallHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.ContractCallTransactionBody; import com.hederahashgraph.api.proto.java.TransactionBody; import com.hederahashgraph.api.proto.java.TransactionID; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerParityTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerParityTest.java index c7deb7a126bf..593cb6ebb0fd 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerParityTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerParityTest.java @@ -25,7 +25,7 @@ import com.hedera.node.app.service.contract.impl.handlers.ContractCreateHandler; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.test.factories.scenarios.TxnHandlingScenario; import com.hederahashgraph.api.proto.java.TransactionBody; import java.time.Instant; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerTest.java index 3a5c9f14f239..5adcdb35ce81 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractCreateHandlerTest.java @@ -23,7 +23,7 @@ import com.hedera.node.app.service.contract.impl.handlers.ContractCreateHandler; import com.hedera.node.app.spi.KeyOrLookupFailureReason; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractDeleteHandlerParityTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractDeleteHandlerParityTest.java index 95ca9a2120bb..1809959fa9d4 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractDeleteHandlerParityTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractDeleteHandlerParityTest.java @@ -30,7 +30,7 @@ import com.hedera.node.app.service.contract.impl.handlers.ContractDeleteHandler; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.test.factories.scenarios.TxnHandlingScenario; import com.hederahashgraph.api.proto.java.TransactionBody; import org.junit.jupiter.api.BeforeEach; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractHandlerTestBase.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractHandlerTestBase.java index 67de339576c6..4bc735d02ea5 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractHandlerTestBase.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractHandlerTestBase.java @@ -28,7 +28,7 @@ import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.KeyOrLookupFailureReason; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractUpdateHandlerParityTest.java b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractUpdateHandlerParityTest.java index 08e86d9d4c39..6bbdbda794f5 100644 --- a/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractUpdateHandlerParityTest.java +++ b/hedera-node/hedera-smart-contract-service-impl/src/test/java/com/hedera/node/app/service/contract/impl/test/handlers/ContractUpdateHandlerParityTest.java @@ -28,7 +28,7 @@ import com.hedera.node.app.service.contract.impl.handlers.ContractUpdateHandler; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.test.factories.scenarios.TxnHandlingScenario; import com.hederahashgraph.api.proto.java.TransactionBody; import org.junit.jupiter.api.BeforeEach; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoAddLiveHashHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoAddLiveHashHandler.java index bd87e8b5fbb6..63b38b08c8ed 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoAddLiveHashHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoAddLiveHashHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoApproveAllowanceHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoApproveAllowanceHandler.java index be2296272791..d011f0bdfc9c 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoApproveAllowanceHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoApproveAllowanceHandler.java @@ -20,8 +20,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_DELEGATING_SPENDER; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoCreateHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoCreateHandler.java index b67fde82fec2..566d6c52275f 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoCreateHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoCreateHandler.java @@ -19,8 +19,8 @@ import static com.hedera.node.app.service.mono.Utils.asHederaKey; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteAllowanceHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteAllowanceHandler.java index aebdb8a0a48c..94d1f719fff3 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteAllowanceHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteAllowanceHandler.java @@ -19,8 +19,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ALLOWANCE_OWNER_ID; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteHandler.java index 815cf5df6996..8635f25c942c 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteHandler.java @@ -19,8 +19,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_TRANSFER_ACCOUNT_ID; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteLiveHashHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteLiveHashHandler.java index f799665194d4..a7f7ada16d8d 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteLiveHashHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoDeleteLiveHashHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoTransferHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoTransferHandler.java index bee7d4d66032..860a6eeee49d 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoTransferHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoTransferHandler.java @@ -26,9 +26,9 @@ import com.hedera.node.app.service.token.impl.ReadableTokenStore; import com.hedera.node.app.spi.AccountKeyLookup; import com.hedera.node.app.spi.KeyOrLookupFailureReason; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; import com.hedera.node.app.spi.workflows.PreCheckException; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.AccountAmount; import com.hederahashgraph.api.proto.java.AccountID; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoUpdateHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoUpdateHandler.java index 0085ec546b39..c728aec5fb50 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoUpdateHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/CryptoUpdateHandler.java @@ -20,8 +20,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.CryptoSignatureWaivers; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAccountWipeHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAccountWipeHandler.java index 1fcc65c1826f..92267689013a 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAccountWipeHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAccountWipeHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAssociateToAccountHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAssociateToAccountHandler.java index 8a3c9f0e6b60..42e43610d583 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAssociateToAccountHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenAssociateToAccountHandler.java @@ -19,8 +19,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenBurnHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenBurnHandler.java index d9fac7ed599a..2bea513e3c32 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenBurnHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenBurnHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenCreateHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenCreateHandler.java index 088e6ab18205..572b701018d1 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenCreateHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenCreateHandler.java @@ -22,8 +22,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_TREASURY_ACCOUNT_FOR_TOKEN; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.CustomFee; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDeleteHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDeleteHandler.java index 636b525c7f3c..4c2b79fef9cd 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDeleteHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDeleteHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDissociateFromAccountHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDissociateFromAccountHandler.java index 8b42a6923948..4337085f289a 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDissociateFromAccountHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenDissociateFromAccountHandler.java @@ -19,8 +19,8 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFeeScheduleUpdateHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFeeScheduleUpdateHandler.java index 591a6b885ec6..b33508ffb4ad 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFeeScheduleUpdateHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFeeScheduleUpdateHandler.java @@ -20,8 +20,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFreezeAccountHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFreezeAccountHandler.java index 27a37586b7ea..b651015dad2e 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFreezeAccountHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenFreezeAccountHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenGrantKycToAccountHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenGrantKycToAccountHandler.java index 8a429a8ef146..e0d3253a9cac 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenGrantKycToAccountHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenGrantKycToAccountHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenMintHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenMintHandler.java index 5a6c29ca6037..4f65ea387559 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenMintHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenMintHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenPauseHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenPauseHandler.java index 521b7ddf1d6e..a63f8e24a037 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenPauseHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenPauseHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenRevokeKycFromAccountHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenRevokeKycFromAccountHandler.java index ae59e500177d..196ba0fb8093 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenRevokeKycFromAccountHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenRevokeKycFromAccountHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnfreezeAccountHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnfreezeAccountHandler.java index 27cfc6a730d0..17ece4d1f434 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnfreezeAccountHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnfreezeAccountHandler.java @@ -19,8 +19,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnpauseHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnpauseHandler.java index 9875ad3d3099..0c511efe8e33 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnpauseHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUnpauseHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull; diff --git a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUpdateHandler.java b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUpdateHandler.java index c1e3fb28239d..b39f4aa7b8de 100644 --- a/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUpdateHandler.java +++ b/hedera-node/hedera-token-service-impl/src/main/java/com/hedera/node/app/service/token/impl/handlers/TokenUpdateHandler.java @@ -21,8 +21,8 @@ import static java.util.Objects.requireNonNull; import com.hedera.node.app.service.token.impl.ReadableTokenStore; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import edu.umd.cs.findbugs.annotations.NonNull; import javax.inject.Inject; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoApproveAllowanceHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoApproveAllowanceHandlerTest.java index c8ef97b5d8d3..f842808d67c3 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoApproveAllowanceHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoApproveAllowanceHandlerTest.java @@ -31,7 +31,7 @@ import com.hedera.node.app.service.mono.state.merkle.MerkleAccount; import com.hedera.node.app.service.token.impl.handlers.CryptoApproveAllowanceHandler; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.CryptoAllowance; import com.hederahashgraph.api.proto.java.CryptoApproveAllowanceTransactionBody; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoCreateHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoCreateHandlerTest.java index be4f52d4d82c..4d7247e553c1 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoCreateHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoCreateHandlerTest.java @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.*; import com.hedera.node.app.service.token.impl.handlers.CryptoCreateHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.CryptoCreateTransactionBody; import com.hederahashgraph.api.proto.java.TransactionBody; import com.hederahashgraph.api.proto.java.TransactionID; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteAllowanceHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteAllowanceHandlerTest.java index fc88bb8bc675..71fb47326490 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteAllowanceHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteAllowanceHandlerTest.java @@ -33,7 +33,7 @@ import com.hedera.node.app.service.mono.state.merkle.MerkleAccount; import com.hedera.node.app.service.token.impl.handlers.CryptoDeleteAllowanceHandler; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.CryptoDeleteAllowanceTransactionBody; import com.hederahashgraph.api.proto.java.NftRemoveAllowance; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteHandlerTest.java index 3bcffd2ca6fa..24cf13ee33b9 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoDeleteHandlerTest.java @@ -27,7 +27,7 @@ import com.hedera.node.app.service.mono.legacy.core.jproto.JKey; import com.hedera.node.app.service.mono.state.merkle.MerkleAccount; import com.hedera.node.app.service.token.impl.handlers.CryptoDeleteHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.CryptoDeleteTransactionBody; import com.hederahashgraph.api.proto.java.TransactionBody; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoHandlerTestBase.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoHandlerTestBase.java index 798292729ccc..4e92b7cbba63 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoHandlerTestBase.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoHandlerTestBase.java @@ -28,10 +28,10 @@ import com.hedera.node.app.service.token.impl.CryptoSignatureWaiversImpl; import com.hedera.node.app.service.token.impl.ReadableAccountStore; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; import com.hedera.node.app.spi.state.ReadableKVState; import com.hedera.node.app.spi.state.ReadableStates; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.Key; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoTransferHandlerParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoTransferHandlerParityTest.java index e2d4dfac4fd5..7e889bcacb16 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoTransferHandlerParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoTransferHandlerParityTest.java @@ -67,7 +67,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.CryptoTransferHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.Key; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoUpdateHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoUpdateHandlerTest.java index 93c7a3ead730..1d589ba1b2ef 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoUpdateHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/CryptoUpdateHandlerTest.java @@ -29,7 +29,7 @@ import com.hedera.node.app.service.mono.state.merkle.MerkleAccount; import com.hedera.node.app.service.token.impl.handlers.CryptoUpdateHandler; import com.hedera.node.app.spi.key.HederaKey; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.AccountID; import com.hederahashgraph.api.proto.java.CryptoUpdateTransactionBody; import com.hederahashgraph.api.proto.java.TransactionBody; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAccountWipeHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAccountWipeHandlerTest.java index ec53d1ecc06f..2b6a7ddc01bf 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAccountWipeHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAccountWipeHandlerTest.java @@ -26,10 +26,12 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenAccountWipeHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.junit.jupiter.api.Test; class TokenAccountWipeHandlerTest extends ParityTestBase { diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAssociateToAccountHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAssociateToAccountHandlerTest.java index 52e7b227cc53..493d951be769 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAssociateToAccountHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenAssociateToAccountHandlerTest.java @@ -27,10 +27,12 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.INVALID_ACCOUNT_ID; import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenAssociateToAccountHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenBurnHandlerParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenBurnHandlerParityTest.java index e3def21dd5d1..81b8948dddb1 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenBurnHandlerParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenBurnHandlerParityTest.java @@ -26,10 +26,12 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenBurnHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.junit.jupiter.api.Test; public class TokenBurnHandlerParityTest extends ParityTestBase { diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenCreateHandleParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenCreateHandleParityTest.java index df638166066a..d9a2a718a03f 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenCreateHandleParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenCreateHandleParityTest.java @@ -59,7 +59,7 @@ import com.hedera.node.app.service.token.impl.handlers.TokenCreateHandler; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDeleteHandlerParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDeleteHandlerParityTest.java index f2e4a90a4fd0..e6f911a83aa0 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDeleteHandlerParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDeleteHandlerParityTest.java @@ -31,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenDeleteHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.junit.jupiter.api.Test; class TokenDeleteHandlerParityTest extends ParityTestBase { diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDissociateFromAccountHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDissociateFromAccountHandlerTest.java index 8a7ff99be302..af668bcb8b66 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDissociateFromAccountHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenDissociateFromAccountHandlerTest.java @@ -31,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenDissociateFromAccountHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFeeScheduleUpdateHandlerParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFeeScheduleUpdateHandlerParityTest.java index 10251d7b41ad..3b73c5217f96 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFeeScheduleUpdateHandlerParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFeeScheduleUpdateHandlerParityTest.java @@ -39,7 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenFeeScheduleUpdateHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import java.util.Collections; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFreezeAccountHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFreezeAccountHandlerTest.java index d3f991246cff..a0a6dacc1dfe 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFreezeAccountHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenFreezeAccountHandlerTest.java @@ -22,10 +22,11 @@ import static com.hederahashgraph.api.proto.java.ResponseCodeEnum.OK; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import com.hedera.node.app.service.token.impl.handlers.TokenFreezeAccountHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.junit.jupiter.api.Test; class TokenFreezeAccountHandlerTest extends ParityTestBase { diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenGrantKycToAccountHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenGrantKycToAccountHandlerTest.java index 688128f4d988..7ea5a9acb7bc 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenGrantKycToAccountHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenGrantKycToAccountHandlerTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import com.hedera.node.app.service.token.impl.handlers.TokenGrantKycToAccountHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.junit.jupiter.api.Test; class TokenGrantKycToAccountHandlerTest extends ParityTestBase { diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenMintHandlerParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenMintHandlerParityTest.java index bb3208fd7841..b0e7b4d35f45 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenMintHandlerParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenMintHandlerParityTest.java @@ -31,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenMintHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import org.junit.jupiter.api.Test; class TokenMintHandlerParityTest extends ParityTestBase { diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenRevokeKycFromAccountHandlerTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenRevokeKycFromAccountHandlerTest.java index be2c03775d4f..d24751563b65 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenRevokeKycFromAccountHandlerTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenRevokeKycFromAccountHandlerTest.java @@ -34,7 +34,7 @@ import com.hedera.node.app.service.token.impl.handlers.TokenRevokeKycFromAccountHandler; import com.hedera.node.app.service.token.impl.test.util.SigReqAdapterUtils; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUnfreezeAccountHandlerParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUnfreezeAccountHandlerParityTest.java index dfe3730092ff..ed8b4f73b0d0 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUnfreezeAccountHandlerParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUnfreezeAccountHandlerParityTest.java @@ -33,7 +33,7 @@ import com.hedera.node.app.service.token.impl.handlers.TokenUnfreezeAccountHandler; import com.hedera.node.app.service.token.impl.test.util.SigReqAdapterUtils; import com.hedera.node.app.spi.AccountKeyLookup; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUpdateHandlerParityTest.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUpdateHandlerParityTest.java index 16f2ee47fcad..9024c9fd5efa 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUpdateHandlerParityTest.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/handlers/TokenUpdateHandlerParityTest.java @@ -47,7 +47,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.hedera.node.app.service.token.impl.handlers.TokenUpdateHandler; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; import org.junit.jupiter.api.Test; diff --git a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/util/MetaAssertion.java b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/util/MetaAssertion.java index e6d2b0406315..a641b23a6db3 100644 --- a/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/util/MetaAssertion.java +++ b/hedera-node/hedera-token-service-impl/src/test/java/com/hedera/node/app/service/token/impl/test/util/MetaAssertion.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import com.hedera.node.app.spi.meta.PreHandleContext; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hederahashgraph.api.proto.java.ResponseCodeEnum; public class MetaAssertion { diff --git a/hedera-node/hedera-util-service-impl/src/main/java/com/hedera/node/app/service/util/impl/handlers/UtilPrngHandler.java b/hedera-node/hedera-util-service-impl/src/main/java/com/hedera/node/app/service/util/impl/handlers/UtilPrngHandler.java index fb9976d107be..96dd2ce787a0 100644 --- a/hedera-node/hedera-util-service-impl/src/main/java/com/hedera/node/app/service/util/impl/handlers/UtilPrngHandler.java +++ b/hedera-node/hedera-util-service-impl/src/main/java/com/hedera/node/app/service/util/impl/handlers/UtilPrngHandler.java @@ -18,8 +18,8 @@ import static java.util.Objects.requireNonNull; -import com.hedera.node.app.spi.meta.PreHandleContext; import com.hedera.node.app.spi.meta.TransactionMetadata; +import com.hedera.node.app.spi.workflows.PreHandleContext; import com.hedera.node.app.spi.workflows.TransactionHandler; import com.hederahashgraph.api.proto.java.TransactionBody; import edu.umd.cs.findbugs.annotations.NonNull;