private void WriteStorageChange(JsonWriter writer, ParityStateChange <byte[]> change, bool isNew, JsonSerializer serializer)
 {
     if (change == null)
     {
         writer.WriteValue("=");
     }
     else
     {
         if (isNew)
         {
             writer.WriteStartObject();
             writer.WritePropertyName("+");
             _32BytesConverter.WriteJson(writer, change.After, serializer);
             writer.WriteEndObject();
         }
         else
         {
             writer.WriteStartObject();
             writer.WritePropertyName("*");
             writer.WriteStartObject();
             writer.WritePropertyName("from");
             _32BytesConverter.WriteJson(writer, change.Before, serializer);
             writer.WritePropertyName("to");
             _32BytesConverter.WriteJson(writer, change.After, serializer);
             writer.WriteEndObject();
             writer.WriteEndObject();
         }
     }
 }
 private void WriteChange(JsonWriter writer, ParityStateChange <UInt256?> change, JsonSerializer serializer)
 {
     if (change == null)
     {
         writer.WriteValue("=");
     }
     else
     {
         if (change.Before == null)
         {
             writer.WriteStartObject();
             writer.WritePropertyName("+");
             _intConverter.WriteJson(writer, change.After, serializer);
             writer.WriteEndObject();
         }
         else
         {
             writer.WriteStartObject();
             writer.WritePropertyName("*");
             writer.WriteStartObject();
             writer.WritePropertyName("from");
             _intConverter.WriteJson(writer, change.Before, serializer);
             writer.WritePropertyName("to");
             _intConverter.WriteJson(writer, change.After, serializer);
             writer.WriteEndObject();
             writer.WriteEndObject();
         }
     }
 }
Example #3
0
        public void Does_not_throw_on_change_when_code_before_is_null()
        {
            JsonWriter     writer     = Substitute.For <JsonWriter>();
            JsonSerializer serializer = Substitute.For <JsonSerializer>();

            ParityAccountStateChange change = new()
            {
                Code = new ParityStateChange <byte[]>(null, new byte[] { 1 })
            };

            Assert.DoesNotThrow(() => converter.WriteJson(writer, change, serializer));
        }
        public void Can_serialize_creation_method()
        {
            string expectedResult = "{\"output\":null,\"stateDiff\":{\"0x76e68a8696537e4141926f3e528733af9e237d69\":{\"balance\":{\"*\":{\"from\":\"0x1\",\"to\":\"0x2\"}},\"code\":\"=\",\"nonce\":{\"*\":{\"from\":\"0x0\",\"to\":\"0x1\"}},\"storage\":{\"0x0000000000000000000000000000000000000000000000000000000000000001\":{\"*\":{\"from\":\"0x0000000000000000000000000000000000000000000000000000000000000001\",\"to\":\"0x0000000000000000000000000000000000000000000000000000000000000002\"}}}}},\"trace\":[{\"action\":{\"creationMethod\":\"create2\",\"from\":\"0xb7705ae4c6f81b66cdb323c65f4e8133690fc099\",\"gas\":\"0x9c40\",\"init\":\"0x010203040506\",\"value\":\"0x3039\"},\"result\":{\"gasUsed\":\"0x0\",\"output\":null},\"subtraces\":1,\"traceAddress\":[1,2,3],\"type\":\"create\"},{\"action\":{\"callType\":\"call\",\"from\":\"0x76e68a8696537e4141926f3e528733af9e237d69\",\"gas\":\"0x2710\",\"input\":\"0x\",\"to\":\"0x475674cb523a0a2736b7f7534390288fce16982c\",\"value\":\"0x10932\"},\"result\":{\"gasUsed\":\"0x0\",\"output\":null},\"subtraces\":0,\"traceAddress\":[0,0],\"type\":null}],\"vmTrace\":null}";

            ParityTraceAction subtrace = new()
            {
                Value        = 67890,
                CallType     = "call",
                From         = TestItem.AddressC,
                To           = TestItem.AddressD,
                Input        = Array.Empty <byte>(),
                Gas          = 10000,
                TraceAddress = new int[] { 0, 0 }
            };

            ParityLikeTxTrace result = new()
            {
                Action = new ParityTraceAction
                {
                    Value          = 12345,
                    Type           = "create",
                    CallType       = "create",
                    CreationMethod = "create2",
                    From           = TestItem.AddressA,
                    To             = null,
                    Input          = new byte[] { 1, 2, 3, 4, 5, 6 },
                    Gas            = 40000,
                    TraceAddress   = new int[] { 0 }
                },
                BlockHash           = TestItem.KeccakB,
                BlockNumber         = 123456,
                TransactionHash     = TestItem.KeccakC,
                TransactionPosition = 5
            };

            result.Action.TraceAddress = new int[] { 1, 2, 3 };
            result.Action.Subtraces.Add(subtrace);

            ParityAccountStateChange stateChange = new()
            {
                Balance = new ParityStateChange <UInt256?>(1, 2),
                Nonce   = new ParityStateChange <UInt256?>(0, 1),
                Storage = new Dictionary <UInt256, ParityStateChange <byte[]> > {
                    [1] = new(new byte[] { 1 }, new byte[] { 2 })
                }
            };

            result.StateChanges = new Dictionary <Address, ParityAccountStateChange> {
                { TestItem.AddressC, stateChange }
            };
            TestToJson(new ParityTxTraceFromReplay(result, false), expectedResult);
        }
Example #5
0
        protected static ParityLikeTxTrace BuildParityTxTrace()
        {
            ParityTraceAction subtrace = new()
            {
                Value        = 67890,
                CallType     = "call",
                From         = TestItem.AddressC,
                To           = TestItem.AddressD,
                Input        = Array.Empty <byte>(),
                Gas          = 10000,
                TraceAddress = new int[] { 0, 0 }
            };

            ParityLikeTxTrace result = new()
            {
                Action = new ParityTraceAction
                {
                    Value        = 12345,
                    CallType     = "init",
                    From         = TestItem.AddressA,
                    To           = TestItem.AddressB,
                    Input        = new byte[] { 1, 2, 3, 4, 5, 6 },
                    Gas          = 40000,
                    TraceAddress = new int[] { 0 }
                },
                BlockHash           = TestItem.KeccakB,
                BlockNumber         = 123456,
                TransactionHash     = TestItem.KeccakC,
                TransactionPosition = 5
            };

            result.Action.TraceAddress = new int[] { 1, 2, 3 };
            result.Action.Subtraces.Add(subtrace);

            ParityAccountStateChange stateChange = new()
            {
                Balance = new ParityStateChange <UInt256?>(1, 2),
                Nonce   = new ParityStateChange <UInt256?>(0, 1),
                Storage = new Dictionary <UInt256, ParityStateChange <byte[]> > {
                    [1] = new(new byte[] { 1 }, new byte[] { 2 })
                },
                Code = new ParityStateChange <byte[]>(new byte[] { 1 }, new byte[] { 2 })
            };

            result.StateChanges = new Dictionary <Address, ParityAccountStateChange> {
                { TestItem.AddressC, stateChange }
            };
            return(result);
        }
        public void Can_serialize(bool includeTransactionHash, string expectedResult)
        {
            ParityTraceAction subtrace = new()
            {
                Value        = 67890,
                CallType     = "call",
                From         = TestItem.AddressC,
                To           = TestItem.AddressD,
                Input        = Array.Empty <byte>(),
                Gas          = 10000,
                TraceAddress = new int[] { 0, 0 }
            };

            ParityLikeTxTrace result = new()
            {
                Action = new ParityTraceAction
                {
                    Value        = 12345,
                    CallType     = "init",
                    From         = TestItem.AddressA,
                    To           = TestItem.AddressB,
                    Input        = new byte[] { 1, 2, 3, 4, 5, 6 },
                    Gas          = 40000,
                    TraceAddress = new int[] { 0 }
                },
                BlockHash           = TestItem.KeccakB,
                BlockNumber         = 123456,
                TransactionHash     = TestItem.KeccakC,
                TransactionPosition = 5
            };

            result.Action.TraceAddress = new int[] { 1, 2, 3 };
            result.Action.Subtraces.Add(subtrace);

            ParityAccountStateChange stateChange = new()
            {
                Balance = new ParityStateChange <UInt256?>(1, 2),
                Nonce   = new ParityStateChange <UInt256?>(0, 1),
                Storage = new Dictionary <UInt256, ParityStateChange <byte[]> > {
                    [1] = new(new byte[] { 1 }, new byte[] { 2 })
                }
            };

            result.StateChanges = new Dictionary <Address, ParityAccountStateChange> {
                { TestItem.AddressC, stateChange }
            };
            TestToJson(new ParityTxTraceFromReplay(result, includeTransactionHash), expectedResult);
        }