diff --git a/pkg/smartcontract/param_type.go b/pkg/smartcontract/param_type.go index 403a48649..cb32c72ab 100644 --- a/pkg/smartcontract/param_type.go +++ b/pkg/smartcontract/param_type.go @@ -7,6 +7,7 @@ import ( "fmt" "math/big" "strings" + "unicode/utf8" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/encoding/address" @@ -203,8 +204,10 @@ func (pt ParamType) Match(v stackitem.Item) bool { return vt == stackitem.BooleanT case IntegerType: return vt == stackitem.IntegerT - case ByteArrayType, StringType: + case ByteArrayType: return vt == stackitem.ByteArrayT || vt == stackitem.BufferT || vt == stackitem.AnyT + case StringType: + return (vt == stackitem.ByteArrayT || vt == stackitem.BufferT) && utf8.Valid(v.Value().([]byte)) case Hash160Type: return checkBytesWithLen(vt, v, Hash160Len) case Hash256Type: diff --git a/pkg/smartcontract/param_type_test.go b/pkg/smartcontract/param_type_test.go index 9d3e51d2f..4f754d5ae 100644 --- a/pkg/smartcontract/param_type_test.go +++ b/pkg/smartcontract/param_type_test.go @@ -428,25 +428,27 @@ func TestConvertToStackitemType(t *testing.T) { func TestParamTypeMatch(t *testing.T) { for itm, pt := range map[stackitem.Item]ParamType{ - &stackitem.Pointer{}: BoolType, - &stackitem.Pointer{}: MapType, - stackitem.Make(0): BoolType, - stackitem.Make(0): ByteArrayType, - stackitem.Make(0): StringType, - stackitem.Make(false): ByteArrayType, - stackitem.Make(true): StringType, - stackitem.Make([]byte{1}): Hash160Type, - stackitem.Make([]byte{1}): Hash256Type, - stackitem.Make([]byte{1}): PublicKeyType, - stackitem.Make([]byte{1}): SignatureType, - stackitem.Make(0): Hash160Type, - stackitem.Make(0): Hash256Type, - stackitem.Make(0): PublicKeyType, - stackitem.Make(0): SignatureType, - stackitem.Make(0): ArrayType, - stackitem.Make(0): MapType, - stackitem.Make(0): InteropInterfaceType, - stackitem.Make(0): VoidType, + &stackitem.Pointer{}: BoolType, + &stackitem.Pointer{}: MapType, + stackitem.Make(0): BoolType, + stackitem.Make(0): ByteArrayType, + stackitem.Make(0): StringType, + stackitem.Make(false): ByteArrayType, + stackitem.Make(true): StringType, + stackitem.Make([]byte{1}): Hash160Type, + stackitem.Make([]byte{1}): Hash256Type, + stackitem.Make([]byte{1}): PublicKeyType, + stackitem.Make([]byte{1}): SignatureType, + stackitem.Make(0): Hash160Type, + stackitem.Make(0): Hash256Type, + stackitem.Make(0): PublicKeyType, + stackitem.Make(0): SignatureType, + stackitem.Make(0): ArrayType, + stackitem.Make(0): MapType, + stackitem.Make(0): InteropInterfaceType, + stackitem.Make(0): VoidType, + stackitem.Null{}: StringType, + stackitem.Make([]byte{0x80}): StringType, // non utf-8 } { require.Falsef(t, pt.Match(itm), "%s - %s", pt.String(), itm.String()) } @@ -456,11 +458,11 @@ func TestParamTypeMatch(t *testing.T) { stackitem.Make(0): IntegerType, stackitem.Make(100500): IntegerType, stackitem.Make([]byte{1}): ByteArrayType, + stackitem.Make([]byte{0x80}): ByteArrayType, // non utf-8 stackitem.Make([]byte{1}): StringType, stackitem.NewBuffer([]byte{1}): ByteArrayType, stackitem.NewBuffer([]byte{1}): StringType, stackitem.Null{}: ByteArrayType, - stackitem.Null{}: StringType, stackitem.Make(util.Uint160{}.BytesBE()): Hash160Type, stackitem.Make(util.Uint256{}.BytesBE()): Hash256Type, stackitem.Null{}: Hash160Type,