From 29ada4ca463b9e15927042d26b54edd288a56ae3 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Mon, 11 May 2020 00:55:15 +0300 Subject: [PATCH] smartcontract: add JSON marshal/unmarshal for InteropType We actually have to do that in order to answer getapplicationlog requests for transactions that leave some interop items on the stack. It follows the same logic our binary serializer/deserializes does leaving the type and stripping the value (whatever that is). --- pkg/smartcontract/parameter.go | 5 +++++ pkg/smartcontract/parameter_test.go | 34 ++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/pkg/smartcontract/parameter.go b/pkg/smartcontract/parameter.go index 379a75593..5dad09926 100644 --- a/pkg/smartcontract/parameter.go +++ b/pkg/smartcontract/parameter.go @@ -85,6 +85,8 @@ func (p *Parameter) MarshalJSON() ([]byte, error) { case MapType: ppair := p.Value.([]ParameterPair) resultRawValue, resultErr = json.Marshal(ppair) + case InteropInterfaceType: + resultRawValue = []byte("null") default: resultErr = errors.Errorf("Marshaller for type %s not implemented", p.Type) } @@ -166,6 +168,9 @@ func (p *Parameter) UnmarshalJSON(data []byte) (err error) { return } p.Value = h + case InteropInterfaceType: + // stub, ignore value, it can only be null + p.Value = nil default: return errors.Errorf("Unmarshaller for type %s not implemented", p.Type) } diff --git a/pkg/smartcontract/parameter_test.go b/pkg/smartcontract/parameter_test.go index 61d2fd6a6..72ce299a4 100644 --- a/pkg/smartcontract/parameter_test.go +++ b/pkg/smartcontract/parameter_test.go @@ -122,6 +122,13 @@ var marshalJSONTestCases = []struct { }, result: `{"type":"Hash256","value":"0xf037308fa0ab18155bccfc08485468c112409ea5064595699e98c545f245f32d"}`, }, + { + input: Parameter{ + Type: InteropInterfaceType, + Value: nil, + }, + result: `{"type":"InteropInterface","value":null}`, + }, } var marshalJSONErrorCases = []Parameter{ @@ -129,10 +136,6 @@ var marshalJSONErrorCases = []Parameter{ Type: UnknownType, Value: nil, }, - { - Type: InteropInterfaceType, - Value: nil, - }, { Type: IntegerType, Value: math.Inf(1), @@ -252,6 +255,27 @@ var unmarshalJSONTestCases = []struct { }, input: `{"type":"PublicKey","value":"03b3bf1502fbdc05449b506aaf04579724024b06542e49262bfaa3f70e200040a9"}`, }, + { + input: `{"type":"InteropInterface","value":null}`, + result: Parameter{ + Type: InteropInterfaceType, + Value: nil, + }, + }, + { + input: `{"type":"InteropInterface","value":""}`, + result: Parameter{ + Type: InteropInterfaceType, + Value: nil, + }, + }, + { + input: `{"type":"InteropInterface","value":"Hundertwasser"}`, + result: Parameter{ + Type: InteropInterfaceType, + Value: nil, + }, + }, } var unmarshalJSONErrorCases = []string{ @@ -272,8 +296,6 @@ var unmarshalJSONErrorCases = []string{ `{"type": "Map","value": ["key": {}]}`, // incorrect Map value `{"type": "Map","value": ["key": {"type":"String", "value":"qwer"}, "value": {"type":"Boolean"}]}`, // incorrect Map Value value `{"type": "Map","value": ["key": {"type":"String"}, "value": {"type":"Boolean", "value":true}]}`, // incorrect Map Key value - - `{"type": "InteropInterface","value": ""}`, // ununmarshable type } func TestParam_UnmarshalJSON(t *testing.T) {