diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c10a0604..bfd251bc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ pre: "5. " #### Changed -- N/A +- Retry `HasTx` on false with id wrapped in different eras, to cope with the hard-fork combinator inability to compare transaction id across eras. See also [#376](https://github.com/CardanoSolutions/ogmios/issues/376). #### Removed diff --git a/server/src/Ogmios/App/Protocol.hs b/server/src/Ogmios/App/Protocol.hs index 0c9ab92c5..0cf8bf882 100644 --- a/server/src/Ogmios/App/Protocol.hs +++ b/server/src/Ogmios/App/Protocol.hs @@ -47,7 +47,6 @@ import Ogmios.Data.Protocol.StateQuery ) import Ogmios.Data.Protocol.TxMonitor ( AcquireMempool - , GenTxId , HasTransaction , NextTransaction , ReleaseMempool @@ -105,8 +104,8 @@ onUnmatchedMessage ( FromJSON (MultiEraDecoder (SerializedTransaction block)) , FromJSON (QueryLedgerState block) , FromJSON (Point block) - , FromJSON (GenTxId block) , FromJSON (MultiEraUTxO block) + , Crypto (BlockCrypto block) ) => Rpc.Options -> ByteString diff --git a/server/src/Ogmios/App/Protocol/TxMonitor.hs b/server/src/Ogmios/App/Protocol/TxMonitor.hs index 9a05e63fe..17fa8e107 100644 --- a/server/src/Ogmios/App/Protocol/TxMonitor.hs +++ b/server/src/Ogmios/App/Protocol/TxMonitor.hs @@ -48,6 +48,9 @@ import Ogmios.Prelude hiding import Ogmios.Control.MonadSTM ( MonadSTM (..) ) +import Ogmios.Data.EraTranslation + ( MostRecentEra + ) import Ogmios.Data.Json ( Json ) @@ -69,21 +72,32 @@ import Ogmios.Data.Protocol.TxMonitor , TxMonitorCodecs (..) , TxMonitorMessage (..) ) +import Ouroboros.Consensus.Cardano + ( CardanoBlock + ) +import Ouroboros.Consensus.Cardano.Block + ( TxId (..) + ) import Ouroboros.Consensus.Ledger.SupportsMempool ( HasTxId (..) ) +import Ouroboros.Consensus.Shelley.Ledger.Mempool + ( TxId (..) + ) import Ouroboros.Network.Protocol.LocalTxMonitor.Client ( ClientStAcquired (..) , ClientStIdle (..) , LocalTxMonitorClient (..) ) +import qualified Cardano.Ledger.TxIn as Ledger import qualified Codec.Json.Rpc as Rpc mkTxMonitorClient - :: forall m block. + :: forall m block crypto. ( MonadSTM m , HasTxId (GenTx block) + , block ~ CardanoBlock crypto ) => (forall a r. m a -> (Json -> m ()) -> Rpc.ToResponse r -> m a -> m a) -- ^ A default response handler to catch errors. @@ -141,9 +155,38 @@ mkTxMonitorClient defaultWithInternalError TxMonitorCodecs{..} queue yield = clientStAcquired MsgHasTransaction HasTransaction{id} toResponse -> defaultWithInternalError clientStAcquired yield toResponse $ do - pure $ SendMsgHasTx id $ \has -> do - yield $ encodeHasTransactionResponse $ toResponse $ HasTransactionResponse{has} - clientStAcquired + -- NOTE: + -- + -- Unfortunately here, we can't reliably ask the node for a + -- transaction id because it performs equality on the GenTxId NS + -- wrapper instead of the inner transaction id bytes. + -- + -- As a consequence, sending a transaction id wrapped as a + -- GenTxIdAlonzo will not match the same transaction id wrapped + -- as a GenTxIdBabbage. + -- + -- Yet, we cannot know upfront in what era those ids are wrapped + -- in the mempool although we do commit to a specific NS summand + -- when we deserialize it. So we have no other choice than + -- retrying the request on `False` with ids wrapped in different + -- eras. + -- + -- To be removed once the following issue is addressed: + -- + -- https://github.com/IntersectMBO/ouroboros-consensus/issues/1009 + loop (inMultipleEras id) + where + done has = do + yield $ encodeHasTransactionResponse $ toResponse $ HasTransactionResponse{has} + clientStAcquired + + loop = \case + [] -> done False + genId:rest -> do + pure $ SendMsgHasTx genId $ \case + True -> done True + False -> loop rest + MsgSizeOfMempool SizeOfMempool toResponse -> defaultWithInternalError clientStAcquired yield toResponse $ do pure $ SendMsgGetSizes $ \mempool -> do @@ -154,3 +197,24 @@ mkTxMonitorClient defaultWithInternalError TxMonitorCodecs{..} queue yield = pure $ SendMsgRelease $ do yield $ encodeReleaseMempoolResponse $ toResponse Released clientStIdle + +inMultipleEras + :: forall crypto constraint. + ( constraint ~ (MostRecentEra (CardanoBlock crypto) ~ ConwayEra crypto) + ) + => Ledger.TxId crypto + -> [GenTxId (CardanoBlock crypto)] +inMultipleEras id = + -- The list is ordered from the "most probable era", down to the least + -- probable. This hopefully ensures that we do a minimum number of loops + -- for the happy path. + [ GenTxIdBabbage (ShelleyTxId id) + , GenTxIdConway (ShelleyTxId id) + , GenTxIdAlonzo (ShelleyTxId id) + , GenTxIdMary (ShelleyTxId id) + ] + where + -- This line exists as a reminder. It will generate a compiler error + -- when a new era becomes available. From there, one should update + -- the list above to contain that latest era. + _compilerWarning = keepRedundantConstraint (Proxy @constraint) diff --git a/server/src/Ogmios/App/Server/WebSocket.hs b/server/src/Ogmios/App/Server/WebSocket.hs index 7e737d15e..410c68a19 100644 --- a/server/src/Ogmios/App/Server/WebSocket.hs +++ b/server/src/Ogmios/App/Server/WebSocket.hs @@ -118,11 +118,11 @@ import Ogmios.Data.Json , encodeDeserialisationFailure , encodeEvaluationError , encodeExUnits + , encodeGenTxId , encodePoint , encodeSubmitTransactionError , encodeTip , encodeTx - , encodeTxId , jsonToByteString ) import Ogmios.Data.Json.Ledger.PredicateFailure @@ -219,12 +219,12 @@ newWebSocketApp tr unliftIO = do , mkTxMonitorCodecs opts - encodeTxId + encodeGenTxId (encodeTx (metadataFormat, includeCbor)) , mkTxSubmissionCodecs opts - encodeTxId + encodeGenTxId encodeScriptPurposeIndexInAnyEra encodeExUnits encodeEvaluationError diff --git a/server/src/Ogmios/Data/Json.hs b/server/src/Ogmios/Data/Json.hs index b07e3168b..2732a96f6 100644 --- a/server/src/Ogmios/Data/Json.hs +++ b/server/src/Ogmios/Data/Json.hs @@ -27,7 +27,8 @@ module Ogmios.Data.Json , encodeSubmitTransactionError , encodeTip , encodeTx - , encodeTxId + , encodeGenTxId + , Shelley.encodeTxId , Shelley.encodeTxIn -- * Decoders @@ -264,11 +265,11 @@ encodeTx opts = \case GenTxByron _ -> error "encodeTx: unsupported Byron transaction." -encodeTxId +encodeGenTxId :: Crypto crypto => GenTxId (CardanoBlock crypto) -> Json -encodeTxId = encodeObject . \case +encodeGenTxId = encodeObject . \case GenTxIdConway (ShelleyTxId x) -> Shelley.encodeTxId x GenTxIdBabbage (ShelleyTxId x) -> diff --git a/server/src/Ogmios/Data/Json/Orphans.hs b/server/src/Ogmios/Data/Json/Orphans.hs index f71a2b8f9..d8ecba4db 100644 --- a/server/src/Ogmios/Data/Json/Orphans.hs +++ b/server/src/Ogmios/Data/Json/Orphans.hs @@ -17,7 +17,6 @@ import Cardano.Ledger.Shelley.UTxO ) import Cardano.Network.Protocol.NodeToClient ( GenTx - , GenTxId ) import Cardano.Network.Protocol.NodeToClient.Trace ( TraceClient @@ -30,7 +29,6 @@ import Ogmios.Data.Json ( decodePoint , decodeSerializedTransaction , decodeTip - , decodeTxId , decodeUtxo , encodeSerializedTransaction , encodeSubmitTransactionError @@ -97,9 +95,6 @@ instance parseJSON = Json.withObject "CBOR" $ \o -> o .: "cbor" >>= decodeSerializedTransaction -instance PraosCrypto crypto => FromJSON (GenTxId (CardanoBlock crypto)) where - parseJSON = decodeTxId - instance Crypto crypto => FromJSON (MultiEraUTxO (CardanoBlock crypto)) where parseJSON = decodeUtxo diff --git a/server/src/Ogmios/Data/Json/Query.hs b/server/src/Ogmios/Data/Json/Query.hs index 5c0dd5d69..960e8c9b0 100644 --- a/server/src/Ogmios/Data/Json/Query.hs +++ b/server/src/Ogmios/Data/Json/Query.hs @@ -130,7 +130,6 @@ import Cardano.Ledger.Shelley.Genesis ) import Cardano.Network.Protocol.NodeToClient ( GenTx - , GenTxId , SerializedTransaction ) import Cardano.Slotting.Block @@ -164,7 +163,6 @@ import Ouroboros.Consensus.Cardano.Block ( BlockQuery (..) , CardanoBlock , GenTx (..) - , TxId (..) ) import Ouroboros.Consensus.HardFork.Combinator ( MismatchEraInfo @@ -197,9 +195,6 @@ import Ouroboros.Consensus.Shelley.Ledger.Block ( ShelleyBlock (..) , ShelleyHash (..) ) -import Ouroboros.Consensus.Shelley.Ledger.Mempool - ( TxId (..) - ) import Ouroboros.Consensus.Shelley.Ledger.Query ( BlockQuery (..) , NonMyopicMemberRewards (..) @@ -1818,14 +1813,14 @@ decodeTip json = decodeTxId :: forall crypto. Crypto crypto => Json.Value - -> Json.Parser (GenTxId (CardanoBlock crypto)) + -> Json.Parser (Ledger.TxId crypto) decodeTxId = Json.withText "TxId" $ \(encodeUtf8 -> utf8) -> do bytes <- decodeBase16 utf8 case hashFromBytes bytes of Nothing -> fail "couldn't interpret bytes as blake2b-256 digest" Just h -> - pure $ GenTxIdAlonzo $ ShelleyTxId $ Ledger.TxId (Ledger.unsafeMakeSafeHash h) + pure $ Ledger.TxId (Ledger.unsafeMakeSafeHash h) decodeTxIn :: forall crypto. (Crypto crypto) diff --git a/server/src/Ogmios/Data/Protocol/TxMonitor.hs b/server/src/Ogmios/Data/Protocol/TxMonitor.hs index 0759b7150..c4935715d 100644 --- a/server/src/Ogmios/Data/Protocol/TxMonitor.hs +++ b/server/src/Ogmios/Data/Protocol/TxMonitor.hs @@ -79,6 +79,7 @@ import Ouroboros.Network.Protocol.LocalTxMonitor.Type ( MempoolSizeAndCapacity (..) ) +import qualified Cardano.Ledger.TxIn as Ledger import qualified Codec.Json.Rpc as Rpc import qualified Data.Aeson as Json import qualified Data.Aeson.Encoding as Json @@ -122,7 +123,7 @@ data TxMonitorCodecs block = TxMonitorCodecs } mkTxMonitorCodecs - :: (FromJSON (GenTxId block)) + :: (FromJSON (Ledger.TxId (BlockCrypto block))) => Rpc.Options -> (GenTxId block -> Json) -> (GenTx block -> Json) @@ -295,14 +296,14 @@ _encodeNextTransactionResponse opts encodeTxId encodeTx = -- HasTransaction -- data HasTransaction block - = HasTransaction { id :: GenTxId block } + = HasTransaction { id :: Ledger.TxId (BlockCrypto block) } deriving (Generic) deriving instance Show (GenTxId block) => Show (HasTransaction block) deriving instance Eq (GenTxId block) => Eq (HasTransaction block) _encodeHasTransaction :: forall block. () - => (GenTxId block -> Json) + => (Ledger.TxId (BlockCrypto block) -> Json) -> Rpc.Request (HasTransaction block) -> Json _encodeHasTransaction encodeTxId = @@ -311,7 +312,7 @@ _encodeHasTransaction encodeTxId = encodeTxId id _decodeHasTransaction - :: forall block. (FromJSON (GenTxId block)) + :: forall block. (FromJSON (Ledger.TxId (BlockCrypto block))) => Json.Value -> Json.Parser (Rpc.Request (HasTransaction block)) _decodeHasTransaction = diff --git a/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs b/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs index e7d956a38..c768d3cc6 100644 --- a/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs +++ b/server/test/unit/Ogmios/App/Protocol/TxMonitorSpec.hs @@ -63,8 +63,8 @@ import Ogmios.Control.MonadSTM ) import Ogmios.Data.Json ( Json + , encodeGenTxId , encodeTx - , encodeTxId ) import Ogmios.Data.Json.Orphans () @@ -84,9 +84,15 @@ import Ogmios.Data.Protocol.TxMonitor , TxMonitorMessage (..) , mkTxMonitorCodecs ) +import Ouroboros.Consensus.Cardano.Block + ( TxId (..) + ) import Ouroboros.Consensus.Ledger.SupportsMempool ( HasTxId (..) ) +import Ouroboros.Consensus.Shelley.Ledger + ( TxId (ShelleyTxId) + ) import Ouroboros.Network.Protocol.LocalTxMonitor.Type ( ClientHasAgency (..) , LocalTxMonitor (..) @@ -138,6 +144,7 @@ import Test.QuickCheck , vectorOf ) +import qualified Cardano.Ledger.TxIn as Ledger import qualified Codec.Json.Rpc as Rpc import qualified Codec.Json.Rpc.Handler as Rpc import qualified Data.Aeson as Json @@ -213,7 +220,7 @@ withTxMonitorClient withTxMonitorClient action seed = do (recvQ, sendQ) <- atomically $ (,) <$> newTQueue <*> newTQueue let opts = Rpc.defaultOptions - let innerCodecs = mkTxMonitorCodecs opts encodeTxId (encodeTx (MetadataNoSchema, omitOptionalCbor)) + let innerCodecs = mkTxMonitorCodecs opts encodeGenTxId (encodeTx (MetadataNoSchema, omitOptionalCbor)) let client = mkTxMonitorClient (defaultWithInternalError opts) innerCodecs recvQ (atomically . writeTQueue sendQ) let codec = codecs defaultSlotsPerEpoch nodeToClientV_Latest & cTxMonitorCodec withMockChannel (txMonitorMockPeer seed codec) $ \channel -> do @@ -365,8 +372,17 @@ maxCapacity = 10 plausibleTxs :: [GenTx Block] plausibleTxs = generateWith (vectorOf (2 * maxCapacity) genTx) 42 -plausibleTxsIds :: [GenTxId Block] -plausibleTxsIds = txId <$> plausibleTxs +plausibleTxsIds :: [Ledger.TxId StandardCrypto] +plausibleTxsIds = unGenTxId . txId <$> plausibleTxs + where + unGenTxId = \case + GenTxIdConway (ShelleyTxId x) -> x + GenTxIdBabbage (ShelleyTxId x) -> x + GenTxIdAlonzo (ShelleyTxId x) -> x + GenTxIdMary (ShelleyTxId x) -> x + GenTxIdAllegra (ShelleyTxId x) -> x + GenTxIdShelley (ShelleyTxId x) -> x + GenTxIdByron _ -> error "GenTxIdByron" genServerAction :: [tx] -> Gen ServerAction genServerAction xs = frequency $ mconcat @@ -427,7 +443,7 @@ isNextTxResponse :: ResponsePredicate isNextTxResponse = ResponsePredicate $ \v -> ("method" `at` v) == Just (toJSON @Text "nextTransaction") -hasTx :: Rpc.Mirror -> GenTxId Block -> TxMonitorMessage Block +hasTx :: Rpc.Mirror -> Ledger.TxId StandardCrypto -> TxMonitorMessage Block hasTx mirror tx = MsgHasTransaction (HasTransaction tx) (Rpc.Response method mirror) where diff --git a/server/test/unit/Ogmios/Data/JsonSpec.hs b/server/test/unit/Ogmios/Data/JsonSpec.hs index 4a8714ba7..91bc09d73 100644 --- a/server/test/unit/Ogmios/Data/JsonSpec.hs +++ b/server/test/unit/Ogmios/Data/JsonSpec.hs @@ -54,6 +54,8 @@ import Ogmios.Data.Json , encodeDeserialisationFailure , encodeEvaluationError , encodeExUnits + , encodeGenTxId + , encodeObject , encodePoint , encodeSubmitTransactionError , encodeTip @@ -185,6 +187,7 @@ import Test.Generators , genData , genEpochResult , genEvaluateTransactionResponse + , genGenTxId , genGenesisConfig , genHardForkApplyTxErr , genInterpreterResult @@ -204,7 +207,6 @@ import Test.Generators , genTip , genTipNoGenesis , genTx - , genTxId , genUTxOResult , genUtxoBabbage , genWithOrigin @@ -461,7 +463,7 @@ spec = do (arbitrary @(Rpc.Response (SubmitTransactionResponse Block))) (_encodeSubmitTransactionResponse (Proxy @Block) Rpc.defaultOptions - encodeTxId + encodeGenTxId encodeSubmitTransactionError encodeDeserialisationFailure ) @@ -501,19 +503,19 @@ spec = do validateToJSON (arbitrary @(Rpc.Response (NextTransactionResponse Block))) - (_encodeNextTransactionResponse Rpc.defaultOptions encodeTxId (encodeTx (MetadataNoSchema, omitOptionalCbor))) + (_encodeNextTransactionResponse Rpc.defaultOptions encodeGenTxId (encodeTx (MetadataNoSchema, omitOptionalCbor))) (10, "NextTransactionResponse") "ogmios.json#/properties/NextTransactionResponse" validateToJSON (arbitrary @(Rpc.Response (NextTransactionResponse Block))) - (_encodeNextTransactionResponse Rpc.defaultOptions encodeTxId (encodeTx (MetadataDetailedSchema, omitOptionalCbor))) + (_encodeNextTransactionResponse Rpc.defaultOptions encodeGenTxId (encodeTx (MetadataDetailedSchema, omitOptionalCbor))) (10, "NextTransactionResponse") "ogmios.json#/properties/NextTransactionResponse" validateFromJSON (arbitrary @(Rpc.Request (HasTransaction Block))) - (_encodeHasTransaction encodeTxId, _decodeHasTransaction) + (_encodeHasTransaction (encodeObject . encodeTxId), _decodeHasTransaction) (10, "HasTransaction") "ogmios.json#/properties/HasTransaction" @@ -881,7 +883,7 @@ instance Arbitrary (GenTx Block) where arbitrary = genTx instance Arbitrary (GenTxId Block) where - arbitrary = genTxId + arbitrary = genGenTxId instance Arbitrary MempoolSizeAndCapacity where arbitrary = genMempoolSizeAndCapacity diff --git a/server/test/unit/Test/Generators.hs b/server/test/unit/Test/Generators.hs index 7ea425f8b..bc6b2b06e 100644 --- a/server/test/unit/Test/Generators.hs +++ b/server/test/unit/Test/Generators.hs @@ -164,6 +164,7 @@ import qualified Cardano.Ledger.PoolDistr as Ledger import qualified Cardano.Ledger.Shelley.API.Wallet as Sh.Api import qualified Cardano.Ledger.Shelley.PParams as Sh import qualified Cardano.Ledger.Shelley.UTxO as Sh +import qualified Cardano.Ledger.TxIn as Ledger genBlock :: Gen Block genBlock = oneof @@ -224,9 +225,15 @@ genBlock = oneof ) ] -genTxId :: Gen (GenTxId Block) -genTxId = - GenTxIdAlonzo . ShelleyTxId <$> arbitrary +genTxId :: Gen (Ledger.TxId StandardCrypto) +genTxId = arbitrary + +genGenTxId :: Gen (GenTxId Block) +genGenTxId = oneof + [ GenTxIdConway . ShelleyTxId <$> genTxId + , GenTxIdBabbage . ShelleyTxId <$> genTxId + , GenTxIdAlonzo . ShelleyTxId <$> genTxId + ] genTx :: Gen (GenTx Block) genTx = oneof diff --git a/server/test/vectors/NextTransactionResponse/002.json b/server/test/vectors/NextTransactionResponse/002.json index 49d0ed750..4dbb5f5b1 100644 --- a/server/test/vectors/NextTransactionResponse/002.json +++ b/server/test/vectors/NextTransactionResponse/002.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"5241c22b8eb02fb1443c7c9b806655b5c9fef5e84b80dbacf8e9898b2c84c6fe"}},"id":"FN46wUpZUZXP"} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"39ce2a8b0682400153616f13df490a56807a0577231cb38a358dbf3dd8305581"}},"id":"FN46wUpZUZXP"} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/003.json b/server/test/vectors/NextTransactionResponse/003.json index 4a3487008..e2c1a7311 100644 --- a/server/test/vectors/NextTransactionResponse/003.json +++ b/server/test/vectors/NextTransactionResponse/003.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"86ae01af71ee07a1fdb24703b42b7d3dcac8fa659dcedcd1096e2005b8aa4de6"}},"id":"2rw187OkJXf2"} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"9edbc6ea6ba5111b856536171e5fb024537e180303b5bbf34f4f83e479da3527"}},"id":"2rw187OkJXf2"} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/004.json b/server/test/vectors/NextTransactionResponse/004.json index 5c210d1d7..9a5e9a7e6 100644 --- a/server/test/vectors/NextTransactionResponse/004.json +++ b/server/test/vectors/NextTransactionResponse/004.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"0e769695e2b5c45dc7ab442816fc36e8e919ae658837d830527bcd15efd1f017"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"bcc5cb32714eff126402cb7d7e93d0641351e89559b18b2085bdeab3ceed79bb"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/005.json b/server/test/vectors/NextTransactionResponse/005.json index 2f87a02ab..1dee2a94b 100644 --- a/server/test/vectors/NextTransactionResponse/005.json +++ b/server/test/vectors/NextTransactionResponse/005.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"195add629f6743a07a41f31fa846f459599598c2ce13a1c9f7a8461d56a6be29"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"08838ee3833ff5b9b5b7b54936e9d678e80d83f7e0c0d6e03f220ba08371e1d2"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/NextTransactionResponse/006.json b/server/test/vectors/NextTransactionResponse/006.json index 2b5df5a61..a6662615f 100644 --- a/server/test/vectors/NextTransactionResponse/006.json +++ b/server/test/vectors/NextTransactionResponse/006.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"f7ee4aa58b21b20d624de9c2229fa326c7b4b5ae42943e89430c2dcc1ef96774"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"nextTransaction","result":{"transaction":{"id":"15f25f4b60f82fb982a7ef2710d2c02435da6a191615b75628cbebeb1d76b7f0"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/SubmitTransactionResponse/147.json b/server/test/vectors/SubmitTransactionResponse/147.json index ad6364912..cfd27c570 100644 --- a/server/test/vectors/SubmitTransactionResponse/147.json +++ b/server/test/vectors/SubmitTransactionResponse/147.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"99cafc4b87787cd17b1a4b2855ea70169af681e65f91f7e343aca8e93bfe1664"}},"id":"wwcCZ6ce7lrH"} \ No newline at end of file +{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"0c087171a3245c20d73ba13840c0c700ebb63d626a51cab768bd19e4bf906abb"}},"id":"wwcCZ6ce7lrH"} \ No newline at end of file diff --git a/server/test/vectors/SubmitTransactionResponse/172.json b/server/test/vectors/SubmitTransactionResponse/172.json index ec8470c1a..501d0a611 100644 --- a/server/test/vectors/SubmitTransactionResponse/172.json +++ b/server/test/vectors/SubmitTransactionResponse/172.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"41dd7fbc15186d5712e48036525c25e20e0a22dd3412afe91fe12f81755359fd"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"1d023d6210da0652f6c63c688e0591e8346ca5cfd43bff01677e5c8351ba6b7e"}},"id":null} \ No newline at end of file diff --git a/server/test/vectors/SubmitTransactionResponse/186.json b/server/test/vectors/SubmitTransactionResponse/186.json index e37fc209e..5437017bb 100644 --- a/server/test/vectors/SubmitTransactionResponse/186.json +++ b/server/test/vectors/SubmitTransactionResponse/186.json @@ -1 +1 @@ -{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"182d356d006a10567c2c827c7c01cc0e14ee90e21ce385f98a123baa9ef7d6f4"}},"id":null} \ No newline at end of file +{"jsonrpc":"2.0","method":"submitTransaction","result":{"transaction":{"id":"94ed71433d1c40eba224b2c988d12030d53e58f114d5901884129227a847ad85"}},"id":null} \ No newline at end of file