@@ -2,6 +2,7 @@ package multinode
22
33import (
44 "context"
5+ "encoding/json"
56 "fmt"
67 "testing"
78
@@ -425,3 +426,40 @@ func TestTransactionSender_SendTransaction_aggregateTxResults(t *testing.T) {
425426func newSendTxResult (err error ) sendTxResult [any ] {
426427 return sendTxResult [any ]{error : err }
427428}
429+
430+ func TestLoggableSendTxResults (t * testing.T ) {
431+ t .Parallel ()
432+
433+ // Input reconstructed from an observed production invariant violation log:
434+ // 1 node returned Successful (code 1), 2 nodes returned Unknown (code 5)
435+ // with "RPC call failed: TX_REPLAY_ATTACK", triggering "got success and severe error".
436+ replayAttackErr := errors .New ("RPC call failed: TX_REPLAY_ATTACK" )
437+ input := sendTxResults [any ]{
438+ Successful : {
439+ {res : nil , code : Successful , error : nil },
440+ },
441+ Unknown : {
442+ {res : nil , code : Unknown , error : replayAttackErr },
443+ {res : nil , code : Unknown , error : replayAttackErr },
444+ },
445+ }
446+
447+ got := loggableSendTxResults (input )
448+
449+ require .Equal (t , map [SendTxReturnCode ][]map [string ]any {
450+ Successful : {
451+ {"res" : nil , "code" : Successful , "error" : "" },
452+ },
453+ Unknown : {
454+ {"res" : nil , "code" : Unknown , "error" : "RPC call failed: TX_REPLAY_ATTACK" },
455+ {"res" : nil , "code" : Unknown , "error" : "RPC call failed: TX_REPLAY_ATTACK" },
456+ },
457+ }, got )
458+
459+ b , err := json .Marshal (got )
460+ require .NoError (t , err )
461+ require .Equal (t ,
462+ `{"Successful":[{"code":"Successful","error":"","res":null}],"Unknown":[{"code":"Unknown","error":"RPC call failed: TX_REPLAY_ATTACK","res":null},{"code":"Unknown","error":"RPC call failed: TX_REPLAY_ATTACK","res":null}]}` ,
463+ string (b ),
464+ )
465+ }
0 commit comments