|
|
|
@ -20,6 +20,7 @@ import ( |
|
|
|
|
"bytes" |
|
|
|
|
"encoding/hex" |
|
|
|
|
"fmt" |
|
|
|
|
"math" |
|
|
|
|
"math/big" |
|
|
|
|
"reflect" |
|
|
|
|
"strconv" |
|
|
|
@ -943,3 +944,164 @@ func TestOOMMaliciousInput(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestPackAndUnpackIncompatibleNumber(t *testing.T) { |
|
|
|
|
var encodeABI Arguments |
|
|
|
|
uint256Ty, err := NewType("uint256", "", nil) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
encodeABI = Arguments{ |
|
|
|
|
{Type: uint256Ty}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
maxU64, ok := new(big.Int).SetString(strconv.FormatUint(math.MaxUint64, 10), 10) |
|
|
|
|
if !ok { |
|
|
|
|
panic("bug") |
|
|
|
|
} |
|
|
|
|
maxU64Plus1 := new(big.Int).Add(maxU64, big.NewInt(1)) |
|
|
|
|
cases := []struct { |
|
|
|
|
decodeType string |
|
|
|
|
inputValue *big.Int |
|
|
|
|
err error |
|
|
|
|
expectValue interface{} |
|
|
|
|
}{ |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint8", |
|
|
|
|
inputValue: big.NewInt(math.MaxUint8 + 1), |
|
|
|
|
err: errBadUint8, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint8", |
|
|
|
|
inputValue: big.NewInt(math.MaxUint8), |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: uint8(math.MaxUint8), |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint16", |
|
|
|
|
inputValue: big.NewInt(math.MaxUint16 + 1), |
|
|
|
|
err: errBadUint16, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint16", |
|
|
|
|
inputValue: big.NewInt(math.MaxUint16), |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: uint16(math.MaxUint16), |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint32", |
|
|
|
|
inputValue: big.NewInt(math.MaxUint32 + 1), |
|
|
|
|
err: errBadUint32, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint32", |
|
|
|
|
inputValue: big.NewInt(math.MaxUint32), |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: uint32(math.MaxUint32), |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint64", |
|
|
|
|
inputValue: maxU64Plus1, |
|
|
|
|
err: errBadUint64, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint64", |
|
|
|
|
inputValue: maxU64, |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: uint64(math.MaxUint64), |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "uint256", |
|
|
|
|
inputValue: maxU64Plus1, |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: maxU64Plus1, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int8", |
|
|
|
|
inputValue: big.NewInt(math.MaxInt8 + 1), |
|
|
|
|
err: errBadInt8, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int8", |
|
|
|
|
inputValue: big.NewInt(math.MinInt8 - 1), |
|
|
|
|
err: errBadInt8, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int8", |
|
|
|
|
inputValue: big.NewInt(math.MaxInt8), |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: int8(math.MaxInt8), |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int16", |
|
|
|
|
inputValue: big.NewInt(math.MaxInt16 + 1), |
|
|
|
|
err: errBadInt16, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int16", |
|
|
|
|
inputValue: big.NewInt(math.MinInt16 - 1), |
|
|
|
|
err: errBadInt16, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int16", |
|
|
|
|
inputValue: big.NewInt(math.MaxInt16), |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: int16(math.MaxInt16), |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int32", |
|
|
|
|
inputValue: big.NewInt(math.MaxInt32 + 1), |
|
|
|
|
err: errBadInt32, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int32", |
|
|
|
|
inputValue: big.NewInt(math.MinInt32 - 1), |
|
|
|
|
err: errBadInt32, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int32", |
|
|
|
|
inputValue: big.NewInt(math.MaxInt32), |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: int32(math.MaxInt32), |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int64", |
|
|
|
|
inputValue: new(big.Int).Add(big.NewInt(math.MaxInt64), big.NewInt(1)), |
|
|
|
|
err: errBadInt64, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int64", |
|
|
|
|
inputValue: new(big.Int).Sub(big.NewInt(math.MinInt64), big.NewInt(1)), |
|
|
|
|
err: errBadInt64, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
decodeType: "int64", |
|
|
|
|
inputValue: big.NewInt(math.MaxInt64), |
|
|
|
|
err: nil, |
|
|
|
|
expectValue: int64(math.MaxInt64), |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
for i, testCase := range cases { |
|
|
|
|
packed, err := encodeABI.Pack(testCase.inputValue) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
ty, err := NewType(testCase.decodeType, "", nil) |
|
|
|
|
if err != nil { |
|
|
|
|
panic(err) |
|
|
|
|
} |
|
|
|
|
decodeABI := Arguments{ |
|
|
|
|
{Type: ty}, |
|
|
|
|
} |
|
|
|
|
decoded, err := decodeABI.Unpack(packed) |
|
|
|
|
if err != testCase.err { |
|
|
|
|
t.Fatalf("Expected error %v, actual error %v. case %d", testCase.err, err, i) |
|
|
|
|
} |
|
|
|
|
if err != nil { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
if !reflect.DeepEqual(decoded[0], testCase.expectValue) { |
|
|
|
|
t.Fatalf("Expected value %v, actual value %v", testCase.expectValue, decoded[0]) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|