Skip to content

Commit 3278c79

Browse files
Merge pull request ethereum#1254 from maticnetwork/upstream_merge
Merge upstream_merge branch to develop
2 parents e789b4e + f25b6ef commit 3278c79

File tree

358 files changed

+6605
-30911
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

358 files changed

+6605
-30911
lines changed

.github/workflows/go.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: i386 linux tests
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
pull_request:
7+
branches: [ master ]
8+
workflow_dispatch:
9+
10+
jobs:
11+
build:
12+
runs-on: self-hosted
13+
steps:
14+
- uses: actions/checkout@v2
15+
- name: Set up Go
16+
uses: actions/setup-go@v2
17+
with:
18+
go-version: 1.21.4
19+
- name: Run tests
20+
run: go test ./...
21+
env:
22+
GOOS: linux
23+
GOARCH: 386

accounts/abi/abi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4]
274274
var panicSelector = crypto.Keccak256([]byte("Panic(uint256)"))[:4]
275275

276276
// panicReasons map is for readable panic codes
277-
// see this linkage for the deails
277+
// see this linkage for the details
278278
// https://docs.soliditylang.org/en/v0.8.21/control-structures.html#panic-via-assert-and-error-via-require
279279
// the reason string list is copied from ether.js
280280
// https://github.com/ethers-io/ethers.js/blob/fa3a883ff7c88611ce766f58bdd4b8ac90814470/src.ts/abi/interface.ts#L207-L218

accounts/abi/abi_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ var methods = map[string]Method{
120120
}
121121

122122
func TestReader(t *testing.T) {
123+
t.Parallel()
123124
abi := ABI{
124125
Methods: methods,
125126
}
@@ -153,6 +154,7 @@ func TestReader(t *testing.T) {
153154
}
154155

155156
func TestInvalidABI(t *testing.T) {
157+
t.Parallel()
156158
json := `[{ "type" : "function", "name" : "", "constant" : fals }]`
157159

158160
_, err := JSON(strings.NewReader(json))
@@ -175,6 +177,7 @@ func TestInvalidABI(t *testing.T) {
175177
// constructor(uint256 a, uint256 b) public{}
176178
// }
177179
func TestConstructor(t *testing.T) {
180+
t.Parallel()
178181
json := `[{ "inputs": [{"internalType": "uint256","name": "a","type": "uint256" },{ "internalType": "uint256","name": "b","type": "uint256"}],"stateMutability": "nonpayable","type": "constructor"}]`
179182
method := NewMethod("", "", Constructor, "nonpayable", false, false, []Argument{{"a", Uint256, false}, {"b", Uint256, false}}, nil)
180183
// Test from JSON
@@ -207,6 +210,7 @@ func TestConstructor(t *testing.T) {
207210
}
208211

209212
func TestTestNumbers(t *testing.T) {
213+
t.Parallel()
210214
abi, err := JSON(strings.NewReader(jsondata))
211215
if err != nil {
212216
t.Fatal(err)
@@ -245,6 +249,7 @@ func TestTestNumbers(t *testing.T) {
245249
}
246250

247251
func TestMethodSignature(t *testing.T) {
252+
t.Parallel()
248253
m := NewMethod("foo", "foo", Function, "", false, false, []Argument{{"bar", String, false}, {"baz", String, false}}, nil)
249254
exp := "foo(string,string)"
250255

@@ -286,6 +291,7 @@ func TestMethodSignature(t *testing.T) {
286291
}
287292

288293
func TestOverloadedMethodSignature(t *testing.T) {
294+
t.Parallel()
289295
json := `[{"constant":true,"inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"i","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"}],"name":"bar","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"},{"indexed":false,"name":"j","type":"uint256"}],"name":"bar","type":"event"}]`
290296

291297
abi, err := JSON(strings.NewReader(json))
@@ -311,6 +317,7 @@ func TestOverloadedMethodSignature(t *testing.T) {
311317
}
312318

313319
func TestCustomErrors(t *testing.T) {
320+
t.Parallel()
314321
json := `[{ "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ],"name": "MyError", "type": "error"} ]`
315322

316323
abi, err := JSON(strings.NewReader(json))
@@ -327,6 +334,7 @@ func TestCustomErrors(t *testing.T) {
327334
}
328335

329336
func TestMultiPack(t *testing.T) {
337+
t.Parallel()
330338
abi, err := JSON(strings.NewReader(jsondata))
331339
if err != nil {
332340
t.Fatal(err)
@@ -366,6 +374,7 @@ func ExampleJSON() {
366374
}
367375

368376
func TestInputVariableInputLength(t *testing.T) {
377+
t.Parallel()
369378
const definition = `[
370379
{ "type" : "function", "name" : "strOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" } ] },
371380
{ "type" : "function", "name" : "bytesOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "bytes" } ] },
@@ -498,6 +507,7 @@ func TestInputVariableInputLength(t *testing.T) {
498507
}
499508

500509
func TestInputFixedArrayAndVariableInputLength(t *testing.T) {
510+
t.Parallel()
501511
abi, err := JSON(strings.NewReader(jsondata))
502512
if err != nil {
503513
t.Error(err)
@@ -682,6 +692,7 @@ func TestInputFixedArrayAndVariableInputLength(t *testing.T) {
682692
}
683693

684694
func TestDefaultFunctionParsing(t *testing.T) {
695+
t.Parallel()
685696
const definition = `[{ "name" : "balance", "type" : "function" }]`
686697

687698
abi, err := JSON(strings.NewReader(definition))
@@ -695,6 +706,7 @@ func TestDefaultFunctionParsing(t *testing.T) {
695706
}
696707

697708
func TestBareEvents(t *testing.T) {
709+
t.Parallel()
698710
const definition = `[
699711
{ "type" : "event", "name" : "balance" },
700712
{ "type" : "event", "name" : "anon", "anonymous" : true},
@@ -776,6 +788,7 @@ func TestBareEvents(t *testing.T) {
776788
//
777789
// receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]}
778790
func TestUnpackEvent(t *testing.T) {
791+
t.Parallel()
779792
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]`
780793

781794
abi, err := JSON(strings.NewReader(abiJSON))
@@ -820,6 +833,7 @@ func TestUnpackEvent(t *testing.T) {
820833
}
821834

822835
func TestUnpackEventIntoMap(t *testing.T) {
836+
t.Parallel()
823837
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]`
824838

825839
abi, err := JSON(strings.NewReader(abiJSON))
@@ -880,6 +894,7 @@ func TestUnpackEventIntoMap(t *testing.T) {
880894
}
881895

882896
func TestUnpackMethodIntoMap(t *testing.T) {
897+
t.Parallel()
883898
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]`
884899

885900
abi, err := JSON(strings.NewReader(abiJSON))
@@ -939,6 +954,7 @@ func TestUnpackMethodIntoMap(t *testing.T) {
939954
}
940955

941956
func TestUnpackIntoMapNamingConflict(t *testing.T) {
957+
t.Parallel()
942958
// Two methods have the same name
943959
var abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"get","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]`
944960

@@ -1043,6 +1059,7 @@ func TestUnpackIntoMapNamingConflict(t *testing.T) {
10431059
}
10441060

10451061
func TestABI_MethodById(t *testing.T) {
1062+
t.Parallel()
10461063
abi, err := JSON(strings.NewReader(jsondata))
10471064
if err != nil {
10481065
t.Fatal(err)
@@ -1080,6 +1097,7 @@ func TestABI_MethodById(t *testing.T) {
10801097
}
10811098

10821099
func TestABI_EventById(t *testing.T) {
1100+
t.Parallel()
10831101
tests := []struct {
10841102
name string
10851103
json string
@@ -1149,6 +1167,7 @@ func TestABI_EventById(t *testing.T) {
11491167
}
11501168

11511169
func TestABI_ErrorByID(t *testing.T) {
1170+
t.Parallel()
11521171
abi, err := JSON(strings.NewReader(`[
11531172
{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"MyError1","type":"error"},
11541173
{"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"string","name":"b","type":"string"},{"internalType":"address","name":"c","type":"address"}],"internalType":"struct MyError.MyStruct","name":"x","type":"tuple"},{"internalType":"address","name":"y","type":"address"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"string","name":"b","type":"string"},{"internalType":"address","name":"c","type":"address"}],"internalType":"struct MyError.MyStruct","name":"z","type":"tuple"}],"name":"MyError2","type":"error"},
@@ -1179,6 +1198,7 @@ func TestABI_ErrorByID(t *testing.T) {
11791198
// TestDoubleDuplicateMethodNames checks that if transfer0 already exists, there won't be a name
11801199
// conflict and that the second transfer method will be renamed transfer1.
11811200
func TestDoubleDuplicateMethodNames(t *testing.T) {
1201+
t.Parallel()
11821202
abiJSON := `[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer0","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]`
11831203

11841204
contractAbi, err := JSON(strings.NewReader(abiJSON))
@@ -1213,6 +1233,7 @@ func TestDoubleDuplicateMethodNames(t *testing.T) {
12131233
// event send();
12141234
// }
12151235
func TestDoubleDuplicateEventNames(t *testing.T) {
1236+
t.Parallel()
12161237
abiJSON := `[{"anonymous": false,"inputs": [{"indexed": false,"internalType": "uint256","name": "a","type": "uint256"}],"name": "send","type": "event"},{"anonymous": false,"inputs": [],"name": "send0","type": "event"},{ "anonymous": false, "inputs": [],"name": "send","type": "event"}]`
12171238

12181239
contractAbi, err := JSON(strings.NewReader(abiJSON))
@@ -1245,6 +1266,7 @@ func TestDoubleDuplicateEventNames(t *testing.T) {
12451266
// event send(uint256, uint256);
12461267
// }
12471268
func TestUnnamedEventParam(t *testing.T) {
1269+
t.Parallel()
12481270
abiJSON := `[{ "anonymous": false, "inputs": [{ "indexed": false,"internalType": "uint256", "name": "","type": "uint256"},{"indexed": false,"internalType": "uint256","name": "","type": "uint256"}],"name": "send","type": "event"}]`
12491271

12501272
contractAbi, err := JSON(strings.NewReader(abiJSON))
@@ -1282,7 +1304,9 @@ func TestUnpackRevert(t *testing.T) {
12821304
}
12831305

12841306
for index, c := range cases {
1307+
index, c := index, c
12851308
t.Run(fmt.Sprintf("case %d", index), func(t *testing.T) {
1309+
t.Parallel()
12861310
got, err := UnpackRevert(common.Hex2Bytes(c.input))
12871311
if c.expectErr != nil {
12881312
if err == nil {

tests/fuzzers/abi/abifuzzer_test.go renamed to accounts/abi/abifuzzer_test.go

Lines changed: 56 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -22,33 +22,32 @@ import (
2222
"strings"
2323
"testing"
2424

25-
"github.com/ethereum/go-ethereum/accounts/abi"
2625
fuzz "github.com/google/gofuzz"
2726
)
2827

2928
// TestReplicate can be used to replicate crashers from the fuzzing tests.
3029
// Just replace testString with the data in .quoted
3130
func TestReplicate(t *testing.T) {
32-
testString := "\x20\x20\x20\x20\x20\x20\x20\x20\x80\x00\x00\x00\x20\x20\x20\x20\x00"
33-
data := []byte(testString)
34-
fuzzAbi(data)
31+
t.Parallel()
32+
//t.Skip("Test only useful for reproducing issues")
33+
fuzzAbi([]byte("\x20\x20\x20\x20\x20\x20\x20\x20\x80\x00\x00\x00\x20\x20\x20\x20\x00"))
34+
//fuzzAbi([]byte("asdfasdfkadsf;lasdf;lasd;lfk"))
3535
}
3636

37-
func Fuzz(f *testing.F) {
37+
// FuzzABI is the main entrypoint for fuzzing
38+
func FuzzABI(f *testing.F) {
3839
f.Fuzz(func(t *testing.T, data []byte) {
3940
fuzzAbi(data)
4041
})
4142
}
4243

4344
var (
44-
names = []string{"_name", "name", "NAME", "name_", "__", "_name_", "n"}
45-
stateMut = []string{"", "pure", "view", "payable"}
46-
stateMutabilites = []*string{&stateMut[0], &stateMut[1], &stateMut[2], &stateMut[3]}
47-
pays = []string{"", "true", "false"}
48-
payables = []*string{&pays[0], &pays[1]}
49-
vNames = []string{"a", "b", "c", "d", "e", "f", "g"}
50-
varNames = append(vNames, names...)
51-
varTypes = []string{"bool", "address", "bytes", "string",
45+
names = []string{"_name", "name", "NAME", "name_", "__", "_name_", "n"}
46+
stateMut = []string{"pure", "view", "payable"}
47+
pays = []string{"true", "false"}
48+
vNames = []string{"a", "b", "c", "d", "e", "f", "g"}
49+
varNames = append(vNames, names...)
50+
varTypes = []string{"bool", "address", "bytes", "string",
5251
"uint8", "int8", "uint8", "int8", "uint16", "int16",
5352
"uint24", "int24", "uint32", "int32", "uint40", "int40", "uint48", "int48", "uint56", "int56",
5453
"uint64", "int64", "uint72", "int72", "uint80", "int80", "uint88", "int88", "uint96", "int96",
@@ -62,7 +61,7 @@ var (
6261
"bytes32", "bytes"}
6362
)
6463

65-
func unpackPack(abi abi.ABI, method string, input []byte) ([]interface{}, bool) {
64+
func unpackPack(abi ABI, method string, input []byte) ([]interface{}, bool) {
6665
if out, err := abi.Unpack(method, input); err == nil {
6766
_, err := abi.Pack(method, out...)
6867
if err != nil {
@@ -78,7 +77,7 @@ func unpackPack(abi abi.ABI, method string, input []byte) ([]interface{}, bool)
7877
return nil, false
7978
}
8079

81-
func packUnpack(abi abi.ABI, method string, input *[]interface{}) bool {
80+
func packUnpack(abi ABI, method string, input *[]interface{}) bool {
8281
if packed, err := abi.Pack(method, input); err == nil {
8382
outptr := reflect.New(reflect.TypeOf(input))
8483
err := abi.UnpackIntoInterface(outptr.Interface(), method, packed)
@@ -94,12 +93,12 @@ func packUnpack(abi abi.ABI, method string, input *[]interface{}) bool {
9493
return false
9594
}
9695

97-
type args struct {
96+
type arg struct {
9897
name string
9998
typ string
10099
}
101100

102-
func createABI(name string, stateMutability, payable *string, inputs []args) (abi.ABI, error) {
101+
func createABI(name string, stateMutability, payable *string, inputs []arg) (ABI, error) {
103102
sig := fmt.Sprintf(`[{ "type" : "function", "name" : "%v" `, name)
104103
if stateMutability != nil {
105104
sig += fmt.Sprintf(`, "stateMutability": "%v" `, *stateMutability)
@@ -126,56 +125,55 @@ func createABI(name string, stateMutability, payable *string, inputs []args) (ab
126125
sig += "} ]"
127126
}
128127
sig += `}]`
129-
130-
return abi.JSON(strings.NewReader(sig))
128+
//fmt.Printf("sig: %s\n", sig)
129+
return JSON(strings.NewReader(sig))
131130
}
132131

133-
func fuzzAbi(input []byte) int {
134-
good := false
135-
fuzzer := fuzz.NewFromGoFuzz(input)
136-
137-
name := names[getUInt(fuzzer)%len(names)]
138-
stateM := stateMutabilites[getUInt(fuzzer)%len(stateMutabilites)]
139-
payable := payables[getUInt(fuzzer)%len(payables)]
140-
maxLen := 5
141-
for k := 1; k < maxLen; k++ {
142-
var arg []args
143-
for i := k; i > 0; i-- {
144-
argName := varNames[i]
145-
argTyp := varTypes[getUInt(fuzzer)%len(varTypes)]
146-
if getUInt(fuzzer)%10 == 0 {
147-
argTyp += "[]"
148-
} else if getUInt(fuzzer)%10 == 0 {
149-
arrayArgs := getUInt(fuzzer)%30 + 1
150-
argTyp += fmt.Sprintf("[%d]", arrayArgs)
151-
}
152-
arg = append(arg, args{
153-
name: argName,
154-
typ: argTyp,
155-
})
132+
func fuzzAbi(input []byte) {
133+
var (
134+
fuzzer = fuzz.NewFromGoFuzz(input)
135+
name = oneOf(fuzzer, names)
136+
stateM = oneOfOrNil(fuzzer, stateMut)
137+
payable = oneOfOrNil(fuzzer, pays)
138+
arguments []arg
139+
)
140+
for i := 0; i < upTo(fuzzer, 10); i++ {
141+
argName := oneOf(fuzzer, varNames)
142+
argTyp := oneOf(fuzzer, varTypes)
143+
switch upTo(fuzzer, 10) {
144+
case 0: // 10% chance to make it a slice
145+
argTyp += "[]"
146+
case 1: // 10% chance to make it an array
147+
argTyp += fmt.Sprintf("[%d]", 1+upTo(fuzzer, 30))
148+
default:
156149
}
157-
abi, err := createABI(name, stateM, payable, arg)
158-
if err != nil {
159-
continue
160-
}
161-
structs, b := unpackPack(abi, name, input)
162-
c := packUnpack(abi, name, &structs)
163-
good = good || b || c
150+
arguments = append(arguments, arg{name: argName, typ: argTyp})
164151
}
165-
if good {
166-
return 1
152+
abi, err := createABI(name, stateM, payable, arguments)
153+
if err != nil {
154+
//fmt.Printf("err: %v\n", err)
155+
panic(err)
167156
}
168-
return 0
157+
structs, _ := unpackPack(abi, name, input)
158+
_ = packUnpack(abi, name, &structs)
169159
}
170160

171-
func getUInt(fuzzer *fuzz.Fuzzer) int {
161+
func upTo(fuzzer *fuzz.Fuzzer, max int) int {
172162
var i int
173163
fuzzer.Fuzz(&i)
174164
if i < 0 {
175-
i = -i
176-
if i < 0 {
177-
return 0
178-
}
165+
return (-1 - i) % max
166+
}
167+
return i % max
168+
}
169+
170+
func oneOf(fuzzer *fuzz.Fuzzer, options []string) string {
171+
return options[upTo(fuzzer, len(options))]
172+
}
173+
174+
func oneOfOrNil(fuzzer *fuzz.Fuzzer, options []string) *string {
175+
if i := upTo(fuzzer, len(options)+1); i < len(options) {
176+
return &options[i]
179177
}
180-
return i
178+
return nil
181179
}

0 commit comments

Comments
 (0)