diff --git a/hapi/hedera-protobufs/block/stream/output/smart_contract_service.proto b/hapi/hedera-protobufs/block/stream/output/smart_contract_service.proto index d4fc194ea459..c36054a4afd7 100644 --- a/hapi/hedera-protobufs/block/stream/output/smart_contract_service.proto +++ b/hapi/hedera-protobufs/block/stream/output/smart_contract_service.proto @@ -151,6 +151,7 @@ message EthereumOutput { * This field is not settled and MAY be removed or modified. */ repeated proto.TransactionSidecarRecord sidecars = 1; + /** * An ethereum hash value. *

diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/BlockItemsTranslator.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/BlockItemsTranslator.java index 6d6fc387d928..ba0b0f97db97 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/BlockItemsTranslator.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/BlockItemsTranslator.java @@ -71,8 +71,9 @@ public TransactionReceipt translateReceipt( requireNonNull(context); requireNonNull(result); requireNonNull(outputs); - final var receiptBuilder = - TransactionReceipt.newBuilder().status(result.status()).exchangeRate(result.exchangeRate()); + final var receiptBuilder = TransactionReceipt.newBuilder() + .status(result.status()) + .exchangeRate(context.transactionExchangeRates()); final var function = context.functionality(); switch (function) { case CONTRACT_CALL, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/BlockStreamBuilder.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/BlockStreamBuilder.java index 8d4a610dead7..b44adc6546a2 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/BlockStreamBuilder.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/BlockStreamBuilder.java @@ -184,6 +184,10 @@ public class BlockStreamBuilder */ @Nullable private HederaFunctionality functionality; + /** + * The exchange rate set to add to the record stream transaction receipt. + */ + private ExchangeRateSet translationContextExchangeRates; /** * The memo from the transaction, set explicitly to avoid parsing the transaction again. */ @@ -840,7 +844,10 @@ public BlockStreamBuilder contractID(@Nullable final ContractID contractID) { @NonNull @Override public BlockStreamBuilder exchangeRate(@Nullable final ExchangeRateSet exchangeRate) { - transactionResultBuilder.exchangeRate(exchangeRate); + // Block Stream doesn't include exchange rate in output (it's in state + // changes when it is updated), so store exchange rate for the + // translation context + translationContextExchangeRates = exchangeRate; return this; } @@ -1171,27 +1178,58 @@ private TranslationContext translationContext() { CONTRACT_DELETE, CONTRACT_UPDATE, ETHEREUM_TRANSACTION -> new ContractOpContext( - memo, transactionId, transaction, functionality, contractId); + memo, translationContextExchangeRates, transactionId, transaction, functionality, contractId); case CRYPTO_CREATE, CRYPTO_UPDATE -> new CryptoOpContext( - memo, transactionId, transaction, functionality, accountId, evmAddress); - case FILE_CREATE -> new FileOpContext(memo, transactionId, transaction, functionality, fileId); - case NODE_CREATE -> new NodeOpContext(memo, transactionId, transaction, functionality, nodeId); - case SCHEDULE_DELETE -> new ScheduleOpContext(memo, transactionId, transaction, functionality, scheduleId); + memo, + translationContextExchangeRates, + transactionId, + transaction, + functionality, + accountId, + evmAddress); + case FILE_CREATE -> new FileOpContext( + memo, translationContextExchangeRates, transactionId, transaction, functionality, fileId); + case NODE_CREATE -> new NodeOpContext( + memo, translationContextExchangeRates, transactionId, transaction, functionality, nodeId); + case SCHEDULE_DELETE -> new ScheduleOpContext( + memo, translationContextExchangeRates, transactionId, transaction, functionality, scheduleId); case CONSENSUS_SUBMIT_MESSAGE -> new SubmitOpContext( - memo, transactionId, transaction, functionality, runningHash, runningHashVersion, sequenceNumber); + memo, + translationContextExchangeRates, + transactionId, + transaction, + functionality, + runningHash, + runningHashVersion, + sequenceNumber); case TOKEN_AIRDROP -> { if (!pendingAirdropRecords.isEmpty()) { pendingAirdropRecords.sort(PENDING_AIRDROP_RECORD_COMPARATOR); } - yield new AirdropOpContext(memo, transactionId, transaction, functionality, pendingAirdropRecords); + yield new AirdropOpContext( + memo, + translationContextExchangeRates, + transactionId, + transaction, + functionality, + pendingAirdropRecords); } case TOKEN_MINT -> new MintOpContext( - memo, transactionId, transaction, functionality, serialNumbers, newTotalSupply); + memo, + translationContextExchangeRates, + transactionId, + transaction, + functionality, + serialNumbers, + newTotalSupply); case TOKEN_BURN, TOKEN_ACCOUNT_WIPE -> new SupplyChangeOpContext( - memo, transactionId, transaction, functionality, newTotalSupply); - case TOKEN_CREATE -> new TokenOpContext(memo, transactionId, transaction, functionality, tokenId); - case CONSENSUS_CREATE_TOPIC -> new TopicOpContext(memo, transactionId, transaction, functionality, topicId); - default -> new BaseOpContext(memo, transactionId, transaction, functionality); + memo, translationContextExchangeRates, transactionId, transaction, functionality, newTotalSupply); + case TOKEN_CREATE -> new TokenOpContext( + memo, translationContextExchangeRates, transactionId, transaction, functionality, tokenId); + case CONSENSUS_CREATE_TOPIC -> new TopicOpContext( + memo, translationContextExchangeRates, transactionId, transaction, functionality, topicId); + default -> new BaseOpContext( + memo, translationContextExchangeRates, transactionId, transaction, functionality); }; } } diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/TranslationContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/TranslationContext.java index 018d49d2db50..d8a01f436093 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/TranslationContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/TranslationContext.java @@ -23,6 +23,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.hapi.node.transaction.TransactionRecord; import com.hedera.pbj.runtime.io.buffer.Bytes; @@ -37,6 +38,12 @@ public interface TranslationContext { */ String memo(); + /** + * The exchange rate set to include in the receipt for this transaction. + * @return an exchange rate set applicable to the transaction receipt. + */ + ExchangeRateSet transactionExchangeRates(); + /** * Returns the transaction ID of the transaction. * @return the transaction ID diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/AirdropOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/AirdropOpContext.java index dbb3cabb4355..cda970178b82 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/AirdropOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/AirdropOpContext.java @@ -19,6 +19,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.hapi.node.transaction.PendingAirdropRecord; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; @@ -34,6 +35,7 @@ */ public record AirdropOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/BaseOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/BaseOpContext.java index 0945fed1d67b..750dcd7aa345 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/BaseOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/BaseOpContext.java @@ -19,6 +19,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; @@ -32,6 +33,7 @@ */ public record BaseOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality) diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ContractOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ContractOpContext.java index 46efafbc9384..b281c638bab5 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ContractOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ContractOpContext.java @@ -20,6 +20,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; @@ -34,6 +35,7 @@ */ public record ContractOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/CryptoOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/CryptoOpContext.java index 70a1595f63f9..7d2c16269d58 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/CryptoOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/CryptoOpContext.java @@ -20,6 +20,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import com.hedera.pbj.runtime.io.buffer.Bytes; import edu.umd.cs.findbugs.annotations.NonNull; @@ -37,6 +38,7 @@ */ public record CryptoOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/FileOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/FileOpContext.java index 28cfa953d7d8..23bb681ead89 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/FileOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/FileOpContext.java @@ -20,6 +20,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; @@ -34,6 +35,7 @@ */ public record FileOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/MintOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/MintOpContext.java index 8c195cd06afd..bab7b98157ae 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/MintOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/MintOpContext.java @@ -19,6 +19,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.List; @@ -34,6 +35,7 @@ */ public record MintOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/NodeOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/NodeOpContext.java index 3240ca18e5c2..55e34af52682 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/NodeOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/NodeOpContext.java @@ -19,6 +19,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; @@ -32,6 +33,7 @@ */ public record NodeOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ScheduleOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ScheduleOpContext.java index e70903802c7d..cf1faee096d6 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ScheduleOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/ScheduleOpContext.java @@ -20,6 +20,7 @@ import com.hedera.hapi.node.base.ScheduleID; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; @@ -33,6 +34,7 @@ */ public record ScheduleOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SubmitOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SubmitOpContext.java index adf8d1be9eab..aa304a506584 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SubmitOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SubmitOpContext.java @@ -19,6 +19,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import com.hedera.pbj.runtime.io.buffer.Bytes; import edu.umd.cs.findbugs.annotations.NonNull; @@ -35,6 +36,7 @@ */ public record SubmitOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SupplyChangeOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SupplyChangeOpContext.java index 1753ffad1aaf..6d2f872d116e 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SupplyChangeOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/SupplyChangeOpContext.java @@ -19,6 +19,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; @@ -32,6 +33,7 @@ */ public record SupplyChangeOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TokenOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TokenOpContext.java index af43550ba6bf..cc96abed47bc 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TokenOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TokenOpContext.java @@ -20,6 +20,7 @@ import com.hedera.hapi.node.base.TokenID; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; @@ -33,6 +34,7 @@ */ public record TokenOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TopicOpContext.java b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TopicOpContext.java index 9a653a0c29da..22452d1f2435 100644 --- a/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TopicOpContext.java +++ b/hedera-node/hedera-app/src/main/java/com/hedera/node/app/blocks/impl/contexts/TopicOpContext.java @@ -20,6 +20,7 @@ import com.hedera.hapi.node.base.TopicID; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.node.app.blocks.impl.TranslationContext; import edu.umd.cs.findbugs.annotations.NonNull; @@ -33,6 +34,7 @@ */ public record TopicOpContext( @NonNull String memo, + @NonNull ExchangeRateSet transactionExchangeRates, @NonNull TransactionID txnId, @NonNull Transaction transaction, @NonNull HederaFunctionality functionality, diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockItemsTranslatorTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockItemsTranslatorTest.java index 21a080c21dfa..be304352071c 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockItemsTranslatorTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockItemsTranslatorTest.java @@ -142,7 +142,6 @@ class BlockItemsTranslatorTest { .nextRate(new ExchangeRate(3, 4, TimestampSeconds.DEFAULT)) .build(); private static final TransactionResult TRANSACTION_RESULT = TransactionResult.newBuilder() - .exchangeRate(RATES) .consensusTimestamp(CONSENSUS_TIME) .parentConsensusTimestamp(PARENT_CONSENSUS_TIME) .scheduleRef(SCHEDULE_REF) @@ -216,7 +215,7 @@ class BlockItemsTranslatorTest { "TOKEN_BURN", }) void mostOpsUseJustUseBaseOpContextForReceipt(@NonNull final HederaFunctionality function) { - final var context = new BaseOpContext(MEMO, TXN_ID, Transaction.DEFAULT, function); + final var context = new BaseOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, function); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT, actualReceipt); @@ -233,7 +232,7 @@ void mostOpsUseJustUseBaseOpContextForReceipt(@NonNull final HederaFunctionality "ETHEREUM_TRANSACTION", }) void contractOpsUseContractOpContext(@NonNull final HederaFunctionality function) { - final var context = new ContractOpContext(MEMO, TXN_ID, Transaction.DEFAULT, function, CONTRACT_ID); + final var context = new ContractOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, function, CONTRACT_ID); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT.copyBuilder().contractID(CONTRACT_ID).build(), actualReceipt); @@ -247,35 +246,37 @@ void contractOpsUseContractOpContext(@NonNull final HederaFunctionality function "CRYPTO_UPDATE", }) void certainCryptoOpsUseCryptoOpContext(@NonNull final HederaFunctionality function) { - final var context = new CryptoOpContext(MEMO, TXN_ID, Transaction.DEFAULT, function, ACCOUNT_ID, EVM_ADDRESS); + final var context = + new CryptoOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, function, ACCOUNT_ID, EVM_ADDRESS); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT.copyBuilder().accountID(ACCOUNT_ID).build(), actualReceipt); } @Test void fileCreateUsesFileOpContext() { - final var context = new FileOpContext(MEMO, TXN_ID, Transaction.DEFAULT, FILE_CREATE, FILE_ID); + final var context = new FileOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, FILE_CREATE, FILE_ID); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT.copyBuilder().fileID(FILE_ID).build(), actualReceipt); } @Test void nodeCreateUsesNodeOpContext() { - final var context = new NodeOpContext(MEMO, TXN_ID, Transaction.DEFAULT, NODE_CREATE, NODE_ID); + final var context = new NodeOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, NODE_CREATE, NODE_ID); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT.copyBuilder().nodeId(NODE_ID).build(), actualReceipt); } @Test void tokenCreateUsesTokenOpContext() { - final var context = new TokenOpContext(MEMO, TXN_ID, Transaction.DEFAULT, TOKEN_CREATE, TOKEN_ID); + final var context = new TokenOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, TOKEN_CREATE, TOKEN_ID); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT.copyBuilder().tokenID(TOKEN_ID).build(), actualReceipt); } @Test void topicCreateUsesTopicOpContext() { - final var context = new TopicOpContext(MEMO, TXN_ID, Transaction.DEFAULT, CONSENSUS_CREATE_TOPIC, TOPIC_ID); + final var context = + new TopicOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, CONSENSUS_CREATE_TOPIC, TOPIC_ID); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT.copyBuilder().topicID(TOPIC_ID).build(), actualReceipt); } @@ -285,7 +286,7 @@ void scheduleCreateUsesCreateScheduleOutputOnlyIfPresent() { final var output = TransactionOutput.newBuilder() .createSchedule(new CreateScheduleOutput(SCHEDULE_ID, SCHEDULED_TXN_ID)) .build(); - final var context = new BaseOpContext(MEMO, TXN_ID, Transaction.DEFAULT, SCHEDULE_CREATE); + final var context = new BaseOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, SCHEDULE_CREATE); final var actualReceiptNoOutput = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT, actualReceiptNoOutput); @@ -306,7 +307,7 @@ void scheduleSignUsesSignScheduleOutputOnlyIfPresent() { final var output = TransactionOutput.newBuilder() .signSchedule(new SignScheduleOutput(SCHEDULED_TXN_ID)) .build(); - final var context = new BaseOpContext(MEMO, TXN_ID, Transaction.DEFAULT, SCHEDULE_SIGN); + final var context = new BaseOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, SCHEDULE_SIGN); final var actualReceiptNoOutput = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT, actualReceiptNoOutput); @@ -323,7 +324,8 @@ void scheduleSignUsesSignScheduleOutputOnlyIfPresent() { @Test void scheduleDeleteUsesScheduleOpContext() { - final var context = new ScheduleOpContext(MEMO, TXN_ID, Transaction.DEFAULT, SCHEDULE_DELETE, SCHEDULE_ID); + final var context = + new ScheduleOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, SCHEDULE_DELETE, SCHEDULE_ID); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECEIPT.copyBuilder().scheduleID(SCHEDULE_ID).build(), actualReceipt); @@ -333,6 +335,7 @@ void scheduleDeleteUsesScheduleOpContext() { void submitMessageUsesSubmitOpContext() { final var context = new SubmitOpContext( MEMO, + RATES, TXN_ID, Transaction.DEFAULT, CONSENSUS_SUBMIT_MESSAGE, @@ -354,7 +357,7 @@ void submitMessageUsesSubmitOpContext() { @Test void tokenMintUsesMintOpContext() { final var context = - new MintOpContext(MEMO, TXN_ID, Transaction.DEFAULT, TOKEN_MINT, SERIAL_NOS, NEW_TOTAL_SUPPLY); + new MintOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, TOKEN_MINT, SERIAL_NOS, NEW_TOTAL_SUPPLY); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals( @@ -374,7 +377,8 @@ void tokenMintUsesMintOpContext() { "TOKEN_BURN", }) void supplyChangeOpsUseSupplyChangeContext(@NonNull final HederaFunctionality function) { - final var context = new SupplyChangeOpContext(MEMO, TXN_ID, Transaction.DEFAULT, function, NEW_TOTAL_SUPPLY); + final var context = + new SupplyChangeOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, function, NEW_TOTAL_SUPPLY); final var actualReceipt = BLOCK_ITEMS_TRANSLATOR.translateReceipt(context, TRANSACTION_RESULT); assertEquals( EXPECTED_BASE_RECEIPT @@ -391,7 +395,7 @@ void contractCallUsesResultOutputIfPresent() { final var output = TransactionOutput.newBuilder() .contractCall(new CallContractOutput(List.of(), FUNCTION_RESULT)) .build(); - final var context = new ContractOpContext(MEMO, TXN_ID, Transaction.DEFAULT, CONTRACT_CALL, CONTRACT_ID); + final var context = new ContractOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, CONTRACT_CALL, CONTRACT_ID); final var actualRecordNoOutput = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals( @@ -423,7 +427,8 @@ void contractCreateUsesResultOutputIfPresent() { final var output = TransactionOutput.newBuilder() .contractCreate(new CreateContractOutput(List.of(), FUNCTION_RESULT)) .build(); - final var context = new ContractOpContext(MEMO, TXN_ID, Transaction.DEFAULT, CONTRACT_CREATE, CONTRACT_ID); + final var context = + new ContractOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, CONTRACT_CREATE, CONTRACT_ID); final var actualRecordNoOutput = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals( @@ -458,7 +463,8 @@ void ethTxCallUsesResultOutputIfPresent() { .ethereumCallResult(FUNCTION_RESULT) .build()) .build(); - final var context = new ContractOpContext(MEMO, TXN_ID, Transaction.DEFAULT, ETHEREUM_TRANSACTION, CONTRACT_ID); + final var context = + new ContractOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, ETHEREUM_TRANSACTION, CONTRACT_ID); final var actualRecordNoOutput = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals( @@ -494,7 +500,8 @@ void ethTxCreateUsesResultOutputIfPresent() { .ethereumCreateResult(FUNCTION_RESULT) .build()) .build(); - final var context = new ContractOpContext(MEMO, TXN_ID, Transaction.DEFAULT, ETHEREUM_TRANSACTION, CONTRACT_ID); + final var context = + new ContractOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, ETHEREUM_TRANSACTION, CONTRACT_ID); final var actualRecordNoOutput = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals( @@ -527,7 +534,7 @@ void cryptoTransferUsesSynthResultOutputIfPresent() { final var output = TransactionOutput.newBuilder() .contractCall(new CallContractOutput(List.of(), FUNCTION_RESULT)) .build(); - final var context = new BaseOpContext(MEMO, TXN_ID, Transaction.DEFAULT, CRYPTO_TRANSFER); + final var context = new BaseOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, CRYPTO_TRANSFER); final var actualRecordNoOutput = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECORD, actualRecordNoOutput); @@ -546,7 +553,7 @@ void cryptoTransferUsesCustomFeesOutputIfPresent() { final var output = TransactionOutput.newBuilder() .cryptoTransfer(new CryptoTransferOutput(ASSESSED_CUSTOM_FEES)) .build(); - final var context = new BaseOpContext(MEMO, TXN_ID, Transaction.DEFAULT, CRYPTO_TRANSFER); + final var context = new BaseOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, CRYPTO_TRANSFER); final var actualRecordNoOutput = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECORD, actualRecordNoOutput); @@ -568,7 +575,8 @@ void cryptoTransferUsesCustomFeesOutputIfPresent() { "CRYPTO_UPDATE", }) void certainCryptoOpsUseEvmAddressFromContext(@NonNull final HederaFunctionality function) { - final var context = new CryptoOpContext(MEMO, TXN_ID, Transaction.DEFAULT, function, ACCOUNT_ID, EVM_ADDRESS); + final var context = + new CryptoOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, function, ACCOUNT_ID, EVM_ADDRESS); final var actualRecord = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals( EXPECTED_BASE_RECORD @@ -585,7 +593,7 @@ void certainCryptoOpsUseEvmAddressFromContext(@NonNull final HederaFunctionality @Test void tokenAirdropUsesPendingFromContext() { final var context = - new AirdropOpContext(MEMO, TXN_ID, Transaction.DEFAULT, TOKEN_AIRDROP, PENDING_AIRDROP_RECORDS); + new AirdropOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, TOKEN_AIRDROP, PENDING_AIRDROP_RECORDS); final var actualRecord = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals( EXPECTED_BASE_RECORD @@ -603,7 +611,7 @@ void utilPrngUsesOutputIfPresent() { final var seedOutput = TransactionOutput.newBuilder() .utilPrng(UtilPrngOutput.newBuilder().prngBytes(RUNNING_HASH).build()) .build(); - final var context = new BaseOpContext(MEMO, TXN_ID, Transaction.DEFAULT, UTIL_PRNG); + final var context = new BaseOpContext(MEMO, RATES, TXN_ID, Transaction.DEFAULT, UTIL_PRNG); final var actualRecordNoOutput = BLOCK_ITEMS_TRANSLATOR.translateRecord(context, TRANSACTION_RESULT); assertEquals(EXPECTED_BASE_RECORD, actualRecordNoOutput); diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockStreamBuilderTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockStreamBuilderTest.java index 476061949b3c..296070dc7a32 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockStreamBuilderTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/BlockStreamBuilderTest.java @@ -154,7 +154,6 @@ private void validateTransactionResult(final List blockItems) { assertEquals(status, result.status()); assertEquals(asTimestamp(CONSENSUS_TIME), result.consensusTimestamp()); assertEquals(asTimestamp(PARENT_CONSENSUS_TIME), result.parentConsensusTimestamp()); - assertEquals(exchangeRate, result.exchangeRate()); assertEquals(scheduleRef, result.scheduleRef()); assertEquals(TRANSACTION_FEE, result.transactionFeeCharged()); assertEquals(transferList, result.transferList()); diff --git a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/impl/TranslationContextTest.java b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/impl/TranslationContextTest.java index db63a1c3ae66..2023d4fe9ef6 100644 --- a/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/impl/TranslationContextTest.java +++ b/hedera-node/hedera-app/src/test/java/com/hedera/node/app/blocks/impl/TranslationContextTest.java @@ -22,6 +22,7 @@ import com.hedera.hapi.node.base.HederaFunctionality; import com.hedera.hapi.node.base.Transaction; import com.hedera.hapi.node.base.TransactionID; +import com.hedera.hapi.node.transaction.ExchangeRateSet; import com.hedera.hapi.node.transaction.SignedTransaction; import com.hedera.node.app.blocks.impl.contexts.BaseOpContext; import com.hedera.pbj.runtime.io.buffer.Bytes; @@ -35,6 +36,7 @@ void hashIsOfSignedTransactionBytesIfSet() { final var subject = new BaseOpContext( "", + ExchangeRateSet.DEFAULT, TransactionID.DEFAULT, Transaction.newBuilder() .signedTransactionBytes(signedTransactionBytes) @@ -48,7 +50,8 @@ void hashIsOfSignedTransactionBytesIfSet() { void hashIsOfSerializedTransactionIfMissingSignedTransactionBytes() { final var transactionBytes = Transaction.PROTOBUF.toBytes(Transaction.DEFAULT); - final var subject = new BaseOpContext("", TransactionID.DEFAULT, Transaction.DEFAULT, HederaFunctionality.NONE); + final var subject = new BaseOpContext( + "", ExchangeRateSet.DEFAULT, TransactionID.DEFAULT, Transaction.DEFAULT, HederaFunctionality.NONE); assertEquals(Bytes.wrap(noThrowSha384HashOf(transactionBytes.toByteArray())), subject.transactionHash()); }