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(); } } }
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); }
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); }