forked from etclabscore/core-geth
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'foundation/release/1.10' into merge/fou…
…ndation-release/1.10.17 Conflicts: .travis.yml README.md cmd/geth/config.go cmd/geth/main.go cmd/geth/usage.go cmd/utils/flags.go core/blockchain_insert.go core/genesis.go core/rawdb/table.go eth/catalyst/api.go eth/catalyst/api_test.go eth/handler.go eth/sync.go go.mod go.sum node/node.go params/alloc.go params/config.go params/version.go
- Loading branch information
Showing
175 changed files
with
10,634 additions
and
1,763 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
package abi | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
type SelectorMarshaling struct { | ||
Name string `json:"name"` | ||
Type string `json:"type"` | ||
Inputs []ArgumentMarshaling `json:"inputs"` | ||
} | ||
|
||
func isDigit(c byte) bool { | ||
return c >= '0' && c <= '9' | ||
} | ||
|
||
func isAlpha(c byte) bool { | ||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') | ||
} | ||
|
||
func isIdentifierSymbol(c byte) bool { | ||
return c == '$' || c == '_' | ||
} | ||
|
||
func parseToken(unescapedSelector string, isIdent bool) (string, string, error) { | ||
if len(unescapedSelector) == 0 { | ||
return "", "", fmt.Errorf("empty token") | ||
} | ||
firstChar := unescapedSelector[0] | ||
position := 1 | ||
if !(isAlpha(firstChar) || (isIdent && isIdentifierSymbol(firstChar))) { | ||
return "", "", fmt.Errorf("invalid token start: %c", firstChar) | ||
} | ||
for position < len(unescapedSelector) { | ||
char := unescapedSelector[position] | ||
if !(isAlpha(char) || isDigit(char) || (isIdent && isIdentifierSymbol(char))) { | ||
break | ||
} | ||
position++ | ||
} | ||
return unescapedSelector[:position], unescapedSelector[position:], nil | ||
} | ||
|
||
func parseIdentifier(unescapedSelector string) (string, string, error) { | ||
return parseToken(unescapedSelector, true) | ||
} | ||
|
||
func parseElementaryType(unescapedSelector string) (string, string, error) { | ||
parsedType, rest, err := parseToken(unescapedSelector, false) | ||
if err != nil { | ||
return "", "", fmt.Errorf("failed to parse elementary type: %v", err) | ||
} | ||
// handle arrays | ||
for len(rest) > 0 && rest[0] == '[' { | ||
parsedType = parsedType + string(rest[0]) | ||
rest = rest[1:] | ||
for len(rest) > 0 && isDigit(rest[0]) { | ||
parsedType = parsedType + string(rest[0]) | ||
rest = rest[1:] | ||
} | ||
if len(rest) == 0 || rest[0] != ']' { | ||
return "", "", fmt.Errorf("failed to parse array: expected ']', got %c", unescapedSelector[0]) | ||
} | ||
parsedType = parsedType + string(rest[0]) | ||
rest = rest[1:] | ||
} | ||
return parsedType, rest, nil | ||
} | ||
|
||
func parseCompositeType(unescapedSelector string) ([]interface{}, string, error) { | ||
if len(unescapedSelector) == 0 || unescapedSelector[0] != '(' { | ||
return nil, "", fmt.Errorf("expected '(', got %c", unescapedSelector[0]) | ||
} | ||
parsedType, rest, err := parseType(unescapedSelector[1:]) | ||
if err != nil { | ||
return nil, "", fmt.Errorf("failed to parse type: %v", err) | ||
} | ||
result := []interface{}{parsedType} | ||
for len(rest) > 0 && rest[0] != ')' { | ||
parsedType, rest, err = parseType(rest[1:]) | ||
if err != nil { | ||
return nil, "", fmt.Errorf("failed to parse type: %v", err) | ||
} | ||
result = append(result, parsedType) | ||
} | ||
if len(rest) == 0 || rest[0] != ')' { | ||
return nil, "", fmt.Errorf("expected ')', got '%s'", rest) | ||
} | ||
return result, rest[1:], nil | ||
} | ||
|
||
func parseType(unescapedSelector string) (interface{}, string, error) { | ||
if len(unescapedSelector) == 0 { | ||
return nil, "", fmt.Errorf("empty type") | ||
} | ||
if unescapedSelector[0] == '(' { | ||
return parseCompositeType(unescapedSelector) | ||
} else { | ||
return parseElementaryType(unescapedSelector) | ||
} | ||
} | ||
|
||
func assembleArgs(args []interface{}) ([]ArgumentMarshaling, error) { | ||
arguments := make([]ArgumentMarshaling, 0) | ||
for i, arg := range args { | ||
// generate dummy name to avoid unmarshal issues | ||
name := fmt.Sprintf("name%d", i) | ||
if s, ok := arg.(string); ok { | ||
arguments = append(arguments, ArgumentMarshaling{name, s, s, nil, false}) | ||
} else if components, ok := arg.([]interface{}); ok { | ||
subArgs, err := assembleArgs(components) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to assemble components: %v", err) | ||
} | ||
arguments = append(arguments, ArgumentMarshaling{name, "tuple", "tuple", subArgs, false}) | ||
} else { | ||
return nil, fmt.Errorf("failed to assemble args: unexpected type %T", arg) | ||
} | ||
} | ||
return arguments, nil | ||
} | ||
|
||
// ParseSelector converts a method selector into a struct that can be JSON encoded | ||
// and consumed by other functions in this package. | ||
// Note, although uppercase letters are not part of the ABI spec, this function | ||
// still accepts it as the general format is valid. | ||
func ParseSelector(unescapedSelector string) (SelectorMarshaling, error) { | ||
name, rest, err := parseIdentifier(unescapedSelector) | ||
if err != nil { | ||
return SelectorMarshaling{}, fmt.Errorf("failed to parse selector '%s': %v", unescapedSelector, err) | ||
} | ||
args := []interface{}{} | ||
if len(rest) >= 2 && rest[0] == '(' && rest[1] == ')' { | ||
rest = rest[2:] | ||
} else { | ||
args, rest, err = parseCompositeType(rest) | ||
if err != nil { | ||
return SelectorMarshaling{}, fmt.Errorf("failed to parse selector '%s': %v", unescapedSelector, err) | ||
} | ||
} | ||
if len(rest) > 0 { | ||
return SelectorMarshaling{}, fmt.Errorf("failed to parse selector '%s': unexpected string '%s'", unescapedSelector, rest) | ||
} | ||
|
||
// Reassemble the fake ABI and constuct the JSON | ||
fakeArgs, err := assembleArgs(args) | ||
if err != nil { | ||
return SelectorMarshaling{}, fmt.Errorf("failed to parse selector: %v", err) | ||
} | ||
|
||
return SelectorMarshaling{name, "function", fakeArgs}, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
package abi | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
"reflect" | ||
"testing" | ||
) | ||
|
||
func TestParseSelector(t *testing.T) { | ||
mkType := func(types ...interface{}) []ArgumentMarshaling { | ||
var result []ArgumentMarshaling | ||
for i, typeOrComponents := range types { | ||
name := fmt.Sprintf("name%d", i) | ||
if typeName, ok := typeOrComponents.(string); ok { | ||
result = append(result, ArgumentMarshaling{name, typeName, typeName, nil, false}) | ||
} else if components, ok := typeOrComponents.([]ArgumentMarshaling); ok { | ||
result = append(result, ArgumentMarshaling{name, "tuple", "tuple", components, false}) | ||
} else { | ||
log.Fatalf("unexpected type %T", typeOrComponents) | ||
} | ||
} | ||
return result | ||
} | ||
tests := []struct { | ||
input string | ||
name string | ||
args []ArgumentMarshaling | ||
}{ | ||
{"noargs()", "noargs", []ArgumentMarshaling{}}, | ||
{"simple(uint256,uint256,uint256)", "simple", mkType("uint256", "uint256", "uint256")}, | ||
{"other(uint256,address)", "other", mkType("uint256", "address")}, | ||
{"withArray(uint256[],address[2],uint8[4][][5])", "withArray", mkType("uint256[]", "address[2]", "uint8[4][][5]")}, | ||
{"singleNest(bytes32,uint8,(uint256,uint256),address)", "singleNest", mkType("bytes32", "uint8", mkType("uint256", "uint256"), "address")}, | ||
{"multiNest(address,(uint256[],uint256),((address,bytes32),uint256))", "multiNest", | ||
mkType("address", mkType("uint256[]", "uint256"), mkType(mkType("address", "bytes32"), "uint256"))}, | ||
} | ||
for i, tt := range tests { | ||
selector, err := ParseSelector(tt.input) | ||
if err != nil { | ||
t.Errorf("test %d: failed to parse selector '%v': %v", i, tt.input, err) | ||
} | ||
if selector.Name != tt.name { | ||
t.Errorf("test %d: unexpected function name: '%s' != '%s'", i, selector.Name, tt.name) | ||
} | ||
|
||
if selector.Type != "function" { | ||
t.Errorf("test %d: unexpected type: '%s' != '%s'", i, selector.Type, "function") | ||
} | ||
if !reflect.DeepEqual(selector.Inputs, tt.args) { | ||
t.Errorf("test %d: unexpected args: '%v' != '%v'", i, selector.Inputs, tt.args) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,58 @@ | ||
# This file contains sha256 checksums of optional build dependencies. | ||
|
||
3defb9a09bed042403195e872dcbc8c6fae1485963332279668ec52e80a95a2d go1.17.5.src.tar.gz | ||
2db6a5d25815b56072465a2cacc8ed426c18f1d5fc26c1fc8c4f5a7188658264 go1.17.5.darwin-amd64.tar.gz | ||
111f71166de0cb8089bb3e8f9f5b02d76e1bf1309256824d4062a47b0e5f98e0 go1.17.5.darwin-arm64.tar.gz | ||
443c1cd9768df02085014f1eb034ebc7dbe032ffc8a9bb9f2e6617d037eee23c go1.17.5.freebsd-386.tar.gz | ||
17180bdc4126acffd0ebf86d66ef5cbc3488b6734e93374fb00eb09494e006d3 go1.17.5.freebsd-amd64.tar.gz | ||
4f4914303bc18f24fd137a97e595735308f5ce81323c7224c12466fd763fc59f go1.17.5.linux-386.tar.gz | ||
bd78114b0d441b029c8fe0341f4910370925a4d270a6a590668840675b0c653e go1.17.5.linux-amd64.tar.gz | ||
6f95ce3da40d9ce1355e48f31f4eb6508382415ca4d7413b1e7a3314e6430e7e go1.17.5.linux-arm64.tar.gz | ||
aa1fb6c53b4fe72f159333362a10aca37ae938bde8adc9c6eaf2a8e87d1e47de go1.17.5.linux-armv6l.tar.gz | ||
3d4be616e568f0a02cb7f7769bcaafda4b0969ed0f9bb4277619930b96847e70 go1.17.5.linux-ppc64le.tar.gz | ||
8087d4fe991e82804e6485c26568c2e0ee0bfde00ceb9015dc86cb6bf84ef40b go1.17.5.linux-s390x.tar.gz | ||
6d7b9948ee14a906b14f5cbebdfab63cd6828b0b618160847ecd3cc3470a26fe go1.17.5.windows-386.zip | ||
671faf99cd5d81cd7e40936c0a94363c64d654faa0148d2af4bbc262555620b9 go1.17.5.windows-amd64.zip | ||
45e88676b68e9cf364be469b5a27965397f4e339aa622c2f52c10433c56e5030 go1.17.5.windows-arm64.zip | ||
38f423db4cc834883f2b52344282fa7a39fbb93650dc62a11fdf0be6409bdad6 go1.18.src.tar.gz | ||
70bb4a066997535e346c8bfa3e0dfe250d61100b17ccc5676274642447834969 go1.18.darwin-amd64.tar.gz | ||
9cab6123af9ffade905525d79fc9ee76651e716c85f1f215872b5f2976782480 go1.18.darwin-arm64.tar.gz | ||
e63492d4f38487331518eb4b50e670d853bb8d67e88596269af84bb9aca0b381 go1.18.freebsd-386.tar.gz | ||
01cd67bbc12e659ff236ecebde1806f76452f7ca145c172d5ecdbf4f4803daae go1.18.freebsd-amd64.tar.gz | ||
1c04cf4440b323a66328e0df95d409f955b9b475e58eae235fdd3d1f1cf02f4f go1.18.linux-386.tar.gz | ||
e85278e98f57cdb150fe8409e6e5df5343ecb13cebf03a5d5ff12bd55a80264f go1.18.linux-amd64.tar.gz | ||
7ac7b396a691e588c5fb57687759e6c4db84a2a3bbebb0765f4b38e5b1c5b00e go1.18.linux-arm64.tar.gz | ||
a80fa43d1f4575fb030adbfbaa94acd860c6847820764eecb06c63b7c103612b go1.18.linux-armv6l.tar.gz | ||
070351edac192483c074b38d08ec19251a83f8210765a532a84c3dcf8aec04d8 go1.18.linux-ppc64le.tar.gz | ||
ea265f5e62fcaf941d53f0cdb81222d9668e1672a0d39d992f16ff0e87c0ee6b go1.18.linux-s390x.tar.gz | ||
e23fd2a0509690fe7e63b2b1bcd4c39ed57b46ccde76f35dc0d16ca7fdbc5aaa go1.18.windows-386.zip | ||
65c5c0c709a7ca1b357091b10b795b439d8b50e579d3893edab4c7e9b384f435 go1.18.windows-amd64.zip | ||
1c454eb60c64d481965a165c623ff1ed6cf32d68c6b31f36069c8768d908f093 go1.18.windows-arm64.zip | ||
|
||
d4bd25b9814eeaa2134197dd2c7671bb791eae786d42010d9d788af20dee4bfa golangci-lint-1.42.0-darwin-amd64.tar.gz | ||
e56859c04a2ad5390c6a497b1acb1cc9329ecb1010260c6faae9b5a4c35b35ea golangci-lint-1.42.0-darwin-arm64.tar.gz | ||
14d912a3fa856830339472fc4dc341933adf15f37bdb7130bbbfcf960ecf4809 golangci-lint-1.42.0-freebsd-386.tar.gz | ||
337257fccc9baeb5ee1cd7e70c153e9d9f59d3afde46d631659500048afbdf80 golangci-lint-1.42.0-freebsd-amd64.tar.gz | ||
6debcc266b629359fdd8eef4f4abb05a621604079d27016265afb5b4593b0eff golangci-lint-1.42.0-freebsd-armv6.tar.gz | ||
878f0e190169db2ce9dde8cefbd99adc4fe28b90b68686bbfcfcc2085e6d693e golangci-lint-1.42.0-freebsd-armv7.tar.gz | ||
42c78e31faf62b225363eff1b1d2aa74f9dbcb75686c8914aa3e90d6af65cece golangci-lint-1.42.0-linux-386.tar.gz | ||
6937f62f8e2329e94822dc11c10b871ace5557ae1fcc4ee2f9980cd6aecbc159 golangci-lint-1.42.0-linux-amd64.tar.gz | ||
2cf8d23d96cd854a537b355dab2962b960b88a06b615232599f066afd233f246 golangci-lint-1.42.0-linux-arm64.tar.gz | ||
08b003d1ed61367473886defc957af5301066e62338e5d96a319c34dadc4c1d1 golangci-lint-1.42.0-linux-armv6.tar.gz | ||
c7c00ec4845e806a1f32685f5b150219e180bd6d6a9d584be8d27f0c41d7a1bf golangci-lint-1.42.0-linux-armv7.tar.gz | ||
3650fcf29eb3d8ee326d77791a896b15259eb2d5bf77437dc72e7efe5af6bd40 golangci-lint-1.42.0-linux-mips64.tar.gz | ||
f51ae003fdbca4fef78ba73e2eb736a939c8eaa178cd452234213b489da5a420 golangci-lint-1.42.0-linux-mips64le.tar.gz | ||
1b0bb7b8b22cc4ea7da44fd5ad5faaf6111d0677e01cc6f961b62a96537de2c6 golangci-lint-1.42.0-linux-ppc64le.tar.gz | ||
8cb56927eb75e572450efbe0ff0f9cf3f56dc9faa81d9e8d30d6559fc1d06e6d golangci-lint-1.42.0-linux-riscv64.tar.gz | ||
5ac41cd31825a176b21505a371a7b307cd9cdf17df0f35bbb3bf1466f9356ccc golangci-lint-1.42.0-linux-s390x.tar.gz | ||
e1cebd2af621ac4b64c20937df92c3819264f2174c92f51e196db1e64ae097e0 golangci-lint-1.42.0-windows-386.zip | ||
7e70fcde8e87a17cae0455df07d257ebc86669f3968d568e12727fa24bbe9883 golangci-lint-1.42.0-windows-amd64.zip | ||
59da7ce1bda432616bfc28ae663e52c3675adee8d9bf5959fafd657c159576ab golangci-lint-1.42.0-windows-armv6.zip | ||
65f62dda937bfcede0326ac77abe947ce1548931e6e13298ca036cb31f224db5 golangci-lint-1.42.0-windows-armv7.zip | ||
03c181fc1bb29ea3e73cbb23399c43b081063833a7cf7554b94e5a98308df53e golangci-lint-1.45.2-linux-riscv64.deb | ||
08a50bbbf451ede6d5354179eb3e14a5634e156dfa92cb9a2606f855a637e35b golangci-lint-1.45.2-linux-ppc64le.rpm | ||
0d12f6ec1296b5a70e392aa88cd2295cceef266165eb7028e675f455515dd1c9 golangci-lint-1.45.2-linux-armv7.deb | ||
10f2846e2e50e4ea8ae426ee62dcd2227b23adddd8e991aa3c065927ac948735 golangci-lint-1.45.2-linux-ppc64le.deb | ||
1463049b744871168095e3e8f687247d6040eeb895955b869889ea151e0603ab golangci-lint-1.45.2-linux-arm64.tar.gz | ||
15720f9c4c6f9324af695f081dc189adc7751b255759e78d7b2df1d7e9192533 golangci-lint-1.45.2-linux-amd64.deb | ||
166d922e4d3cfe3d47786c590154a9c8ea689dff0aa92b73d2f5fc74fc570c29 golangci-lint-1.45.2-linux-arm64.rpm | ||
1a3754c69f7cc19ab89cbdcc2550da4cf9abb3120383c6b3bd440c1ec22da2e6 golangci-lint-1.45.2-freebsd-386.tar.gz | ||
1dec0aa46d4f0d241863b573f70129bdf1de9c595cf51172a840a588a4cd9fc5 golangci-lint-1.45.2-windows-amd64.zip | ||
3198453806517c1ad988229f5e758ef850e671203f46d6905509df5bdf4dc24b golangci-lint-1.45.2-freebsd-armv7.tar.gz | ||
46a3cd1749d7b98adc2dc01510ddbe21abe42689c8a53fb0e81662713629f215 golangci-lint-1.45.2-linux-386.deb | ||
4e28bfb593d464b9e160f2acd5b71993836a183270bf8299b78ad31f7a168c0d golangci-lint-1.45.2-linux-arm64.deb | ||
5157a58c8f9ab85c33af2e46f0d7c57a3b1e8953b81d61130e292e09f545cfab golangci-lint-1.45.2-linux-mips64le.tar.gz | ||
518cd027644129fbf8ec4f02bd6f9ad7278aae826f92b63c80d4d0819ddde49a golangci-lint-1.45.2-linux-armv6.rpm | ||
595ad6c6dade4c064351bc309f411703e457f8ffbb7a1806b3d8ee713333427f golangci-lint-1.45.2-linux-amd64.tar.gz | ||
6994d6c80f0730751090986184a3481b4be2e6b6e84416238a2b857910045a4f golangci-lint-1.45.2-windows-arm64.zip | ||
6c81652fc340118811b487f713c441fc6f527800bf5fd11b8929d08124efa015 golangci-lint-1.45.2-linux-armv7.tar.gz | ||
726cb045559b7518bafdd3459de70a0647c087eb1b4634627a4b2e95b1258580 golangci-lint-1.45.2-freebsd-amd64.tar.gz | ||
77df3774cdfda49b956d4a0e676da9a9b883f496ee37293c530770fef6b1d24e golangci-lint-1.45.2-linux-mips64.deb | ||
7a9840f279a7d5d405bb434e101c2290964b3729630ac2add29280b962b7b9a5 golangci-lint-1.45.2-windows-armv6.zip | ||
7d4bf9a5d80ec467aaaf66e78dbdcab567bbc6ba8151334c714eee58766aae32 golangci-lint-1.45.2-windows-armv7.zip | ||
7e5f8821d39bb11d273b0841b34355f56bd5a45a2d5179f0d09e614e0efc0482 golangci-lint-1.45.2-linux-s390x.rpm | ||
828de1bde796b23d8656b17a8885fbd879ef612795d62d1e4618126b419728b5 golangci-lint-1.45.2-linux-mips64.rpm | ||
879a52107a797678a03c175cc7cf441411a14a01f66dc87f70bdfa304a4129a6 golangci-lint-1.45.2-windows-386.zip | ||
87b6c7e3a3769f7d9abeb3bb82119b3c91e3c975300f6834fdeef8b2e37c98ff golangci-lint-1.45.2-linux-amd64.rpm | ||
8b605c6d686c8af53ecc4ef39544541eeb1644d34cc10f9ffc5087808210c4ff golangci-lint-1.45.2-linux-s390x.deb | ||
9427dbf51d0ac6f73a0f992838bd40c817470cc5bf6c8e2e2bea6fac46d7af6e golangci-lint-1.45.2-linux-ppc64le.tar.gz | ||
995e509e895ca6a64ffc7395ac884d5961bdec98423cb896b17f345a9b4a19cf golangci-lint-1.45.2-darwin-amd64.tar.gz | ||
a3f36278f2ea5516341e9071a2df6e65df272be80230b5406a12b72c6d425bee golangci-lint-1.45.2-linux-armv7.rpm | ||
a5e12c50c23e87ac1deffc872f92ae85427b1198604969399805ae47cfe43f08 golangci-lint-1.45.2-linux-riscv64.tar.gz | ||
aa8fa1be0729dbc2fbc4e01e82027097613eee74bd686ebef20f860b01fff8b3 golangci-lint-1.45.2-freebsd-armv6.tar.gz | ||
c2b9669decc1b638cf2ee9060571af4e255f6dfcbb225c293e3a7ee4bb2c7217 golangci-lint-1.45.2-darwin-arm64.tar.gz | ||
dfa8bdaf0387aec1cd5c1aa8857f67b2bbdfc2e42efce540c8fb9bbe3e8af302 golangci-lint-1.45.2-linux-armv6.tar.gz | ||
eb8b8539dd017eee5c131ea9b875893ab2cebeeca41e8c6624907fb02224d643 golangci-lint-1.45.2-linux-386.rpm | ||
ed6c7e17a857f30d715c5302fa250d95936936b277024bffea201187a257d7a7 golangci-lint-1.45.2-linux-armv6.deb | ||
ef4d0154ace4001f01b288baeb118176242efb4fd163e178763e3213b77ef30b golangci-lint-1.45.2-linux-mips64le.deb | ||
ef7002a2229f5ff5ba201a715fcf877664ea88decbe58e69d163293913024955 golangci-lint-1.45.2-linux-s390x.tar.gz | ||
f13ecbd09228632e6bbe91a8324bd675c406eed22eb6d2c1e8192eed9ec4f914 golangci-lint-1.45.2-linux-386.tar.gz | ||
f4cd9cfb09252f51699407277512263cae8409b665dd764f55a34738d0e89edc golangci-lint-1.45.2-linux-riscv64.rpm | ||
fb1945dc59d37c9d14bf0a4aea11ea8651fa0e1d582ea80c4c44d0a536c08893 golangci-lint-1.45.2-linux-mips64.tar.gz | ||
fe542c22738010f453c735a3c410decfd3784d1bd394b395c298ee298fc4c606 golangci-lint-1.45.2-linux-mips64le.rpm |
Oops, something went wrong.