diff --git a/bchain/coins/eth/erc20.go b/bchain/coins/eth/erc20.go index 6903d1e4..6a7739b0 100644 --- a/bchain/coins/eth/erc20.go +++ b/bchain/coins/eth/erc20.go @@ -145,24 +145,26 @@ func parseErc20StringProperty(contractDesc bchain.AddressDescriptor, data string n := parseErc20NumericProperty(contractDesc, data[64:128]) if n != nil { l := n.Uint64() - if 2*int(l) <= len(data)-128 { + if l > 0 && 2*int(l) <= len(data)-128 { b, err := hex.DecodeString(data[128 : 128+2*l]) if err == nil { return string(b) } } } - } else if len(data) == 64 { - // allow string properties as 32 bytes of UTF-8 data - b, err := hex.DecodeString(data) - if err == nil { - i := bytes.Index(b, []byte{0}) - if i > 0 { - b = b[:i] - } - if utf8.Valid(b) { - return string(b) - } + } + // allow string properties as UTF-8 data + b, err := hex.DecodeString(data) + if err == nil { + i := bytes.Index(b, []byte{0}) + if i > 32 { + i = 32 + } + if i > 0 { + b = b[:i] + } + if utf8.Valid(b) { + return string(b) } } if glog.V(1) { diff --git a/bchain/coins/eth/erc20_test.go b/bchain/coins/eth/erc20_test.go index 0a12738b..64f4236e 100644 --- a/bchain/coins/eth/erc20_test.go +++ b/bchain/coins/eth/erc20_test.go @@ -138,6 +138,16 @@ func TestErc20_parseErc20StringProperty(t *testing.T) { args: "0x44616920537461626c65636f696e2076312e3020444444444444444444444444", want: "Dai Stablecoin v1.0 DDDDDDDDDDDD", }, + { + name: "long", + args: "0x556e6973776170205631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + want: "Uniswap V1", + }, + { + name: "garbage", + args: "0x2234880850896048596206002535425366538144616734015984380565810000", + want: "", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {