mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-25 22:26:42 +00:00
Merge branch 'ethereum:master' into master
This commit is contained in:
commit
24336997d4
602 changed files with 93839 additions and 18227 deletions
19
.github/CODEOWNERS
vendored
19
.github/CODEOWNERS
vendored
|
|
@ -9,12 +9,11 @@ beacon/light/ @zsfelfoldi
|
|||
beacon/merkle/ @zsfelfoldi
|
||||
beacon/types/ @zsfelfoldi @fjl
|
||||
beacon/params/ @zsfelfoldi @fjl
|
||||
cmd/clef/ @holiman
|
||||
cmd/evm/ @holiman @MariusVanDerWijden @lightclient
|
||||
core/state/ @rjl493456442 @holiman
|
||||
crypto/ @gballet @jwasinger @holiman @fjl
|
||||
core/ @holiman @rjl493456442
|
||||
eth/ @holiman @rjl493456442
|
||||
cmd/evm/ @MariusVanDerWijden @lightclient
|
||||
core/state/ @rjl493456442
|
||||
crypto/ @gballet @jwasinger @fjl
|
||||
core/ @rjl493456442
|
||||
eth/ @rjl493456442
|
||||
eth/catalyst/ @MariusVanDerWijden @lightclient @fjl @jwasinger
|
||||
eth/tracers/ @s1na
|
||||
ethclient/ @fjl
|
||||
|
|
@ -26,11 +25,9 @@ core/tracing/ @s1na
|
|||
graphql/ @s1na
|
||||
internal/ethapi/ @fjl @s1na @lightclient
|
||||
internal/era/ @lightclient
|
||||
metrics/ @holiman
|
||||
miner/ @MariusVanDerWijden @holiman @fjl @rjl493456442
|
||||
miner/ @MariusVanDerWijden @fjl @rjl493456442
|
||||
node/ @fjl
|
||||
p2p/ @fjl @zsfelfoldi
|
||||
rlp/ @fjl
|
||||
params/ @fjl @holiman @karalabe @gballet @rjl493456442 @zsfelfoldi
|
||||
rpc/ @fjl @holiman
|
||||
signer/ @holiman
|
||||
params/ @fjl @karalabe @gballet @rjl493456442 @zsfelfoldi
|
||||
rpc/ @fjl
|
||||
|
|
|
|||
13
.gitignore
vendored
13
.gitignore
vendored
|
|
@ -43,3 +43,16 @@ profile.cov
|
|||
.vscode
|
||||
|
||||
tests/spec-tests/
|
||||
|
||||
# binaries
|
||||
cmd/abidump/abidump
|
||||
cmd/abigen/abigen
|
||||
cmd/blsync/blsync
|
||||
cmd/clef/clef
|
||||
cmd/devp2p/devp2p
|
||||
cmd/era/era
|
||||
cmd/ethkey/ethkey
|
||||
cmd/evm/evm
|
||||
cmd/geth/geth
|
||||
cmd/rlpdump/rlpdump
|
||||
cmd/workload/workload
|
||||
131
.golangci.yml
131
.golangci.yml
|
|
@ -1,31 +1,25 @@
|
|||
# This file configures github.com/golangci/golangci-lint.
|
||||
|
||||
version: '2'
|
||||
run:
|
||||
timeout: 20m
|
||||
tests: true
|
||||
|
||||
linters:
|
||||
disable-all: true
|
||||
default: none
|
||||
enable:
|
||||
- goimports
|
||||
- gosimple
|
||||
- govet
|
||||
- ineffassign
|
||||
- misspell
|
||||
- unconvert
|
||||
- typecheck
|
||||
- unused
|
||||
- staticcheck
|
||||
- bidichk
|
||||
- durationcheck
|
||||
- copyloopvar
|
||||
- whitespace
|
||||
- revive # only certain checks enabled
|
||||
- durationcheck
|
||||
- gocheckcompilerdirectives
|
||||
- reassign
|
||||
- govet
|
||||
- ineffassign
|
||||
- mirror
|
||||
- misspell
|
||||
- reassign
|
||||
- revive # only certain checks enabled
|
||||
- staticcheck
|
||||
- unconvert
|
||||
- unused
|
||||
- usetesting
|
||||
- whitespace
|
||||
### linters we tried and will not be using:
|
||||
###
|
||||
# - structcheck # lots of false positives
|
||||
|
|
@ -36,44 +30,67 @@ linters:
|
|||
# - exhaustive # silly check
|
||||
# - makezero # false positives
|
||||
# - nilerr # several intentional
|
||||
|
||||
linters-settings:
|
||||
gofmt:
|
||||
simplify: true
|
||||
revive:
|
||||
enable-all-rules: false
|
||||
# here we enable specific useful rules
|
||||
# see https://golangci-lint.run/usage/linters/#revive for supported rules
|
||||
settings:
|
||||
staticcheck:
|
||||
checks:
|
||||
# disable Quickfixes
|
||||
- -QF1*
|
||||
revive:
|
||||
enable-all-rules: false
|
||||
# here we enable specific useful rules
|
||||
# see https://golangci-lint.run/usage/linters/#revive for supported rules
|
||||
rules:
|
||||
- name: receiver-naming
|
||||
severity: warning
|
||||
disabled: false
|
||||
exclude:
|
||||
- ''
|
||||
exclusions:
|
||||
generated: lax
|
||||
presets:
|
||||
- comments
|
||||
- common-false-positives
|
||||
- legacy
|
||||
- std-error-handling
|
||||
rules:
|
||||
- name: receiver-naming
|
||||
severity: warning
|
||||
disabled: false
|
||||
exclude: [""]
|
||||
|
||||
issues:
|
||||
# default is true. Enables skipping of directories:
|
||||
# vendor$, third_party$, testdata$, examples$, Godeps$, builtin$
|
||||
exclude-dirs-use-default: true
|
||||
exclude-files:
|
||||
- core/genesis_alloc.go
|
||||
exclude-rules:
|
||||
- path: crypto/bn256/cloudflare/optate.go
|
||||
linters:
|
||||
- deadcode
|
||||
- staticcheck
|
||||
- path: crypto/bn256/
|
||||
linters:
|
||||
- revive
|
||||
- path: cmd/utils/flags.go
|
||||
text: "SA1019: cfg.TxLookupLimit is deprecated: use 'TransactionHistory' instead."
|
||||
- path: cmd/utils/flags.go
|
||||
text: "SA1019: ethconfig.Defaults.TxLookupLimit is deprecated: use 'TransactionHistory' instead."
|
||||
- path: internal/build/pgp.go
|
||||
text: 'SA1019: "golang.org/x/crypto/openpgp" is deprecated: this package is unmaintained except for security fixes.'
|
||||
- path: core/vm/contracts.go
|
||||
text: 'SA1019: "golang.org/x/crypto/ripemd160" is deprecated: RIPEMD-160 is a legacy hash and should not be used for new applications.'
|
||||
exclude:
|
||||
- 'SA1019: event.TypeMux is deprecated: use Feed'
|
||||
- 'SA1019: strings.Title is deprecated'
|
||||
- 'SA1019: strings.Title has been deprecated since Go 1.18 and an alternative has been available since Go 1.0: The rule Title uses for word boundaries does not handle Unicode punctuation properly. Use golang.org/x/text/cases instead.'
|
||||
- 'SA1029: should not use built-in type string as key for value'
|
||||
- linters:
|
||||
- deadcode
|
||||
- staticcheck
|
||||
path: crypto/bn256/cloudflare/optate.go
|
||||
- linters:
|
||||
- revive
|
||||
path: crypto/bn256/
|
||||
- path: cmd/utils/flags.go
|
||||
text: "SA1019: cfg.TxLookupLimit is deprecated: use 'TransactionHistory' instead."
|
||||
- path: cmd/utils/flags.go
|
||||
text: "SA1019: ethconfig.Defaults.TxLookupLimit is deprecated: use 'TransactionHistory' instead."
|
||||
- path: internal/build/pgp.go
|
||||
text: 'SA1019: "golang.org/x/crypto/openpgp" is deprecated: this package is unmaintained except for security fixes.'
|
||||
- path: core/vm/contracts.go
|
||||
text: 'SA1019: "golang.org/x/crypto/ripemd160" is deprecated: RIPEMD-160 is a legacy hash and should not be used for new applications.'
|
||||
- path: (.+)\.go$
|
||||
text: 'SA1019: event.TypeMux is deprecated: use Feed'
|
||||
- path: (.+)\.go$
|
||||
text: 'SA1019: strings.Title is deprecated'
|
||||
- path: (.+)\.go$
|
||||
text: 'SA1019: strings.Title has been deprecated since Go 1.18 and an alternative has been available since Go 1.0: The rule Title uses for word boundaries does not handle Unicode punctuation properly. Use golang.org/x/text/cases instead.'
|
||||
- path: (.+)\.go$
|
||||
text: 'SA1029: should not use built-in type string as key for value'
|
||||
paths:
|
||||
- core/genesis_alloc.go
|
||||
- third_party$
|
||||
- builtin$
|
||||
- examples$
|
||||
formatters:
|
||||
enable:
|
||||
- goimports
|
||||
settings:
|
||||
gofmt:
|
||||
simplify: true
|
||||
exclusions:
|
||||
generated: lax
|
||||
paths:
|
||||
- core/genesis_alloc.go
|
||||
- third_party$
|
||||
- builtin$
|
||||
- examples$
|
||||
|
|
|
|||
7
.mailmap
7
.mailmap
|
|
@ -50,6 +50,10 @@ Boqin Qin <bobbqqin@bupt.edu.cn> <Bobbqqin@gmail.com>
|
|||
|
||||
Casey Detrio <cdetrio@gmail.com>
|
||||
|
||||
Charlotte <tqpcharlie@proton.me>
|
||||
Charlotte <tqpcharlie@proton.me> <Zachinquarantine@protonmail.com>
|
||||
Charlotte <tqpcharlie@proton.me> <zachinquarantine@yahoo.com>
|
||||
|
||||
Cheng Li <lob4tt@gmail.com>
|
||||
|
||||
Chris Ziogas <ziogaschr@gmail.com>
|
||||
|
|
@ -301,9 +305,6 @@ Yohann Léon <sybiload@gmail.com>
|
|||
yzb <335357057@qq.com>
|
||||
yzb <335357057@qq.com> <flyingyzb@gmail.com>
|
||||
|
||||
Zachinquarantine <Zachinquarantine@protonmail.com>
|
||||
Zachinquarantine <Zachinquarantine@protonmail.com> <zachinquarantine@yahoo.com>
|
||||
|
||||
Ziyuan Zhong <zzy.albert@163.com>
|
||||
|
||||
Zsolt Felföldi <zsfelfoldi@gmail.com>
|
||||
|
|
|
|||
23
.travis.yml
23
.travis.yml
|
|
@ -2,12 +2,6 @@ language: go
|
|||
go_import_path: github.com/ethereum/go-ethereum
|
||||
sudo: false
|
||||
jobs:
|
||||
allow_failures:
|
||||
- stage: build
|
||||
os: osx
|
||||
env:
|
||||
- azure-osx
|
||||
|
||||
include:
|
||||
# This builder create and push the Docker images for all architectures
|
||||
- stage: build
|
||||
|
|
@ -62,23 +56,6 @@ jobs:
|
|||
- go run build/ci.go install -dlgo -arch arm64 -cc aarch64-linux-gnu-gcc
|
||||
- go run build/ci.go archive -arch arm64 -type tar -signer LINUX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds
|
||||
|
||||
# This builder does the OSX Azure uploads
|
||||
- stage: build
|
||||
if: type = push
|
||||
os: osx
|
||||
osx_image: xcode14.2
|
||||
go: 1.23.1 # See https://github.com/ethereum/go-ethereum/pull/30478
|
||||
env:
|
||||
- azure-osx
|
||||
git:
|
||||
submodules: false # avoid cloning ethereum/tests
|
||||
script:
|
||||
- ln -sf /Users/travis/gopath/bin/go1.23.1 /usr/local/bin/go # Work around travis go-setup bug
|
||||
- go run build/ci.go install -dlgo
|
||||
- go run build/ci.go archive -type tar -signer OSX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds
|
||||
- go run build/ci.go install -dlgo -arch arm64
|
||||
- go run build/ci.go archive -arch arm64 -type tar -signer OSX_SIGNING_KEY -signify SIGNIFY_KEY -upload gethstore/builds
|
||||
|
||||
# These builders run the tests
|
||||
- stage: build
|
||||
if: type = push
|
||||
|
|
|
|||
2
AUTHORS
2
AUTHORS
|
|
@ -123,6 +123,7 @@ Ceyhun Onur <ceyhun.onur@avalabs.org>
|
|||
chabashilah <doumodoumo@gmail.com>
|
||||
changhong <changhong.yu@shanbay.com>
|
||||
Charles Cooper <cooper.charles.m@gmail.com>
|
||||
Charlotte <tqpcharlie@proton.me>
|
||||
Chase Wright <mysticryuujin@gmail.com>
|
||||
Chawin Aiemvaravutigul <nick41746@hotmail.com>
|
||||
Chen Quan <terasum@163.com>
|
||||
|
|
@ -839,7 +840,6 @@ ywzqwwt <39263032+ywzqwwt@users.noreply.github.com>
|
|||
yzb <335357057@qq.com>
|
||||
zaccoding <zaccoding725@gmail.com>
|
||||
Zach <zach.ramsay@gmail.com>
|
||||
Zachinquarantine <Zachinquarantine@protonmail.com>
|
||||
zah <zahary@gmail.com>
|
||||
Zahoor Mohamed <zahoor@zahoor.in>
|
||||
Zak Cole <zak@beattiecole.com>
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ accessible from the outside.
|
|||
|
||||
As a developer, sooner rather than later you'll want to start interacting with `geth` and the
|
||||
Ethereum network via your own programs and not manually through the console. To aid
|
||||
this, `geth` has built-in support for a JSON-RPC based APIs ([standard APIs](https://ethereum.github.io/execution-apis/api-documentation/)
|
||||
this, `geth` has built-in support for a JSON-RPC based APIs ([standard APIs](https://ethereum.org/en/developers/docs/apis/json-rpc/)
|
||||
and [`geth` specific APIs](https://geth.ethereum.org/docs/interacting-with-geth/rpc)).
|
||||
These can be exposed via HTTP, WebSockets and IPC (UNIX sockets on UNIX based
|
||||
platforms, and named pipes on Windows).
|
||||
|
|
|
|||
|
|
@ -14,11 +14,11 @@
|
|||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Package bind generates Ethereum contract Go bindings.
|
||||
// Package abigen generates Ethereum contract Go bindings.
|
||||
//
|
||||
// Detailed usage document and tutorial available on the go-ethereum Wiki page:
|
||||
// https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts
|
||||
package bind
|
||||
// https://geth.ethereum.org/docs/developers/dapp-developer/native-bindings
|
||||
package abigen
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
|
@ -33,13 +33,6 @@ import (
|
|||
"github.com/ethereum/go-ethereum/log"
|
||||
)
|
||||
|
||||
// Lang is a target programming language selector to generate bindings for.
|
||||
type Lang int
|
||||
|
||||
const (
|
||||
LangGo Lang = iota
|
||||
)
|
||||
|
||||
func isKeyWord(arg string) bool {
|
||||
switch arg {
|
||||
case "break":
|
||||
|
|
@ -81,7 +74,7 @@ func isKeyWord(arg string) bool {
|
|||
// to be used as is in client code, but rather as an intermediate struct which
|
||||
// enforces compile time type safety and naming convention as opposed to having to
|
||||
// manually maintain hard coded strings that break on runtime.
|
||||
func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, lang Lang, libs map[string]string, aliases map[string]string) (string, error) {
|
||||
func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, libs map[string]string, aliases map[string]string) (string, error) {
|
||||
var (
|
||||
// contracts is the map of each individual contract requested binding
|
||||
contracts = make(map[string]*tmplContract)
|
||||
|
|
@ -125,14 +118,14 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
|
||||
for _, input := range evmABI.Constructor.Inputs {
|
||||
if hasStruct(input.Type) {
|
||||
bindStructType[lang](input.Type, structs)
|
||||
bindStructType(input.Type, structs)
|
||||
}
|
||||
}
|
||||
|
||||
for _, original := range evmABI.Methods {
|
||||
// Normalize the method for capital cases and non-anonymous inputs/outputs
|
||||
normalized := original
|
||||
normalizedName := methodNormalizer[lang](alias(aliases, original.Name))
|
||||
normalizedName := abi.ToCamelCase(alias(aliases, original.Name))
|
||||
// Ensure there is no duplicated identifier
|
||||
var identifiers = callIdentifiers
|
||||
if !original.IsConstant() {
|
||||
|
|
@ -159,17 +152,17 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j)
|
||||
}
|
||||
if hasStruct(input.Type) {
|
||||
bindStructType[lang](input.Type, structs)
|
||||
bindStructType(input.Type, structs)
|
||||
}
|
||||
}
|
||||
normalized.Outputs = make([]abi.Argument, len(original.Outputs))
|
||||
copy(normalized.Outputs, original.Outputs)
|
||||
for j, output := range normalized.Outputs {
|
||||
if output.Name != "" {
|
||||
normalized.Outputs[j].Name = capitalise(output.Name)
|
||||
normalized.Outputs[j].Name = abi.ToCamelCase(output.Name)
|
||||
}
|
||||
if hasStruct(output.Type) {
|
||||
bindStructType[lang](output.Type, structs)
|
||||
bindStructType(output.Type, structs)
|
||||
}
|
||||
}
|
||||
// Append the methods to the call or transact lists
|
||||
|
|
@ -188,7 +181,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
normalized := original
|
||||
|
||||
// Ensure there is no duplicated identifier
|
||||
normalizedName := methodNormalizer[lang](alias(aliases, original.Name))
|
||||
normalizedName := abi.ToCamelCase(alias(aliases, original.Name))
|
||||
// Name shouldn't start with a digit. It will make the generated code invalid.
|
||||
if len(normalizedName) > 0 && unicode.IsDigit(rune(normalizedName[0])) {
|
||||
normalizedName = fmt.Sprintf("E%s", normalizedName)
|
||||
|
|
@ -213,14 +206,14 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
// Event is a bit special, we need to define event struct in binding,
|
||||
// ensure there is no camel-case-style name conflict.
|
||||
for index := 0; ; index++ {
|
||||
if !used[capitalise(normalized.Inputs[j].Name)] {
|
||||
used[capitalise(normalized.Inputs[j].Name)] = true
|
||||
if !used[abi.ToCamelCase(normalized.Inputs[j].Name)] {
|
||||
used[abi.ToCamelCase(normalized.Inputs[j].Name)] = true
|
||||
break
|
||||
}
|
||||
normalized.Inputs[j].Name = fmt.Sprintf("%s%d", normalized.Inputs[j].Name, index)
|
||||
}
|
||||
if hasStruct(input.Type) {
|
||||
bindStructType[lang](input.Type, structs)
|
||||
bindStructType(input.Type, structs)
|
||||
}
|
||||
}
|
||||
// Append the event to the accumulator list
|
||||
|
|
@ -233,8 +226,9 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
if evmABI.HasReceive() {
|
||||
receive = &tmplMethod{Original: evmABI.Receive}
|
||||
}
|
||||
|
||||
contracts[types[i]] = &tmplContract{
|
||||
Type: capitalise(types[i]),
|
||||
Type: abi.ToCamelCase(types[i]),
|
||||
InputABI: strings.ReplaceAll(strippedABI, "\"", "\\\""),
|
||||
InputBin: strings.TrimPrefix(strings.TrimSpace(bytecodes[i]), "0x"),
|
||||
Constructor: evmABI.Constructor,
|
||||
|
|
@ -245,6 +239,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
Events: events,
|
||||
Libraries: make(map[string]string),
|
||||
}
|
||||
|
||||
// Function 4-byte signatures are stored in the same sequence
|
||||
// as types, if available.
|
||||
if len(fsigs) > i {
|
||||
|
|
@ -270,6 +265,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
_, ok := isLib[types[i]]
|
||||
contracts[types[i]].Library = ok
|
||||
}
|
||||
|
||||
// Generate the contract template data content and render it
|
||||
data := &tmplData{
|
||||
Package: pkg,
|
||||
|
|
@ -280,36 +276,25 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
|||
buffer := new(bytes.Buffer)
|
||||
|
||||
funcs := map[string]interface{}{
|
||||
"bindtype": bindType[lang],
|
||||
"bindtopictype": bindTopicType[lang],
|
||||
"namedtype": namedType[lang],
|
||||
"capitalise": capitalise,
|
||||
"bindtype": bindType,
|
||||
"bindtopictype": bindTopicType,
|
||||
"capitalise": abi.ToCamelCase,
|
||||
"decapitalise": decapitalise,
|
||||
}
|
||||
tmpl := template.Must(template.New("").Funcs(funcs).Parse(tmplSource[lang]))
|
||||
tmpl := template.Must(template.New("").Funcs(funcs).Parse(tmplSource))
|
||||
if err := tmpl.Execute(buffer, data); err != nil {
|
||||
return "", err
|
||||
}
|
||||
// For Go bindings pass the code through gofmt to clean it up
|
||||
if lang == LangGo {
|
||||
code, err := format.Source(buffer.Bytes())
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("%v\n%s", err, buffer)
|
||||
}
|
||||
return string(code), nil
|
||||
// Pass the code through gofmt to clean it up
|
||||
code, err := format.Source(buffer.Bytes())
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("%v\n%s", err, buffer)
|
||||
}
|
||||
// For all others just return as is for now
|
||||
return buffer.String(), nil
|
||||
return string(code), nil
|
||||
}
|
||||
|
||||
// bindType is a set of type binders that convert Solidity types to some supported
|
||||
// programming language types.
|
||||
var bindType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{
|
||||
LangGo: bindTypeGo,
|
||||
}
|
||||
|
||||
// bindBasicTypeGo converts basic solidity types(except array, slice and tuple) to Go ones.
|
||||
func bindBasicTypeGo(kind abi.Type) string {
|
||||
// bindBasicType converts basic solidity types(except array, slice and tuple) to Go ones.
|
||||
func bindBasicType(kind abi.Type) string {
|
||||
switch kind.T {
|
||||
case abi.AddressTy:
|
||||
return "common.Address"
|
||||
|
|
@ -332,32 +317,26 @@ func bindBasicTypeGo(kind abi.Type) string {
|
|||
}
|
||||
}
|
||||
|
||||
// bindTypeGo converts solidity types to Go ones. Since there is no clear mapping
|
||||
// bindType converts solidity types to Go ones. Since there is no clear mapping
|
||||
// from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly
|
||||
// mapped will use an upscaled type (e.g. BigDecimal).
|
||||
func bindTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||
func bindType(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||
switch kind.T {
|
||||
case abi.TupleTy:
|
||||
return structs[kind.TupleRawName+kind.String()].Name
|
||||
case abi.ArrayTy:
|
||||
return fmt.Sprintf("[%d]", kind.Size) + bindTypeGo(*kind.Elem, structs)
|
||||
return fmt.Sprintf("[%d]", kind.Size) + bindType(*kind.Elem, structs)
|
||||
case abi.SliceTy:
|
||||
return "[]" + bindTypeGo(*kind.Elem, structs)
|
||||
return "[]" + bindType(*kind.Elem, structs)
|
||||
default:
|
||||
return bindBasicTypeGo(kind)
|
||||
return bindBasicType(kind)
|
||||
}
|
||||
}
|
||||
|
||||
// bindTopicType is a set of type binders that convert Solidity types to some
|
||||
// supported programming language topic types.
|
||||
var bindTopicType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{
|
||||
LangGo: bindTopicTypeGo,
|
||||
}
|
||||
|
||||
// bindTopicTypeGo converts a Solidity topic type to a Go one. It is almost the same
|
||||
// bindTopicType converts a Solidity topic type to a Go one. It is almost the same
|
||||
// functionality as for simple types, but dynamic types get converted to hashes.
|
||||
func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||
bound := bindTypeGo(kind, structs)
|
||||
func bindTopicType(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||
bound := bindType(kind, structs)
|
||||
|
||||
// todo(rjl493456442) according solidity documentation, indexed event
|
||||
// parameters that are not value types i.e. arrays and structs are not
|
||||
|
|
@ -371,16 +350,10 @@ func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
|||
return bound
|
||||
}
|
||||
|
||||
// bindStructType is a set of type binders that convert Solidity tuple types to some supported
|
||||
// programming language struct definition.
|
||||
var bindStructType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{
|
||||
LangGo: bindStructTypeGo,
|
||||
}
|
||||
|
||||
// bindStructTypeGo converts a Solidity tuple type to a Go one and records the mapping
|
||||
// in the given map.
|
||||
// Notably, this function will resolve and record nested struct recursively.
|
||||
func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||
// bindStructType converts a Solidity tuple type to a Go one and records the mapping
|
||||
// in the given map. Notably, this function will resolve and record nested struct
|
||||
// recursively.
|
||||
func bindStructType(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||
switch kind.T {
|
||||
case abi.TupleTy:
|
||||
// We compose a raw struct name and a canonical parameter expression
|
||||
|
|
@ -398,16 +371,20 @@ func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
|||
fields []*tmplField
|
||||
)
|
||||
for i, elem := range kind.TupleElems {
|
||||
name := capitalise(kind.TupleRawNames[i])
|
||||
name := abi.ToCamelCase(kind.TupleRawNames[i])
|
||||
name = abi.ResolveNameConflict(name, func(s string) bool { return names[s] })
|
||||
names[name] = true
|
||||
fields = append(fields, &tmplField{Type: bindStructTypeGo(*elem, structs), Name: name, SolKind: *elem})
|
||||
fields = append(fields, &tmplField{
|
||||
Type: bindStructType(*elem, structs),
|
||||
Name: name,
|
||||
SolKind: *elem,
|
||||
})
|
||||
}
|
||||
name := kind.TupleRawName
|
||||
if name == "" {
|
||||
name = fmt.Sprintf("Struct%d", len(structs))
|
||||
}
|
||||
name = capitalise(name)
|
||||
name = abi.ToCamelCase(name)
|
||||
|
||||
structs[id] = &tmplStruct{
|
||||
Name: name,
|
||||
|
|
@ -415,20 +392,14 @@ func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
|||
}
|
||||
return name
|
||||
case abi.ArrayTy:
|
||||
return fmt.Sprintf("[%d]", kind.Size) + bindStructTypeGo(*kind.Elem, structs)
|
||||
return fmt.Sprintf("[%d]", kind.Size) + bindStructType(*kind.Elem, structs)
|
||||
case abi.SliceTy:
|
||||
return "[]" + bindStructTypeGo(*kind.Elem, structs)
|
||||
return "[]" + bindStructType(*kind.Elem, structs)
|
||||
default:
|
||||
return bindBasicTypeGo(kind)
|
||||
return bindBasicType(kind)
|
||||
}
|
||||
}
|
||||
|
||||
// namedType is a set of functions that transform language specific types to
|
||||
// named versions that may be used inside method names.
|
||||
var namedType = map[Lang]func(string, abi.Type) string{
|
||||
LangGo: func(string, abi.Type) string { panic("this shouldn't be needed") },
|
||||
}
|
||||
|
||||
// alias returns an alias of the given string based on the aliasing rules
|
||||
// or returns itself if no rule is matched.
|
||||
func alias(aliases map[string]string, n string) string {
|
||||
|
|
@ -438,21 +409,11 @@ func alias(aliases map[string]string, n string) string {
|
|||
return n
|
||||
}
|
||||
|
||||
// methodNormalizer is a name transformer that modifies Solidity method names to
|
||||
// conform to target language naming conventions.
|
||||
var methodNormalizer = map[Lang]func(string) string{
|
||||
LangGo: abi.ToCamelCase,
|
||||
}
|
||||
|
||||
// capitalise makes a camel-case string which starts with an upper case character.
|
||||
var capitalise = abi.ToCamelCase
|
||||
|
||||
// decapitalise makes a camel-case string which starts with a lower case character.
|
||||
func decapitalise(input string) string {
|
||||
if len(input) == 0 {
|
||||
return input
|
||||
}
|
||||
|
||||
goForm := abi.ToCamelCase(input)
|
||||
return strings.ToLower(goForm[:1]) + goForm[1:]
|
||||
}
|
||||
|
|
@ -471,7 +432,7 @@ func structured(args abi.Arguments) bool {
|
|||
}
|
||||
// If the field name is empty when normalized or collides (var, Var, _var, _Var),
|
||||
// we can't organize into a struct
|
||||
field := capitalise(out.Name)
|
||||
field := abi.ToCamelCase(out.Name)
|
||||
if field == "" || exists[field] {
|
||||
return false
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind
|
||||
package abigen
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
|
@ -541,7 +541,7 @@ var bindTests = []struct {
|
|||
struct A {
|
||||
bytes32 B;
|
||||
}
|
||||
|
||||
|
||||
function F() public view returns (A[] memory a, uint256[] memory c, bool[] memory d) {
|
||||
A[] memory a = new A[](2);
|
||||
a[0].B = bytes32(uint256(1234) << 96);
|
||||
|
|
@ -549,7 +549,7 @@ var bindTests = []struct {
|
|||
bool[] memory d;
|
||||
return (a, c, d);
|
||||
}
|
||||
|
||||
|
||||
function G() public view returns (A[] memory a) {
|
||||
A[] memory a = new A[](2);
|
||||
a[0].B = bytes32(uint256(1234) << 96);
|
||||
|
|
@ -571,10 +571,10 @@ var bindTests = []struct {
|
|||
// Generate a new random account and a funded simulator
|
||||
key, _ := crypto.GenerateKey()
|
||||
auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
|
||||
|
||||
|
||||
sim := backends.NewSimulatedBackend(types.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000000000)}}, 10000000)
|
||||
defer sim.Close()
|
||||
|
||||
|
||||
// Deploy a structs method invoker contract and execute its default method
|
||||
_, _, structs, err := DeployStructs(auth, sim)
|
||||
if err != nil {
|
||||
|
|
@ -939,6 +939,7 @@ var bindTests = []struct {
|
|||
if _, err := eventer.RaiseSimpleEvent(auth, common.Address{byte(j)}, [32]byte{byte(j)}, true, big.NewInt(int64(10*i+j))); err != nil {
|
||||
t.Fatalf("block %d, event %d: raise failed: %v", i, j, err)
|
||||
}
|
||||
time.Sleep(time.Millisecond * 200)
|
||||
}
|
||||
sim.Commit()
|
||||
}
|
||||
|
|
@ -1495,7 +1496,7 @@ var bindTests = []struct {
|
|||
if n != 3 {
|
||||
t.Fatalf("Invalid bar0 event")
|
||||
}
|
||||
case <-time.NewTimer(3 * time.Second).C:
|
||||
case <-time.NewTimer(10 * time.Second).C:
|
||||
t.Fatalf("Wait bar0 event timeout")
|
||||
}
|
||||
|
||||
|
|
@ -1506,7 +1507,7 @@ var bindTests = []struct {
|
|||
if n != 1 {
|
||||
t.Fatalf("Invalid bar event")
|
||||
}
|
||||
case <-time.NewTimer(3 * time.Second).C:
|
||||
case <-time.NewTimer(10 * time.Second).C:
|
||||
t.Fatalf("Wait bar event timeout")
|
||||
}
|
||||
close(stopCh)
|
||||
|
|
@ -1701,13 +1702,13 @@ var bindTests = []struct {
|
|||
`NewFallbacks`,
|
||||
`
|
||||
pragma solidity >=0.6.0 <0.7.0;
|
||||
|
||||
|
||||
contract NewFallbacks {
|
||||
event Fallback(bytes data);
|
||||
fallback() external {
|
||||
emit Fallback(msg.data);
|
||||
}
|
||||
|
||||
|
||||
event Received(address addr, uint value);
|
||||
receive() external payable {
|
||||
emit Received(msg.sender, msg.value);
|
||||
|
|
@ -1719,7 +1720,7 @@ var bindTests = []struct {
|
|||
`
|
||||
"bytes"
|
||||
"math/big"
|
||||
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
|
|
@ -1728,22 +1729,22 @@ var bindTests = []struct {
|
|||
`
|
||||
key, _ := crypto.GenerateKey()
|
||||
addr := crypto.PubkeyToAddress(key.PublicKey)
|
||||
|
||||
|
||||
sim := backends.NewSimulatedBackend(types.GenesisAlloc{addr: {Balance: big.NewInt(10000000000000000)}}, 1000000)
|
||||
defer sim.Close()
|
||||
|
||||
|
||||
opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
|
||||
_, _, c, err := DeployNewFallbacks(opts, sim)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to deploy contract: %v", err)
|
||||
}
|
||||
sim.Commit()
|
||||
|
||||
|
||||
// Test receive function
|
||||
opts.Value = big.NewInt(100)
|
||||
c.Receive(opts)
|
||||
sim.Commit()
|
||||
|
||||
|
||||
var gotEvent bool
|
||||
iter, _ := c.FilterReceived(nil)
|
||||
defer iter.Close()
|
||||
|
|
@ -1760,14 +1761,14 @@ var bindTests = []struct {
|
|||
if !gotEvent {
|
||||
t.Fatal("Expect to receive event emitted by receive")
|
||||
}
|
||||
|
||||
|
||||
// Test fallback function
|
||||
gotEvent = false
|
||||
opts.Value = nil
|
||||
calldata := []byte{0x01, 0x02, 0x03}
|
||||
c.Fallback(opts, calldata)
|
||||
sim.Commit()
|
||||
|
||||
|
||||
iter2, _ := c.FilterFallback(nil)
|
||||
defer iter2.Close()
|
||||
for iter2.Next() {
|
||||
|
|
@ -1806,7 +1807,9 @@ var bindTests = []struct {
|
|||
[]string{"608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806324ec1d3f14602d575b600080fd5b60336035565b005b7fb4b2ff75e30cb4317eaae16dd8a187dd89978df17565104caa6c2797caae27d460405180604001604052806001815260200160028152506040516078919060ba565b60405180910390a1565b6040820160008201516096600085018260ad565b50602082015160a7602085018260ad565b50505050565b60b48160d3565b82525050565b600060408201905060cd60008301846082565b92915050565b600081905091905056fea26469706673582212208823628796125bf9941ce4eda18da1be3cf2931b231708ab848e1bd7151c0c9a64736f6c63430008070033"},
|
||||
[]string{`[{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"indexed":false,"internalType":"struct Test.MyStruct","name":"s","type":"tuple"}],"name":"StructEvent","type":"event"},{"inputs":[],"name":"TestEvent","outputs":[],"stateMutability":"nonpayable","type":"function"}]`},
|
||||
`
|
||||
"context"
|
||||
"math/big"
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||
|
|
@ -1828,12 +1831,23 @@ var bindTests = []struct {
|
|||
}
|
||||
sim.Commit()
|
||||
|
||||
_, err = d.TestEvent(user)
|
||||
tx, err := d.TestEvent(user)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to call contract %v", err)
|
||||
}
|
||||
sim.Commit()
|
||||
|
||||
// Wait for the transaction to be mined
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
||||
defer cancel()
|
||||
receipt, err := bind.WaitMined(ctx, sim, tx)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to wait for tx to be mined: %v", err)
|
||||
}
|
||||
if receipt.Status != types.ReceiptStatusSuccessful {
|
||||
t.Fatal("Transaction failed")
|
||||
}
|
||||
|
||||
it, err := d.FilterStructEvent(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to filter contract event %v", err)
|
||||
|
|
@ -1862,7 +1876,7 @@ var bindTests = []struct {
|
|||
`NewErrors`,
|
||||
`
|
||||
pragma solidity >0.8.4;
|
||||
|
||||
|
||||
contract NewErrors {
|
||||
error MyError(uint256);
|
||||
error MyError1(uint256);
|
||||
|
|
@ -1878,7 +1892,7 @@ var bindTests = []struct {
|
|||
`
|
||||
"context"
|
||||
"math/big"
|
||||
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
|
|
@ -1892,7 +1906,7 @@ var bindTests = []struct {
|
|||
sim = backends.NewSimulatedBackend(types.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, ethconfig.Defaults.Miner.GasCeil)
|
||||
)
|
||||
defer sim.Close()
|
||||
|
||||
|
||||
_, tx, contract, err := DeployNewErrors(user, sim)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
@ -1917,12 +1931,12 @@ var bindTests = []struct {
|
|||
name: `ConstructorWithStructParam`,
|
||||
contract: `
|
||||
pragma solidity >=0.8.0 <0.9.0;
|
||||
|
||||
|
||||
contract ConstructorWithStructParam {
|
||||
struct StructType {
|
||||
uint256 field;
|
||||
}
|
||||
|
||||
|
||||
constructor(StructType memory st) {}
|
||||
}
|
||||
`,
|
||||
|
|
@ -1951,7 +1965,7 @@ var bindTests = []struct {
|
|||
t.Fatalf("DeployConstructorWithStructParam() got err %v; want nil err", err)
|
||||
}
|
||||
sim.Commit()
|
||||
|
||||
|
||||
if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil {
|
||||
t.Logf("Deployment tx: %+v", tx)
|
||||
t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err)
|
||||
|
|
@ -2000,7 +2014,7 @@ var bindTests = []struct {
|
|||
t.Fatalf("DeployNameConflict() got err %v; want nil err", err)
|
||||
}
|
||||
sim.Commit()
|
||||
|
||||
|
||||
if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil {
|
||||
t.Logf("Deployment tx: %+v", tx)
|
||||
t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err)
|
||||
|
|
@ -2072,20 +2086,22 @@ var bindTests = []struct {
|
|||
|
||||
// Tests that packages generated by the binder can be successfully compiled and
|
||||
// the requested tester run against it.
|
||||
func TestGolangBindings(t *testing.T) {
|
||||
func TestBindings(t *testing.T) {
|
||||
t.Parallel()
|
||||
// Skip the test if no Go command can be found
|
||||
gocmd := runtime.GOROOT() + "/bin/go"
|
||||
if !common.FileExist(gocmd) {
|
||||
t.Skip("go sdk not found for testing")
|
||||
}
|
||||
// Create a temporary workspace for the test suite
|
||||
ws := t.TempDir()
|
||||
|
||||
pkg := filepath.Join(ws, "bindtest")
|
||||
// Create a temporary workspace for the test suite
|
||||
path := t.TempDir()
|
||||
pkg := filepath.Join(path, "bindtest")
|
||||
if err := os.MkdirAll(pkg, 0700); err != nil {
|
||||
t.Fatalf("failed to create package: %v", err)
|
||||
}
|
||||
t.Log("tmpdir", pkg)
|
||||
|
||||
// Generate the test suite for all the contracts
|
||||
for i, tt := range bindTests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
|
@ -2096,7 +2112,7 @@ func TestGolangBindings(t *testing.T) {
|
|||
types = []string{tt.name}
|
||||
}
|
||||
// Generate the binding and create a Go source file in the workspace
|
||||
bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases)
|
||||
bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", tt.libs, tt.aliases)
|
||||
if err != nil {
|
||||
t.Fatalf("test %d: failed to generate binding: %v", i, err)
|
||||
}
|
||||
373
accounts/abi/abigen/bindv2.go
Normal file
373
accounts/abi/abigen/bindv2.go
Normal file
|
|
@ -0,0 +1,373 @@
|
|||
// Copyright 2024 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package abigen
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"go/format"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"slices"
|
||||
"sort"
|
||||
"strings"
|
||||
"text/template"
|
||||
"unicode"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
)
|
||||
|
||||
// underlyingBindType returns a string representation of the Go type
|
||||
// that corresponds to the given ABI type, panicking if it is not a
|
||||
// pointer.
|
||||
func underlyingBindType(typ abi.Type) string {
|
||||
goType := typ.GetType()
|
||||
if goType.Kind() != reflect.Pointer {
|
||||
panic("trying to retrieve underlying bind type of non-pointer type.")
|
||||
}
|
||||
return goType.Elem().String()
|
||||
}
|
||||
|
||||
// isPointerType returns true if the underlying type is a pointer.
|
||||
func isPointerType(typ abi.Type) bool {
|
||||
return typ.GetType().Kind() == reflect.Pointer
|
||||
}
|
||||
|
||||
// OLD:
|
||||
// binder is used during the conversion of an ABI definition into Go bindings
|
||||
// (as part of the execution of BindV2). In contrast to contractBinder, binder
|
||||
// contains binding-generation-state that is shared between contracts:
|
||||
//
|
||||
// a global struct map of structs emitted by all contracts is tracked and expanded.
|
||||
// Structs generated in the bindings are not prefixed with the contract name
|
||||
// that uses them (to keep the generated bindings less verbose).
|
||||
//
|
||||
// This contrasts to other per-contract state (constructor/method/event/error,
|
||||
// pack/unpack methods) which are guaranteed to be unique because of their
|
||||
// association with the uniquely-named owning contract (whether prefixed in the
|
||||
// generated symbol name, or as a member method on a contract struct).
|
||||
//
|
||||
// In addition, binder contains the input alias map. In BindV2, a binder is
|
||||
// instantiated to produce a set of tmplContractV2 and tmplStruct objects from
|
||||
// the provided ABI definition. These are used as part of the input to rendering
|
||||
// the binding template.
|
||||
|
||||
// NEW:
|
||||
// binder is used to translate an ABI definition into a set of data-structures
|
||||
// that will be used to render the template and produce Go bindings. This can
|
||||
// be thought of as the "backend" that sanitizes the ABI definition to a format
|
||||
// that can be directly rendered with minimal complexity in the template.
|
||||
//
|
||||
// The input data to the template rendering consists of:
|
||||
// - the set of all contracts requested for binding, each containing
|
||||
// methods/events/errors to emit pack/unpack methods for.
|
||||
// - the set of structures defined by the contracts, and created
|
||||
// as part of the binding process.
|
||||
type binder struct {
|
||||
// contracts is the map of each individual contract requested binding.
|
||||
// It is keyed by the contract name provided in the ABI definition.
|
||||
contracts map[string]*tmplContractV2
|
||||
|
||||
// structs is the map of all emitted structs from contracts being bound.
|
||||
// it is keyed by a unique identifier generated from the name of the owning contract
|
||||
// and the solidity type signature of the struct
|
||||
structs map[string]*tmplStruct
|
||||
|
||||
// aliases is a map for renaming instances of named events/functions/errors
|
||||
// to specified values. it is keyed by source symbol name, and values are
|
||||
// what the replacement name should be.
|
||||
aliases map[string]string
|
||||
}
|
||||
|
||||
// BindStructType registers the type to be emitted as a struct in the
|
||||
// bindings.
|
||||
func (b *binder) BindStructType(typ abi.Type) {
|
||||
bindStructType(typ, b.structs)
|
||||
}
|
||||
|
||||
// contractBinder holds state for binding of a single contract. It is a type
|
||||
// registry for compiling maps of identifiers that will be emitted in generated
|
||||
// bindings.
|
||||
type contractBinder struct {
|
||||
binder *binder
|
||||
|
||||
// all maps are keyed by the original (non-normalized) name of the symbol in question
|
||||
// from the provided ABI definition.
|
||||
calls map[string]*tmplMethod
|
||||
events map[string]*tmplEvent
|
||||
errors map[string]*tmplError
|
||||
callIdentifiers map[string]bool
|
||||
eventIdentifiers map[string]bool
|
||||
errorIdentifiers map[string]bool
|
||||
}
|
||||
|
||||
func newContractBinder(binder *binder) *contractBinder {
|
||||
return &contractBinder{
|
||||
binder,
|
||||
make(map[string]*tmplMethod),
|
||||
make(map[string]*tmplEvent),
|
||||
make(map[string]*tmplError),
|
||||
make(map[string]bool),
|
||||
make(map[string]bool),
|
||||
make(map[string]bool),
|
||||
}
|
||||
}
|
||||
|
||||
// registerIdentifier applies alias renaming, name normalization (conversion
|
||||
// from snake to camel-case), and registers the normalized name in the specified identifier map.
|
||||
// It returns an error if the normalized name already exists in the map.
|
||||
func (cb *contractBinder) registerIdentifier(identifiers map[string]bool, original string) (normalized string, err error) {
|
||||
normalized = abi.ToCamelCase(alias(cb.binder.aliases, original))
|
||||
|
||||
// Name shouldn't start with a digit. It will make the generated code invalid.
|
||||
if len(normalized) > 0 && unicode.IsDigit(rune(normalized[0])) {
|
||||
normalized = fmt.Sprintf("E%s", normalized)
|
||||
normalized = abi.ResolveNameConflict(normalized, func(name string) bool {
|
||||
_, ok := identifiers[name]
|
||||
return ok
|
||||
})
|
||||
}
|
||||
if _, ok := identifiers[normalized]; ok {
|
||||
return "", fmt.Errorf("duplicate symbol '%s'", normalized)
|
||||
}
|
||||
identifiers[normalized] = true
|
||||
return normalized, nil
|
||||
}
|
||||
|
||||
// bindMethod registers a method to be emitted in the bindings. The name, inputs
|
||||
// and outputs are normalized. If any inputs are struct-type their structs are
|
||||
// registered to be emitted in the bindings. Any methods that return more than
|
||||
// one output have their results gathered into a struct.
|
||||
func (cb *contractBinder) bindMethod(original abi.Method) error {
|
||||
normalized := original
|
||||
normalizedName, err := cb.registerIdentifier(cb.callIdentifiers, original.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
normalized.Name = normalizedName
|
||||
|
||||
normalized.Inputs = normalizeArgs(original.Inputs)
|
||||
for _, input := range normalized.Inputs {
|
||||
if hasStruct(input.Type) {
|
||||
cb.binder.BindStructType(input.Type)
|
||||
}
|
||||
}
|
||||
normalized.Outputs = normalizeArgs(original.Outputs)
|
||||
for _, output := range normalized.Outputs {
|
||||
if hasStruct(output.Type) {
|
||||
cb.binder.BindStructType(output.Type)
|
||||
}
|
||||
}
|
||||
|
||||
var isStructured bool
|
||||
// If the call returns multiple values, gather them into a struct
|
||||
if len(normalized.Outputs) > 1 {
|
||||
isStructured = true
|
||||
}
|
||||
cb.calls[original.Name] = &tmplMethod{
|
||||
Original: original,
|
||||
Normalized: normalized,
|
||||
Structured: isStructured,
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// normalize a set of arguments by stripping underscores, giving a generic name
|
||||
// in the case where the arg name collides with a reserved Go keyword, and finally
|
||||
// converting to camel-case.
|
||||
func normalizeArgs(args abi.Arguments) abi.Arguments {
|
||||
args = slices.Clone(args)
|
||||
used := make(map[string]bool)
|
||||
|
||||
for i, input := range args {
|
||||
if isKeyWord(input.Name) {
|
||||
args[i].Name = fmt.Sprintf("arg%d", i)
|
||||
}
|
||||
args[i].Name = abi.ToCamelCase(args[i].Name)
|
||||
if args[i].Name == "" {
|
||||
args[i].Name = fmt.Sprintf("arg%d", i)
|
||||
} else {
|
||||
args[i].Name = strings.ToLower(args[i].Name[:1]) + args[i].Name[1:]
|
||||
}
|
||||
|
||||
for index := 0; ; index++ {
|
||||
if !used[args[i].Name] {
|
||||
used[args[i].Name] = true
|
||||
break
|
||||
}
|
||||
args[i].Name = fmt.Sprintf("%s%d", args[i].Name, index)
|
||||
}
|
||||
}
|
||||
return args
|
||||
}
|
||||
|
||||
// normalizeErrorOrEventFields normalizes errors/events for emitting through
|
||||
// bindings: Any anonymous fields are given generated names.
|
||||
func (cb *contractBinder) normalizeErrorOrEventFields(originalInputs abi.Arguments) abi.Arguments {
|
||||
normalizedArguments := normalizeArgs(originalInputs)
|
||||
for _, input := range normalizedArguments {
|
||||
if hasStruct(input.Type) {
|
||||
cb.binder.BindStructType(input.Type)
|
||||
}
|
||||
}
|
||||
return normalizedArguments
|
||||
}
|
||||
|
||||
// bindEvent normalizes an event and registers it to be emitted in the bindings.
|
||||
func (cb *contractBinder) bindEvent(original abi.Event) error {
|
||||
// Skip anonymous events as they don't support explicit filtering
|
||||
if original.Anonymous {
|
||||
return nil
|
||||
}
|
||||
normalizedName, err := cb.registerIdentifier(cb.eventIdentifiers, original.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
normalized := original
|
||||
normalized.Name = normalizedName
|
||||
normalized.Inputs = cb.normalizeErrorOrEventFields(original.Inputs)
|
||||
cb.events[original.Name] = &tmplEvent{Original: original, Normalized: normalized}
|
||||
return nil
|
||||
}
|
||||
|
||||
// bindError normalizes an error and registers it to be emitted in the bindings.
|
||||
func (cb *contractBinder) bindError(original abi.Error) error {
|
||||
normalizedName, err := cb.registerIdentifier(cb.errorIdentifiers, original.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
normalized := original
|
||||
normalized.Name = normalizedName
|
||||
normalized.Inputs = cb.normalizeErrorOrEventFields(original.Inputs)
|
||||
cb.errors[original.Name] = &tmplError{Original: original, Normalized: normalized}
|
||||
return nil
|
||||
}
|
||||
|
||||
// parseLibraryDeps extracts references to library dependencies from the unlinked
|
||||
// hex string deployment bytecode.
|
||||
func parseLibraryDeps(unlinkedCode string) (res []string) {
|
||||
reMatchSpecificPattern, err := regexp.Compile(`__\$([a-f0-9]+)\$__`)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, match := range reMatchSpecificPattern.FindAllStringSubmatch(unlinkedCode, -1) {
|
||||
res = append(res, match[1])
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// iterSorted iterates the map in the lexicographic order of the keys calling
|
||||
// onItem on each. If the callback returns an error, iteration is halted and
|
||||
// the error is returned from iterSorted.
|
||||
func iterSorted[V any](inp map[string]V, onItem func(string, V) error) error {
|
||||
var sortedKeys []string
|
||||
for key := range inp {
|
||||
sortedKeys = append(sortedKeys, key)
|
||||
}
|
||||
sort.Strings(sortedKeys)
|
||||
|
||||
for _, key := range sortedKeys {
|
||||
if err := onItem(key, inp[key]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// BindV2 generates a Go wrapper around a contract ABI. This wrapper isn't meant
|
||||
// to be used as is in client code, but rather as an intermediate struct which
|
||||
// enforces compile time type safety and naming convention as opposed to having to
|
||||
// manually maintain hard coded strings that break on runtime.
|
||||
func BindV2(types []string, abis []string, bytecodes []string, pkg string, libs map[string]string, aliases map[string]string) (string, error) {
|
||||
b := binder{
|
||||
contracts: make(map[string]*tmplContractV2),
|
||||
structs: make(map[string]*tmplStruct),
|
||||
aliases: aliases,
|
||||
}
|
||||
for i := 0; i < len(types); i++ {
|
||||
// Parse the actual ABI to generate the binding for
|
||||
evmABI, err := abi.JSON(strings.NewReader(abis[i]))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
for _, input := range evmABI.Constructor.Inputs {
|
||||
if hasStruct(input.Type) {
|
||||
bindStructType(input.Type, b.structs)
|
||||
}
|
||||
}
|
||||
|
||||
cb := newContractBinder(&b)
|
||||
err = iterSorted(evmABI.Methods, func(_ string, original abi.Method) error {
|
||||
return cb.bindMethod(original)
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
err = iterSorted(evmABI.Events, func(_ string, original abi.Event) error {
|
||||
return cb.bindEvent(original)
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
err = iterSorted(evmABI.Errors, func(_ string, original abi.Error) error {
|
||||
return cb.bindError(original)
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
b.contracts[types[i]] = newTmplContractV2(types[i], abis[i], bytecodes[i], evmABI.Constructor, cb)
|
||||
}
|
||||
|
||||
invertedLibs := make(map[string]string)
|
||||
for pattern, name := range libs {
|
||||
invertedLibs[name] = pattern
|
||||
}
|
||||
data := tmplDataV2{
|
||||
Package: pkg,
|
||||
Contracts: b.contracts,
|
||||
Libraries: invertedLibs,
|
||||
Structs: b.structs,
|
||||
}
|
||||
|
||||
for typ, contract := range data.Contracts {
|
||||
for _, depPattern := range parseLibraryDeps(contract.InputBin) {
|
||||
data.Contracts[typ].Libraries[libs[depPattern]] = depPattern
|
||||
}
|
||||
}
|
||||
buffer := new(bytes.Buffer)
|
||||
funcs := map[string]interface{}{
|
||||
"bindtype": bindType,
|
||||
"bindtopictype": bindTopicType,
|
||||
"capitalise": abi.ToCamelCase,
|
||||
"decapitalise": decapitalise,
|
||||
"ispointertype": isPointerType,
|
||||
"underlyingbindtype": underlyingBindType,
|
||||
}
|
||||
tmpl := template.Must(template.New("").Funcs(funcs).Parse(tmplSourceV2))
|
||||
if err := tmpl.Execute(buffer, data); err != nil {
|
||||
return "", err
|
||||
}
|
||||
// Pass the code through gofmt to clean it up
|
||||
code, err := format.Source(buffer.Bytes())
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("%v\n%s", err, buffer)
|
||||
}
|
||||
return string(code), nil
|
||||
}
|
||||
342
accounts/abi/abigen/bindv2_test.go
Normal file
342
accounts/abi/abigen/bindv2_test.go
Normal file
File diff suppressed because one or more lines are too long
238
accounts/abi/abigen/source2.go.tpl
Normal file
238
accounts/abi/abigen/source2.go.tpl
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package {{.Package}}
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"math/big"
|
||||
"errors"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
{{$structs := .Structs}}
|
||||
{{range $structs}}
|
||||
// {{.Name}} is an auto generated low-level Go binding around an user-defined struct.
|
||||
type {{.Name}} struct {
|
||||
{{range $field := .Fields}}
|
||||
{{capitalise $field.Name}} {{$field.Type}}{{end}}
|
||||
}
|
||||
{{end}}
|
||||
|
||||
{{range $contract := .Contracts}}
|
||||
// {{.Type}}MetaData contains all meta data concerning the {{.Type}} contract.
|
||||
var {{.Type}}MetaData = bind.MetaData{
|
||||
ABI: "{{.InputABI}}",
|
||||
{{if (index $.Libraries .Type) -}}
|
||||
ID: "{{index $.Libraries .Type}}",
|
||||
{{ else -}}
|
||||
ID: "{{.Type}}",
|
||||
{{end -}}
|
||||
{{if .InputBin -}}
|
||||
Bin: "0x{{.InputBin}}",
|
||||
{{end -}}
|
||||
{{if .Libraries -}}
|
||||
Deps: []*bind.MetaData{
|
||||
{{- range $name, $pattern := .Libraries}}
|
||||
&{{$name}}MetaData,
|
||||
{{- end}}
|
||||
},
|
||||
{{end}}
|
||||
}
|
||||
|
||||
// {{.Type}} is an auto generated Go binding around an Ethereum contract.
|
||||
type {{.Type}} struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// New{{.Type}} creates a new instance of {{.Type}}.
|
||||
func New{{.Type}}() *{{.Type}} {
|
||||
parsed, err := {{.Type}}MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &{{.Type}}{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *{{.Type}}) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
{{ if .Constructor.Inputs }}
|
||||
// PackConstructor is the Go binding used to pack the parameters required for
|
||||
// contract deployment.
|
||||
//
|
||||
// Solidity: {{.Constructor.String}}
|
||||
func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) PackConstructor({{range .Constructor.Inputs}} {{.Name}} {{bindtype .Type $structs}}, {{end}}) []byte {
|
||||
enc, err := {{ decapitalise $contract.Type}}.abi.Pack("" {{range .Constructor.Inputs}}, {{.Name}}{{end}})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
{{ end }}
|
||||
|
||||
{{range .Calls}}
|
||||
// Pack{{.Normalized.Name}} is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x{{printf "%x" .Original.ID}}.
|
||||
//
|
||||
// Solidity: {{.Original.String}}
|
||||
func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) Pack{{.Normalized.Name}}({{range .Normalized.Inputs}} {{.Name}} {{bindtype .Type $structs}}, {{end}}) []byte {
|
||||
enc, err := {{ decapitalise $contract.Type}}.abi.Pack("{{.Original.Name}}" {{range .Normalized.Inputs}}, {{.Name}}{{end}})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
{{/* Unpack method is needed only when there are return args */}}
|
||||
{{if .Normalized.Outputs }}
|
||||
{{ if .Structured }}
|
||||
// {{.Normalized.Name}}Output serves as a container for the return parameters of contract
|
||||
// method {{ .Normalized.Name }}.
|
||||
type {{.Normalized.Name}}Output struct {
|
||||
{{range .Normalized.Outputs}}
|
||||
{{capitalise .Name}} {{bindtype .Type $structs}}{{end}}
|
||||
}
|
||||
{{ end }}
|
||||
|
||||
// Unpack{{.Normalized.Name}} is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x{{printf "%x" .Original.ID}}.
|
||||
//
|
||||
// Solidity: {{.Original.String}}
|
||||
func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) Unpack{{.Normalized.Name}}(data []byte) (
|
||||
{{- if .Structured}} {{.Normalized.Name}}Output,{{else}}
|
||||
{{- range .Normalized.Outputs}} {{bindtype .Type $structs}},{{- end }}
|
||||
{{- end }} error) {
|
||||
out, err := {{ decapitalise $contract.Type}}.abi.Unpack("{{.Original.Name}}", data)
|
||||
{{- if .Structured}}
|
||||
outstruct := new({{.Normalized.Name}}Output)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
{{- range $i, $t := .Normalized.Outputs}}
|
||||
{{- if ispointertype .Type}}
|
||||
outstruct.{{capitalise .Name}} = abi.ConvertType(out[{{$i}}], new({{underlyingbindtype .Type }})).({{bindtype .Type $structs}})
|
||||
{{- else }}
|
||||
outstruct.{{capitalise .Name}} = *abi.ConvertType(out[{{$i}}], new({{bindtype .Type $structs}})).(*{{bindtype .Type $structs}})
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
return *outstruct, err
|
||||
{{else}}
|
||||
if err != nil {
|
||||
return {{range $i, $_ := .Normalized.Outputs}}{{if ispointertype .Type}}new({{underlyingbindtype .Type }}), {{else}}*new({{bindtype .Type $structs}}), {{end}}{{end}} err
|
||||
}
|
||||
{{- range $i, $t := .Normalized.Outputs}}
|
||||
{{- if ispointertype .Type }}
|
||||
out{{$i}} := abi.ConvertType(out[{{$i}}], new({{underlyingbindtype .Type}})).({{bindtype .Type $structs}})
|
||||
{{- else }}
|
||||
out{{$i}} := *abi.ConvertType(out[{{$i}}], new({{bindtype .Type $structs}})).(*{{bindtype .Type $structs}})
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
return {{range $i, $t := .Normalized.Outputs}}out{{$i}}, {{end}} err
|
||||
{{- end}}
|
||||
}
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
||||
{{range .Events}}
|
||||
// {{$contract.Type}}{{.Normalized.Name}} represents a {{.Original.Name}} event raised by the {{$contract.Type}} contract.
|
||||
type {{$contract.Type}}{{.Normalized.Name}} struct {
|
||||
{{- range .Normalized.Inputs}}
|
||||
{{ capitalise .Name}}
|
||||
{{- if .Indexed}} {{ bindtopictype .Type $structs}}{{- else}} {{ bindtype .Type $structs}}{{ end }}
|
||||
{{- end}}
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const {{$contract.Type}}{{.Normalized.Name}}EventName = "{{.Original.Name}}"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func ({{$contract.Type}}{{.Normalized.Name}}) ContractEventName() string {
|
||||
return {{$contract.Type}}{{.Normalized.Name}}EventName
|
||||
}
|
||||
|
||||
// Unpack{{.Normalized.Name}}Event is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: {{.Original.String}}
|
||||
func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) Unpack{{.Normalized.Name}}Event(log *types.Log) (*{{$contract.Type}}{{.Normalized.Name}}, error) {
|
||||
event := "{{.Original.Name}}"
|
||||
if log.Topics[0] != {{ decapitalise $contract.Type}}.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new({{$contract.Type}}{{.Normalized.Name}})
|
||||
if len(log.Data) > 0 {
|
||||
if err := {{ decapitalise $contract.Type}}.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range {{ decapitalise $contract.Type}}.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
{{end}}
|
||||
|
||||
{{ if .Errors }}
|
||||
// UnpackError attempts to decode the provided error data using user-defined
|
||||
// error definitions.
|
||||
func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) UnpackError(raw []byte) (any, error) {
|
||||
{{- range $k, $v := .Errors}}
|
||||
if bytes.Equal(raw[:4], {{ decapitalise $contract.Type}}.abi.Errors["{{.Normalized.Name}}"].ID.Bytes()[:4]) {
|
||||
return {{ decapitalise $contract.Type}}.Unpack{{.Normalized.Name}}Error(raw[4:])
|
||||
}
|
||||
{{- end }}
|
||||
return nil, errors.New("Unknown error")
|
||||
}
|
||||
{{ end }}
|
||||
|
||||
{{range .Errors}}
|
||||
// {{$contract.Type}}{{.Normalized.Name}} represents a {{.Original.Name}} error raised by the {{$contract.Type}} contract.
|
||||
type {{$contract.Type}}{{.Normalized.Name}} struct { {{range .Normalized.Inputs}}
|
||||
{{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type $structs}}{{else}}{{bindtype .Type $structs}}{{end}}; {{end}}
|
||||
}
|
||||
|
||||
// ErrorID returns the hash of canonical representation of the error's signature.
|
||||
//
|
||||
// Solidity: {{.Original.String}}
|
||||
func {{$contract.Type}}{{.Normalized.Name}}ErrorID() common.Hash {
|
||||
return common.HexToHash("{{.Original.ID}}")
|
||||
}
|
||||
|
||||
// Unpack{{.Normalized.Name}}Error is the Go binding used to decode the provided
|
||||
// error data into the corresponding Go error struct.
|
||||
//
|
||||
// Solidity: {{.Original.String}}
|
||||
func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) Unpack{{.Normalized.Name}}Error(raw []byte) (*{{$contract.Type}}{{.Normalized.Name}}, error) {
|
||||
out := new({{$contract.Type}}{{.Normalized.Name}})
|
||||
if err := {{ decapitalise $contract.Type}}.abi.UnpackIntoInterface(out, "{{.Normalized.Name}}", raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
|
@ -14,10 +14,12 @@
|
|||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind
|
||||
package abigen
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
)
|
||||
|
|
@ -42,10 +44,48 @@ type tmplContract struct {
|
|||
Fallback *tmplMethod // Additional special fallback function
|
||||
Receive *tmplMethod // Additional special receive function
|
||||
Events map[string]*tmplEvent // Contract events accessors
|
||||
Libraries map[string]string // Same as tmplData, but filtered to only keep what the contract needs
|
||||
Libraries map[string]string // Same as tmplData, but filtered to only keep direct deps that the contract needs
|
||||
Library bool // Indicator whether the contract is a library
|
||||
}
|
||||
|
||||
type tmplContractV2 struct {
|
||||
Type string // Type name of the main contract binding
|
||||
InputABI string // JSON ABI used as the input to generate the binding from
|
||||
InputBin string // Optional EVM bytecode used to generate deploy code from
|
||||
Constructor abi.Method // Contract constructor for deploy parametrization
|
||||
Calls map[string]*tmplMethod // All contract methods (excluding fallback, receive)
|
||||
Events map[string]*tmplEvent // Contract events accessors
|
||||
Libraries map[string]string // all direct library dependencies
|
||||
Errors map[string]*tmplError // all errors defined
|
||||
}
|
||||
|
||||
func newTmplContractV2(typ string, abiStr string, bytecode string, constructor abi.Method, cb *contractBinder) *tmplContractV2 {
|
||||
// Strip any whitespace from the JSON ABI
|
||||
strippedABI := strings.Map(func(r rune) rune {
|
||||
if unicode.IsSpace(r) {
|
||||
return -1
|
||||
}
|
||||
return r
|
||||
}, abiStr)
|
||||
return &tmplContractV2{
|
||||
abi.ToCamelCase(typ),
|
||||
strings.ReplaceAll(strippedABI, "\"", "\\\""),
|
||||
strings.TrimPrefix(strings.TrimSpace(bytecode), "0x"),
|
||||
constructor,
|
||||
cb.calls,
|
||||
cb.events,
|
||||
make(map[string]string),
|
||||
cb.errors,
|
||||
}
|
||||
}
|
||||
|
||||
type tmplDataV2 struct {
|
||||
Package string // Name of the package to use for the generated bindings
|
||||
Contracts map[string]*tmplContractV2 // Contracts that will be emitted in the bindings (keyed by contract name)
|
||||
Libraries map[string]string // Map of the contract's name to link pattern
|
||||
Structs map[string]*tmplStruct // Contract struct type definitions
|
||||
}
|
||||
|
||||
// tmplMethod is a wrapper around an abi.Method that contains a few preprocessed
|
||||
// and cached data fields.
|
||||
type tmplMethod struct {
|
||||
|
|
@ -61,6 +101,13 @@ type tmplEvent struct {
|
|||
Normalized abi.Event // Normalized version of the parsed fields
|
||||
}
|
||||
|
||||
// tmplError is a wrapper around an abi.Error that contains a few preprocessed
|
||||
// and cached data fields.
|
||||
type tmplError struct {
|
||||
Original abi.Error
|
||||
Normalized abi.Error
|
||||
}
|
||||
|
||||
// tmplField is a wrapper around a struct field with binding language
|
||||
// struct type definition and relative filed name.
|
||||
type tmplField struct {
|
||||
|
|
@ -76,14 +123,14 @@ type tmplStruct struct {
|
|||
Fields []*tmplField // Struct fields definition depends on the binding language.
|
||||
}
|
||||
|
||||
// tmplSource is language to template mapping containing all the supported
|
||||
// programming languages the package can generate to.
|
||||
var tmplSource = map[Lang]string{
|
||||
LangGo: tmplSourceGo,
|
||||
}
|
||||
|
||||
// tmplSourceGo is the Go source template that the generated Go contract binding
|
||||
// tmplSource is the Go source template that the generated Go contract binding
|
||||
// is based on.
|
||||
//
|
||||
//go:embed source.go.tpl
|
||||
var tmplSourceGo string
|
||||
var tmplSource string
|
||||
|
||||
// tmplSourceV2 is the Go source template that the generated Go contract binding
|
||||
// for abigen v2 is based on.
|
||||
//
|
||||
//go:embed source2.go.tpl
|
||||
var tmplSourceV2 string
|
||||
64
accounts/abi/abigen/testdata/v2/callbackparam.go.txt
vendored
Normal file
64
accounts/abi/abigen/testdata/v2/callbackparam.go.txt
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// CallbackParamMetaData contains all meta data concerning the CallbackParam contract.
|
||||
var CallbackParamMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":false,\"inputs\":[{\"name\":\"callback\",\"type\":\"function\"}],\"name\":\"test\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
|
||||
ID: "949f96f86d3c2e1bcc15563ad898beaaca",
|
||||
Bin: "0x608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029",
|
||||
}
|
||||
|
||||
// CallbackParam is an auto generated Go binding around an Ethereum contract.
|
||||
type CallbackParam struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewCallbackParam creates a new instance of CallbackParam.
|
||||
func NewCallbackParam() *CallbackParam {
|
||||
parsed, err := CallbackParamMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &CallbackParam{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *CallbackParam) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackTest is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xd7a5aba2.
|
||||
//
|
||||
// Solidity: function test(function callback) returns()
|
||||
func (callbackParam *CallbackParam) PackTest(callback [24]byte) []byte {
|
||||
enc, err := callbackParam.abi.Pack("test", callback)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
304
accounts/abi/abigen/testdata/v2/crowdsale.go.txt
vendored
Normal file
304
accounts/abi/abigen/testdata/v2/crowdsale.go.txt
vendored
Normal file
|
|
@ -0,0 +1,304 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// CrowdsaleMetaData contains all meta data concerning the Crowdsale contract.
|
||||
var CrowdsaleMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":false,\"inputs\":[],\"name\":\"checkGoalReached\",\"outputs\":[],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deadline\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"beneficiary\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenReward\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"fundingGoal\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"amountRaised\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"price\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"funders\",\"outputs\":[{\"name\":\"addr\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"inputs\":[{\"name\":\"ifSuccessfulSendTo\",\"type\":\"address\"},{\"name\":\"fundingGoalInEthers\",\"type\":\"uint256\"},{\"name\":\"durationInMinutes\",\"type\":\"uint256\"},{\"name\":\"etherCostOfEachToken\",\"type\":\"uint256\"},{\"name\":\"addressOfTokenUsedAsReward\",\"type\":\"address\"}],\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"backer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"isContribution\",\"type\":\"bool\"}],\"name\":\"FundTransfer\",\"type\":\"event\"}]",
|
||||
ID: "84d7e935785c5c648282d326307bb8fa0d",
|
||||
Bin: "0x606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56",
|
||||
}
|
||||
|
||||
// Crowdsale is an auto generated Go binding around an Ethereum contract.
|
||||
type Crowdsale struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewCrowdsale creates a new instance of Crowdsale.
|
||||
func NewCrowdsale() *Crowdsale {
|
||||
parsed, err := CrowdsaleMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Crowdsale{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Crowdsale) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackConstructor is the Go binding used to pack the parameters required for
|
||||
// contract deployment.
|
||||
//
|
||||
// Solidity: constructor(address ifSuccessfulSendTo, uint256 fundingGoalInEthers, uint256 durationInMinutes, uint256 etherCostOfEachToken, address addressOfTokenUsedAsReward) returns()
|
||||
func (crowdsale *Crowdsale) PackConstructor(ifSuccessfulSendTo common.Address, fundingGoalInEthers *big.Int, durationInMinutes *big.Int, etherCostOfEachToken *big.Int, addressOfTokenUsedAsReward common.Address) []byte {
|
||||
enc, err := crowdsale.abi.Pack("", ifSuccessfulSendTo, fundingGoalInEthers, durationInMinutes, etherCostOfEachToken, addressOfTokenUsedAsReward)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackAmountRaised is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x7b3e5e7b.
|
||||
//
|
||||
// Solidity: function amountRaised() returns(uint256)
|
||||
func (crowdsale *Crowdsale) PackAmountRaised() []byte {
|
||||
enc, err := crowdsale.abi.Pack("amountRaised")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackAmountRaised is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x7b3e5e7b.
|
||||
//
|
||||
// Solidity: function amountRaised() returns(uint256)
|
||||
func (crowdsale *Crowdsale) UnpackAmountRaised(data []byte) (*big.Int, error) {
|
||||
out, err := crowdsale.abi.Unpack("amountRaised", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackBeneficiary is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x38af3eed.
|
||||
//
|
||||
// Solidity: function beneficiary() returns(address)
|
||||
func (crowdsale *Crowdsale) PackBeneficiary() []byte {
|
||||
enc, err := crowdsale.abi.Pack("beneficiary")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackBeneficiary is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x38af3eed.
|
||||
//
|
||||
// Solidity: function beneficiary() returns(address)
|
||||
func (crowdsale *Crowdsale) UnpackBeneficiary(data []byte) (common.Address, error) {
|
||||
out, err := crowdsale.abi.Unpack("beneficiary", data)
|
||||
if err != nil {
|
||||
return *new(common.Address), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackCheckGoalReached is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x01cb3b20.
|
||||
//
|
||||
// Solidity: function checkGoalReached() returns()
|
||||
func (crowdsale *Crowdsale) PackCheckGoalReached() []byte {
|
||||
enc, err := crowdsale.abi.Pack("checkGoalReached")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackDeadline is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x29dcb0cf.
|
||||
//
|
||||
// Solidity: function deadline() returns(uint256)
|
||||
func (crowdsale *Crowdsale) PackDeadline() []byte {
|
||||
enc, err := crowdsale.abi.Pack("deadline")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDeadline is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x29dcb0cf.
|
||||
//
|
||||
// Solidity: function deadline() returns(uint256)
|
||||
func (crowdsale *Crowdsale) UnpackDeadline(data []byte) (*big.Int, error) {
|
||||
out, err := crowdsale.abi.Unpack("deadline", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackFunders is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xdc0d3dff.
|
||||
//
|
||||
// Solidity: function funders(uint256 ) returns(address addr, uint256 amount)
|
||||
func (crowdsale *Crowdsale) PackFunders(arg0 *big.Int) []byte {
|
||||
enc, err := crowdsale.abi.Pack("funders", arg0)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// FundersOutput serves as a container for the return parameters of contract
|
||||
// method Funders.
|
||||
type FundersOutput struct {
|
||||
Addr common.Address
|
||||
Amount *big.Int
|
||||
}
|
||||
|
||||
// UnpackFunders is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xdc0d3dff.
|
||||
//
|
||||
// Solidity: function funders(uint256 ) returns(address addr, uint256 amount)
|
||||
func (crowdsale *Crowdsale) UnpackFunders(data []byte) (FundersOutput, error) {
|
||||
out, err := crowdsale.abi.Unpack("funders", data)
|
||||
outstruct := new(FundersOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Addr = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
|
||||
outstruct.Amount = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackFundingGoal is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x7a3a0e84.
|
||||
//
|
||||
// Solidity: function fundingGoal() returns(uint256)
|
||||
func (crowdsale *Crowdsale) PackFundingGoal() []byte {
|
||||
enc, err := crowdsale.abi.Pack("fundingGoal")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackFundingGoal is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x7a3a0e84.
|
||||
//
|
||||
// Solidity: function fundingGoal() returns(uint256)
|
||||
func (crowdsale *Crowdsale) UnpackFundingGoal(data []byte) (*big.Int, error) {
|
||||
out, err := crowdsale.abi.Unpack("fundingGoal", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackPrice is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xa035b1fe.
|
||||
//
|
||||
// Solidity: function price() returns(uint256)
|
||||
func (crowdsale *Crowdsale) PackPrice() []byte {
|
||||
enc, err := crowdsale.abi.Pack("price")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackPrice is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xa035b1fe.
|
||||
//
|
||||
// Solidity: function price() returns(uint256)
|
||||
func (crowdsale *Crowdsale) UnpackPrice(data []byte) (*big.Int, error) {
|
||||
out, err := crowdsale.abi.Unpack("price", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackTokenReward is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x6e66f6e9.
|
||||
//
|
||||
// Solidity: function tokenReward() returns(address)
|
||||
func (crowdsale *Crowdsale) PackTokenReward() []byte {
|
||||
enc, err := crowdsale.abi.Pack("tokenReward")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackTokenReward is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x6e66f6e9.
|
||||
//
|
||||
// Solidity: function tokenReward() returns(address)
|
||||
func (crowdsale *Crowdsale) UnpackTokenReward(data []byte) (common.Address, error) {
|
||||
out, err := crowdsale.abi.Unpack("tokenReward", data)
|
||||
if err != nil {
|
||||
return *new(common.Address), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// CrowdsaleFundTransfer represents a FundTransfer event raised by the Crowdsale contract.
|
||||
type CrowdsaleFundTransfer struct {
|
||||
Backer common.Address
|
||||
Amount *big.Int
|
||||
IsContribution bool
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const CrowdsaleFundTransferEventName = "FundTransfer"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (CrowdsaleFundTransfer) ContractEventName() string {
|
||||
return CrowdsaleFundTransferEventName
|
||||
}
|
||||
|
||||
// UnpackFundTransferEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event FundTransfer(address backer, uint256 amount, bool isContribution)
|
||||
func (crowdsale *Crowdsale) UnpackFundTransferEvent(log *types.Log) (*CrowdsaleFundTransfer, error) {
|
||||
event := "FundTransfer"
|
||||
if log.Topics[0] != crowdsale.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(CrowdsaleFundTransfer)
|
||||
if len(log.Data) > 0 {
|
||||
if err := crowdsale.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range crowdsale.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
655
accounts/abi/abigen/testdata/v2/dao.go.txt
vendored
Normal file
655
accounts/abi/abigen/testdata/v2/dao.go.txt
vendored
Normal file
File diff suppressed because one or more lines are too long
114
accounts/abi/abigen/testdata/v2/deeplynestedarray.go.txt
vendored
Normal file
114
accounts/abi/abigen/testdata/v2/deeplynestedarray.go.txt
vendored
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// DeeplyNestedArrayMetaData contains all meta data concerning the DeeplyNestedArray contract.
|
||||
var DeeplyNestedArrayMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":false,\"inputs\":[{\"name\":\"arr\",\"type\":\"uint64[3][4][5]\"}],\"name\":\"storeDeepUintArray\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"retrieveDeepArray\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64[3][4][5]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deepUint64Array\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]",
|
||||
ID: "3a44c26b21f02743d5dbeb02d24a67bf41",
|
||||
Bin: "0x6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029",
|
||||
}
|
||||
|
||||
// DeeplyNestedArray is an auto generated Go binding around an Ethereum contract.
|
||||
type DeeplyNestedArray struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewDeeplyNestedArray creates a new instance of DeeplyNestedArray.
|
||||
func NewDeeplyNestedArray() *DeeplyNestedArray {
|
||||
parsed, err := DeeplyNestedArrayMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &DeeplyNestedArray{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *DeeplyNestedArray) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackDeepUint64Array is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x98ed1856.
|
||||
//
|
||||
// Solidity: function deepUint64Array(uint256 , uint256 , uint256 ) view returns(uint64)
|
||||
func (deeplyNestedArray *DeeplyNestedArray) PackDeepUint64Array(arg0 *big.Int, arg1 *big.Int, arg2 *big.Int) []byte {
|
||||
enc, err := deeplyNestedArray.abi.Pack("deepUint64Array", arg0, arg1, arg2)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDeepUint64Array is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x98ed1856.
|
||||
//
|
||||
// Solidity: function deepUint64Array(uint256 , uint256 , uint256 ) view returns(uint64)
|
||||
func (deeplyNestedArray *DeeplyNestedArray) UnpackDeepUint64Array(data []byte) (uint64, error) {
|
||||
out, err := deeplyNestedArray.abi.Unpack("deepUint64Array", data)
|
||||
if err != nil {
|
||||
return *new(uint64), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackRetrieveDeepArray is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x8ed4573a.
|
||||
//
|
||||
// Solidity: function retrieveDeepArray() view returns(uint64[3][4][5])
|
||||
func (deeplyNestedArray *DeeplyNestedArray) PackRetrieveDeepArray() []byte {
|
||||
enc, err := deeplyNestedArray.abi.Pack("retrieveDeepArray")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackRetrieveDeepArray is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x8ed4573a.
|
||||
//
|
||||
// Solidity: function retrieveDeepArray() view returns(uint64[3][4][5])
|
||||
func (deeplyNestedArray *DeeplyNestedArray) UnpackRetrieveDeepArray(data []byte) ([5][4][3]uint64, error) {
|
||||
out, err := deeplyNestedArray.abi.Unpack("retrieveDeepArray", data)
|
||||
if err != nil {
|
||||
return *new([5][4][3]uint64), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new([5][4][3]uint64)).(*[5][4][3]uint64)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackStoreDeepUintArray is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x34424855.
|
||||
//
|
||||
// Solidity: function storeDeepUintArray(uint64[3][4][5] arr) returns()
|
||||
func (deeplyNestedArray *DeeplyNestedArray) PackStoreDeepUintArray(arr [5][4][3]uint64) []byte {
|
||||
enc, err := deeplyNestedArray.abi.Pack("storeDeepUintArray", arr)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
52
accounts/abi/abigen/testdata/v2/empty.go.txt
vendored
Normal file
52
accounts/abi/abigen/testdata/v2/empty.go.txt
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// EmptyMetaData contains all meta data concerning the Empty contract.
|
||||
var EmptyMetaData = bind.MetaData{
|
||||
ABI: "[]",
|
||||
ID: "c4ce3210982aa6fc94dabe46dc1dbf454d",
|
||||
Bin: "0x606060405260068060106000396000f3606060405200",
|
||||
}
|
||||
|
||||
// Empty is an auto generated Go binding around an Ethereum contract.
|
||||
type Empty struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewEmpty creates a new instance of Empty.
|
||||
func NewEmpty() *Empty {
|
||||
parsed, err := EmptyMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Empty{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Empty) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
261
accounts/abi/abigen/testdata/v2/eventchecker.go.txt
vendored
Normal file
261
accounts/abi/abigen/testdata/v2/eventchecker.go.txt
vendored
Normal file
|
|
@ -0,0 +1,261 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// EventCheckerMetaData contains all meta data concerning the EventChecker contract.
|
||||
var EventCheckerMetaData = bind.MetaData{
|
||||
ABI: "[{\"type\":\"event\",\"name\":\"empty\",\"inputs\":[]},{\"type\":\"event\",\"name\":\"indexed\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true},{\"name\":\"num\",\"type\":\"int256\",\"indexed\":true}]},{\"type\":\"event\",\"name\":\"mixed\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true},{\"name\":\"num\",\"type\":\"int256\"}]},{\"type\":\"event\",\"name\":\"anonymous\",\"anonymous\":true,\"inputs\":[]},{\"type\":\"event\",\"name\":\"dynamic\",\"inputs\":[{\"name\":\"idxStr\",\"type\":\"string\",\"indexed\":true},{\"name\":\"idxDat\",\"type\":\"bytes\",\"indexed\":true},{\"name\":\"str\",\"type\":\"string\"},{\"name\":\"dat\",\"type\":\"bytes\"}]},{\"type\":\"event\",\"name\":\"unnamed\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"indexed\":true},{\"name\":\"\",\"type\":\"uint256\",\"indexed\":true}]}]",
|
||||
ID: "253d421f98e29b25315bde79c1251ab27c",
|
||||
}
|
||||
|
||||
// EventChecker is an auto generated Go binding around an Ethereum contract.
|
||||
type EventChecker struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewEventChecker creates a new instance of EventChecker.
|
||||
func NewEventChecker() *EventChecker {
|
||||
parsed, err := EventCheckerMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &EventChecker{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *EventChecker) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// EventCheckerDynamic represents a dynamic event raised by the EventChecker contract.
|
||||
type EventCheckerDynamic struct {
|
||||
IdxStr common.Hash
|
||||
IdxDat common.Hash
|
||||
Str string
|
||||
Dat []byte
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const EventCheckerDynamicEventName = "dynamic"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (EventCheckerDynamic) ContractEventName() string {
|
||||
return EventCheckerDynamicEventName
|
||||
}
|
||||
|
||||
// UnpackDynamicEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event dynamic(string indexed idxStr, bytes indexed idxDat, string str, bytes dat)
|
||||
func (eventChecker *EventChecker) UnpackDynamicEvent(log *types.Log) (*EventCheckerDynamic, error) {
|
||||
event := "dynamic"
|
||||
if log.Topics[0] != eventChecker.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(EventCheckerDynamic)
|
||||
if len(log.Data) > 0 {
|
||||
if err := eventChecker.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range eventChecker.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// EventCheckerEmpty represents a empty event raised by the EventChecker contract.
|
||||
type EventCheckerEmpty struct {
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const EventCheckerEmptyEventName = "empty"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (EventCheckerEmpty) ContractEventName() string {
|
||||
return EventCheckerEmptyEventName
|
||||
}
|
||||
|
||||
// UnpackEmptyEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event empty()
|
||||
func (eventChecker *EventChecker) UnpackEmptyEvent(log *types.Log) (*EventCheckerEmpty, error) {
|
||||
event := "empty"
|
||||
if log.Topics[0] != eventChecker.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(EventCheckerEmpty)
|
||||
if len(log.Data) > 0 {
|
||||
if err := eventChecker.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range eventChecker.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// EventCheckerIndexed represents a indexed event raised by the EventChecker contract.
|
||||
type EventCheckerIndexed struct {
|
||||
Addr common.Address
|
||||
Num *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const EventCheckerIndexedEventName = "indexed"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (EventCheckerIndexed) ContractEventName() string {
|
||||
return EventCheckerIndexedEventName
|
||||
}
|
||||
|
||||
// UnpackIndexedEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event indexed(address indexed addr, int256 indexed num)
|
||||
func (eventChecker *EventChecker) UnpackIndexedEvent(log *types.Log) (*EventCheckerIndexed, error) {
|
||||
event := "indexed"
|
||||
if log.Topics[0] != eventChecker.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(EventCheckerIndexed)
|
||||
if len(log.Data) > 0 {
|
||||
if err := eventChecker.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range eventChecker.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// EventCheckerMixed represents a mixed event raised by the EventChecker contract.
|
||||
type EventCheckerMixed struct {
|
||||
Addr common.Address
|
||||
Num *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const EventCheckerMixedEventName = "mixed"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (EventCheckerMixed) ContractEventName() string {
|
||||
return EventCheckerMixedEventName
|
||||
}
|
||||
|
||||
// UnpackMixedEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event mixed(address indexed addr, int256 num)
|
||||
func (eventChecker *EventChecker) UnpackMixedEvent(log *types.Log) (*EventCheckerMixed, error) {
|
||||
event := "mixed"
|
||||
if log.Topics[0] != eventChecker.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(EventCheckerMixed)
|
||||
if len(log.Data) > 0 {
|
||||
if err := eventChecker.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range eventChecker.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// EventCheckerUnnamed represents a unnamed event raised by the EventChecker contract.
|
||||
type EventCheckerUnnamed struct {
|
||||
Arg0 *big.Int
|
||||
Arg1 *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const EventCheckerUnnamedEventName = "unnamed"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (EventCheckerUnnamed) ContractEventName() string {
|
||||
return EventCheckerUnnamedEventName
|
||||
}
|
||||
|
||||
// UnpackUnnamedEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event unnamed(uint256 indexed arg0, uint256 indexed arg1)
|
||||
func (eventChecker *EventChecker) UnpackUnnamedEvent(log *types.Log) (*EventCheckerUnnamed, error) {
|
||||
event := "unnamed"
|
||||
if log.Topics[0] != eventChecker.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(EventCheckerUnnamed)
|
||||
if len(log.Data) > 0 {
|
||||
if err := eventChecker.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range eventChecker.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
89
accounts/abi/abigen/testdata/v2/getter.go.txt
vendored
Normal file
89
accounts/abi/abigen/testdata/v2/getter.go.txt
vendored
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// GetterMetaData contains all meta data concerning the Getter contract.
|
||||
var GetterMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":true,\"inputs\":[],\"name\":\"getter\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"},{\"name\":\"\",\"type\":\"int256\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"type\":\"function\"}]",
|
||||
ID: "e23a74c8979fe93c9fff15e4f51535ad54",
|
||||
Bin: "0x606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3",
|
||||
}
|
||||
|
||||
// Getter is an auto generated Go binding around an Ethereum contract.
|
||||
type Getter struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewGetter creates a new instance of Getter.
|
||||
func NewGetter() *Getter {
|
||||
parsed, err := GetterMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Getter{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Getter) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackGetter is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x993a04b7.
|
||||
//
|
||||
// Solidity: function getter() returns(string, int256, bytes32)
|
||||
func (getter *Getter) PackGetter() []byte {
|
||||
enc, err := getter.abi.Pack("getter")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// GetterOutput serves as a container for the return parameters of contract
|
||||
// method Getter.
|
||||
type GetterOutput struct {
|
||||
Arg0 string
|
||||
Arg1 *big.Int
|
||||
Arg2 [32]byte
|
||||
}
|
||||
|
||||
// UnpackGetter is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x993a04b7.
|
||||
//
|
||||
// Solidity: function getter() returns(string, int256, bytes32)
|
||||
func (getter *Getter) UnpackGetter(data []byte) (GetterOutput, error) {
|
||||
out, err := getter.abi.Unpack("getter", data)
|
||||
outstruct := new(GetterOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Arg0 = *abi.ConvertType(out[0], new(string)).(*string)
|
||||
outstruct.Arg1 = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
outstruct.Arg2 = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
102
accounts/abi/abigen/testdata/v2/identifiercollision.go.txt
vendored
Normal file
102
accounts/abi/abigen/testdata/v2/identifiercollision.go.txt
vendored
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// IdentifierCollisionMetaData contains all meta data concerning the IdentifierCollision contract.
|
||||
var IdentifierCollisionMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":true,\"inputs\":[],\"name\":\"MyVar\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_myVar\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]",
|
||||
ID: "1863c5622f8ac2c09c42f063ca883fe438",
|
||||
Bin: "0x60806040523480156100115760006000fd5b50610017565b60c3806100256000396000f3fe608060405234801560105760006000fd5b506004361060365760003560e01c806301ad4d8714603c5780634ef1f0ad146058576036565b60006000fd5b60426074565b6040518082815260200191505060405180910390f35b605e607d565b6040518082815260200191505060405180910390f35b60006000505481565b60006000600050549050608b565b9056fea265627a7a7231582067c8d84688b01c4754ba40a2a871cede94ea1f28b5981593ab2a45b46ac43af664736f6c634300050c0032",
|
||||
}
|
||||
|
||||
// IdentifierCollision is an auto generated Go binding around an Ethereum contract.
|
||||
type IdentifierCollision struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewIdentifierCollision creates a new instance of IdentifierCollision.
|
||||
func NewIdentifierCollision() *IdentifierCollision {
|
||||
parsed, err := IdentifierCollisionMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &IdentifierCollision{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *IdentifierCollision) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackMyVar is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x4ef1f0ad.
|
||||
//
|
||||
// Solidity: function MyVar() view returns(uint256)
|
||||
func (identifierCollision *IdentifierCollision) PackMyVar() []byte {
|
||||
enc, err := identifierCollision.abi.Pack("MyVar")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackMyVar is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x4ef1f0ad.
|
||||
//
|
||||
// Solidity: function MyVar() view returns(uint256)
|
||||
func (identifierCollision *IdentifierCollision) UnpackMyVar(data []byte) (*big.Int, error) {
|
||||
out, err := identifierCollision.abi.Unpack("MyVar", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackPubVar is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x01ad4d87.
|
||||
//
|
||||
// Solidity: function _myVar() view returns(uint256)
|
||||
func (identifierCollision *IdentifierCollision) PackPubVar() []byte {
|
||||
enc, err := identifierCollision.abi.Pack("_myVar")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackPubVar is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x01ad4d87.
|
||||
//
|
||||
// Solidity: function _myVar() view returns(uint256)
|
||||
func (identifierCollision *IdentifierCollision) UnpackPubVar(data []byte) (*big.Int, error) {
|
||||
out, err := identifierCollision.abi.Unpack("_myVar", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
123
accounts/abi/abigen/testdata/v2/inputchecker.go.txt
vendored
Normal file
123
accounts/abi/abigen/testdata/v2/inputchecker.go.txt
vendored
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// InputCheckerMetaData contains all meta data concerning the InputChecker contract.
|
||||
var InputCheckerMetaData = bind.MetaData{
|
||||
ABI: "[{\"type\":\"function\",\"name\":\"noInput\",\"constant\":true,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"namedInput\",\"constant\":true,\"inputs\":[{\"name\":\"str\",\"type\":\"string\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"anonInput\",\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"string\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"namedInputs\",\"constant\":true,\"inputs\":[{\"name\":\"str1\",\"type\":\"string\"},{\"name\":\"str2\",\"type\":\"string\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"anonInputs\",\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"string\"},{\"name\":\"\",\"type\":\"string\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mixedInputs\",\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"string\"},{\"name\":\"str\",\"type\":\"string\"}],\"outputs\":[]}]",
|
||||
ID: "e551ce092312e54f54f45ffdf06caa4cdc",
|
||||
}
|
||||
|
||||
// InputChecker is an auto generated Go binding around an Ethereum contract.
|
||||
type InputChecker struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewInputChecker creates a new instance of InputChecker.
|
||||
func NewInputChecker() *InputChecker {
|
||||
parsed, err := InputCheckerMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &InputChecker{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *InputChecker) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackAnonInput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x3e708e82.
|
||||
//
|
||||
// Solidity: function anonInput(string ) returns()
|
||||
func (inputChecker *InputChecker) PackAnonInput(arg0 string) []byte {
|
||||
enc, err := inputChecker.abi.Pack("anonInput", arg0)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackAnonInputs is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x28160527.
|
||||
//
|
||||
// Solidity: function anonInputs(string , string ) returns()
|
||||
func (inputChecker *InputChecker) PackAnonInputs(arg0 string, arg1 string) []byte {
|
||||
enc, err := inputChecker.abi.Pack("anonInputs", arg0, arg1)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackMixedInputs is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xc689ebdc.
|
||||
//
|
||||
// Solidity: function mixedInputs(string , string str) returns()
|
||||
func (inputChecker *InputChecker) PackMixedInputs(arg0 string, str string) []byte {
|
||||
enc, err := inputChecker.abi.Pack("mixedInputs", arg0, str)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackNamedInput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x0d402005.
|
||||
//
|
||||
// Solidity: function namedInput(string str) returns()
|
||||
func (inputChecker *InputChecker) PackNamedInput(str string) []byte {
|
||||
enc, err := inputChecker.abi.Pack("namedInput", str)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackNamedInputs is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x63c796ed.
|
||||
//
|
||||
// Solidity: function namedInputs(string str1, string str2) returns()
|
||||
func (inputChecker *InputChecker) PackNamedInputs(str1 string, str2 string) []byte {
|
||||
enc, err := inputChecker.abi.Pack("namedInputs", str1, str2)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackNoInput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x53539029.
|
||||
//
|
||||
// Solidity: function noInput() returns()
|
||||
func (inputChecker *InputChecker) PackNoInput() []byte {
|
||||
enc, err := inputChecker.abi.Pack("noInput")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
126
accounts/abi/abigen/testdata/v2/interactor.go.txt
vendored
Normal file
126
accounts/abi/abigen/testdata/v2/interactor.go.txt
vendored
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// InteractorMetaData contains all meta data concerning the Interactor contract.
|
||||
var InteractorMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":true,\"inputs\":[],\"name\":\"transactString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deployString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"str\",\"type\":\"string\"}],\"name\":\"transact\",\"outputs\":[],\"type\":\"function\"},{\"inputs\":[{\"name\":\"str\",\"type\":\"string\"}],\"type\":\"constructor\"}]",
|
||||
ID: "f63980878028f3242c9033fdc30fd21a81",
|
||||
Bin: "0x6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056",
|
||||
}
|
||||
|
||||
// Interactor is an auto generated Go binding around an Ethereum contract.
|
||||
type Interactor struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewInteractor creates a new instance of Interactor.
|
||||
func NewInteractor() *Interactor {
|
||||
parsed, err := InteractorMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Interactor{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Interactor) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackConstructor is the Go binding used to pack the parameters required for
|
||||
// contract deployment.
|
||||
//
|
||||
// Solidity: constructor(string str) returns()
|
||||
func (interactor *Interactor) PackConstructor(str string) []byte {
|
||||
enc, err := interactor.abi.Pack("", str)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackDeployString is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x6874e809.
|
||||
//
|
||||
// Solidity: function deployString() returns(string)
|
||||
func (interactor *Interactor) PackDeployString() []byte {
|
||||
enc, err := interactor.abi.Pack("deployString")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDeployString is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x6874e809.
|
||||
//
|
||||
// Solidity: function deployString() returns(string)
|
||||
func (interactor *Interactor) UnpackDeployString(data []byte) (string, error) {
|
||||
out, err := interactor.abi.Unpack("deployString", data)
|
||||
if err != nil {
|
||||
return *new(string), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(string)).(*string)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackTransact is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xd736c513.
|
||||
//
|
||||
// Solidity: function transact(string str) returns()
|
||||
func (interactor *Interactor) PackTransact(str string) []byte {
|
||||
enc, err := interactor.abi.Pack("transact", str)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackTransactString is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x0d86a0e1.
|
||||
//
|
||||
// Solidity: function transactString() returns(string)
|
||||
func (interactor *Interactor) PackTransactString() []byte {
|
||||
enc, err := interactor.abi.Pack("transactString")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackTransactString is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x0d86a0e1.
|
||||
//
|
||||
// Solidity: function transactString() returns(string)
|
||||
func (interactor *Interactor) UnpackTransactString(data []byte) (string, error) {
|
||||
out, err := interactor.abi.Unpack("transactString", data)
|
||||
if err != nil {
|
||||
return *new(string), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(string)).(*string)
|
||||
return out0, err
|
||||
}
|
||||
137
accounts/abi/abigen/testdata/v2/nameconflict.go.txt
vendored
Normal file
137
accounts/abi/abigen/testdata/v2/nameconflict.go.txt
vendored
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// Oraclerequest is an auto generated low-level Go binding around an user-defined struct.
|
||||
type Oraclerequest struct {
|
||||
Data []byte
|
||||
Data0 []byte
|
||||
}
|
||||
|
||||
// NameConflictMetaData contains all meta data concerning the NameConflict contract.
|
||||
var NameConflictMetaData = bind.MetaData{
|
||||
ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"msg\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"_msg\",\"type\":\"int256\"}],\"name\":\"log\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"internalType\":\"structoracle.request\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"addRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRequest\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"internalType\":\"structoracle.request\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "8f6e2703b307244ae6bd61ed94ce959cf9",
|
||||
Bin: "0x608060405234801561001057600080fd5b5061042b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c2bb515f1461003b578063cce7b04814610059575b600080fd5b610043610075565b60405161005091906101af565b60405180910390f35b610073600480360381019061006e91906103ac565b6100b5565b005b61007d6100b8565b604051806040016040528060405180602001604052806000815250815260200160405180602001604052806000815250815250905090565b50565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561010c5780820151818401526020810190506100f1565b8381111561011b576000848401525b50505050565b6000601f19601f8301169050919050565b600061013d826100d2565b61014781856100dd565b93506101578185602086016100ee565b61016081610121565b840191505092915050565b600060408301600083015184820360008601526101888282610132565b915050602083015184820360208601526101a28282610132565b9150508091505092915050565b600060208201905081810360008301526101c9818461016b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022282610121565b810181811067ffffffffffffffff82111715610241576102406101ea565b5b80604052505050565b60006102546101d1565b90506102608282610219565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561028f5761028e6101ea565b5b61029882610121565b9050602081019050919050565b82818337600083830152505050565b60006102c76102c284610274565b61024a565b9050828152602081018484840111156102e3576102e261026f565b5b6102ee8482856102a5565b509392505050565b600082601f83011261030b5761030a61026a565b5b813561031b8482602086016102b4565b91505092915050565b60006040828403121561033a576103396101e5565b5b610344604061024a565b9050600082013567ffffffffffffffff81111561036457610363610265565b5b610370848285016102f6565b600083015250602082013567ffffffffffffffff81111561039457610393610265565b5b6103a0848285016102f6565b60208301525092915050565b6000602082840312156103c2576103c16101db565b5b600082013567ffffffffffffffff8111156103e0576103df6101e0565b5b6103ec84828501610324565b9150509291505056fea264697066735822122033bca1606af9b6aeba1673f98c52003cec19338539fb44b86690ce82c51483b564736f6c634300080e0033",
|
||||
}
|
||||
|
||||
// NameConflict is an auto generated Go binding around an Ethereum contract.
|
||||
type NameConflict struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewNameConflict creates a new instance of NameConflict.
|
||||
func NewNameConflict() *NameConflict {
|
||||
parsed, err := NameConflictMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &NameConflict{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *NameConflict) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackAddRequest is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xcce7b048.
|
||||
//
|
||||
// Solidity: function addRequest((bytes,bytes) req) pure returns()
|
||||
func (nameConflict *NameConflict) PackAddRequest(req Oraclerequest) []byte {
|
||||
enc, err := nameConflict.abi.Pack("addRequest", req)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackGetRequest is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xc2bb515f.
|
||||
//
|
||||
// Solidity: function getRequest() pure returns((bytes,bytes))
|
||||
func (nameConflict *NameConflict) PackGetRequest() []byte {
|
||||
enc, err := nameConflict.abi.Pack("getRequest")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackGetRequest is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xc2bb515f.
|
||||
//
|
||||
// Solidity: function getRequest() pure returns((bytes,bytes))
|
||||
func (nameConflict *NameConflict) UnpackGetRequest(data []byte) (Oraclerequest, error) {
|
||||
out, err := nameConflict.abi.Unpack("getRequest", data)
|
||||
if err != nil {
|
||||
return *new(Oraclerequest), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(Oraclerequest)).(*Oraclerequest)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// NameConflictLog represents a log event raised by the NameConflict contract.
|
||||
type NameConflictLog struct {
|
||||
Msg *big.Int
|
||||
Msg0 *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const NameConflictLogEventName = "log"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (NameConflictLog) ContractEventName() string {
|
||||
return NameConflictLogEventName
|
||||
}
|
||||
|
||||
// UnpackLogEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event log(int256 msg, int256 _msg)
|
||||
func (nameConflict *NameConflict) UnpackLogEvent(log *types.Log) (*NameConflictLog, error) {
|
||||
event := "log"
|
||||
if log.Topics[0] != nameConflict.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(NameConflictLog)
|
||||
if len(log.Data) > 0 {
|
||||
if err := nameConflict.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range nameConflict.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
129
accounts/abi/abigen/testdata/v2/numericmethodname.go.txt
vendored
Normal file
129
accounts/abi/abigen/testdata/v2/numericmethodname.go.txt
vendored
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// NumericMethodNameMetaData contains all meta data concerning the NumericMethodName contract.
|
||||
var NumericMethodNameMetaData = bind.MetaData{
|
||||
ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_param\",\"type\":\"address\"}],\"name\":\"_1TestEvent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"_1test\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__1test\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__2test\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "a691b347afbc44b90dd9a1dfbc65661904",
|
||||
Bin: "0x6080604052348015600f57600080fd5b5060958061001e6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80639d993132146041578063d02767c7146049578063ffa02795146051575b600080fd5b60476059565b005b604f605b565b005b6057605d565b005b565b565b56fea26469706673582212200382ca602dff96a7e2ba54657985e2b4ac423a56abe4a1f0667bc635c4d4371f64736f6c63430008110033",
|
||||
}
|
||||
|
||||
// NumericMethodName is an auto generated Go binding around an Ethereum contract.
|
||||
type NumericMethodName struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewNumericMethodName creates a new instance of NumericMethodName.
|
||||
func NewNumericMethodName() *NumericMethodName {
|
||||
parsed, err := NumericMethodNameMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &NumericMethodName{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *NumericMethodName) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackE1test is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xffa02795.
|
||||
//
|
||||
// Solidity: function _1test() pure returns()
|
||||
func (numericMethodName *NumericMethodName) PackE1test() []byte {
|
||||
enc, err := numericMethodName.abi.Pack("_1test")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackE1test0 is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xd02767c7.
|
||||
//
|
||||
// Solidity: function __1test() pure returns()
|
||||
func (numericMethodName *NumericMethodName) PackE1test0() []byte {
|
||||
enc, err := numericMethodName.abi.Pack("__1test")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackE2test is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x9d993132.
|
||||
//
|
||||
// Solidity: function __2test() pure returns()
|
||||
func (numericMethodName *NumericMethodName) PackE2test() []byte {
|
||||
enc, err := numericMethodName.abi.Pack("__2test")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// NumericMethodNameE1TestEvent represents a _1TestEvent event raised by the NumericMethodName contract.
|
||||
type NumericMethodNameE1TestEvent struct {
|
||||
Param common.Address
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const NumericMethodNameE1TestEventEventName = "_1TestEvent"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (NumericMethodNameE1TestEvent) ContractEventName() string {
|
||||
return NumericMethodNameE1TestEventEventName
|
||||
}
|
||||
|
||||
// UnpackE1TestEventEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event _1TestEvent(address _param)
|
||||
func (numericMethodName *NumericMethodName) UnpackE1TestEventEvent(log *types.Log) (*NumericMethodNameE1TestEvent, error) {
|
||||
event := "_1TestEvent"
|
||||
if log.Topics[0] != numericMethodName.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(NumericMethodNameE1TestEvent)
|
||||
if len(log.Data) > 0 {
|
||||
if err := numericMethodName.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range numericMethodName.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
253
accounts/abi/abigen/testdata/v2/outputchecker.go.txt
vendored
Normal file
253
accounts/abi/abigen/testdata/v2/outputchecker.go.txt
vendored
Normal file
|
|
@ -0,0 +1,253 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// OutputCheckerMetaData contains all meta data concerning the OutputChecker contract.
|
||||
var OutputCheckerMetaData = bind.MetaData{
|
||||
ABI: "[{\"type\":\"function\",\"name\":\"noOutput\",\"constant\":true,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"namedOutput\",\"constant\":true,\"inputs\":[],\"outputs\":[{\"name\":\"str\",\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"anonOutput\",\"constant\":true,\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"namedOutputs\",\"constant\":true,\"inputs\":[],\"outputs\":[{\"name\":\"str1\",\"type\":\"string\"},{\"name\":\"str2\",\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"collidingOutputs\",\"constant\":true,\"inputs\":[],\"outputs\":[{\"name\":\"str\",\"type\":\"string\"},{\"name\":\"Str\",\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"anonOutputs\",\"constant\":true,\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\"},{\"name\":\"\",\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"mixedOutputs\",\"constant\":true,\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\"},{\"name\":\"str\",\"type\":\"string\"}]}]",
|
||||
ID: "cc1d4e235801a590b506d5130b0cca90a1",
|
||||
}
|
||||
|
||||
// OutputChecker is an auto generated Go binding around an Ethereum contract.
|
||||
type OutputChecker struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewOutputChecker creates a new instance of OutputChecker.
|
||||
func NewOutputChecker() *OutputChecker {
|
||||
parsed, err := OutputCheckerMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &OutputChecker{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *OutputChecker) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackAnonOutput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x008bda05.
|
||||
//
|
||||
// Solidity: function anonOutput() returns(string)
|
||||
func (outputChecker *OutputChecker) PackAnonOutput() []byte {
|
||||
enc, err := outputChecker.abi.Pack("anonOutput")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackAnonOutput is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x008bda05.
|
||||
//
|
||||
// Solidity: function anonOutput() returns(string)
|
||||
func (outputChecker *OutputChecker) UnpackAnonOutput(data []byte) (string, error) {
|
||||
out, err := outputChecker.abi.Unpack("anonOutput", data)
|
||||
if err != nil {
|
||||
return *new(string), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(string)).(*string)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackAnonOutputs is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x3c401115.
|
||||
//
|
||||
// Solidity: function anonOutputs() returns(string, string)
|
||||
func (outputChecker *OutputChecker) PackAnonOutputs() []byte {
|
||||
enc, err := outputChecker.abi.Pack("anonOutputs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// AnonOutputsOutput serves as a container for the return parameters of contract
|
||||
// method AnonOutputs.
|
||||
type AnonOutputsOutput struct {
|
||||
Arg0 string
|
||||
Arg1 string
|
||||
}
|
||||
|
||||
// UnpackAnonOutputs is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x3c401115.
|
||||
//
|
||||
// Solidity: function anonOutputs() returns(string, string)
|
||||
func (outputChecker *OutputChecker) UnpackAnonOutputs(data []byte) (AnonOutputsOutput, error) {
|
||||
out, err := outputChecker.abi.Unpack("anonOutputs", data)
|
||||
outstruct := new(AnonOutputsOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Arg0 = *abi.ConvertType(out[0], new(string)).(*string)
|
||||
outstruct.Arg1 = *abi.ConvertType(out[1], new(string)).(*string)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackCollidingOutputs is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xeccbc1ee.
|
||||
//
|
||||
// Solidity: function collidingOutputs() returns(string str, string Str)
|
||||
func (outputChecker *OutputChecker) PackCollidingOutputs() []byte {
|
||||
enc, err := outputChecker.abi.Pack("collidingOutputs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// CollidingOutputsOutput serves as a container for the return parameters of contract
|
||||
// method CollidingOutputs.
|
||||
type CollidingOutputsOutput struct {
|
||||
Str string
|
||||
Str0 string
|
||||
}
|
||||
|
||||
// UnpackCollidingOutputs is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xeccbc1ee.
|
||||
//
|
||||
// Solidity: function collidingOutputs() returns(string str, string Str)
|
||||
func (outputChecker *OutputChecker) UnpackCollidingOutputs(data []byte) (CollidingOutputsOutput, error) {
|
||||
out, err := outputChecker.abi.Unpack("collidingOutputs", data)
|
||||
outstruct := new(CollidingOutputsOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Str = *abi.ConvertType(out[0], new(string)).(*string)
|
||||
outstruct.Str0 = *abi.ConvertType(out[1], new(string)).(*string)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackMixedOutputs is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x21b77b44.
|
||||
//
|
||||
// Solidity: function mixedOutputs() returns(string, string str)
|
||||
func (outputChecker *OutputChecker) PackMixedOutputs() []byte {
|
||||
enc, err := outputChecker.abi.Pack("mixedOutputs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// MixedOutputsOutput serves as a container for the return parameters of contract
|
||||
// method MixedOutputs.
|
||||
type MixedOutputsOutput struct {
|
||||
Arg0 string
|
||||
Str string
|
||||
}
|
||||
|
||||
// UnpackMixedOutputs is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x21b77b44.
|
||||
//
|
||||
// Solidity: function mixedOutputs() returns(string, string str)
|
||||
func (outputChecker *OutputChecker) UnpackMixedOutputs(data []byte) (MixedOutputsOutput, error) {
|
||||
out, err := outputChecker.abi.Unpack("mixedOutputs", data)
|
||||
outstruct := new(MixedOutputsOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Arg0 = *abi.ConvertType(out[0], new(string)).(*string)
|
||||
outstruct.Str = *abi.ConvertType(out[1], new(string)).(*string)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackNamedOutput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x5e632bd5.
|
||||
//
|
||||
// Solidity: function namedOutput() returns(string str)
|
||||
func (outputChecker *OutputChecker) PackNamedOutput() []byte {
|
||||
enc, err := outputChecker.abi.Pack("namedOutput")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackNamedOutput is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x5e632bd5.
|
||||
//
|
||||
// Solidity: function namedOutput() returns(string str)
|
||||
func (outputChecker *OutputChecker) UnpackNamedOutput(data []byte) (string, error) {
|
||||
out, err := outputChecker.abi.Unpack("namedOutput", data)
|
||||
if err != nil {
|
||||
return *new(string), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(string)).(*string)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackNamedOutputs is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x7970a189.
|
||||
//
|
||||
// Solidity: function namedOutputs() returns(string str1, string str2)
|
||||
func (outputChecker *OutputChecker) PackNamedOutputs() []byte {
|
||||
enc, err := outputChecker.abi.Pack("namedOutputs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// NamedOutputsOutput serves as a container for the return parameters of contract
|
||||
// method NamedOutputs.
|
||||
type NamedOutputsOutput struct {
|
||||
Str1 string
|
||||
Str2 string
|
||||
}
|
||||
|
||||
// UnpackNamedOutputs is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x7970a189.
|
||||
//
|
||||
// Solidity: function namedOutputs() returns(string str1, string str2)
|
||||
func (outputChecker *OutputChecker) UnpackNamedOutputs(data []byte) (NamedOutputsOutput, error) {
|
||||
out, err := outputChecker.abi.Unpack("namedOutputs", data)
|
||||
outstruct := new(NamedOutputsOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Str1 = *abi.ConvertType(out[0], new(string)).(*string)
|
||||
outstruct.Str2 = *abi.ConvertType(out[1], new(string)).(*string)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackNoOutput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x625f0306.
|
||||
//
|
||||
// Solidity: function noOutput() returns()
|
||||
func (outputChecker *OutputChecker) PackNoOutput() []byte {
|
||||
enc, err := outputChecker.abi.Pack("noOutput")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
159
accounts/abi/abigen/testdata/v2/overload.go.txt
vendored
Normal file
159
accounts/abi/abigen/testdata/v2/overload.go.txt
vendored
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// OverloadMetaData contains all meta data concerning the Overload contract.
|
||||
var OverloadMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\"},{\"name\":\"j\",\"type\":\"uint256\"}],\"name\":\"foo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"foo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"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\"}]",
|
||||
ID: "f49f0ff7ed407de5c37214f49309072aec",
|
||||
Bin: "0x608060405234801561001057600080fd5b50610153806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806304bc52f81461003b5780632fbebd3814610073575b600080fd5b6100716004803603604081101561005157600080fd5b8101908080359060200190929190803590602001909291905050506100a1565b005b61009f6004803603602081101561008957600080fd5b81019080803590602001909291905050506100e4565b005b7fae42e9514233792a47a1e4554624e83fe852228e1503f63cd383e8a431f4f46d8282604051808381526020018281526020019250505060405180910390a15050565b7f0423a1321222a0a8716c22b92fac42d85a45a612b696a461784d9fa537c81e5c816040518082815260200191505060405180910390a15056fea265627a7a72305820e22b049858b33291cbe67eeaece0c5f64333e439d27032ea8337d08b1de18fe864736f6c634300050a0032",
|
||||
}
|
||||
|
||||
// Overload is an auto generated Go binding around an Ethereum contract.
|
||||
type Overload struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewOverload creates a new instance of Overload.
|
||||
func NewOverload() *Overload {
|
||||
parsed, err := OverloadMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Overload{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Overload) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackFoo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x04bc52f8.
|
||||
//
|
||||
// Solidity: function foo(uint256 i, uint256 j) returns()
|
||||
func (overload *Overload) PackFoo(i *big.Int, j *big.Int) []byte {
|
||||
enc, err := overload.abi.Pack("foo", i, j)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackFoo0 is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2fbebd38.
|
||||
//
|
||||
// Solidity: function foo(uint256 i) returns()
|
||||
func (overload *Overload) PackFoo0(i *big.Int) []byte {
|
||||
enc, err := overload.abi.Pack("foo0", i)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// OverloadBar represents a bar event raised by the Overload contract.
|
||||
type OverloadBar struct {
|
||||
I *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const OverloadBarEventName = "bar"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (OverloadBar) ContractEventName() string {
|
||||
return OverloadBarEventName
|
||||
}
|
||||
|
||||
// UnpackBarEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event bar(uint256 i)
|
||||
func (overload *Overload) UnpackBarEvent(log *types.Log) (*OverloadBar, error) {
|
||||
event := "bar"
|
||||
if log.Topics[0] != overload.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(OverloadBar)
|
||||
if len(log.Data) > 0 {
|
||||
if err := overload.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range overload.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// OverloadBar0 represents a bar0 event raised by the Overload contract.
|
||||
type OverloadBar0 struct {
|
||||
I *big.Int
|
||||
J *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const OverloadBar0EventName = "bar0"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (OverloadBar0) ContractEventName() string {
|
||||
return OverloadBar0EventName
|
||||
}
|
||||
|
||||
// UnpackBar0Event is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event bar(uint256 i, uint256 j)
|
||||
func (overload *Overload) UnpackBar0Event(log *types.Log) (*OverloadBar0, error) {
|
||||
event := "bar0"
|
||||
if log.Topics[0] != overload.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(OverloadBar0)
|
||||
if len(log.Data) > 0 {
|
||||
if err := overload.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range overload.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
64
accounts/abi/abigen/testdata/v2/rangekeyword.go.txt
vendored
Normal file
64
accounts/abi/abigen/testdata/v2/rangekeyword.go.txt
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// RangeKeywordMetaData contains all meta data concerning the RangeKeyword contract.
|
||||
var RangeKeywordMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"range\",\"type\":\"uint256\"}],\"name\":\"functionWithKeywordParameter\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "cec8c872ba06feb1b8f0a00e7b237eb226",
|
||||
Bin: "0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063527a119f14602d575b600080fd5b60436004803603810190603f9190605b565b6045565b005b50565b6000813590506055816092565b92915050565b600060208284031215606e57606d608d565b5b6000607a848285016048565b91505092915050565b6000819050919050565b600080fd5b6099816083565b811460a357600080fd5b5056fea2646970667358221220d4f4525e2615516394055d369fb17df41c359e5e962734f27fd683ea81fd9db164736f6c63430008070033",
|
||||
}
|
||||
|
||||
// RangeKeyword is an auto generated Go binding around an Ethereum contract.
|
||||
type RangeKeyword struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewRangeKeyword creates a new instance of RangeKeyword.
|
||||
func NewRangeKeyword() *RangeKeyword {
|
||||
parsed, err := RangeKeywordMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &RangeKeyword{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *RangeKeyword) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackFunctionWithKeywordParameter is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x527a119f.
|
||||
//
|
||||
// Solidity: function functionWithKeywordParameter(uint256 range) pure returns()
|
||||
func (rangeKeyword *RangeKeyword) PackFunctionWithKeywordParameter(arg0 *big.Int) []byte {
|
||||
enc, err := rangeKeyword.abi.Pack("functionWithKeywordParameter", arg0)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
152
accounts/abi/abigen/testdata/v2/slicer.go.txt
vendored
Normal file
152
accounts/abi/abigen/testdata/v2/slicer.go.txt
vendored
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// SlicerMetaData contains all meta data concerning the Slicer contract.
|
||||
var SlicerMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":true,\"inputs\":[{\"name\":\"input\",\"type\":\"address[]\"}],\"name\":\"echoAddresses\",\"outputs\":[{\"name\":\"output\",\"type\":\"address[]\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"input\",\"type\":\"uint24[23]\"}],\"name\":\"echoFancyInts\",\"outputs\":[{\"name\":\"output\",\"type\":\"uint24[23]\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"input\",\"type\":\"int256[]\"}],\"name\":\"echoInts\",\"outputs\":[{\"name\":\"output\",\"type\":\"int256[]\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"input\",\"type\":\"bool[]\"}],\"name\":\"echoBools\",\"outputs\":[{\"name\":\"output\",\"type\":\"bool[]\"}],\"type\":\"function\"}]",
|
||||
ID: "082c0740ab6537c7169cb573d097c52112",
|
||||
Bin: "0x606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3",
|
||||
}
|
||||
|
||||
// Slicer is an auto generated Go binding around an Ethereum contract.
|
||||
type Slicer struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewSlicer creates a new instance of Slicer.
|
||||
func NewSlicer() *Slicer {
|
||||
parsed, err := SlicerMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Slicer{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Slicer) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackEchoAddresses is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xbe1127a3.
|
||||
//
|
||||
// Solidity: function echoAddresses(address[] input) returns(address[] output)
|
||||
func (slicer *Slicer) PackEchoAddresses(input []common.Address) []byte {
|
||||
enc, err := slicer.abi.Pack("echoAddresses", input)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackEchoAddresses is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xbe1127a3.
|
||||
//
|
||||
// Solidity: function echoAddresses(address[] input) returns(address[] output)
|
||||
func (slicer *Slicer) UnpackEchoAddresses(data []byte) ([]common.Address, error) {
|
||||
out, err := slicer.abi.Unpack("echoAddresses", data)
|
||||
if err != nil {
|
||||
return *new([]common.Address), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackEchoBools is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xf637e589.
|
||||
//
|
||||
// Solidity: function echoBools(bool[] input) returns(bool[] output)
|
||||
func (slicer *Slicer) PackEchoBools(input []bool) []byte {
|
||||
enc, err := slicer.abi.Pack("echoBools", input)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackEchoBools is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xf637e589.
|
||||
//
|
||||
// Solidity: function echoBools(bool[] input) returns(bool[] output)
|
||||
func (slicer *Slicer) UnpackEchoBools(data []byte) ([]bool, error) {
|
||||
out, err := slicer.abi.Unpack("echoBools", data)
|
||||
if err != nil {
|
||||
return *new([]bool), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new([]bool)).(*[]bool)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackEchoFancyInts is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xd88becc0.
|
||||
//
|
||||
// Solidity: function echoFancyInts(uint24[23] input) returns(uint24[23] output)
|
||||
func (slicer *Slicer) PackEchoFancyInts(input [23]*big.Int) []byte {
|
||||
enc, err := slicer.abi.Pack("echoFancyInts", input)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackEchoFancyInts is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xd88becc0.
|
||||
//
|
||||
// Solidity: function echoFancyInts(uint24[23] input) returns(uint24[23] output)
|
||||
func (slicer *Slicer) UnpackEchoFancyInts(data []byte) ([23]*big.Int, error) {
|
||||
out, err := slicer.abi.Unpack("echoFancyInts", data)
|
||||
if err != nil {
|
||||
return *new([23]*big.Int), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new([23]*big.Int)).(*[23]*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackEchoInts is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xe15a3db7.
|
||||
//
|
||||
// Solidity: function echoInts(int256[] input) returns(int256[] output)
|
||||
func (slicer *Slicer) PackEchoInts(input []*big.Int) []byte {
|
||||
enc, err := slicer.abi.Pack("echoInts", input)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackEchoInts is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xe15a3db7.
|
||||
//
|
||||
// Solidity: function echoInts(int256[] input) returns(int256[] output)
|
||||
func (slicer *Slicer) UnpackEchoInts(data []byte) ([]*big.Int, error) {
|
||||
out, err := slicer.abi.Unpack("echoInts", data)
|
||||
if err != nil {
|
||||
return *new([]*big.Int), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
119
accounts/abi/abigen/testdata/v2/structs.go.txt
vendored
Normal file
119
accounts/abi/abigen/testdata/v2/structs.go.txt
vendored
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// Struct0 is an auto generated low-level Go binding around an user-defined struct.
|
||||
type Struct0 struct {
|
||||
B [32]byte
|
||||
}
|
||||
|
||||
// StructsMetaData contains all meta data concerning the Structs contract.
|
||||
var StructsMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[],\"name\":\"F\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"B\",\"type\":\"bytes32\"}],\"internalType\":\"structStructs.A[]\",\"name\":\"a\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[]\",\"name\":\"c\",\"type\":\"uint256[]\"},{\"internalType\":\"bool[]\",\"name\":\"d\",\"type\":\"bool[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"G\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"B\",\"type\":\"bytes32\"}],\"internalType\":\"structStructs.A[]\",\"name\":\"a\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
|
||||
ID: "920a35318e7581766aec7a17218628a91d",
|
||||
Bin: "0x608060405234801561001057600080fd5b50610278806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806328811f591461003b5780636fecb6231461005b575b600080fd5b610043610070565b604051610052939291906101a0565b60405180910390f35b6100636100d6565b6040516100529190610186565b604080516002808252606082810190935282918291829190816020015b610095610131565b81526020019060019003908161008d575050805190915061026960611b9082906000906100be57fe5b60209081029190910101515293606093508392509050565b6040805160028082526060828101909352829190816020015b6100f7610131565b8152602001906001900390816100ef575050805190915061026960611b90829060009061012057fe5b602090810291909101015152905090565b60408051602081019091526000815290565b815260200190565b6000815180845260208085019450808401835b8381101561017b578151518752958201959082019060010161015e565b509495945050505050565b600060208252610199602083018461014b565b9392505050565b6000606082526101b3606083018661014b565b6020838203818501528186516101c98185610239565b91508288019350845b818110156101f3576101e5838651610143565b9484019492506001016101d2565b505084810360408601528551808252908201925081860190845b8181101561022b57825115158552938301939183019160010161020d565b509298975050505050505050565b9081526020019056fea2646970667358221220eb85327e285def14230424c52893aebecec1e387a50bb6b75fc4fdbed647f45f64736f6c63430006050033",
|
||||
}
|
||||
|
||||
// Structs is an auto generated Go binding around an Ethereum contract.
|
||||
type Structs struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewStructs creates a new instance of Structs.
|
||||
func NewStructs() *Structs {
|
||||
parsed, err := StructsMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Structs{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Structs) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackF is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x28811f59.
|
||||
//
|
||||
// Solidity: function F() view returns((bytes32)[] a, uint256[] c, bool[] d)
|
||||
func (structs *Structs) PackF() []byte {
|
||||
enc, err := structs.abi.Pack("F")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// FOutput serves as a container for the return parameters of contract
|
||||
// method F.
|
||||
type FOutput struct {
|
||||
A []Struct0
|
||||
C []*big.Int
|
||||
D []bool
|
||||
}
|
||||
|
||||
// UnpackF is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x28811f59.
|
||||
//
|
||||
// Solidity: function F() view returns((bytes32)[] a, uint256[] c, bool[] d)
|
||||
func (structs *Structs) UnpackF(data []byte) (FOutput, error) {
|
||||
out, err := structs.abi.Unpack("F", data)
|
||||
outstruct := new(FOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.A = *abi.ConvertType(out[0], new([]Struct0)).(*[]Struct0)
|
||||
outstruct.C = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
|
||||
outstruct.D = *abi.ConvertType(out[2], new([]bool)).(*[]bool)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackG is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x6fecb623.
|
||||
//
|
||||
// Solidity: function G() view returns((bytes32)[] a)
|
||||
func (structs *Structs) PackG() []byte {
|
||||
enc, err := structs.abi.Pack("G")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackG is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x6fecb623.
|
||||
//
|
||||
// Solidity: function G() view returns((bytes32)[] a)
|
||||
func (structs *Structs) UnpackG(data []byte) ([]Struct0, error) {
|
||||
out, err := structs.abi.Unpack("G", data)
|
||||
if err != nil {
|
||||
return *new([]Struct0), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new([]Struct0)).(*[]Struct0)
|
||||
return out0, err
|
||||
}
|
||||
319
accounts/abi/abigen/testdata/v2/token.go.txt
vendored
Normal file
319
accounts/abi/abigen/testdata/v2/token.go.txt
vendored
Normal file
|
|
@ -0,0 +1,319 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// TokenMetaData contains all meta data concerning the Token contract.
|
||||
var TokenMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"spentAllowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"inputs\":[{\"name\":\"initialSupply\",\"type\":\"uint256\"},{\"name\":\"tokenName\",\"type\":\"string\"},{\"name\":\"decimalUnits\",\"type\":\"uint8\"},{\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]",
|
||||
ID: "1317f51c845ce3bfb7c268e5337a825f12",
|
||||
Bin: "0x60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056",
|
||||
}
|
||||
|
||||
// Token is an auto generated Go binding around an Ethereum contract.
|
||||
type Token struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewToken creates a new instance of Token.
|
||||
func NewToken() *Token {
|
||||
parsed, err := TokenMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Token{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Token) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackConstructor is the Go binding used to pack the parameters required for
|
||||
// contract deployment.
|
||||
//
|
||||
// Solidity: constructor(uint256 initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) returns()
|
||||
func (token *Token) PackConstructor(initialSupply *big.Int, tokenName string, decimalUnits uint8, tokenSymbol string) []byte {
|
||||
enc, err := token.abi.Pack("", initialSupply, tokenName, decimalUnits, tokenSymbol)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackAllowance is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xdd62ed3e.
|
||||
//
|
||||
// Solidity: function allowance(address , address ) returns(uint256)
|
||||
func (token *Token) PackAllowance(arg0 common.Address, arg1 common.Address) []byte {
|
||||
enc, err := token.abi.Pack("allowance", arg0, arg1)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackAllowance is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xdd62ed3e.
|
||||
//
|
||||
// Solidity: function allowance(address , address ) returns(uint256)
|
||||
func (token *Token) UnpackAllowance(data []byte) (*big.Int, error) {
|
||||
out, err := token.abi.Unpack("allowance", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackApproveAndCall is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xcae9ca51.
|
||||
//
|
||||
// Solidity: function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns(bool success)
|
||||
func (token *Token) PackApproveAndCall(spender common.Address, value *big.Int, extraData []byte) []byte {
|
||||
enc, err := token.abi.Pack("approveAndCall", spender, value, extraData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackApproveAndCall is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xcae9ca51.
|
||||
//
|
||||
// Solidity: function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns(bool success)
|
||||
func (token *Token) UnpackApproveAndCall(data []byte) (bool, error) {
|
||||
out, err := token.abi.Unpack("approveAndCall", data)
|
||||
if err != nil {
|
||||
return *new(bool), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackBalanceOf is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x70a08231.
|
||||
//
|
||||
// Solidity: function balanceOf(address ) returns(uint256)
|
||||
func (token *Token) PackBalanceOf(arg0 common.Address) []byte {
|
||||
enc, err := token.abi.Pack("balanceOf", arg0)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackBalanceOf is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x70a08231.
|
||||
//
|
||||
// Solidity: function balanceOf(address ) returns(uint256)
|
||||
func (token *Token) UnpackBalanceOf(data []byte) (*big.Int, error) {
|
||||
out, err := token.abi.Unpack("balanceOf", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackDecimals is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x313ce567.
|
||||
//
|
||||
// Solidity: function decimals() returns(uint8)
|
||||
func (token *Token) PackDecimals() []byte {
|
||||
enc, err := token.abi.Pack("decimals")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDecimals is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x313ce567.
|
||||
//
|
||||
// Solidity: function decimals() returns(uint8)
|
||||
func (token *Token) UnpackDecimals(data []byte) (uint8, error) {
|
||||
out, err := token.abi.Unpack("decimals", data)
|
||||
if err != nil {
|
||||
return *new(uint8), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackName is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x06fdde03.
|
||||
//
|
||||
// Solidity: function name() returns(string)
|
||||
func (token *Token) PackName() []byte {
|
||||
enc, err := token.abi.Pack("name")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackName is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x06fdde03.
|
||||
//
|
||||
// Solidity: function name() returns(string)
|
||||
func (token *Token) UnpackName(data []byte) (string, error) {
|
||||
out, err := token.abi.Unpack("name", data)
|
||||
if err != nil {
|
||||
return *new(string), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(string)).(*string)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackSpentAllowance is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xdc3080f2.
|
||||
//
|
||||
// Solidity: function spentAllowance(address , address ) returns(uint256)
|
||||
func (token *Token) PackSpentAllowance(arg0 common.Address, arg1 common.Address) []byte {
|
||||
enc, err := token.abi.Pack("spentAllowance", arg0, arg1)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackSpentAllowance is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xdc3080f2.
|
||||
//
|
||||
// Solidity: function spentAllowance(address , address ) returns(uint256)
|
||||
func (token *Token) UnpackSpentAllowance(data []byte) (*big.Int, error) {
|
||||
out, err := token.abi.Unpack("spentAllowance", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackSymbol is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x95d89b41.
|
||||
//
|
||||
// Solidity: function symbol() returns(string)
|
||||
func (token *Token) PackSymbol() []byte {
|
||||
enc, err := token.abi.Pack("symbol")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackSymbol is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x95d89b41.
|
||||
//
|
||||
// Solidity: function symbol() returns(string)
|
||||
func (token *Token) UnpackSymbol(data []byte) (string, error) {
|
||||
out, err := token.abi.Unpack("symbol", data)
|
||||
if err != nil {
|
||||
return *new(string), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(string)).(*string)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackTransfer is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xa9059cbb.
|
||||
//
|
||||
// Solidity: function transfer(address _to, uint256 _value) returns()
|
||||
func (token *Token) PackTransfer(to common.Address, value *big.Int) []byte {
|
||||
enc, err := token.abi.Pack("transfer", to, value)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackTransferFrom is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x23b872dd.
|
||||
//
|
||||
// Solidity: function transferFrom(address _from, address _to, uint256 _value) returns(bool success)
|
||||
func (token *Token) PackTransferFrom(from common.Address, to common.Address, value *big.Int) []byte {
|
||||
enc, err := token.abi.Pack("transferFrom", from, to, value)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackTransferFrom is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x23b872dd.
|
||||
//
|
||||
// Solidity: function transferFrom(address _from, address _to, uint256 _value) returns(bool success)
|
||||
func (token *Token) UnpackTransferFrom(data []byte) (bool, error) {
|
||||
out, err := token.abi.Unpack("transferFrom", data)
|
||||
if err != nil {
|
||||
return *new(bool), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// TokenTransfer represents a Transfer event raised by the Token contract.
|
||||
type TokenTransfer struct {
|
||||
From common.Address
|
||||
To common.Address
|
||||
Value *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const TokenTransferEventName = "Transfer"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (TokenTransfer) ContractEventName() string {
|
||||
return TokenTransferEventName
|
||||
}
|
||||
|
||||
// UnpackTransferEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
|
||||
func (token *Token) UnpackTransferEvent(log *types.Log) (*TokenTransfer, error) {
|
||||
event := "Transfer"
|
||||
if log.Topics[0] != token.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(TokenTransfer)
|
||||
if len(log.Data) > 0 {
|
||||
if err := token.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range token.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
228
accounts/abi/abigen/testdata/v2/tuple.go.txt
vendored
Normal file
228
accounts/abi/abigen/testdata/v2/tuple.go.txt
vendored
Normal file
File diff suppressed because one or more lines are too long
89
accounts/abi/abigen/testdata/v2/tupler.go.txt
vendored
Normal file
89
accounts/abi/abigen/testdata/v2/tupler.go.txt
vendored
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// TuplerMetaData contains all meta data concerning the Tupler contract.
|
||||
var TuplerMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":true,\"inputs\":[],\"name\":\"tuple\",\"outputs\":[{\"name\":\"a\",\"type\":\"string\"},{\"name\":\"b\",\"type\":\"int256\"},{\"name\":\"c\",\"type\":\"bytes32\"}],\"type\":\"function\"}]",
|
||||
ID: "a8f4d2061f55c712cfae266c426a1cd568",
|
||||
Bin: "0x606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3",
|
||||
}
|
||||
|
||||
// Tupler is an auto generated Go binding around an Ethereum contract.
|
||||
type Tupler struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewTupler creates a new instance of Tupler.
|
||||
func NewTupler() *Tupler {
|
||||
parsed, err := TuplerMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Tupler{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Tupler) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackTuple is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x3175aae2.
|
||||
//
|
||||
// Solidity: function tuple() returns(string a, int256 b, bytes32 c)
|
||||
func (tupler *Tupler) PackTuple() []byte {
|
||||
enc, err := tupler.abi.Pack("tuple")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// TupleOutput serves as a container for the return parameters of contract
|
||||
// method Tuple.
|
||||
type TupleOutput struct {
|
||||
A string
|
||||
B *big.Int
|
||||
C [32]byte
|
||||
}
|
||||
|
||||
// UnpackTuple is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x3175aae2.
|
||||
//
|
||||
// Solidity: function tuple() returns(string a, int256 b, bytes32 c)
|
||||
func (tupler *Tupler) UnpackTuple(data []byte) (TupleOutput, error) {
|
||||
out, err := tupler.abi.Unpack("tuple", data)
|
||||
outstruct := new(TupleOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.A = *abi.ConvertType(out[0], new(string)).(*string)
|
||||
outstruct.B = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
outstruct.C = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
322
accounts/abi/abigen/testdata/v2/underscorer.go.txt
vendored
Normal file
322
accounts/abi/abigen/testdata/v2/underscorer.go.txt
vendored
Normal file
|
|
@ -0,0 +1,322 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package bindtests
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// UnderscorerMetaData contains all meta data concerning the Underscorer contract.
|
||||
var UnderscorerMetaData = bind.MetaData{
|
||||
ABI: "[{\"constant\":true,\"inputs\":[],\"name\":\"LowerUpperCollision\",\"outputs\":[{\"name\":\"_res\",\"type\":\"int256\"},{\"name\":\"Res\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_under_scored_func\",\"outputs\":[{\"name\":\"_int\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"UnderscoredOutput\",\"outputs\":[{\"name\":\"_int\",\"type\":\"int256\"},{\"name\":\"_string\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PurelyUnderscoredOutput\",\"outputs\":[{\"name\":\"_\",\"type\":\"int256\"},{\"name\":\"res\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"UpperLowerCollision\",\"outputs\":[{\"name\":\"_Res\",\"type\":\"int256\"},{\"name\":\"res\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"AllPurelyUnderscoredOutput\",\"outputs\":[{\"name\":\"_\",\"type\":\"int256\"},{\"name\":\"__\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"UpperUpperCollision\",\"outputs\":[{\"name\":\"_Res\",\"type\":\"int256\"},{\"name\":\"Res\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"LowerLowerCollision\",\"outputs\":[{\"name\":\"_res\",\"type\":\"int256\"},{\"name\":\"res\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]",
|
||||
ID: "5873a90ab43c925dfced86ad53f871f01d",
|
||||
Bin: "0x6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029",
|
||||
}
|
||||
|
||||
// Underscorer is an auto generated Go binding around an Ethereum contract.
|
||||
type Underscorer struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewUnderscorer creates a new instance of Underscorer.
|
||||
func NewUnderscorer() *Underscorer {
|
||||
parsed, err := UnderscorerMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &Underscorer{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *Underscorer) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackAllPurelyUnderscoredOutput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xb564b34d.
|
||||
//
|
||||
// Solidity: function AllPurelyUnderscoredOutput() view returns(int256 _, int256 __)
|
||||
func (underscorer *Underscorer) PackAllPurelyUnderscoredOutput() []byte {
|
||||
enc, err := underscorer.abi.Pack("AllPurelyUnderscoredOutput")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// AllPurelyUnderscoredOutputOutput serves as a container for the return parameters of contract
|
||||
// method AllPurelyUnderscoredOutput.
|
||||
type AllPurelyUnderscoredOutputOutput struct {
|
||||
Arg0 *big.Int
|
||||
Arg1 *big.Int
|
||||
}
|
||||
|
||||
// UnpackAllPurelyUnderscoredOutput is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xb564b34d.
|
||||
//
|
||||
// Solidity: function AllPurelyUnderscoredOutput() view returns(int256 _, int256 __)
|
||||
func (underscorer *Underscorer) UnpackAllPurelyUnderscoredOutput(data []byte) (AllPurelyUnderscoredOutputOutput, error) {
|
||||
out, err := underscorer.abi.Unpack("AllPurelyUnderscoredOutput", data)
|
||||
outstruct := new(AllPurelyUnderscoredOutputOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Arg0 = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Arg1 = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackLowerLowerCollision is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xe409ca45.
|
||||
//
|
||||
// Solidity: function LowerLowerCollision() view returns(int256 _res, int256 res)
|
||||
func (underscorer *Underscorer) PackLowerLowerCollision() []byte {
|
||||
enc, err := underscorer.abi.Pack("LowerLowerCollision")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// LowerLowerCollisionOutput serves as a container for the return parameters of contract
|
||||
// method LowerLowerCollision.
|
||||
type LowerLowerCollisionOutput struct {
|
||||
Res *big.Int
|
||||
Res0 *big.Int
|
||||
}
|
||||
|
||||
// UnpackLowerLowerCollision is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xe409ca45.
|
||||
//
|
||||
// Solidity: function LowerLowerCollision() view returns(int256 _res, int256 res)
|
||||
func (underscorer *Underscorer) UnpackLowerLowerCollision(data []byte) (LowerLowerCollisionOutput, error) {
|
||||
out, err := underscorer.abi.Unpack("LowerLowerCollision", data)
|
||||
outstruct := new(LowerLowerCollisionOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Res = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Res0 = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackLowerUpperCollision is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x03a59213.
|
||||
//
|
||||
// Solidity: function LowerUpperCollision() view returns(int256 _res, int256 Res)
|
||||
func (underscorer *Underscorer) PackLowerUpperCollision() []byte {
|
||||
enc, err := underscorer.abi.Pack("LowerUpperCollision")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// LowerUpperCollisionOutput serves as a container for the return parameters of contract
|
||||
// method LowerUpperCollision.
|
||||
type LowerUpperCollisionOutput struct {
|
||||
Res *big.Int
|
||||
Res0 *big.Int
|
||||
}
|
||||
|
||||
// UnpackLowerUpperCollision is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x03a59213.
|
||||
//
|
||||
// Solidity: function LowerUpperCollision() view returns(int256 _res, int256 Res)
|
||||
func (underscorer *Underscorer) UnpackLowerUpperCollision(data []byte) (LowerUpperCollisionOutput, error) {
|
||||
out, err := underscorer.abi.Unpack("LowerUpperCollision", data)
|
||||
outstruct := new(LowerUpperCollisionOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Res = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Res0 = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackPurelyUnderscoredOutput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x9df48485.
|
||||
//
|
||||
// Solidity: function PurelyUnderscoredOutput() view returns(int256 _, int256 res)
|
||||
func (underscorer *Underscorer) PackPurelyUnderscoredOutput() []byte {
|
||||
enc, err := underscorer.abi.Pack("PurelyUnderscoredOutput")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PurelyUnderscoredOutputOutput serves as a container for the return parameters of contract
|
||||
// method PurelyUnderscoredOutput.
|
||||
type PurelyUnderscoredOutputOutput struct {
|
||||
Arg0 *big.Int
|
||||
Res *big.Int
|
||||
}
|
||||
|
||||
// UnpackPurelyUnderscoredOutput is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x9df48485.
|
||||
//
|
||||
// Solidity: function PurelyUnderscoredOutput() view returns(int256 _, int256 res)
|
||||
func (underscorer *Underscorer) UnpackPurelyUnderscoredOutput(data []byte) (PurelyUnderscoredOutputOutput, error) {
|
||||
out, err := underscorer.abi.Unpack("PurelyUnderscoredOutput", data)
|
||||
outstruct := new(PurelyUnderscoredOutputOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Arg0 = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Res = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackUnderscoredOutput is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x67e6633d.
|
||||
//
|
||||
// Solidity: function UnderscoredOutput() view returns(int256 _int, string _string)
|
||||
func (underscorer *Underscorer) PackUnderscoredOutput() []byte {
|
||||
enc, err := underscorer.abi.Pack("UnderscoredOutput")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnderscoredOutputOutput serves as a container for the return parameters of contract
|
||||
// method UnderscoredOutput.
|
||||
type UnderscoredOutputOutput struct {
|
||||
Int *big.Int
|
||||
String string
|
||||
}
|
||||
|
||||
// UnpackUnderscoredOutput is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x67e6633d.
|
||||
//
|
||||
// Solidity: function UnderscoredOutput() view returns(int256 _int, string _string)
|
||||
func (underscorer *Underscorer) UnpackUnderscoredOutput(data []byte) (UnderscoredOutputOutput, error) {
|
||||
out, err := underscorer.abi.Unpack("UnderscoredOutput", data)
|
||||
outstruct := new(UnderscoredOutputOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Int = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.String = *abi.ConvertType(out[1], new(string)).(*string)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackUpperLowerCollision is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xaf7486ab.
|
||||
//
|
||||
// Solidity: function UpperLowerCollision() view returns(int256 _Res, int256 res)
|
||||
func (underscorer *Underscorer) PackUpperLowerCollision() []byte {
|
||||
enc, err := underscorer.abi.Pack("UpperLowerCollision")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UpperLowerCollisionOutput serves as a container for the return parameters of contract
|
||||
// method UpperLowerCollision.
|
||||
type UpperLowerCollisionOutput struct {
|
||||
Res *big.Int
|
||||
Res0 *big.Int
|
||||
}
|
||||
|
||||
// UnpackUpperLowerCollision is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xaf7486ab.
|
||||
//
|
||||
// Solidity: function UpperLowerCollision() view returns(int256 _Res, int256 res)
|
||||
func (underscorer *Underscorer) UnpackUpperLowerCollision(data []byte) (UpperLowerCollisionOutput, error) {
|
||||
out, err := underscorer.abi.Unpack("UpperLowerCollision", data)
|
||||
outstruct := new(UpperLowerCollisionOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Res = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Res0 = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackUpperUpperCollision is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xe02ab24d.
|
||||
//
|
||||
// Solidity: function UpperUpperCollision() view returns(int256 _Res, int256 Res)
|
||||
func (underscorer *Underscorer) PackUpperUpperCollision() []byte {
|
||||
enc, err := underscorer.abi.Pack("UpperUpperCollision")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UpperUpperCollisionOutput serves as a container for the return parameters of contract
|
||||
// method UpperUpperCollision.
|
||||
type UpperUpperCollisionOutput struct {
|
||||
Res *big.Int
|
||||
Res0 *big.Int
|
||||
}
|
||||
|
||||
// UnpackUpperUpperCollision is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xe02ab24d.
|
||||
//
|
||||
// Solidity: function UpperUpperCollision() view returns(int256 _Res, int256 Res)
|
||||
func (underscorer *Underscorer) UnpackUpperUpperCollision(data []byte) (UpperUpperCollisionOutput, error) {
|
||||
out, err := underscorer.abi.Unpack("UpperUpperCollision", data)
|
||||
outstruct := new(UpperUpperCollisionOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Res = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Res0 = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackUnderScoredFunc is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x46546dbe.
|
||||
//
|
||||
// Solidity: function _under_scored_func() view returns(int256 _int)
|
||||
func (underscorer *Underscorer) PackUnderScoredFunc() []byte {
|
||||
enc, err := underscorer.abi.Pack("_under_scored_func")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackUnderScoredFunc is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x46546dbe.
|
||||
//
|
||||
// Solidity: function _under_scored_func() view returns(int256 _int)
|
||||
func (underscorer *Underscorer) UnpackUnderScoredFunc(data []byte) (*big.Int, error) {
|
||||
out, err := underscorer.abi.Unpack("_under_scored_func", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
|
@ -77,18 +77,18 @@ func (arguments Arguments) isTuple() bool {
|
|||
}
|
||||
|
||||
// Unpack performs the operation hexdata -> Go format.
|
||||
func (arguments Arguments) Unpack(data []byte) ([]interface{}, error) {
|
||||
func (arguments Arguments) Unpack(data []byte) ([]any, error) {
|
||||
if len(data) == 0 {
|
||||
if len(arguments.NonIndexed()) != 0 {
|
||||
return nil, errors.New("abi: attempting to unmarshal an empty string while arguments are expected")
|
||||
}
|
||||
return make([]interface{}, 0), nil
|
||||
return make([]any, 0), nil
|
||||
}
|
||||
return arguments.UnpackValues(data)
|
||||
}
|
||||
|
||||
// UnpackIntoMap performs the operation hexdata -> mapping of argument name to argument value.
|
||||
func (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte) error {
|
||||
func (arguments Arguments) UnpackIntoMap(v map[string]any, data []byte) error {
|
||||
// Make sure map is not nil
|
||||
if v == nil {
|
||||
return errors.New("abi: cannot unpack into a nil map")
|
||||
|
|
@ -110,7 +110,7 @@ func (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte)
|
|||
}
|
||||
|
||||
// Copy performs the operation go format -> provided struct.
|
||||
func (arguments Arguments) Copy(v interface{}, values []interface{}) error {
|
||||
func (arguments Arguments) Copy(v any, values []any) error {
|
||||
// make sure the passed value is arguments pointer
|
||||
if reflect.Ptr != reflect.ValueOf(v).Kind() {
|
||||
return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
|
||||
|
|
@ -128,7 +128,7 @@ func (arguments Arguments) Copy(v interface{}, values []interface{}) error {
|
|||
}
|
||||
|
||||
// copyAtomic copies ( hexdata -> go ) a single value
|
||||
func (arguments Arguments) copyAtomic(v interface{}, marshalledValues interface{}) error {
|
||||
func (arguments Arguments) copyAtomic(v any, marshalledValues any) error {
|
||||
dst := reflect.ValueOf(v).Elem()
|
||||
src := reflect.ValueOf(marshalledValues)
|
||||
|
||||
|
|
@ -139,7 +139,7 @@ func (arguments Arguments) copyAtomic(v interface{}, marshalledValues interface{
|
|||
}
|
||||
|
||||
// copyTuple copies a batch of values from marshalledValues to v.
|
||||
func (arguments Arguments) copyTuple(v interface{}, marshalledValues []interface{}) error {
|
||||
func (arguments Arguments) copyTuple(v any, marshalledValues []any) error {
|
||||
value := reflect.ValueOf(v).Elem()
|
||||
nonIndexedArgs := arguments.NonIndexed()
|
||||
|
||||
|
|
@ -181,11 +181,17 @@ func (arguments Arguments) copyTuple(v interface{}, marshalledValues []interface
|
|||
// UnpackValues can be used to unpack ABI-encoded hexdata according to the ABI-specification,
|
||||
// without supplying a struct to unpack into. Instead, this method returns a list containing the
|
||||
// values. An atomic argument will be a list with one element.
|
||||
func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) {
|
||||
nonIndexedArgs := arguments.NonIndexed()
|
||||
retval := make([]interface{}, 0, len(nonIndexedArgs))
|
||||
virtualArgs := 0
|
||||
for index, arg := range nonIndexedArgs {
|
||||
func (arguments Arguments) UnpackValues(data []byte) ([]any, error) {
|
||||
var (
|
||||
retval = make([]any, 0)
|
||||
virtualArgs = 0
|
||||
index = 0
|
||||
)
|
||||
|
||||
for _, arg := range arguments {
|
||||
if arg.Indexed {
|
||||
continue
|
||||
}
|
||||
marshalledValue, err := toGoType((index+virtualArgs)*32, arg.Type, data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
@ -208,18 +214,19 @@ func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) {
|
|||
virtualArgs += getTypeSize(arg.Type)/32 - 1
|
||||
}
|
||||
retval = append(retval, marshalledValue)
|
||||
index++
|
||||
}
|
||||
return retval, nil
|
||||
}
|
||||
|
||||
// PackValues performs the operation Go format -> Hexdata.
|
||||
// It is the semantic opposite of UnpackValues.
|
||||
func (arguments Arguments) PackValues(args []interface{}) ([]byte, error) {
|
||||
func (arguments Arguments) PackValues(args []any) ([]byte, error) {
|
||||
return arguments.Pack(args...)
|
||||
}
|
||||
|
||||
// Pack performs the operation Go format -> Hexdata.
|
||||
func (arguments Arguments) Pack(args ...interface{}) ([]byte, error) {
|
||||
func (arguments Arguments) Pack(args ...any) ([]byte, error) {
|
||||
// Make sure arguments match up and pack them
|
||||
abiArgs := arguments
|
||||
if len(args) != len(abiArgs) {
|
||||
|
|
|
|||
|
|
@ -1,179 +0,0 @@
|
|||
// Copyright 2016 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/ecdsa"
|
||||
"errors"
|
||||
"io"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts"
|
||||
"github.com/ethereum/go-ethereum/accounts/external"
|
||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
)
|
||||
|
||||
// ErrNoChainID is returned whenever the user failed to specify a chain id.
|
||||
var ErrNoChainID = errors.New("no chain id specified")
|
||||
|
||||
// ErrNotAuthorized is returned when an account is not properly unlocked.
|
||||
var ErrNotAuthorized = errors.New("not authorized to sign this account")
|
||||
|
||||
// NewTransactor is a utility method to easily create a transaction signer from
|
||||
// an encrypted json key stream and the associated passphrase.
|
||||
//
|
||||
// Deprecated: Use NewTransactorWithChainID instead.
|
||||
func NewTransactor(keyin io.Reader, passphrase string) (*TransactOpts, error) {
|
||||
log.Warn("WARNING: NewTransactor has been deprecated in favour of NewTransactorWithChainID")
|
||||
json, err := io.ReadAll(keyin)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
key, err := keystore.DecryptKey(json, passphrase)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewKeyedTransactor(key.PrivateKey), nil
|
||||
}
|
||||
|
||||
// NewKeyStoreTransactor is a utility method to easily create a transaction signer from
|
||||
// a decrypted key from a keystore.
|
||||
//
|
||||
// Deprecated: Use NewKeyStoreTransactorWithChainID instead.
|
||||
func NewKeyStoreTransactor(keystore *keystore.KeyStore, account accounts.Account) (*TransactOpts, error) {
|
||||
log.Warn("WARNING: NewKeyStoreTransactor has been deprecated in favour of NewTransactorWithChainID")
|
||||
signer := types.HomesteadSigner{}
|
||||
return &TransactOpts{
|
||||
From: account.Address,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != account.Address {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := keystore.SignHash(account, signer.Hash(tx).Bytes())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewKeyedTransactor is a utility method to easily create a transaction signer
|
||||
// from a single private key.
|
||||
//
|
||||
// Deprecated: Use NewKeyedTransactorWithChainID instead.
|
||||
func NewKeyedTransactor(key *ecdsa.PrivateKey) *TransactOpts {
|
||||
log.Warn("WARNING: NewKeyedTransactor has been deprecated in favour of NewKeyedTransactorWithChainID")
|
||||
keyAddr := crypto.PubkeyToAddress(key.PublicKey)
|
||||
signer := types.HomesteadSigner{}
|
||||
return &TransactOpts{
|
||||
From: keyAddr,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != keyAddr {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := crypto.Sign(signer.Hash(tx).Bytes(), key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}
|
||||
}
|
||||
|
||||
// NewTransactorWithChainID is a utility method to easily create a transaction signer from
|
||||
// an encrypted json key stream and the associated passphrase.
|
||||
func NewTransactorWithChainID(keyin io.Reader, passphrase string, chainID *big.Int) (*TransactOpts, error) {
|
||||
json, err := io.ReadAll(keyin)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
key, err := keystore.DecryptKey(json, passphrase)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewKeyedTransactorWithChainID(key.PrivateKey, chainID)
|
||||
}
|
||||
|
||||
// NewKeyStoreTransactorWithChainID is a utility method to easily create a transaction signer from
|
||||
// a decrypted key from a keystore.
|
||||
func NewKeyStoreTransactorWithChainID(keystore *keystore.KeyStore, account accounts.Account, chainID *big.Int) (*TransactOpts, error) {
|
||||
if chainID == nil {
|
||||
return nil, ErrNoChainID
|
||||
}
|
||||
signer := types.LatestSignerForChainID(chainID)
|
||||
return &TransactOpts{
|
||||
From: account.Address,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != account.Address {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := keystore.SignHash(account, signer.Hash(tx).Bytes())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewKeyedTransactorWithChainID is a utility method to easily create a transaction signer
|
||||
// from a single private key.
|
||||
func NewKeyedTransactorWithChainID(key *ecdsa.PrivateKey, chainID *big.Int) (*TransactOpts, error) {
|
||||
if chainID == nil {
|
||||
return nil, ErrNoChainID
|
||||
}
|
||||
keyAddr := crypto.PubkeyToAddress(key.PublicKey)
|
||||
signer := types.LatestSignerForChainID(chainID)
|
||||
return &TransactOpts{
|
||||
From: keyAddr,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != keyAddr {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := crypto.Sign(signer.Hash(tx).Bytes(), key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewClefTransactor is a utility method to easily create a transaction signer
|
||||
// with a clef backend.
|
||||
func NewClefTransactor(clef *external.ExternalSigner, account accounts.Account) *TransactOpts {
|
||||
return &TransactOpts{
|
||||
From: account.Address,
|
||||
Signer: func(address common.Address, transaction *types.Transaction) (*types.Transaction, error) {
|
||||
if address != account.Address {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
return clef.SignTx(account, transaction, nil) // Clef enforces its own chain id
|
||||
},
|
||||
Context: context.Background(),
|
||||
}
|
||||
}
|
||||
294
accounts/abi/bind/old.go
Normal file
294
accounts/abi/bind/old.go
Normal file
|
|
@ -0,0 +1,294 @@
|
|||
// Copyright 2016 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Package bind is the runtime for abigen v1 generated contract bindings.
|
||||
// Deprecated: please use github.com/ethereum/go-ethereum/bind/v2
|
||||
package bind
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/ecdsa"
|
||||
"errors"
|
||||
"io"
|
||||
"math/big"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/abigen"
|
||||
bind2 "github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/accounts/external"
|
||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
)
|
||||
|
||||
// Bind generates a v1 contract binding.
|
||||
// Deprecated: binding generation has moved to github.com/ethereum/go-ethereum/accounts/abi/abigen
|
||||
func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, libs map[string]string, aliases map[string]string) (string, error) {
|
||||
return abigen.Bind(types, abis, bytecodes, fsigs, pkg, libs, aliases)
|
||||
}
|
||||
|
||||
// auth.go
|
||||
|
||||
// ErrNoChainID is returned whenever the user failed to specify a chain id.
|
||||
var ErrNoChainID = errors.New("no chain id specified")
|
||||
|
||||
// ErrNotAuthorized is returned when an account is not properly unlocked.
|
||||
var ErrNotAuthorized = bind2.ErrNotAuthorized
|
||||
|
||||
// NewTransactor is a utility method to easily create a transaction signer from
|
||||
// an encrypted json key stream and the associated passphrase.
|
||||
//
|
||||
// Deprecated: Use NewTransactorWithChainID instead.
|
||||
func NewTransactor(keyin io.Reader, passphrase string) (*TransactOpts, error) {
|
||||
log.Warn("WARNING: NewTransactor has been deprecated in favour of NewTransactorWithChainID")
|
||||
json, err := io.ReadAll(keyin)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
key, err := keystore.DecryptKey(json, passphrase)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewKeyedTransactor(key.PrivateKey), nil
|
||||
}
|
||||
|
||||
// NewKeyStoreTransactor is a utility method to easily create a transaction signer from
|
||||
// a decrypted key from a keystore.
|
||||
//
|
||||
// Deprecated: Use NewKeyStoreTransactorWithChainID instead.
|
||||
func NewKeyStoreTransactor(keystore *keystore.KeyStore, account accounts.Account) (*TransactOpts, error) {
|
||||
log.Warn("WARNING: NewKeyStoreTransactor has been deprecated in favour of NewTransactorWithChainID")
|
||||
signer := types.HomesteadSigner{}
|
||||
return &TransactOpts{
|
||||
From: account.Address,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != account.Address {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := keystore.SignHash(account, signer.Hash(tx).Bytes())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewKeyedTransactor is a utility method to easily create a transaction signer
|
||||
// from a single private key.
|
||||
//
|
||||
// Deprecated: Use NewKeyedTransactorWithChainID instead.
|
||||
func NewKeyedTransactor(key *ecdsa.PrivateKey) *TransactOpts {
|
||||
log.Warn("WARNING: NewKeyedTransactor has been deprecated in favour of NewKeyedTransactorWithChainID")
|
||||
keyAddr := crypto.PubkeyToAddress(key.PublicKey)
|
||||
signer := types.HomesteadSigner{}
|
||||
return &TransactOpts{
|
||||
From: keyAddr,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != keyAddr {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := crypto.Sign(signer.Hash(tx).Bytes(), key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}
|
||||
}
|
||||
|
||||
// NewTransactorWithChainID is a utility method to easily create a transaction signer from
|
||||
// an encrypted json key stream and the associated passphrase.
|
||||
func NewTransactorWithChainID(keyin io.Reader, passphrase string, chainID *big.Int) (*TransactOpts, error) {
|
||||
json, err := io.ReadAll(keyin)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
key, err := keystore.DecryptKey(json, passphrase)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewKeyedTransactorWithChainID(key.PrivateKey, chainID)
|
||||
}
|
||||
|
||||
// NewKeyStoreTransactorWithChainID is a utility method to easily create a transaction signer from
|
||||
// a decrypted key from a keystore.
|
||||
func NewKeyStoreTransactorWithChainID(keystore *keystore.KeyStore, account accounts.Account, chainID *big.Int) (*TransactOpts, error) {
|
||||
// New version panics for chainID == nil, catch it here.
|
||||
if chainID == nil {
|
||||
return nil, ErrNoChainID
|
||||
}
|
||||
return bind2.NewKeyStoreTransactor(keystore, account, chainID), nil
|
||||
}
|
||||
|
||||
// NewKeyedTransactorWithChainID is a utility method to easily create a transaction signer
|
||||
// from a single private key.
|
||||
func NewKeyedTransactorWithChainID(key *ecdsa.PrivateKey, chainID *big.Int) (*TransactOpts, error) {
|
||||
// New version panics for chainID == nil, catch it here.
|
||||
if chainID == nil {
|
||||
return nil, ErrNoChainID
|
||||
}
|
||||
return bind2.NewKeyedTransactor(key, chainID), nil
|
||||
}
|
||||
|
||||
// NewClefTransactor is a utility method to easily create a transaction signer
|
||||
// with a clef backend.
|
||||
func NewClefTransactor(clef *external.ExternalSigner, account accounts.Account) *TransactOpts {
|
||||
return bind2.NewClefTransactor(clef, account)
|
||||
}
|
||||
|
||||
// backend.go
|
||||
|
||||
var (
|
||||
// ErrNoCode is returned by call and transact operations for which the requested
|
||||
// recipient contract to operate on does not exist in the state db or does not
|
||||
// have any code associated with it (i.e. self-destructed).
|
||||
ErrNoCode = bind2.ErrNoCode
|
||||
|
||||
// ErrNoPendingState is raised when attempting to perform a pending state action
|
||||
// on a backend that doesn't implement PendingContractCaller.
|
||||
ErrNoPendingState = bind2.ErrNoPendingState
|
||||
|
||||
// ErrNoBlockHashState is raised when attempting to perform a block hash action
|
||||
// on a backend that doesn't implement BlockHashContractCaller.
|
||||
ErrNoBlockHashState = bind2.ErrNoBlockHashState
|
||||
|
||||
// ErrNoCodeAfterDeploy is returned by WaitDeployed if contract creation leaves
|
||||
// an empty contract behind.
|
||||
ErrNoCodeAfterDeploy = bind2.ErrNoCodeAfterDeploy
|
||||
)
|
||||
|
||||
// ContractCaller defines the methods needed to allow operating with a contract on a read
|
||||
// only basis.
|
||||
type ContractCaller = bind2.ContractCaller
|
||||
|
||||
// PendingContractCaller defines methods to perform contract calls on the pending state.
|
||||
// Call will try to discover this interface when access to the pending state is requested.
|
||||
// If the backend does not support the pending state, Call returns ErrNoPendingState.
|
||||
type PendingContractCaller = bind2.PendingContractCaller
|
||||
|
||||
// BlockHashContractCaller defines methods to perform contract calls on a specific block hash.
|
||||
// Call will try to discover this interface when access to a block by hash is requested.
|
||||
// If the backend does not support the block hash state, Call returns ErrNoBlockHashState.
|
||||
type BlockHashContractCaller = bind2.BlockHashContractCaller
|
||||
|
||||
// ContractTransactor defines the methods needed to allow operating with a contract
|
||||
// on a write only basis. Besides the transacting method, the remainder are helpers
|
||||
// used when the user does not provide some needed values, but rather leaves it up
|
||||
// to the transactor to decide.
|
||||
type ContractTransactor = bind2.ContractTransactor
|
||||
|
||||
// DeployBackend wraps the operations needed by WaitMined and WaitDeployed.
|
||||
type DeployBackend = bind2.DeployBackend
|
||||
|
||||
// ContractFilterer defines the methods needed to access log events using one-off
|
||||
// queries or continuous event subscriptions.
|
||||
type ContractFilterer = bind2.ContractFilterer
|
||||
|
||||
// ContractBackend defines the methods needed to work with contracts on a read-write basis.
|
||||
type ContractBackend = bind2.ContractBackend
|
||||
|
||||
// base.go
|
||||
|
||||
type SignerFn = bind2.SignerFn
|
||||
|
||||
type CallOpts = bind2.CallOpts
|
||||
|
||||
type TransactOpts = bind2.TransactOpts
|
||||
|
||||
type FilterOpts = bind2.FilterOpts
|
||||
|
||||
type WatchOpts = bind2.WatchOpts
|
||||
|
||||
type BoundContract = bind2.BoundContract
|
||||
|
||||
func NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller, transactor ContractTransactor, filterer ContractFilterer) *BoundContract {
|
||||
return bind2.NewBoundContract(address, abi, caller, transactor, filterer)
|
||||
}
|
||||
|
||||
func DeployContract(opts *TransactOpts, abi abi.ABI, bytecode []byte, backend ContractBackend, params ...interface{}) (common.Address, *types.Transaction, *BoundContract, error) {
|
||||
packed, err := abi.Pack("", params...)
|
||||
if err != nil {
|
||||
return common.Address{}, nil, nil, err
|
||||
}
|
||||
addr, tx, err := bind2.DeployContract(opts, bytecode, backend, packed)
|
||||
if err != nil {
|
||||
return common.Address{}, nil, nil, err
|
||||
}
|
||||
contract := NewBoundContract(addr, abi, backend, backend, backend)
|
||||
return addr, tx, contract, nil
|
||||
}
|
||||
|
||||
// MetaData collects all metadata for a bound contract.
|
||||
type MetaData struct {
|
||||
Bin string // runtime bytecode (as a hex string)
|
||||
ABI string // the raw ABI definition (JSON)
|
||||
Sigs map[string]string // 4byte identifier -> function signature
|
||||
mu sync.Mutex
|
||||
parsedABI *abi.ABI
|
||||
}
|
||||
|
||||
// GetAbi returns the parsed ABI definition.
|
||||
func (m *MetaData) GetAbi() (*abi.ABI, error) {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
if m.parsedABI != nil {
|
||||
return m.parsedABI, nil
|
||||
}
|
||||
if parsed, err := abi.JSON(strings.NewReader(m.ABI)); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
m.parsedABI = &parsed
|
||||
}
|
||||
return m.parsedABI, nil
|
||||
}
|
||||
|
||||
// util.go
|
||||
|
||||
// WaitMined waits for tx to be mined on the blockchain.
|
||||
// It stops waiting when the context is canceled.
|
||||
func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*types.Receipt, error) {
|
||||
return bind2.WaitMined(ctx, b, tx.Hash())
|
||||
}
|
||||
|
||||
// WaitMinedHash waits for a transaction with the provided hash to be mined on the blockchain.
|
||||
// It stops waiting when the context is canceled.
|
||||
func WaitMinedHash(ctx context.Context, b DeployBackend, hash common.Hash) (*types.Receipt, error) {
|
||||
return bind2.WaitMined(ctx, b, hash)
|
||||
}
|
||||
|
||||
// WaitDeployed waits for a contract deployment transaction and returns the on-chain
|
||||
// contract address when it is mined. It stops waiting when ctx is canceled.
|
||||
func WaitDeployed(ctx context.Context, b DeployBackend, tx *types.Transaction) (common.Address, error) {
|
||||
if tx.To() != nil {
|
||||
return common.Address{}, errors.New("tx is not contract creation")
|
||||
}
|
||||
return bind2.WaitDeployed(ctx, b, tx.Hash())
|
||||
}
|
||||
|
||||
// WaitDeployedHash waits for a contract deployment transaction with the provided hash and returns the on-chain
|
||||
// contract address when it is mined. It stops waiting when ctx is canceled.
|
||||
func WaitDeployedHash(ctx context.Context, b DeployBackend, hash common.Hash) (common.Address, error) {
|
||||
return bind2.WaitDeployed(ctx, b, hash)
|
||||
}
|
||||
96
accounts/abi/bind/v2/auth.go
Normal file
96
accounts/abi/bind/v2/auth.go
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
// Copyright 2016 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/ecdsa"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts"
|
||||
"github.com/ethereum/go-ethereum/accounts/external"
|
||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
)
|
||||
|
||||
// ErrNotAuthorized is returned when an account is not properly unlocked.
|
||||
var ErrNotAuthorized = errors.New("not authorized to sign this account")
|
||||
|
||||
// NewKeyStoreTransactor is a utility method to easily create a transaction signer from
|
||||
// a decrypted key from a keystore.
|
||||
func NewKeyStoreTransactor(keystore *keystore.KeyStore, account accounts.Account, chainID *big.Int) *TransactOpts {
|
||||
if chainID == nil {
|
||||
panic("nil chainID")
|
||||
}
|
||||
signer := types.LatestSignerForChainID(chainID)
|
||||
return &TransactOpts{
|
||||
From: account.Address,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != account.Address {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := keystore.SignHash(account, signer.Hash(tx).Bytes())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}
|
||||
}
|
||||
|
||||
// NewKeyedTransactor is a utility method to easily create a transaction signer
|
||||
// from a single private key.
|
||||
func NewKeyedTransactor(key *ecdsa.PrivateKey, chainID *big.Int) *TransactOpts {
|
||||
if chainID == nil {
|
||||
panic("nil chainID")
|
||||
}
|
||||
keyAddr := crypto.PubkeyToAddress(key.PublicKey)
|
||||
signer := types.LatestSignerForChainID(chainID)
|
||||
return &TransactOpts{
|
||||
From: keyAddr,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
if address != keyAddr {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
signature, err := crypto.Sign(signer.Hash(tx).Bytes(), key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tx.WithSignature(signer, signature)
|
||||
},
|
||||
Context: context.Background(),
|
||||
}
|
||||
}
|
||||
|
||||
// NewClefTransactor is a utility method to easily create a transaction signer
|
||||
// with a clef backend.
|
||||
func NewClefTransactor(clef *external.ExternalSigner, account accounts.Account) *TransactOpts {
|
||||
return &TransactOpts{
|
||||
From: account.Address,
|
||||
Signer: func(address common.Address, transaction *types.Transaction) (*types.Transaction, error) {
|
||||
if address != account.Address {
|
||||
return nil, ErrNotAuthorized
|
||||
}
|
||||
return clef.SignTx(account, transaction, nil) // Clef enforces its own chain id
|
||||
},
|
||||
Context: context.Background(),
|
||||
}
|
||||
}
|
||||
|
|
@ -43,6 +43,11 @@ var (
|
|||
// ErrNoCodeAfterDeploy is returned by WaitDeployed if contract creation leaves
|
||||
// an empty contract behind.
|
||||
ErrNoCodeAfterDeploy = errors.New("no contract code after deployment")
|
||||
|
||||
// ErrNoAddressInReceipt is returned by WaitDeployed when the receipt for the
|
||||
// transaction hash does not contain a contract address. This error may indicate
|
||||
// that the transaction hash was not a CREATE transaction.
|
||||
ErrNoAddressInReceipt = errors.New("no contract address in receipt")
|
||||
)
|
||||
|
||||
// ContractCaller defines the methods needed to allow operating with a contract on a read
|
||||
|
|
@ -118,3 +123,11 @@ type ContractBackend interface {
|
|||
ContractTransactor
|
||||
ContractFilterer
|
||||
}
|
||||
|
||||
// Backend combines all backend methods used in this package. This type is provided for
|
||||
// convenience. It is meant to be used when you need to hold a reference to a backend that
|
||||
// is used for both deployment and contract interaction.
|
||||
type Backend interface {
|
||||
DeployBackend
|
||||
ContractBackend
|
||||
}
|
||||
|
|
@ -25,10 +25,10 @@ import (
|
|||
"sync"
|
||||
|
||||
"github.com/ethereum/go-ethereum"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/event"
|
||||
)
|
||||
|
||||
|
|
@ -89,25 +89,42 @@ type WatchOpts struct {
|
|||
|
||||
// MetaData collects all metadata for a bound contract.
|
||||
type MetaData struct {
|
||||
mu sync.Mutex
|
||||
Sigs map[string]string
|
||||
Bin string
|
||||
ABI string
|
||||
ab *abi.ABI
|
||||
Bin string // deployer bytecode (as a hex string)
|
||||
ABI string // the raw ABI definition (JSON)
|
||||
Deps []*MetaData // library dependencies of the contract
|
||||
|
||||
// For bindings that were compiled from combined-json ID is the Solidity
|
||||
// library pattern: a 34 character prefix of the hex encoding of the keccak256
|
||||
// hash of the fully qualified 'library name', i.e. the path of the source file.
|
||||
//
|
||||
// For contracts compiled from the ABI definition alone, this is the type name
|
||||
// of the contract (as specified in the ABI definition or overridden via the
|
||||
// --type flag).
|
||||
//
|
||||
// This is a unique identifier of a contract within a compilation unit. When
|
||||
// used as part of a multi-contract deployment with library dependencies, the
|
||||
// ID is used to link contracts during deployment using [LinkAndDeploy].
|
||||
ID string
|
||||
|
||||
mu sync.Mutex
|
||||
parsedABI *abi.ABI
|
||||
}
|
||||
|
||||
func (m *MetaData) GetAbi() (*abi.ABI, error) {
|
||||
// ParseABI returns the parsed ABI specification, or an error if the string
|
||||
// representation of the ABI set in the MetaData instance could not be parsed.
|
||||
func (m *MetaData) ParseABI() (*abi.ABI, error) {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
if m.ab != nil {
|
||||
return m.ab, nil
|
||||
|
||||
if m.parsedABI != nil {
|
||||
return m.parsedABI, nil
|
||||
}
|
||||
if parsed, err := abi.JSON(strings.NewReader(m.ABI)); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
m.ab = &parsed
|
||||
m.parsedABI = &parsed
|
||||
}
|
||||
return m.ab, nil
|
||||
return m.parsedABI, nil
|
||||
}
|
||||
|
||||
// BoundContract is the base wrapper object that reflects a contract on the
|
||||
|
|
@ -133,94 +150,23 @@ func NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller
|
|||
}
|
||||
}
|
||||
|
||||
// DeployContract deploys a contract onto the Ethereum blockchain and binds the
|
||||
// deployment address with a Go wrapper.
|
||||
func DeployContract(opts *TransactOpts, abi abi.ABI, bytecode []byte, backend ContractBackend, params ...interface{}) (common.Address, *types.Transaction, *BoundContract, error) {
|
||||
// Otherwise try to deploy the contract
|
||||
c := NewBoundContract(common.Address{}, abi, backend, backend, backend)
|
||||
|
||||
input, err := c.abi.Pack("", params...)
|
||||
if err != nil {
|
||||
return common.Address{}, nil, nil, err
|
||||
}
|
||||
tx, err := c.transact(opts, nil, append(bytecode, input...))
|
||||
if err != nil {
|
||||
return common.Address{}, nil, nil, err
|
||||
}
|
||||
c.address = crypto.CreateAddress(opts.From, tx.Nonce())
|
||||
return c.address, tx, c, nil
|
||||
}
|
||||
|
||||
// Call invokes the (constant) contract method with params as input values and
|
||||
// sets the output to result. The result type might be a single field for simple
|
||||
// returns, a slice of interfaces for anonymous returns and a struct for named
|
||||
// returns.
|
||||
func (c *BoundContract) Call(opts *CallOpts, results *[]interface{}, method string, params ...interface{}) error {
|
||||
// Don't crash on a lazy user
|
||||
if opts == nil {
|
||||
opts = new(CallOpts)
|
||||
}
|
||||
func (c *BoundContract) Call(opts *CallOpts, results *[]any, method string, params ...any) error {
|
||||
if results == nil {
|
||||
results = new([]interface{})
|
||||
results = new([]any)
|
||||
}
|
||||
// Pack the input, call and unpack the results
|
||||
input, err := c.abi.Pack(method, params...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var (
|
||||
msg = ethereum.CallMsg{From: opts.From, To: &c.address, Data: input}
|
||||
ctx = ensureContext(opts.Context)
|
||||
code []byte
|
||||
output []byte
|
||||
)
|
||||
if opts.Pending {
|
||||
pb, ok := c.caller.(PendingContractCaller)
|
||||
if !ok {
|
||||
return ErrNoPendingState
|
||||
}
|
||||
output, err = pb.PendingCallContract(ctx, msg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(output) == 0 {
|
||||
// Make sure we have a contract to operate on, and bail out otherwise.
|
||||
if code, err = pb.PendingCodeAt(ctx, c.address); err != nil {
|
||||
return err
|
||||
} else if len(code) == 0 {
|
||||
return ErrNoCode
|
||||
}
|
||||
}
|
||||
} else if opts.BlockHash != (common.Hash{}) {
|
||||
bh, ok := c.caller.(BlockHashContractCaller)
|
||||
if !ok {
|
||||
return ErrNoBlockHashState
|
||||
}
|
||||
output, err = bh.CallContractAtHash(ctx, msg, opts.BlockHash)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(output) == 0 {
|
||||
// Make sure we have a contract to operate on, and bail out otherwise.
|
||||
if code, err = bh.CodeAtHash(ctx, c.address, opts.BlockHash); err != nil {
|
||||
return err
|
||||
} else if len(code) == 0 {
|
||||
return ErrNoCode
|
||||
}
|
||||
}
|
||||
} else {
|
||||
output, err = c.caller.CallContract(ctx, msg, opts.BlockNumber)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(output) == 0 {
|
||||
// Make sure we have a contract to operate on, and bail out otherwise.
|
||||
if code, err = c.caller.CodeAt(ctx, c.address, opts.BlockNumber); err != nil {
|
||||
return err
|
||||
} else if len(code) == 0 {
|
||||
return ErrNoCode
|
||||
}
|
||||
}
|
||||
|
||||
output, err := c.call(opts, input)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(*results) == 0 {
|
||||
|
|
@ -232,26 +178,97 @@ func (c *BoundContract) Call(opts *CallOpts, results *[]interface{}, method stri
|
|||
return c.abi.UnpackIntoInterface(res[0], method, output)
|
||||
}
|
||||
|
||||
// CallRaw executes an eth_call against the contract with the raw calldata as
|
||||
// input. It returns the call's return data or an error.
|
||||
func (c *BoundContract) CallRaw(opts *CallOpts, input []byte) ([]byte, error) {
|
||||
return c.call(opts, input)
|
||||
}
|
||||
|
||||
func (c *BoundContract) call(opts *CallOpts, input []byte) ([]byte, error) {
|
||||
// Don't crash on a lazy user
|
||||
if opts == nil {
|
||||
opts = new(CallOpts)
|
||||
}
|
||||
var (
|
||||
msg = ethereum.CallMsg{From: opts.From, To: &c.address, Data: input}
|
||||
ctx = ensureContext(opts.Context)
|
||||
code []byte
|
||||
output []byte
|
||||
err error
|
||||
)
|
||||
if opts.Pending {
|
||||
pb, ok := c.caller.(PendingContractCaller)
|
||||
if !ok {
|
||||
return nil, ErrNoPendingState
|
||||
}
|
||||
output, err = pb.PendingCallContract(ctx, msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(output) == 0 {
|
||||
// Make sure we have a contract to operate on, and bail out otherwise.
|
||||
if code, err = pb.PendingCodeAt(ctx, c.address); err != nil {
|
||||
return nil, err
|
||||
} else if len(code) == 0 {
|
||||
return nil, ErrNoCode
|
||||
}
|
||||
}
|
||||
} else if opts.BlockHash != (common.Hash{}) {
|
||||
bh, ok := c.caller.(BlockHashContractCaller)
|
||||
if !ok {
|
||||
return nil, ErrNoBlockHashState
|
||||
}
|
||||
output, err = bh.CallContractAtHash(ctx, msg, opts.BlockHash)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(output) == 0 {
|
||||
// Make sure we have a contract to operate on, and bail out otherwise.
|
||||
if code, err = bh.CodeAtHash(ctx, c.address, opts.BlockHash); err != nil {
|
||||
return nil, err
|
||||
} else if len(code) == 0 {
|
||||
return nil, ErrNoCode
|
||||
}
|
||||
}
|
||||
} else {
|
||||
output, err = c.caller.CallContract(ctx, msg, opts.BlockNumber)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(output) == 0 {
|
||||
// Make sure we have a contract to operate on, and bail out otherwise.
|
||||
if code, err = c.caller.CodeAt(ctx, c.address, opts.BlockNumber); err != nil {
|
||||
return nil, err
|
||||
} else if len(code) == 0 {
|
||||
return nil, ErrNoCode
|
||||
}
|
||||
}
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
|
||||
// Transact invokes the (paid) contract method with params as input values.
|
||||
func (c *BoundContract) Transact(opts *TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
||||
func (c *BoundContract) Transact(opts *TransactOpts, method string, params ...any) (*types.Transaction, error) {
|
||||
// Otherwise pack up the parameters and invoke the contract
|
||||
input, err := c.abi.Pack(method, params...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// todo(rjl493456442) check whether the method is payable or not,
|
||||
// reject invalid transaction at the first place
|
||||
return c.transact(opts, &c.address, input)
|
||||
}
|
||||
|
||||
// RawTransact initiates a transaction with the given raw calldata as the input.
|
||||
// It's usually used to initiate transactions for invoking **Fallback** function.
|
||||
func (c *BoundContract) RawTransact(opts *TransactOpts, calldata []byte) (*types.Transaction, error) {
|
||||
// todo(rjl493456442) check whether the method is payable or not,
|
||||
// reject invalid transaction at the first place
|
||||
return c.transact(opts, &c.address, calldata)
|
||||
}
|
||||
|
||||
// RawCreationTransact creates and submits a contract-creation transaction with
|
||||
// the given calldata as the input.
|
||||
func (c *BoundContract) RawCreationTransact(opts *TransactOpts, calldata []byte) (*types.Transaction, error) {
|
||||
return c.transact(opts, nil, calldata)
|
||||
}
|
||||
|
||||
// Transfer initiates a plain transaction to move funds to the contract, calling
|
||||
// its default method if one is available.
|
||||
func (c *BoundContract) Transfer(opts *TransactOpts) (*types.Transaction, error) {
|
||||
|
|
@ -366,13 +383,14 @@ func (c *BoundContract) estimateGasLimit(opts *TransactOpts, contract *common.Ad
|
|||
}
|
||||
}
|
||||
msg := ethereum.CallMsg{
|
||||
From: opts.From,
|
||||
To: contract,
|
||||
GasPrice: gasPrice,
|
||||
GasTipCap: gasTipCap,
|
||||
GasFeeCap: gasFeeCap,
|
||||
Value: value,
|
||||
Data: input,
|
||||
From: opts.From,
|
||||
To: contract,
|
||||
GasPrice: gasPrice,
|
||||
GasTipCap: gasTipCap,
|
||||
GasFeeCap: gasFeeCap,
|
||||
Value: value,
|
||||
Data: input,
|
||||
AccessList: opts.AccessList,
|
||||
}
|
||||
return c.transactor.EstimateGas(ensureContext(opts.Context), msg)
|
||||
}
|
||||
|
|
@ -433,14 +451,13 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i
|
|||
|
||||
// FilterLogs filters contract logs for past blocks, returning the necessary
|
||||
// channels to construct a strongly typed bound iterator on top of them.
|
||||
func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) {
|
||||
func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]any) (chan types.Log, event.Subscription, error) {
|
||||
// Don't crash on a lazy user
|
||||
if opts == nil {
|
||||
opts = new(FilterOpts)
|
||||
}
|
||||
// Append the event selector to the query parameters and construct the topic set
|
||||
query = append([][]interface{}{{c.abi.Events[name].ID}}, query...)
|
||||
|
||||
query = append([][]any{{c.abi.Events[name].ID}}, query...)
|
||||
topics, err := abi.MakeTopics(query...)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
|
|
@ -479,13 +496,13 @@ func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]int
|
|||
|
||||
// WatchLogs filters subscribes to contract logs for future blocks, returning a
|
||||
// subscription object that can be used to tear down the watcher.
|
||||
func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) {
|
||||
func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]any) (chan types.Log, event.Subscription, error) {
|
||||
// Don't crash on a lazy user
|
||||
if opts == nil {
|
||||
opts = new(WatchOpts)
|
||||
}
|
||||
// Append the event selector to the query parameters and construct the topic set
|
||||
query = append([][]interface{}{{c.abi.Events[name].ID}}, query...)
|
||||
query = append([][]any{{c.abi.Events[name].ID}}, query...)
|
||||
|
||||
topics, err := abi.MakeTopics(query...)
|
||||
if err != nil {
|
||||
|
|
@ -509,7 +526,7 @@ func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]inter
|
|||
}
|
||||
|
||||
// UnpackLog unpacks a retrieved log into the provided output structure.
|
||||
func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) error {
|
||||
func (c *BoundContract) UnpackLog(out any, event string, log types.Log) error {
|
||||
// Anonymous events are not supported.
|
||||
if len(log.Topics) == 0 {
|
||||
return errNoEventSignature
|
||||
|
|
@ -532,7 +549,7 @@ func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log)
|
|||
}
|
||||
|
||||
// UnpackLogIntoMap unpacks a retrieved log into the provided map.
|
||||
func (c *BoundContract) UnpackLogIntoMap(out map[string]interface{}, event string, log types.Log) error {
|
||||
func (c *BoundContract) UnpackLogIntoMap(out map[string]any, event string, log types.Log) error {
|
||||
// Anonymous events are not supported.
|
||||
if len(log.Topics) == 0 {
|
||||
return errNoEventSignature
|
||||
|
|
@ -26,7 +26,7 @@ import (
|
|||
|
||||
"github.com/ethereum/go-ethereum"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
167
accounts/abi/bind/v2/dep_tree.go
Normal file
167
accounts/abi/bind/v2/dep_tree.go
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
// Copyright 2025 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"maps"
|
||||
"strings"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// DeploymentParams contains parameters needed to deploy one or more contracts via LinkAndDeploy
|
||||
type DeploymentParams struct {
|
||||
// list of all contracts targeted for the deployment
|
||||
Contracts []*MetaData
|
||||
|
||||
// optional map of ABI-encoded constructor inputs keyed by the MetaData.ID.
|
||||
Inputs map[string][]byte
|
||||
|
||||
// optional map of override addresses for specifying already-deployed
|
||||
// contracts. It is keyed by the MetaData.ID.
|
||||
Overrides map[string]common.Address
|
||||
}
|
||||
|
||||
// validate determines whether the contracts specified in the DeploymentParams
|
||||
// instance have embedded deployer code in their provided MetaData instances.
|
||||
func (d *DeploymentParams) validate() error {
|
||||
for _, meta := range d.Contracts {
|
||||
if meta.Bin == "" {
|
||||
return fmt.Errorf("cannot deploy contract %s: deployer code missing from metadata", meta.ID)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeploymentResult contains information about the result of a pending
|
||||
// deployment made by LinkAndDeploy.
|
||||
type DeploymentResult struct {
|
||||
// Map of contract MetaData.ID to pending deployment transaction
|
||||
Txs map[string]*types.Transaction
|
||||
|
||||
// Map of contract MetaData.ID to the address where it will be deployed
|
||||
Addresses map[string]common.Address
|
||||
}
|
||||
|
||||
// DeployFn deploys a contract given a deployer and optional input. It returns
|
||||
// the address and a pending transaction, or an error if the deployment failed.
|
||||
type DeployFn func(input, deployer []byte) (common.Address, *types.Transaction, error)
|
||||
|
||||
// depTreeDeployer is responsible for taking a dependency, deploying-and-linking
|
||||
// its components in the proper order. A depTreeDeployer cannot be used after
|
||||
// calling LinkAndDeploy other than to retrieve the deployment result.
|
||||
type depTreeDeployer struct {
|
||||
deployedAddrs map[string]common.Address
|
||||
deployerTxs map[string]*types.Transaction
|
||||
inputs map[string][]byte // map of the root contract pattern to the constructor input (if there is any)
|
||||
deployFn DeployFn
|
||||
}
|
||||
|
||||
func newDepTreeDeployer(deployParams *DeploymentParams, deployFn DeployFn) *depTreeDeployer {
|
||||
deployedAddrs := maps.Clone(deployParams.Overrides)
|
||||
if deployedAddrs == nil {
|
||||
deployedAddrs = make(map[string]common.Address)
|
||||
}
|
||||
inputs := deployParams.Inputs
|
||||
if inputs == nil {
|
||||
inputs = make(map[string][]byte)
|
||||
}
|
||||
return &depTreeDeployer{
|
||||
deployFn: deployFn,
|
||||
deployedAddrs: deployedAddrs,
|
||||
deployerTxs: make(map[string]*types.Transaction),
|
||||
inputs: inputs,
|
||||
}
|
||||
}
|
||||
|
||||
// linkAndDeploy deploys a contract and it's dependencies. Because libraries
|
||||
// can in-turn have their own library dependencies, linkAndDeploy performs
|
||||
// deployment recursively (deepest-dependency first). The address of the
|
||||
// pending contract deployment for the top-level contract is returned.
|
||||
func (d *depTreeDeployer) linkAndDeploy(metadata *MetaData) (common.Address, error) {
|
||||
// Don't re-deploy aliased or previously-deployed contracts
|
||||
if addr, ok := d.deployedAddrs[metadata.ID]; ok {
|
||||
return addr, nil
|
||||
}
|
||||
// If this contract/library depends on other libraries deploy them
|
||||
// (and their dependencies) first
|
||||
deployerCode := metadata.Bin
|
||||
for _, dep := range metadata.Deps {
|
||||
addr, err := d.linkAndDeploy(dep)
|
||||
if err != nil {
|
||||
return common.Address{}, err
|
||||
}
|
||||
// Link their deployed addresses into the bytecode to produce
|
||||
deployerCode = strings.ReplaceAll(deployerCode, "__$"+dep.ID+"$__", strings.ToLower(addr.String()[2:]))
|
||||
}
|
||||
// Finally, deploy the top-level contract.
|
||||
code, err := hex.DecodeString(deployerCode[2:])
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("error decoding contract deployer hex %s:\n%v", deployerCode[2:], err))
|
||||
}
|
||||
addr, tx, err := d.deployFn(d.inputs[metadata.ID], code)
|
||||
if err != nil {
|
||||
return common.Address{}, err
|
||||
}
|
||||
d.deployedAddrs[metadata.ID] = addr
|
||||
d.deployerTxs[metadata.ID] = tx
|
||||
return addr, nil
|
||||
}
|
||||
|
||||
// result returns a DeploymentResult instance referencing contracts deployed
|
||||
// and not including any overrides specified for this deployment.
|
||||
func (d *depTreeDeployer) result() *DeploymentResult {
|
||||
// filter the override addresses from the deployed address set.
|
||||
for pattern := range d.deployedAddrs {
|
||||
if _, ok := d.deployerTxs[pattern]; !ok {
|
||||
delete(d.deployedAddrs, pattern)
|
||||
}
|
||||
}
|
||||
return &DeploymentResult{
|
||||
Txs: d.deployerTxs,
|
||||
Addresses: d.deployedAddrs,
|
||||
}
|
||||
}
|
||||
|
||||
// LinkAndDeploy performs the contract deployment specified by params using the
|
||||
// provided DeployFn to create, sign and submit transactions.
|
||||
//
|
||||
// Contracts can depend on libraries, which in-turn can have their own library
|
||||
// dependencies. Therefore, LinkAndDeploy performs the deployment recursively,
|
||||
// starting with libraries (and contracts) that don't have dependencies, and
|
||||
// progressing through the contracts that depend upon them.
|
||||
//
|
||||
// If an error is encountered, the returned DeploymentResult only contains
|
||||
// entries for the contracts whose deployment submission succeeded.
|
||||
//
|
||||
// LinkAndDeploy performs creation and submission of creation transactions,
|
||||
// but does not ensure that the contracts are included in the chain.
|
||||
func LinkAndDeploy(params *DeploymentParams, deploy DeployFn) (*DeploymentResult, error) {
|
||||
if err := params.validate(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
deployer := newDepTreeDeployer(params, deploy)
|
||||
for _, contract := range params.Contracts {
|
||||
if _, err := deployer.linkAndDeploy(contract); err != nil {
|
||||
return deployer.result(), err
|
||||
}
|
||||
}
|
||||
return deployer.result(), nil
|
||||
}
|
||||
370
accounts/abi/bind/v2/dep_tree_test.go
Normal file
370
accounts/abi/bind/v2/dep_tree_test.go
Normal file
|
|
@ -0,0 +1,370 @@
|
|||
// Copyright 2024 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"testing"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"golang.org/x/exp/rand"
|
||||
)
|
||||
|
||||
type linkTestCase struct {
|
||||
// map of pattern to unlinked bytecode (for the purposes of tests just contains the patterns of its dependencies)
|
||||
libCodes map[string]string
|
||||
contractCodes map[string]string
|
||||
|
||||
overrides map[string]common.Address
|
||||
}
|
||||
|
||||
func copyMetaData(m *MetaData) *MetaData {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
var deps []*MetaData
|
||||
if len(m.Deps) > 0 {
|
||||
for _, dep := range m.Deps {
|
||||
deps = append(deps, copyMetaData(dep))
|
||||
}
|
||||
}
|
||||
return &MetaData{
|
||||
Bin: m.Bin,
|
||||
ABI: m.ABI,
|
||||
Deps: deps,
|
||||
ID: m.ID,
|
||||
parsedABI: m.parsedABI,
|
||||
}
|
||||
}
|
||||
|
||||
func makeLinkTestCase(input map[rune][]rune, overrides map[rune]common.Address) *linkTestCase {
|
||||
codes := make(map[string]string)
|
||||
libCodes := make(map[string]string)
|
||||
contractCodes := make(map[string]string)
|
||||
|
||||
inputMap := make(map[rune]map[rune]struct{})
|
||||
// set of solidity patterns for all contracts that are known to be libraries
|
||||
libs := make(map[string]struct{})
|
||||
|
||||
// map of test contract id (rune) to the solidity library pattern (hash of that rune)
|
||||
patternMap := map[rune]string{}
|
||||
|
||||
for contract, deps := range input {
|
||||
inputMap[contract] = make(map[rune]struct{})
|
||||
if _, ok := patternMap[contract]; !ok {
|
||||
patternMap[contract] = crypto.Keccak256Hash([]byte(string(contract))).String()[2:36]
|
||||
}
|
||||
|
||||
for _, dep := range deps {
|
||||
if _, ok := patternMap[dep]; !ok {
|
||||
patternMap[dep] = crypto.Keccak256Hash([]byte(string(dep))).String()[2:36]
|
||||
}
|
||||
codes[patternMap[contract]] = codes[patternMap[contract]] + fmt.Sprintf("__$%s$__", patternMap[dep])
|
||||
inputMap[contract][dep] = struct{}{}
|
||||
libs[patternMap[dep]] = struct{}{}
|
||||
}
|
||||
}
|
||||
overridesPatterns := make(map[string]common.Address)
|
||||
for contractId, overrideAddr := range overrides {
|
||||
pattern := crypto.Keccak256Hash([]byte(string(contractId))).String()[2:36]
|
||||
overridesPatterns[pattern] = overrideAddr
|
||||
}
|
||||
|
||||
for _, pattern := range patternMap {
|
||||
if _, ok := libs[pattern]; ok {
|
||||
// if the library didn't depend on others, give it some dummy code to not bork deployment logic down-the-line
|
||||
if len(codes[pattern]) == 0 {
|
||||
libCodes[pattern] = "ff"
|
||||
} else {
|
||||
libCodes[pattern] = codes[pattern]
|
||||
}
|
||||
} else {
|
||||
contractCodes[pattern] = codes[pattern]
|
||||
}
|
||||
}
|
||||
|
||||
return &linkTestCase{
|
||||
libCodes,
|
||||
contractCodes,
|
||||
overridesPatterns,
|
||||
}
|
||||
}
|
||||
|
||||
var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||
|
||||
type linkTestCaseInput struct {
|
||||
input map[rune][]rune
|
||||
overrides map[rune]struct{}
|
||||
expectDeployed map[rune]struct{}
|
||||
}
|
||||
|
||||
// linkDeps will return a set of root dependencies and their sub-dependencies connected via the Deps field
|
||||
func linkDeps(deps map[string]*MetaData) []*MetaData {
|
||||
roots := make(map[string]struct{})
|
||||
for pattern := range deps {
|
||||
roots[pattern] = struct{}{}
|
||||
}
|
||||
|
||||
connectedDeps := make(map[string]*MetaData)
|
||||
for pattern, dep := range deps {
|
||||
connectedDeps[pattern] = internalLinkDeps(dep, deps, &roots)
|
||||
}
|
||||
|
||||
var rootMetadatas []*MetaData
|
||||
for pattern := range roots {
|
||||
dep := connectedDeps[pattern]
|
||||
rootMetadatas = append(rootMetadatas, dep)
|
||||
}
|
||||
return rootMetadatas
|
||||
}
|
||||
|
||||
// internalLinkDeps is the internal recursing logic of linkDeps:
|
||||
// It links the contract referred to by MetaData given the depMap (map of solidity
|
||||
// link pattern to contract metadata object), deleting contract entries from the
|
||||
// roots map if they were referenced as dependencies. It returns a new MetaData
|
||||
// object which is the linked version of metadata parameter.
|
||||
func internalLinkDeps(metadata *MetaData, depMap map[string]*MetaData, roots *map[string]struct{}) *MetaData {
|
||||
linked := copyMetaData(metadata)
|
||||
depPatterns := parseLibraryDeps(metadata.Bin)
|
||||
for _, pattern := range depPatterns {
|
||||
delete(*roots, pattern)
|
||||
connectedDep := internalLinkDeps(depMap[pattern], depMap, roots)
|
||||
linked.Deps = append(linked.Deps, connectedDep)
|
||||
}
|
||||
return linked
|
||||
}
|
||||
|
||||
func testLinkCase(tcInput linkTestCaseInput) error {
|
||||
var (
|
||||
testAddr = crypto.PubkeyToAddress(testKey.PublicKey)
|
||||
overridesAddrs = make(map[common.Address]struct{})
|
||||
overrideAddrs = make(map[rune]common.Address)
|
||||
)
|
||||
// generate deterministic addresses for the override set.
|
||||
rand.Seed(42)
|
||||
for contract := range tcInput.overrides {
|
||||
var addr common.Address
|
||||
rand.Read(addr[:])
|
||||
overrideAddrs[contract] = addr
|
||||
overridesAddrs[addr] = struct{}{}
|
||||
}
|
||||
|
||||
tc := makeLinkTestCase(tcInput.input, overrideAddrs)
|
||||
allContracts := make(map[rune]struct{})
|
||||
|
||||
for contract, deps := range tcInput.input {
|
||||
allContracts[contract] = struct{}{}
|
||||
for _, dep := range deps {
|
||||
allContracts[dep] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
var testAddrNonce uint64
|
||||
mockDeploy := func(input []byte, deployer []byte) (common.Address, *types.Transaction, error) {
|
||||
contractAddr := crypto.CreateAddress(testAddr, testAddrNonce)
|
||||
testAddrNonce++
|
||||
|
||||
if len(deployer) >= 20 {
|
||||
// assert that this contract only references libs that are known to be deployed or in the override set
|
||||
for i := 0; i < len(deployer); i += 20 {
|
||||
var dep common.Address
|
||||
dep.SetBytes(deployer[i : i+20])
|
||||
if _, ok := overridesAddrs[dep]; !ok {
|
||||
return common.Address{}, nil, fmt.Errorf("reference to dependent contract that has not yet been deployed: %x\n", dep)
|
||||
}
|
||||
}
|
||||
}
|
||||
overridesAddrs[contractAddr] = struct{}{}
|
||||
// we don't care about the txs themselves for the sake of the linking tests. so we can return nil for them in the mock deployer
|
||||
return contractAddr, nil, nil
|
||||
}
|
||||
|
||||
contracts := make(map[string]*MetaData)
|
||||
overrides := make(map[string]common.Address)
|
||||
|
||||
for pattern, bin := range tc.contractCodes {
|
||||
contracts[pattern] = &MetaData{ID: pattern, Bin: "0x" + bin}
|
||||
}
|
||||
for pattern, bin := range tc.libCodes {
|
||||
contracts[pattern] = &MetaData{
|
||||
Bin: "0x" + bin,
|
||||
ID: pattern,
|
||||
}
|
||||
}
|
||||
|
||||
contractsList := linkDeps(contracts)
|
||||
|
||||
for pattern, override := range tc.overrides {
|
||||
overrides[pattern] = override
|
||||
}
|
||||
|
||||
deployParams := &DeploymentParams{
|
||||
Contracts: contractsList,
|
||||
Overrides: overrides,
|
||||
}
|
||||
res, err := LinkAndDeploy(deployParams, mockDeploy)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(res.Txs) != len(tcInput.expectDeployed) {
|
||||
return fmt.Errorf("got %d deployed contracts. expected %d.\n", len(res.Addresses), len(tcInput.expectDeployed))
|
||||
}
|
||||
for contract := range tcInput.expectDeployed {
|
||||
pattern := crypto.Keccak256Hash([]byte(string(contract))).String()[2:36]
|
||||
if _, ok := res.Addresses[pattern]; !ok {
|
||||
return fmt.Errorf("expected contract %s was not deployed\n", string(contract))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestContractLinking(t *testing.T) {
|
||||
for i, tc := range []linkTestCaseInput{
|
||||
// test simple contract without any dependencies or overrides
|
||||
{
|
||||
map[rune][]rune{
|
||||
'a': {}},
|
||||
map[rune]struct{}{},
|
||||
map[rune]struct{}{
|
||||
'a': {}},
|
||||
},
|
||||
// test deployment of a contract that depends on somes libraries.
|
||||
{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'}},
|
||||
map[rune]struct{}{},
|
||||
map[rune]struct{}{
|
||||
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}},
|
||||
},
|
||||
// test deployment of a contract that depends on some libraries,
|
||||
// one of which has its own library dependencies.
|
||||
{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'},
|
||||
'e': {'f', 'g', 'h', 'i'}},
|
||||
map[rune]struct{}{},
|
||||
map[rune]struct{}{
|
||||
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {}, 'i': {}},
|
||||
},
|
||||
// test single contract only without deps
|
||||
{
|
||||
map[rune][]rune{
|
||||
'a': {}},
|
||||
map[rune]struct{}{},
|
||||
map[rune]struct{}{
|
||||
'a': {},
|
||||
},
|
||||
},
|
||||
// test that libraries at different levels of the tree can share deps,
|
||||
// and that these shared deps will only be deployed once.
|
||||
{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'},
|
||||
'e': {'f', 'g', 'h', 'i', 'm'},
|
||||
'i': {'j', 'k', 'l', 'm'}},
|
||||
map[rune]struct{}{},
|
||||
map[rune]struct{}{
|
||||
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {}, 'i': {}, 'j': {}, 'k': {}, 'l': {}, 'm': {},
|
||||
},
|
||||
},
|
||||
// test two contracts can be deployed which don't share deps
|
||||
linkTestCaseInput{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'},
|
||||
'f': {'g', 'h', 'i', 'j'}},
|
||||
map[rune]struct{}{},
|
||||
map[rune]struct{}{
|
||||
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {}, 'i': {}, 'j': {},
|
||||
},
|
||||
},
|
||||
// test two contracts can be deployed which share deps
|
||||
linkTestCaseInput{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'},
|
||||
'f': {'g', 'c', 'd', 'h'}},
|
||||
map[rune]struct{}{},
|
||||
map[rune]struct{}{
|
||||
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {},
|
||||
},
|
||||
},
|
||||
// test one contract with overrides for all lib deps
|
||||
linkTestCaseInput{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'}},
|
||||
map[rune]struct{}{'b': {}, 'c': {}, 'd': {}, 'e': {}},
|
||||
map[rune]struct{}{
|
||||
'a': {}},
|
||||
},
|
||||
// test one contract with overrides for some lib deps
|
||||
linkTestCaseInput{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c'}},
|
||||
map[rune]struct{}{'b': {}, 'c': {}},
|
||||
map[rune]struct{}{
|
||||
'a': {}},
|
||||
},
|
||||
// test deployment of a contract with overrides
|
||||
linkTestCaseInput{
|
||||
map[rune][]rune{
|
||||
'a': {}},
|
||||
map[rune]struct{}{'a': {}},
|
||||
map[rune]struct{}{},
|
||||
},
|
||||
// two contracts ('a' and 'f') share some dependencies. contract 'a' is marked as an override. expect that any of
|
||||
// its depdencies that aren't shared with 'f' are not deployed.
|
||||
linkTestCaseInput{map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'},
|
||||
'f': {'g', 'c', 'd', 'h'}},
|
||||
map[rune]struct{}{'a': {}},
|
||||
map[rune]struct{}{
|
||||
'f': {}, 'g': {}, 'c': {}, 'd': {}, 'h': {}},
|
||||
},
|
||||
// test nested libraries that share deps at different levels of the tree... with override.
|
||||
// same condition as above test: no sub-dependencies of
|
||||
{
|
||||
map[rune][]rune{
|
||||
'a': {'b', 'c', 'd', 'e'},
|
||||
'e': {'f', 'g', 'h', 'i', 'm'},
|
||||
'i': {'j', 'k', 'l', 'm'},
|
||||
'l': {'n', 'o', 'p'}},
|
||||
map[rune]struct{}{
|
||||
'i': {},
|
||||
},
|
||||
map[rune]struct{}{
|
||||
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {}, 'm': {}},
|
||||
},
|
||||
} {
|
||||
if err := testLinkCase(tc); err != nil {
|
||||
t.Fatalf("test case %d failed: %v", i, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func parseLibraryDeps(unlinkedCode string) (res []string) {
|
||||
reMatchSpecificPattern, err := regexp.Compile(`__\$([a-f0-9]+)\$__`)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, match := range reMatchSpecificPattern.FindAllStringSubmatch(unlinkedCode, -1) {
|
||||
res = append(res, match[1])
|
||||
}
|
||||
return res
|
||||
}
|
||||
102
accounts/abi/bind/v2/generate_test.go
Normal file
102
accounts/abi/bind/v2/generate_test.go
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
// Copyright 2024 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/abigen"
|
||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||
"github.com/ethereum/go-ethereum/common/compiler"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
)
|
||||
|
||||
// Run go generate to recreate the test bindings.
|
||||
//
|
||||
//go:generate go run github.com/ethereum/go-ethereum/cmd/abigen -v2 -combined-json internal/contracts/db/combined-abi.json -type DBStats -pkg db -out internal/contracts/db/bindings.go
|
||||
//go:generate go run github.com/ethereum/go-ethereum/cmd/abigen -v2 -combined-json internal/contracts/events/combined-abi.json -type C -pkg events -out internal/contracts/events/bindings.go
|
||||
//go:generate go run github.com/ethereum/go-ethereum/cmd/abigen -v2 -combined-json internal/contracts/nested_libraries/combined-abi.json -type C1 -pkg nested_libraries -out internal/contracts/nested_libraries/bindings.go
|
||||
//go:generate go run github.com/ethereum/go-ethereum/cmd/abigen -v2 -combined-json internal/contracts/solc_errors/combined-abi.json -type C -pkg solc_errors -out internal/contracts/solc_errors/bindings.go
|
||||
//go:generate go run github.com/ethereum/go-ethereum/cmd/abigen -v2 -combined-json internal/contracts/uint256arrayreturn/combined-abi.json -type C -pkg uint256arrayreturn -out internal/contracts/uint256arrayreturn/bindings.go
|
||||
|
||||
// TestBindingGeneration tests that re-running generation of bindings does not result in
|
||||
// mutations to the binding code.
|
||||
func TestBindingGeneration(t *testing.T) {
|
||||
matches, _ := filepath.Glob("internal/contracts/*")
|
||||
var dirs []string
|
||||
for _, match := range matches {
|
||||
f, _ := os.Stat(match)
|
||||
if f.IsDir() {
|
||||
dirs = append(dirs, f.Name())
|
||||
}
|
||||
}
|
||||
|
||||
for _, dir := range dirs {
|
||||
var (
|
||||
abis []string
|
||||
bins []string
|
||||
types []string
|
||||
libs = make(map[string]string)
|
||||
)
|
||||
basePath := filepath.Join("internal/contracts", dir)
|
||||
combinedJsonPath := filepath.Join(basePath, "combined-abi.json")
|
||||
abiBytes, err := os.ReadFile(combinedJsonPath)
|
||||
if err != nil {
|
||||
t.Fatalf("error trying to read file %s: %v", combinedJsonPath, err)
|
||||
}
|
||||
contracts, err := compiler.ParseCombinedJSON(abiBytes, "", "", "", "")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to read contract information from json output: %v", err)
|
||||
}
|
||||
|
||||
for name, contract := range contracts {
|
||||
// fully qualified name is of the form <solFilePath>:<type>
|
||||
nameParts := strings.Split(name, ":")
|
||||
typeName := nameParts[len(nameParts)-1]
|
||||
abi, err := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse
|
||||
if err != nil {
|
||||
utils.Fatalf("Failed to parse ABIs from compiler output: %v", err)
|
||||
}
|
||||
abis = append(abis, string(abi))
|
||||
bins = append(bins, contract.Code)
|
||||
types = append(types, typeName)
|
||||
|
||||
// Derive the library placeholder which is a 34 character prefix of the
|
||||
// hex encoding of the keccak256 hash of the fully qualified library name.
|
||||
// Note that the fully qualified library name is the path of its source
|
||||
// file and the library name separated by ":".
|
||||
libPattern := crypto.Keccak256Hash([]byte(name)).String()[2:36] // the first 2 chars are 0x
|
||||
libs[libPattern] = typeName
|
||||
}
|
||||
code, err := abigen.BindV2(types, abis, bins, dir, libs, make(map[string]string))
|
||||
if err != nil {
|
||||
t.Fatalf("error creating bindings for package %s: %v", dir, err)
|
||||
}
|
||||
|
||||
existingBindings, err := os.ReadFile(filepath.Join(basePath, "bindings.go"))
|
||||
if err != nil {
|
||||
t.Fatalf("ReadFile returned error: %v", err)
|
||||
}
|
||||
if code != string(existingBindings) {
|
||||
t.Fatalf("code mismatch for %s", dir)
|
||||
}
|
||||
}
|
||||
}
|
||||
293
accounts/abi/bind/v2/internal/contracts/db/bindings.go
Normal file
293
accounts/abi/bind/v2/internal/contracts/db/bindings.go
Normal file
|
|
@ -0,0 +1,293 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package db
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// DBStats is an auto generated low-level Go binding around an user-defined struct.
|
||||
type DBStats struct {
|
||||
Gets *big.Int
|
||||
Inserts *big.Int
|
||||
Mods *big.Int
|
||||
}
|
||||
|
||||
// DBMetaData contains all meta data concerning the DB contract.
|
||||
var DBMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"key\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"Insert\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"key\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"KeyedInsert\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"k\",\"type\":\"uint256\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNamedStatParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"inserts\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mods\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStatParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStatsStruct\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"inserts\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mods\",\"type\":\"uint256\"}],\"internalType\":\"structDB.Stats\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"k\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"v\",\"type\":\"uint256\"}],\"name\":\"insert\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
|
||||
ID: "253cc2574e2f8b5e909644530e4934f6ac",
|
||||
Bin: "0x60806040525f5f553480156011575f5ffd5b5060405180606001604052805f81526020015f81526020015f81525060035f820151815f015560208201518160010155604082015181600201559050506105f78061005b5f395ff3fe60806040526004361061004d575f3560e01c80631d834a1b146100cb5780636fcb9c70146101075780639507d39a14610133578063e369ba3b1461016f578063ee8161e01461019b5761006a565b3661006a57345f5f82825461006291906103eb565b925050819055005b348015610075575f5ffd5b505f36606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050509050915050805190602001f35b3480156100d6575f5ffd5b506100f160048036038101906100ec919061044c565b6101c5565b6040516100fe9190610499565b60405180910390f35b348015610112575f5ffd5b5061011b6102ef565b60405161012a939291906104b2565b60405180910390f35b34801561013e575f5ffd5b50610159600480360381019061015491906104e7565b61030e565b6040516101669190610499565b60405180910390f35b34801561017a575f5ffd5b50610183610341565b604051610192939291906104b2565b60405180910390f35b3480156101a6575f5ffd5b506101af610360565b6040516101bc9190610561565b60405180910390f35b5f5f82036101da5760028054905090506102e9565b5f60015f8581526020019081526020015f20540361023757600283908060018154018082558091505060019003905f5260205f20015f909190919091505560036001015f81548092919061022d9061057a565b9190505550610252565b60036002015f81548092919061024c9061057a565b91905055505b8160015f8581526020019081526020015f20819055507f8b39ff47dca36ab5b8b80845238af53aa579625ac7fb173dc09376adada4176983836002805490506040516102a0939291906104b2565b60405180910390a1827f40bed843c6c5f72002f9b469cf4c1ee9f7fb1eb48f091c1267970f98522ac02d836040516102d89190610499565b60405180910390a260028054905090505b92915050565b5f5f5f60035f0154600360010154600360020154925092509250909192565b5f60035f015f8154809291906103239061057a565b919050555060015f8381526020019081526020015f20549050919050565b5f5f5f60035f0154600360010154600360020154925092509250909192565b610368610397565b60036040518060600160405290815f820154815260200160018201548152602001600282015481525050905090565b60405180606001604052805f81526020015f81526020015f81525090565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6103f5826103b5565b9150610400836103b5565b9250828201905080821115610418576104176103be565b5b92915050565b5f5ffd5b61042b816103b5565b8114610435575f5ffd5b50565b5f8135905061044681610422565b92915050565b5f5f604083850312156104625761046161041e565b5b5f61046f85828601610438565b925050602061048085828601610438565b9150509250929050565b610493816103b5565b82525050565b5f6020820190506104ac5f83018461048a565b92915050565b5f6060820190506104c55f83018661048a565b6104d2602083018561048a565b6104df604083018461048a565b949350505050565b5f602082840312156104fc576104fb61041e565b5b5f61050984828501610438565b91505092915050565b61051b816103b5565b82525050565b606082015f8201516105355f850182610512565b5060208201516105486020850182610512565b50604082015161055b6040850182610512565b50505050565b5f6060820190506105745f830184610521565b92915050565b5f610584826103b5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036105b6576105b56103be565b5b60018201905091905056fea264697066735822122063e58431f2afdc667f8e687d3e6a99085a93c1fd3ce40b218463b8ddd3cc093664736f6c634300081c0033",
|
||||
}
|
||||
|
||||
// DB is an auto generated Go binding around an Ethereum contract.
|
||||
type DB struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewDB creates a new instance of DB.
|
||||
func NewDB() *DB {
|
||||
parsed, err := DBMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &DB{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *DB) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackGet is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x9507d39a.
|
||||
//
|
||||
// Solidity: function get(uint256 k) returns(uint256)
|
||||
func (dB *DB) PackGet(k *big.Int) []byte {
|
||||
enc, err := dB.abi.Pack("get", k)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackGet is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x9507d39a.
|
||||
//
|
||||
// Solidity: function get(uint256 k) returns(uint256)
|
||||
func (dB *DB) UnpackGet(data []byte) (*big.Int, error) {
|
||||
out, err := dB.abi.Unpack("get", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackGetNamedStatParams is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xe369ba3b.
|
||||
//
|
||||
// Solidity: function getNamedStatParams() view returns(uint256 gets, uint256 inserts, uint256 mods)
|
||||
func (dB *DB) PackGetNamedStatParams() []byte {
|
||||
enc, err := dB.abi.Pack("getNamedStatParams")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// GetNamedStatParamsOutput serves as a container for the return parameters of contract
|
||||
// method GetNamedStatParams.
|
||||
type GetNamedStatParamsOutput struct {
|
||||
Gets *big.Int
|
||||
Inserts *big.Int
|
||||
Mods *big.Int
|
||||
}
|
||||
|
||||
// UnpackGetNamedStatParams is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xe369ba3b.
|
||||
//
|
||||
// Solidity: function getNamedStatParams() view returns(uint256 gets, uint256 inserts, uint256 mods)
|
||||
func (dB *DB) UnpackGetNamedStatParams(data []byte) (GetNamedStatParamsOutput, error) {
|
||||
out, err := dB.abi.Unpack("getNamedStatParams", data)
|
||||
outstruct := new(GetNamedStatParamsOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Gets = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Inserts = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
outstruct.Mods = abi.ConvertType(out[2], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackGetStatParams is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x6fcb9c70.
|
||||
//
|
||||
// Solidity: function getStatParams() view returns(uint256, uint256, uint256)
|
||||
func (dB *DB) PackGetStatParams() []byte {
|
||||
enc, err := dB.abi.Pack("getStatParams")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// GetStatParamsOutput serves as a container for the return parameters of contract
|
||||
// method GetStatParams.
|
||||
type GetStatParamsOutput struct {
|
||||
Arg0 *big.Int
|
||||
Arg1 *big.Int
|
||||
Arg2 *big.Int
|
||||
}
|
||||
|
||||
// UnpackGetStatParams is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x6fcb9c70.
|
||||
//
|
||||
// Solidity: function getStatParams() view returns(uint256, uint256, uint256)
|
||||
func (dB *DB) UnpackGetStatParams(data []byte) (GetStatParamsOutput, error) {
|
||||
out, err := dB.abi.Unpack("getStatParams", data)
|
||||
outstruct := new(GetStatParamsOutput)
|
||||
if err != nil {
|
||||
return *outstruct, err
|
||||
}
|
||||
outstruct.Arg0 = abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
outstruct.Arg1 = abi.ConvertType(out[1], new(big.Int)).(*big.Int)
|
||||
outstruct.Arg2 = abi.ConvertType(out[2], new(big.Int)).(*big.Int)
|
||||
return *outstruct, err
|
||||
|
||||
}
|
||||
|
||||
// PackGetStatsStruct is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xee8161e0.
|
||||
//
|
||||
// Solidity: function getStatsStruct() view returns((uint256,uint256,uint256))
|
||||
func (dB *DB) PackGetStatsStruct() []byte {
|
||||
enc, err := dB.abi.Pack("getStatsStruct")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackGetStatsStruct is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xee8161e0.
|
||||
//
|
||||
// Solidity: function getStatsStruct() view returns((uint256,uint256,uint256))
|
||||
func (dB *DB) UnpackGetStatsStruct(data []byte) (DBStats, error) {
|
||||
out, err := dB.abi.Unpack("getStatsStruct", data)
|
||||
if err != nil {
|
||||
return *new(DBStats), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new(DBStats)).(*DBStats)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// PackInsert is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x1d834a1b.
|
||||
//
|
||||
// Solidity: function insert(uint256 k, uint256 v) returns(uint256)
|
||||
func (dB *DB) PackInsert(k *big.Int, v *big.Int) []byte {
|
||||
enc, err := dB.abi.Pack("insert", k, v)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackInsert is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x1d834a1b.
|
||||
//
|
||||
// Solidity: function insert(uint256 k, uint256 v) returns(uint256)
|
||||
func (dB *DB) UnpackInsert(data []byte) (*big.Int, error) {
|
||||
out, err := dB.abi.Unpack("insert", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// DBInsert represents a Insert event raised by the DB contract.
|
||||
type DBInsert struct {
|
||||
Key *big.Int
|
||||
Value *big.Int
|
||||
Length *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const DBInsertEventName = "Insert"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (DBInsert) ContractEventName() string {
|
||||
return DBInsertEventName
|
||||
}
|
||||
|
||||
// UnpackInsertEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event Insert(uint256 key, uint256 value, uint256 length)
|
||||
func (dB *DB) UnpackInsertEvent(log *types.Log) (*DBInsert, error) {
|
||||
event := "Insert"
|
||||
if log.Topics[0] != dB.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(DBInsert)
|
||||
if len(log.Data) > 0 {
|
||||
if err := dB.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range dB.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// DBKeyedInsert represents a KeyedInsert event raised by the DB contract.
|
||||
type DBKeyedInsert struct {
|
||||
Key *big.Int
|
||||
Value *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const DBKeyedInsertEventName = "KeyedInsert"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (DBKeyedInsert) ContractEventName() string {
|
||||
return DBKeyedInsertEventName
|
||||
}
|
||||
|
||||
// UnpackKeyedInsertEvent is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event KeyedInsert(uint256 indexed key, uint256 value)
|
||||
func (dB *DB) UnpackKeyedInsertEvent(log *types.Log) (*DBKeyedInsert, error) {
|
||||
event := "KeyedInsert"
|
||||
if log.Topics[0] != dB.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(DBKeyedInsert)
|
||||
if len(log.Data) > 0 {
|
||||
if err := dB.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range dB.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
66
accounts/abi/bind/v2/internal/contracts/db/contract.sol
Normal file
66
accounts/abi/bind/v2/internal/contracts/db/contract.sol
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
contract DB {
|
||||
uint balance = 0;
|
||||
mapping(uint => uint) private _store;
|
||||
uint[] private _keys;
|
||||
struct Stats {
|
||||
uint gets;
|
||||
uint inserts;
|
||||
uint mods; // modifications
|
||||
}
|
||||
Stats _stats;
|
||||
|
||||
event KeyedInsert(uint indexed key, uint value);
|
||||
event Insert(uint key, uint value, uint length);
|
||||
|
||||
constructor() {
|
||||
_stats = Stats(0, 0, 0);
|
||||
}
|
||||
|
||||
// insert adds a key value to the store, returning the new length of the store.
|
||||
function insert(uint k, uint v) external returns (uint) {
|
||||
// No need to store 0 values
|
||||
if (v == 0) {
|
||||
return _keys.length;
|
||||
}
|
||||
// Check if a key is being overriden
|
||||
if (_store[k] == 0) {
|
||||
_keys.push(k);
|
||||
_stats.inserts++;
|
||||
} else {
|
||||
_stats.mods++;
|
||||
}
|
||||
_store[k] = v;
|
||||
emit Insert(k, v, _keys.length);
|
||||
emit KeyedInsert(k, v);
|
||||
|
||||
return _keys.length;
|
||||
}
|
||||
|
||||
function get(uint k) public returns (uint) {
|
||||
_stats.gets++;
|
||||
return _store[k];
|
||||
}
|
||||
|
||||
function getStatParams() public view returns (uint, uint, uint) {
|
||||
return (_stats.gets, _stats.inserts, _stats.mods);
|
||||
}
|
||||
|
||||
function getNamedStatParams() public view returns (uint gets, uint inserts, uint mods) {
|
||||
return (_stats.gets, _stats.inserts, _stats.mods);
|
||||
}
|
||||
|
||||
function getStatsStruct() public view returns (Stats memory) {
|
||||
return _stats;
|
||||
}
|
||||
|
||||
receive() external payable {
|
||||
balance += msg.value;
|
||||
}
|
||||
|
||||
fallback(bytes calldata _input) external returns (bytes memory _output) {
|
||||
_output = _input;
|
||||
}
|
||||
}
|
||||
160
accounts/abi/bind/v2/internal/contracts/events/bindings.go
Normal file
160
accounts/abi/bind/v2/internal/contracts/events/bindings.go
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package events
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// CMetaData contains all meta data concerning the C contract.
|
||||
var CMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"data\",\"type\":\"uint256\"}],\"name\":\"basic1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"flag\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"data\",\"type\":\"uint256\"}],\"name\":\"basic2\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"EmitMulti\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EmitOne\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
|
||||
ID: "55ef3c19a0ab1c1845f9e347540c1e51f5",
|
||||
Bin: "0x6080604052348015600e575f5ffd5b506101a08061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063cb49374914610038578063e8e49a7114610042575b5f5ffd5b61004061004c565b005b61004a6100fd565b005b60017f8f17dc823e2f9fcdf730b8182c935574691e811e7d46399fe0ff0087795cd207600260405161007e9190610151565b60405180910390a260037f8f17dc823e2f9fcdf730b8182c935574691e811e7d46399fe0ff0087795cd20760046040516100b89190610151565b60405180910390a25f15157f3b29b9f6d15ba80d866afb3d70b7548ab1ffda3ef6e65f35f1cb05b0e2b29f4e60016040516100f39190610151565b60405180910390a2565b60017f8f17dc823e2f9fcdf730b8182c935574691e811e7d46399fe0ff0087795cd207600260405161012f9190610151565b60405180910390a2565b5f819050919050565b61014b81610139565b82525050565b5f6020820190506101645f830184610142565b9291505056fea26469706673582212207331c79de16a73a1639c4c4b3489ea78a3ed35fe62a178824f586df12672ac0564736f6c634300081c0033",
|
||||
}
|
||||
|
||||
// C is an auto generated Go binding around an Ethereum contract.
|
||||
type C struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewC creates a new instance of C.
|
||||
func NewC() *C {
|
||||
parsed, err := CMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &C{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *C) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackEmitMulti is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xcb493749.
|
||||
//
|
||||
// Solidity: function EmitMulti() returns()
|
||||
func (c *C) PackEmitMulti() []byte {
|
||||
enc, err := c.abi.Pack("EmitMulti")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackEmitOne is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xe8e49a71.
|
||||
//
|
||||
// Solidity: function EmitOne() returns()
|
||||
func (c *C) PackEmitOne() []byte {
|
||||
enc, err := c.abi.Pack("EmitOne")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// CBasic1 represents a basic1 event raised by the C contract.
|
||||
type CBasic1 struct {
|
||||
Id *big.Int
|
||||
Data *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const CBasic1EventName = "basic1"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (CBasic1) ContractEventName() string {
|
||||
return CBasic1EventName
|
||||
}
|
||||
|
||||
// UnpackBasic1Event is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event basic1(uint256 indexed id, uint256 data)
|
||||
func (c *C) UnpackBasic1Event(log *types.Log) (*CBasic1, error) {
|
||||
event := "basic1"
|
||||
if log.Topics[0] != c.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(CBasic1)
|
||||
if len(log.Data) > 0 {
|
||||
if err := c.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range c.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// CBasic2 represents a basic2 event raised by the C contract.
|
||||
type CBasic2 struct {
|
||||
Flag bool
|
||||
Data *big.Int
|
||||
Raw *types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
const CBasic2EventName = "basic2"
|
||||
|
||||
// ContractEventName returns the user-defined event name.
|
||||
func (CBasic2) ContractEventName() string {
|
||||
return CBasic2EventName
|
||||
}
|
||||
|
||||
// UnpackBasic2Event is the Go binding that unpacks the event data emitted
|
||||
// by contract.
|
||||
//
|
||||
// Solidity: event basic2(bool indexed flag, uint256 data)
|
||||
func (c *C) UnpackBasic2Event(log *types.Log) (*CBasic2, error) {
|
||||
event := "basic2"
|
||||
if log.Topics[0] != c.abi.Events[event].ID {
|
||||
return nil, errors.New("event signature mismatch")
|
||||
}
|
||||
out := new(CBasic2)
|
||||
if len(log.Data) > 0 {
|
||||
if err := c.abi.UnpackIntoInterface(out, event, log.Data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var indexed abi.Arguments
|
||||
for _, arg := range c.abi.Events[event].Inputs {
|
||||
if arg.Indexed {
|
||||
indexed = append(indexed, arg)
|
||||
}
|
||||
}
|
||||
if err := abi.ParseTopics(out, indexed, log.Topics[1:]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Raw = log
|
||||
return out, nil
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"contracts":{"contract.sol:C":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"basic1","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"flag","type":"bool"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"basic2","type":"event"},{"inputs":[],"name":"EmitMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"EmitOne","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bin":"6080604052348015600e575f5ffd5b506101a08061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063cb49374914610038578063e8e49a7114610042575b5f5ffd5b61004061004c565b005b61004a6100fd565b005b60017f8f17dc823e2f9fcdf730b8182c935574691e811e7d46399fe0ff0087795cd207600260405161007e9190610151565b60405180910390a260037f8f17dc823e2f9fcdf730b8182c935574691e811e7d46399fe0ff0087795cd20760046040516100b89190610151565b60405180910390a25f15157f3b29b9f6d15ba80d866afb3d70b7548ab1ffda3ef6e65f35f1cb05b0e2b29f4e60016040516100f39190610151565b60405180910390a2565b60017f8f17dc823e2f9fcdf730b8182c935574691e811e7d46399fe0ff0087795cd207600260405161012f9190610151565b60405180910390a2565b5f819050919050565b61014b81610139565b82525050565b5f6020820190506101645f830184610142565b9291505056fea26469706673582212207331c79de16a73a1639c4c4b3489ea78a3ed35fe62a178824f586df12672ac0564736f6c634300081c0033"}},"version":"0.8.28+commit.7893614a.Darwin.appleclang"}
|
||||
36
accounts/abi/bind/v2/internal/contracts/events/contract.sol
Normal file
36
accounts/abi/bind/v2/internal/contracts/events/contract.sol
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.26;
|
||||
|
||||
contract C {
|
||||
event basic1(
|
||||
uint256 indexed id,
|
||||
uint256 data
|
||||
);
|
||||
event basic2(
|
||||
bool indexed flag,
|
||||
uint256 data
|
||||
);
|
||||
|
||||
function EmitOne() public {
|
||||
emit basic1(
|
||||
uint256(1),
|
||||
uint256(2));
|
||||
}
|
||||
|
||||
// emit multiple events, different types
|
||||
function EmitMulti() public {
|
||||
emit basic1(
|
||||
uint256(1),
|
||||
uint256(2));
|
||||
emit basic1(
|
||||
uint256(3),
|
||||
uint256(4));
|
||||
emit basic2(
|
||||
false,
|
||||
uint256(1));
|
||||
}
|
||||
|
||||
constructor() {
|
||||
// do something with these
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,486 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package nested_libraries
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// C1MetaData contains all meta data concerning the C1 contract.
|
||||
var C1MetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"v1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"v2\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"res\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "ae26158f1824f3918bd66724ee8b6eb7c9",
|
||||
Bin: "0x6080604052348015600e575f5ffd5b506040516103983803806103988339818101604052810190602e91906066565b5050609d565b5f5ffd5b5f819050919050565b6048816038565b81146051575f5ffd5b50565b5f815190506060816041565b92915050565b5f5f6040838503121560795760786034565b5b5f6084858286016054565b92505060206093858286016054565b9150509250929050565b6102ee806100aa5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80632ad112721461002d575b5f5ffd5b6100476004803603810190610042919061019e565b61005d565b60405161005491906101d8565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad112725f6040518263ffffffff1660e01b81526004016100979190610200565b602060405180830381865af41580156100b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d6919061022d565b73__$5f33a1fab8ea7d932b4bc8c5e7dcd90bc2$__632ad11272856040518263ffffffff1660e01b815260040161010d9190610200565b602060405180830381865af4158015610128573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014c919061022d565b6101569190610285565b6101609190610285565b9050919050565b5f5ffd5b5f819050919050565b61017d8161016b565b8114610187575f5ffd5b50565b5f8135905061019881610174565b92915050565b5f602082840312156101b3576101b2610167565b5b5f6101c08482850161018a565b91505092915050565b6101d28161016b565b82525050565b5f6020820190506101eb5f8301846101c9565b92915050565b6101fa8161016b565b82525050565b5f6020820190506102135f8301846101f1565b92915050565b5f8151905061022781610174565b92915050565b5f6020828403121561024257610241610167565b5b5f61024f84828501610219565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61028f8261016b565b915061029a8361016b565b92508282019050808211156102b2576102b1610258565b5b9291505056fea26469706673582212205d4715a8d20a3a0a43113e268ec8868b3c3ce24f7cbdb8735b4eeeebf0b5565164736f6c634300081c0033",
|
||||
Deps: []*bind.MetaData{
|
||||
&L1MetaData,
|
||||
&L4MetaData,
|
||||
},
|
||||
}
|
||||
|
||||
// C1 is an auto generated Go binding around an Ethereum contract.
|
||||
type C1 struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewC1 creates a new instance of C1.
|
||||
func NewC1() *C1 {
|
||||
parsed, err := C1MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &C1{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *C1) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackConstructor is the Go binding used to pack the parameters required for
|
||||
// contract deployment.
|
||||
//
|
||||
// Solidity: constructor(uint256 v1, uint256 v2) returns()
|
||||
func (c1 *C1) PackConstructor(v1 *big.Int, v2 *big.Int) []byte {
|
||||
enc, err := c1.abi.Pack("", v1, v2)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256 res)
|
||||
func (c1 *C1) PackDo(val *big.Int) []byte {
|
||||
enc, err := c1.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256 res)
|
||||
func (c1 *C1) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := c1.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// C2MetaData contains all meta data concerning the C2 contract.
|
||||
var C2MetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"v1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"v2\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"res\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "78ef2840de5b706112ca2dbfa765501a89",
|
||||
Bin: "0x6080604052348015600e575f5ffd5b506040516103983803806103988339818101604052810190602e91906066565b5050609d565b5f5ffd5b5f819050919050565b6048816038565b81146051575f5ffd5b50565b5f815190506060816041565b92915050565b5f5f6040838503121560795760786034565b5b5f6084858286016054565b92505060206093858286016054565b9150509250929050565b6102ee806100aa5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80632ad112721461002d575b5f5ffd5b6100476004803603810190610042919061019e565b61005d565b60405161005491906101d8565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad112725f6040518263ffffffff1660e01b81526004016100979190610200565b602060405180830381865af41580156100b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d6919061022d565b73__$6070639404c39b5667691bb1f9177e1eac$__632ad11272856040518263ffffffff1660e01b815260040161010d9190610200565b602060405180830381865af4158015610128573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014c919061022d565b6101569190610285565b6101609190610285565b9050919050565b5f5ffd5b5f819050919050565b61017d8161016b565b8114610187575f5ffd5b50565b5f8135905061019881610174565b92915050565b5f602082840312156101b3576101b2610167565b5b5f6101c08482850161018a565b91505092915050565b6101d28161016b565b82525050565b5f6020820190506101eb5f8301846101c9565b92915050565b6101fa8161016b565b82525050565b5f6020820190506102135f8301846101f1565b92915050565b5f8151905061022781610174565b92915050565b5f6020828403121561024257610241610167565b5b5f61024f84828501610219565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61028f8261016b565b915061029a8361016b565b92508282019050808211156102b2576102b1610258565b5b9291505056fea2646970667358221220dd394981f1e9fefa4d88bac1c4f1da4131779c7d3bd4189958d278e57e96d96f64736f6c634300081c0033",
|
||||
Deps: []*bind.MetaData{
|
||||
&L1MetaData,
|
||||
&L4bMetaData,
|
||||
},
|
||||
}
|
||||
|
||||
// C2 is an auto generated Go binding around an Ethereum contract.
|
||||
type C2 struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewC2 creates a new instance of C2.
|
||||
func NewC2() *C2 {
|
||||
parsed, err := C2MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &C2{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *C2) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackConstructor is the Go binding used to pack the parameters required for
|
||||
// contract deployment.
|
||||
//
|
||||
// Solidity: constructor(uint256 v1, uint256 v2) returns()
|
||||
func (c2 *C2) PackConstructor(v1 *big.Int, v2 *big.Int) []byte {
|
||||
enc, err := c2.abi.Pack("", v1, v2)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256 res)
|
||||
func (c2 *C2) PackDo(val *big.Int) []byte {
|
||||
enc, err := c2.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256 res)
|
||||
func (c2 *C2) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := c2.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// L1MetaData contains all meta data concerning the L1 contract.
|
||||
var L1MetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "ffc1393672b8ed81d0c8093ffcb0e7fbe8",
|
||||
Bin: "0x61011c61004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106032575f3560e01c80632ad11272146036575b5f5ffd5b604c600480360381019060489190609c565b6060565b6040516057919060cf565b60405180910390f35b5f60019050919050565b5f5ffd5b5f819050919050565b607e81606e565b81146087575f5ffd5b50565b5f813590506096816077565b92915050565b5f6020828403121560ae5760ad606a565b5b5f60b984828501608a565b91505092915050565b60c981606e565b82525050565b5f60208201905060e05f83018460c2565b9291505056fea26469706673582212200161c5f22d130a2b7ec6cf22e0910e42e32c2881fa4a8a01455f524f63cf218d64736f6c634300081c0033",
|
||||
}
|
||||
|
||||
// L1 is an auto generated Go binding around an Ethereum contract.
|
||||
type L1 struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewL1 creates a new instance of L1.
|
||||
func NewL1() *L1 {
|
||||
parsed, err := L1MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &L1{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *L1) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l1 *L1) PackDo(val *big.Int) []byte {
|
||||
enc, err := l1.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l1 *L1) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := l1.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// L2MetaData contains all meta data concerning the L2 contract.
|
||||
var L2MetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "2ce896a6dd38932d354f317286f90bc675",
|
||||
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f5ffd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f5ffd5b5f819050919050565b610108816100f6565b8114610112575f5ffd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea264697066735822122026999f96e14b0e279909ca5972343113c358e93a904569409a86866e2064f0fa64736f6c634300081c0033",
|
||||
Deps: []*bind.MetaData{
|
||||
&L1MetaData,
|
||||
},
|
||||
}
|
||||
|
||||
// L2 is an auto generated Go binding around an Ethereum contract.
|
||||
type L2 struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewL2 creates a new instance of L2.
|
||||
func NewL2() *L2 {
|
||||
parsed, err := L2MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &L2{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *L2) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l2 *L2) PackDo(val *big.Int) []byte {
|
||||
enc, err := l2.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l2 *L2) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := l2.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// L2bMetaData contains all meta data concerning the L2b contract.
|
||||
var L2bMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "fd1474cf57f7ed48491e8bfdfd0d172adf",
|
||||
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f5ffd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$ffc1393672b8ed81d0c8093ffcb0e7fbe8$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f5ffd5b5f819050919050565b610108816100f6565b8114610112575f5ffd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea2646970667358221220d6e7078682642d273736fd63baaa28538fe72495816c810fa0e77034de385dc564736f6c634300081c0033",
|
||||
Deps: []*bind.MetaData{
|
||||
&L1MetaData,
|
||||
},
|
||||
}
|
||||
|
||||
// L2b is an auto generated Go binding around an Ethereum contract.
|
||||
type L2b struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewL2b creates a new instance of L2b.
|
||||
func NewL2b() *L2b {
|
||||
parsed, err := L2bMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &L2b{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *L2b) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l2b *L2b) PackDo(val *big.Int) []byte {
|
||||
enc, err := l2b.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l2b *L2b) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := l2b.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// L3MetaData contains all meta data concerning the L3 contract.
|
||||
var L3MetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "d03b97f5e1a564374023a72ac7d1806773",
|
||||
Bin: "0x61011c61004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106032575f3560e01c80632ad11272146036575b5f5ffd5b604c600480360381019060489190609c565b6060565b6040516057919060cf565b60405180910390f35b5f60019050919050565b5f5ffd5b5f819050919050565b607e81606e565b81146087575f5ffd5b50565b5f813590506096816077565b92915050565b5f6020828403121560ae5760ad606a565b5b5f60b984828501608a565b91505092915050565b60c981606e565b82525050565b5f60208201905060e05f83018460c2565b9291505056fea264697066735822122094cfcb0ce039318885cc58f6d8e609e6e4bec575e1a046d3d15ea2e01e97241e64736f6c634300081c0033",
|
||||
}
|
||||
|
||||
// L3 is an auto generated Go binding around an Ethereum contract.
|
||||
type L3 struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewL3 creates a new instance of L3.
|
||||
func NewL3() *L3 {
|
||||
parsed, err := L3MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &L3{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *L3) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l3 *L3) PackDo(val *big.Int) []byte {
|
||||
enc, err := l3.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l3 *L3) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := l3.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// L4MetaData contains all meta data concerning the L4 contract.
|
||||
var L4MetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "5f33a1fab8ea7d932b4bc8c5e7dcd90bc2",
|
||||
Bin: "0x6102d161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f5ffd5b610052600480360381019061004d91906101a9565b610068565b60405161005f91906101e3565b60405180910390f35b5f600173__$d03b97f5e1a564374023a72ac7d1806773$__632ad11272846040518263ffffffff1660e01b81526004016100a291906101e3565b602060405180830381865af41580156100bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610210565b73__$2ce896a6dd38932d354f317286f90bc675$__632ad11272856040518263ffffffff1660e01b815260040161011891906101e3565b602060405180830381865af4158015610133573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101579190610210565b6101619190610268565b61016b9190610268565b9050919050565b5f5ffd5b5f819050919050565b61018881610176565b8114610192575f5ffd5b50565b5f813590506101a38161017f565b92915050565b5f602082840312156101be576101bd610172565b5b5f6101cb84828501610195565b91505092915050565b6101dd81610176565b82525050565b5f6020820190506101f65f8301846101d4565b92915050565b5f8151905061020a8161017f565b92915050565b5f6020828403121561022557610224610172565b5b5f610232848285016101fc565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61027282610176565b915061027d83610176565b92508282019050808211156102955761029461023b565b5b9291505056fea2646970667358221220531485f0b9ff78ba5ef06ef345aaddccec3ad15d1460014ccd7c2a58d36d0d4464736f6c634300081c0033",
|
||||
Deps: []*bind.MetaData{
|
||||
&L2MetaData,
|
||||
&L3MetaData,
|
||||
},
|
||||
}
|
||||
|
||||
// L4 is an auto generated Go binding around an Ethereum contract.
|
||||
type L4 struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewL4 creates a new instance of L4.
|
||||
func NewL4() *L4 {
|
||||
parsed, err := L4MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &L4{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *L4) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l4 *L4) PackDo(val *big.Int) []byte {
|
||||
enc, err := l4.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l4 *L4) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := l4.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
||||
// L4bMetaData contains all meta data concerning the L4b contract.
|
||||
var L4bMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"val\",\"type\":\"uint256\"}],\"name\":\"Do\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "6070639404c39b5667691bb1f9177e1eac",
|
||||
Bin: "0x61025161004d600b8282823980515f1a6073146041577f4e487b71000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c80632ad1127214610038575b5f5ffd5b610052600480360381019061004d9190610129565b610068565b60405161005f9190610163565b60405180910390f35b5f600173__$fd1474cf57f7ed48491e8bfdfd0d172adf$__632ad11272846040518263ffffffff1660e01b81526004016100a29190610163565b602060405180830381865af41580156100bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190610190565b6100eb91906101e8565b9050919050565b5f5ffd5b5f819050919050565b610108816100f6565b8114610112575f5ffd5b50565b5f81359050610123816100ff565b92915050565b5f6020828403121561013e5761013d6100f2565b5b5f61014b84828501610115565b91505092915050565b61015d816100f6565b82525050565b5f6020820190506101765f830184610154565b92915050565b5f8151905061018a816100ff565b92915050565b5f602082840312156101a5576101a46100f2565b5b5f6101b28482850161017c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101f2826100f6565b91506101fd836100f6565b9250828201905080821115610215576102146101bb565b5b9291505056fea264697066735822122008a2478fd2427f180ace529e137b69337cb655dc21d6426de37054c32e821c6a64736f6c634300081c0033",
|
||||
Deps: []*bind.MetaData{
|
||||
&L2bMetaData,
|
||||
},
|
||||
}
|
||||
|
||||
// L4b is an auto generated Go binding around an Ethereum contract.
|
||||
type L4b struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewL4b creates a new instance of L4b.
|
||||
func NewL4b() *L4b {
|
||||
parsed, err := L4bMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &L4b{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *L4b) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackDo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l4b *L4b) PackDo(val *big.Int) []byte {
|
||||
enc, err := l4b.abi.Pack("Do", val)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackDo is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0x2ad11272.
|
||||
//
|
||||
// Solidity: function Do(uint256 val) pure returns(uint256)
|
||||
func (l4b *L4b) UnpackDo(data []byte) (*big.Int, error) {
|
||||
out, err := l4b.abi.Unpack("Do", data)
|
||||
if err != nil {
|
||||
return new(big.Int), err
|
||||
}
|
||||
out0 := abi.ConvertType(out[0], new(big.Int)).(*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,76 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.26;
|
||||
|
||||
|
||||
// L1
|
||||
// \
|
||||
// L2 L3 L1
|
||||
// \ / /
|
||||
// L4 /
|
||||
// \ /
|
||||
// C1
|
||||
//
|
||||
library L1 {
|
||||
function Do(uint256 val) public pure returns (uint256) {
|
||||
return uint256(1);
|
||||
}
|
||||
}
|
||||
|
||||
library L2 {
|
||||
function Do(uint256 val) public pure returns (uint256) {
|
||||
return L1.Do(val) + uint256(1);
|
||||
}
|
||||
}
|
||||
|
||||
library L3 {
|
||||
function Do(uint256 val) public pure returns (uint256) {
|
||||
return uint256(1);
|
||||
}
|
||||
}
|
||||
|
||||
library L4 {
|
||||
function Do(uint256 val) public pure returns (uint256) {
|
||||
return L2.Do(uint256(val)) + L3.Do(uint256(val)) + uint256(1);
|
||||
}
|
||||
}
|
||||
|
||||
contract C1 {
|
||||
function Do(uint256 val) public pure returns (uint256 res) {
|
||||
return L4.Do(uint256(val)) + L1.Do(uint256(0)) + uint256(1);
|
||||
}
|
||||
|
||||
constructor(uint256 v1, uint256 v2) {
|
||||
// do something with these
|
||||
}
|
||||
}
|
||||
|
||||
// second contract+libraries: slightly different library deps than V1, but sharing several
|
||||
// L1
|
||||
// \
|
||||
// L2b L3 L1
|
||||
// \ / /
|
||||
// L4b /
|
||||
// \ /
|
||||
// C2
|
||||
//
|
||||
library L4b {
|
||||
function Do(uint256 val) public pure returns (uint256) {
|
||||
return L2b.Do(uint256(val)) + uint256(1);
|
||||
}
|
||||
}
|
||||
|
||||
library L2b {
|
||||
function Do(uint256 val) public pure returns (uint256) {
|
||||
return L1.Do(uint256(val)) + uint256(1);
|
||||
}
|
||||
}
|
||||
|
||||
contract C2 {
|
||||
function Do(uint256 val) public pure returns (uint256 res) {
|
||||
return L4b.Do(uint256(val)) + L1.Do(uint256(0)) + uint256(1);
|
||||
}
|
||||
|
||||
constructor(uint256 v1, uint256 v2) {
|
||||
// do something with these
|
||||
}
|
||||
}
|
||||
217
accounts/abi/bind/v2/internal/contracts/solc_errors/bindings.go
Normal file
217
accounts/abi/bind/v2/internal/contracts/solc_errors/bindings.go
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package solc_errors
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// CMetaData contains all meta data concerning the C contract.
|
||||
var CMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"arg1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arg2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arg3\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"arg4\",\"type\":\"bool\"}],\"name\":\"BadThing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"arg1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arg2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arg3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arg4\",\"type\":\"uint256\"}],\"name\":\"BadThing2\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Bar\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Foo\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "55ef3c19a0ab1c1845f9e347540c1e51f5",
|
||||
Bin: "0x6080604052348015600e575f5ffd5b506101c58061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063b0a378b014610038578063bfb4ebcf14610042575b5f5ffd5b61004061004c565b005b61004a610092565b005b5f6001600260036040517fd233a24f00000000000000000000000000000000000000000000000000000000815260040161008994939291906100ef565b60405180910390fd5b5f600160025f6040517fbb6a82f10000000000000000000000000000000000000000000000000000000081526004016100ce949392919061014c565b60405180910390fd5b5f819050919050565b6100e9816100d7565b82525050565b5f6080820190506101025f8301876100e0565b61010f60208301866100e0565b61011c60408301856100e0565b61012960608301846100e0565b95945050505050565b5f8115159050919050565b61014681610132565b82525050565b5f60808201905061015f5f8301876100e0565b61016c60208301866100e0565b61017960408301856100e0565b610186606083018461013d565b9594505050505056fea26469706673582212206a82b4c28576e4483a81102558271cfefc891cd63b95440dea521185c1ff6a2a64736f6c634300081c0033",
|
||||
}
|
||||
|
||||
// C is an auto generated Go binding around an Ethereum contract.
|
||||
type C struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewC creates a new instance of C.
|
||||
func NewC() *C {
|
||||
parsed, err := CMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &C{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *C) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackBar is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xb0a378b0.
|
||||
//
|
||||
// Solidity: function Bar() pure returns()
|
||||
func (c *C) PackBar() []byte {
|
||||
enc, err := c.abi.Pack("Bar")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// PackFoo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xbfb4ebcf.
|
||||
//
|
||||
// Solidity: function Foo() pure returns()
|
||||
func (c *C) PackFoo() []byte {
|
||||
enc, err := c.abi.Pack("Foo")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackError attempts to decode the provided error data using user-defined
|
||||
// error definitions.
|
||||
func (c *C) UnpackError(raw []byte) (any, error) {
|
||||
if bytes.Equal(raw[:4], c.abi.Errors["BadThing"].ID.Bytes()[:4]) {
|
||||
return c.UnpackBadThingError(raw[4:])
|
||||
}
|
||||
if bytes.Equal(raw[:4], c.abi.Errors["BadThing2"].ID.Bytes()[:4]) {
|
||||
return c.UnpackBadThing2Error(raw[4:])
|
||||
}
|
||||
return nil, errors.New("Unknown error")
|
||||
}
|
||||
|
||||
// CBadThing represents a BadThing error raised by the C contract.
|
||||
type CBadThing struct {
|
||||
Arg1 *big.Int
|
||||
Arg2 *big.Int
|
||||
Arg3 *big.Int
|
||||
Arg4 bool
|
||||
}
|
||||
|
||||
// ErrorID returns the hash of canonical representation of the error's signature.
|
||||
//
|
||||
// Solidity: error BadThing(uint256 arg1, uint256 arg2, uint256 arg3, bool arg4)
|
||||
func CBadThingErrorID() common.Hash {
|
||||
return common.HexToHash("0xbb6a82f123854747ef4381e30e497f934a3854753fec99a69c35c30d4b46714d")
|
||||
}
|
||||
|
||||
// UnpackBadThingError is the Go binding used to decode the provided
|
||||
// error data into the corresponding Go error struct.
|
||||
//
|
||||
// Solidity: error BadThing(uint256 arg1, uint256 arg2, uint256 arg3, bool arg4)
|
||||
func (c *C) UnpackBadThingError(raw []byte) (*CBadThing, error) {
|
||||
out := new(CBadThing)
|
||||
if err := c.abi.UnpackIntoInterface(out, "BadThing", raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// CBadThing2 represents a BadThing2 error raised by the C contract.
|
||||
type CBadThing2 struct {
|
||||
Arg1 *big.Int
|
||||
Arg2 *big.Int
|
||||
Arg3 *big.Int
|
||||
Arg4 *big.Int
|
||||
}
|
||||
|
||||
// ErrorID returns the hash of canonical representation of the error's signature.
|
||||
//
|
||||
// Solidity: error BadThing2(uint256 arg1, uint256 arg2, uint256 arg3, uint256 arg4)
|
||||
func CBadThing2ErrorID() common.Hash {
|
||||
return common.HexToHash("0xd233a24f02271fe7c9470e060d0fda6447a142bf12ab31fed7ab65affd546175")
|
||||
}
|
||||
|
||||
// UnpackBadThing2Error is the Go binding used to decode the provided
|
||||
// error data into the corresponding Go error struct.
|
||||
//
|
||||
// Solidity: error BadThing2(uint256 arg1, uint256 arg2, uint256 arg3, uint256 arg4)
|
||||
func (c *C) UnpackBadThing2Error(raw []byte) (*CBadThing2, error) {
|
||||
out := new(CBadThing2)
|
||||
if err := c.abi.UnpackIntoInterface(out, "BadThing2", raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// C2MetaData contains all meta data concerning the C2 contract.
|
||||
var C2MetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"arg1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arg2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arg3\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"arg4\",\"type\":\"bool\"}],\"name\":\"BadThing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Foo\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "78ef2840de5b706112ca2dbfa765501a89",
|
||||
Bin: "0x6080604052348015600e575f5ffd5b506101148061001c5f395ff3fe6080604052348015600e575f5ffd5b50600436106026575f3560e01c8063bfb4ebcf14602a575b5f5ffd5b60306032565b005b5f600160025f6040517fbb6a82f1000000000000000000000000000000000000000000000000000000008152600401606c949392919060a3565b60405180910390fd5b5f819050919050565b6085816075565b82525050565b5f8115159050919050565b609d81608b565b82525050565b5f60808201905060b45f830187607e565b60bf6020830186607e565b60ca6040830185607e565b60d560608301846096565b9594505050505056fea2646970667358221220e90bf647ffc897060e44b88d54995ed0c03c988fbccaf034375c2ff4e594690764736f6c634300081c0033",
|
||||
}
|
||||
|
||||
// C2 is an auto generated Go binding around an Ethereum contract.
|
||||
type C2 struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewC2 creates a new instance of C2.
|
||||
func NewC2() *C2 {
|
||||
parsed, err := C2MetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &C2{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *C2) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackFoo is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xbfb4ebcf.
|
||||
//
|
||||
// Solidity: function Foo() pure returns()
|
||||
func (c2 *C2) PackFoo() []byte {
|
||||
enc, err := c2.abi.Pack("Foo")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackError attempts to decode the provided error data using user-defined
|
||||
// error definitions.
|
||||
func (c2 *C2) UnpackError(raw []byte) (any, error) {
|
||||
if bytes.Equal(raw[:4], c2.abi.Errors["BadThing"].ID.Bytes()[:4]) {
|
||||
return c2.UnpackBadThingError(raw[4:])
|
||||
}
|
||||
return nil, errors.New("Unknown error")
|
||||
}
|
||||
|
||||
// C2BadThing represents a BadThing error raised by the C2 contract.
|
||||
type C2BadThing struct {
|
||||
Arg1 *big.Int
|
||||
Arg2 *big.Int
|
||||
Arg3 *big.Int
|
||||
Arg4 bool
|
||||
}
|
||||
|
||||
// ErrorID returns the hash of canonical representation of the error's signature.
|
||||
//
|
||||
// Solidity: error BadThing(uint256 arg1, uint256 arg2, uint256 arg3, bool arg4)
|
||||
func C2BadThingErrorID() common.Hash {
|
||||
return common.HexToHash("0xbb6a82f123854747ef4381e30e497f934a3854753fec99a69c35c30d4b46714d")
|
||||
}
|
||||
|
||||
// UnpackBadThingError is the Go binding used to decode the provided
|
||||
// error data into the corresponding Go error struct.
|
||||
//
|
||||
// Solidity: error BadThing(uint256 arg1, uint256 arg2, uint256 arg3, bool arg4)
|
||||
func (c2 *C2) UnpackBadThingError(raw []byte) (*C2BadThing, error) {
|
||||
out := new(C2BadThing)
|
||||
if err := c2.abi.UnpackIntoInterface(out, "BadThing", raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"contracts":{"contract.sol:C":{"abi":[{"inputs":[{"internalType":"uint256","name":"arg1","type":"uint256"},{"internalType":"uint256","name":"arg2","type":"uint256"},{"internalType":"uint256","name":"arg3","type":"uint256"},{"internalType":"bool","name":"arg4","type":"bool"}],"name":"BadThing","type":"error"},{"inputs":[{"internalType":"uint256","name":"arg1","type":"uint256"},{"internalType":"uint256","name":"arg2","type":"uint256"},{"internalType":"uint256","name":"arg3","type":"uint256"},{"internalType":"uint256","name":"arg4","type":"uint256"}],"name":"BadThing2","type":"error"},{"inputs":[],"name":"Bar","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"Foo","outputs":[],"stateMutability":"pure","type":"function"}],"bin":"6080604052348015600e575f5ffd5b506101c58061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063b0a378b014610038578063bfb4ebcf14610042575b5f5ffd5b61004061004c565b005b61004a610092565b005b5f6001600260036040517fd233a24f00000000000000000000000000000000000000000000000000000000815260040161008994939291906100ef565b60405180910390fd5b5f600160025f6040517fbb6a82f10000000000000000000000000000000000000000000000000000000081526004016100ce949392919061014c565b60405180910390fd5b5f819050919050565b6100e9816100d7565b82525050565b5f6080820190506101025f8301876100e0565b61010f60208301866100e0565b61011c60408301856100e0565b61012960608301846100e0565b95945050505050565b5f8115159050919050565b61014681610132565b82525050565b5f60808201905061015f5f8301876100e0565b61016c60208301866100e0565b61017960408301856100e0565b610186606083018461013d565b9594505050505056fea26469706673582212206a82b4c28576e4483a81102558271cfefc891cd63b95440dea521185c1ff6a2a64736f6c634300081c0033"},"contract.sol:C2":{"abi":[{"inputs":[{"internalType":"uint256","name":"arg1","type":"uint256"},{"internalType":"uint256","name":"arg2","type":"uint256"},{"internalType":"uint256","name":"arg3","type":"uint256"},{"internalType":"bool","name":"arg4","type":"bool"}],"name":"BadThing","type":"error"},{"inputs":[],"name":"Foo","outputs":[],"stateMutability":"pure","type":"function"}],"bin":"6080604052348015600e575f5ffd5b506101148061001c5f395ff3fe6080604052348015600e575f5ffd5b50600436106026575f3560e01c8063bfb4ebcf14602a575b5f5ffd5b60306032565b005b5f600160025f6040517fbb6a82f1000000000000000000000000000000000000000000000000000000008152600401606c949392919060a3565b60405180910390fd5b5f819050919050565b6085816075565b82525050565b5f8115159050919050565b609d81608b565b82525050565b5f60808201905060b45f830187607e565b60bf6020830186607e565b60ca6040830185607e565b60d560608301846096565b9594505050505056fea2646970667358221220e90bf647ffc897060e44b88d54995ed0c03c988fbccaf034375c2ff4e594690764736f6c634300081c0033"}},"version":"0.8.28+commit.7893614a.Darwin.appleclang"}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.26;
|
||||
|
||||
error BadThing(uint256 arg1, uint256 arg2, uint256 arg3, bool arg4);
|
||||
error BadThing2(uint256 arg1, uint256 arg2, uint256 arg3, uint256 arg4);
|
||||
|
||||
contract C {
|
||||
function Foo() public pure {
|
||||
revert BadThing({
|
||||
arg1: uint256(0),
|
||||
arg2: uint256(1),
|
||||
arg3: uint256(2),
|
||||
arg4: false
|
||||
});
|
||||
}
|
||||
function Bar() public pure {
|
||||
revert BadThing2({
|
||||
arg1: uint256(0),
|
||||
arg2: uint256(1),
|
||||
arg3: uint256(2),
|
||||
arg4: uint256(3)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// purpose of this is to test that generation of metadata for contract that emits one error produces valid Go code
|
||||
contract C2 {
|
||||
function Foo() public pure {
|
||||
revert BadThing({
|
||||
arg1: uint256(0),
|
||||
arg2: uint256(1),
|
||||
arg3: uint256(2),
|
||||
arg4: false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
// Code generated via abigen V2 - DO NOT EDIT.
|
||||
// This file is a generated binding and any manual changes will be lost.
|
||||
|
||||
package uint256arrayreturn
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var (
|
||||
_ = bytes.Equal
|
||||
_ = errors.New
|
||||
_ = big.NewInt
|
||||
_ = common.Big1
|
||||
_ = types.BloomLookup
|
||||
_ = abi.ConvertType
|
||||
)
|
||||
|
||||
// MyContractMetaData contains all meta data concerning the MyContract contract.
|
||||
var MyContractMetaData = bind.MetaData{
|
||||
ABI: "[{\"inputs\":[],\"name\":\"GetNums\",\"outputs\":[{\"internalType\":\"uint256[5]\",\"name\":\"\",\"type\":\"uint256[5]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
|
||||
ID: "e48e83c9c45b19a47bd451eedc725a6bff",
|
||||
Bin: "0x6080604052348015600e575f5ffd5b506101a78061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063bd6d10071461002d575b5f5ffd5b61003561004b565b6040516100429190610158565b60405180910390f35b610053610088565b5f6040518060a001604052805f8152602001600181526020016002815260200160038152602001600481525090508091505090565b6040518060a00160405280600590602082028036833780820191505090505090565b5f60059050919050565b5f81905092915050565b5f819050919050565b5f819050919050565b6100d9816100c7565b82525050565b5f6100ea83836100d0565b60208301905092915050565b5f602082019050919050565b61010b816100aa565b61011581846100b4565b9250610120826100be565b805f5b8381101561015057815161013787826100df565b9650610142836100f6565b925050600181019050610123565b505050505050565b5f60a08201905061016b5f830184610102565b9291505056fea2646970667358221220ef76cc678ca215c3e9e5261e3f33ac1cb9901c3186c2af167bfcd8f03b3b864c64736f6c634300081c0033",
|
||||
}
|
||||
|
||||
// MyContract is an auto generated Go binding around an Ethereum contract.
|
||||
type MyContract struct {
|
||||
abi abi.ABI
|
||||
}
|
||||
|
||||
// NewMyContract creates a new instance of MyContract.
|
||||
func NewMyContract() *MyContract {
|
||||
parsed, err := MyContractMetaData.ParseABI()
|
||||
if err != nil {
|
||||
panic(errors.New("invalid ABI: " + err.Error()))
|
||||
}
|
||||
return &MyContract{abi: *parsed}
|
||||
}
|
||||
|
||||
// Instance creates a wrapper for a deployed contract instance at the given address.
|
||||
// Use this to create the instance object passed to abigen v2 library functions Call, Transact, etc.
|
||||
func (c *MyContract) Instance(backend bind.ContractBackend, addr common.Address) *bind.BoundContract {
|
||||
return bind.NewBoundContract(addr, c.abi, backend, backend, backend)
|
||||
}
|
||||
|
||||
// PackGetNums is the Go binding used to pack the parameters required for calling
|
||||
// the contract method with ID 0xbd6d1007.
|
||||
//
|
||||
// Solidity: function GetNums() pure returns(uint256[5])
|
||||
func (myContract *MyContract) PackGetNums() []byte {
|
||||
enc, err := myContract.abi.Pack("GetNums")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return enc
|
||||
}
|
||||
|
||||
// UnpackGetNums is the Go binding that unpacks the parameters returned
|
||||
// from invoking the contract method with ID 0xbd6d1007.
|
||||
//
|
||||
// Solidity: function GetNums() pure returns(uint256[5])
|
||||
func (myContract *MyContract) UnpackGetNums(data []byte) ([5]*big.Int, error) {
|
||||
out, err := myContract.abi.Unpack("GetNums", data)
|
||||
if err != nil {
|
||||
return *new([5]*big.Int), err
|
||||
}
|
||||
out0 := *abi.ConvertType(out[0], new([5]*big.Int)).(*[5]*big.Int)
|
||||
return out0, err
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"contracts":{"contract.sol:MyContract":{"abi":[{"inputs":[],"name":"GetNums","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"pure","type":"function"}],"bin":"6080604052348015600e575f5ffd5b506101a78061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063bd6d10071461002d575b5f5ffd5b61003561004b565b6040516100429190610158565b60405180910390f35b610053610088565b5f6040518060a001604052805f8152602001600181526020016002815260200160038152602001600481525090508091505090565b6040518060a00160405280600590602082028036833780820191505090505090565b5f60059050919050565b5f81905092915050565b5f819050919050565b5f819050919050565b6100d9816100c7565b82525050565b5f6100ea83836100d0565b60208301905092915050565b5f602082019050919050565b61010b816100aa565b61011581846100b4565b9250610120826100be565b805f5b8381101561015057815161013787826100df565b9650610142836100f6565b925050600181019050610123565b505050505050565b5f60a08201905061016b5f830184610102565b9291505056fea2646970667358221220ef76cc678ca215c3e9e5261e3f33ac1cb9901c3186c2af167bfcd8f03b3b864c64736f6c634300081c0033"}},"version":"0.8.28+commit.7893614a.Darwin.appleclang"}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.26;
|
||||
|
||||
contract MyContract {
|
||||
// emit multiple events, different types
|
||||
function GetNums() public pure returns (uint256[5] memory) {
|
||||
uint256[5] memory myNums = [uint256(0), uint256(1), uint256(2), uint256(3), uint256(4)];
|
||||
return myNums;
|
||||
}
|
||||
}
|
||||
243
accounts/abi/bind/v2/lib.go
Normal file
243
accounts/abi/bind/v2/lib.go
Normal file
|
|
@ -0,0 +1,243 @@
|
|||
// Copyright 2024 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
// Package bind implements utilities for interacting with Solidity contracts.
|
||||
// This is the 'runtime' for contract bindings generated with the abigen command.
|
||||
// It includes methods for calling/transacting, filtering chain history for
|
||||
// specific custom Solidity event types, and creating event subscriptions to monitor the
|
||||
// chain for event occurrences.
|
||||
//
|
||||
// Two methods for contract deployment are provided:
|
||||
// - [DeployContract] is intended to be used for deployment of a single contract.
|
||||
// - [LinkAndDeploy] is intended for the deployment of multiple
|
||||
// contracts, potentially with library dependencies.
|
||||
package bind
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/ethereum/go-ethereum"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/event"
|
||||
)
|
||||
|
||||
// ContractEvent is a type constraint for ABI event types.
|
||||
type ContractEvent interface {
|
||||
ContractEventName() string
|
||||
}
|
||||
|
||||
// FilterEvents filters a historical block range for instances of emission of a
|
||||
// specific event type from a specified contract. It returns an error if the
|
||||
// provided filter opts are invalid or the backend is closed.
|
||||
//
|
||||
// FilterEvents is intended to be used with contract event unpack methods in
|
||||
// bindings generated with the abigen --v2 flag. It should be
|
||||
// preferred over BoundContract.FilterLogs.
|
||||
func FilterEvents[Ev ContractEvent](c *BoundContract, opts *FilterOpts, unpack func(*types.Log) (*Ev, error), topics ...[]any) (*EventIterator[Ev], error) {
|
||||
var e Ev
|
||||
logs, sub, err := c.FilterLogs(opts, e.ContractEventName(), topics...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &EventIterator[Ev]{unpack: unpack, logs: logs, sub: sub}, nil
|
||||
}
|
||||
|
||||
// WatchEvents creates an event subscription to notify when logs of the
|
||||
// specified event type are emitted from the given contract. Received logs are
|
||||
// unpacked and forwarded to sink. If topics are specified, only events are
|
||||
// forwarded which match the topics.
|
||||
//
|
||||
// WatchEvents returns a subscription or an error if the provided WatchOpts are
|
||||
// invalid or the backend is closed.
|
||||
//
|
||||
// WatchEvents is intended to be used with contract event unpack methods in
|
||||
// bindings generated with the abigen --v2 flag. It should be
|
||||
// preferred over BoundContract.WatchLogs.
|
||||
func WatchEvents[Ev ContractEvent](c *BoundContract, opts *WatchOpts, unpack func(*types.Log) (*Ev, error), sink chan<- *Ev, topics ...[]any) (event.Subscription, error) {
|
||||
var e Ev
|
||||
logs, sub, err := c.WatchLogs(opts, e.ContractEventName(), topics...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return event.NewSubscription(func(quit <-chan struct{}) error {
|
||||
defer sub.Unsubscribe()
|
||||
for {
|
||||
select {
|
||||
case log := <-logs:
|
||||
// New log arrived, parse the event and forward to the user
|
||||
ev, err := unpack(&log)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
select {
|
||||
case sink <- ev:
|
||||
case err := <-sub.Err():
|
||||
return err
|
||||
case <-quit:
|
||||
return nil
|
||||
}
|
||||
case err := <-sub.Err():
|
||||
return err
|
||||
case <-quit:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}), nil
|
||||
}
|
||||
|
||||
// EventIterator is an object for iterating over the results of a event log
|
||||
// filter call.
|
||||
type EventIterator[T any] struct {
|
||||
current *T
|
||||
unpack func(*types.Log) (*T, error)
|
||||
logs <-chan types.Log
|
||||
sub ethereum.Subscription
|
||||
fail error // error to hold reason for iteration failure
|
||||
closed bool // true if Close has been called
|
||||
}
|
||||
|
||||
// Value returns the current value of the iterator, or nil if there isn't one.
|
||||
func (it *EventIterator[T]) Value() *T {
|
||||
return it.current
|
||||
}
|
||||
|
||||
// Next advances the iterator to the subsequent event (if there is one),
|
||||
// returning true if the iterator advanced.
|
||||
//
|
||||
// If the attempt to convert the raw log object to an instance of T using the
|
||||
// unpack function provided via FilterEvents returns an error: that error is
|
||||
// returned and subsequent calls to Next will not advance the iterator.
|
||||
func (it *EventIterator[T]) Next() (advanced bool) {
|
||||
// If the iterator failed with an error, don't proceed
|
||||
if it.fail != nil || it.closed {
|
||||
return false
|
||||
}
|
||||
// if the iterator is still active, block until a log is received or the
|
||||
// underlying subscription terminates.
|
||||
select {
|
||||
case log := <-it.logs:
|
||||
res, err := it.unpack(&log)
|
||||
if err != nil {
|
||||
it.fail = err
|
||||
return false
|
||||
}
|
||||
it.current = res
|
||||
return true
|
||||
case <-it.sub.Err():
|
||||
// regardless of how the subscription ends, still be able to iterate
|
||||
// over any unread logs.
|
||||
select {
|
||||
case log := <-it.logs:
|
||||
res, err := it.unpack(&log)
|
||||
if err != nil {
|
||||
it.fail = err
|
||||
return false
|
||||
}
|
||||
it.current = res
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Error returns an error if iteration has failed.
|
||||
func (it *EventIterator[T]) Error() error {
|
||||
return it.fail
|
||||
}
|
||||
|
||||
// Close releases any pending underlying resources. Any subsequent calls to
|
||||
// Next will not advance the iterator, but the current value remains accessible.
|
||||
func (it *EventIterator[T]) Close() error {
|
||||
it.closed = true
|
||||
it.sub.Unsubscribe()
|
||||
return nil
|
||||
}
|
||||
|
||||
// Call performs an eth_call to a contract with optional call data.
|
||||
//
|
||||
// To call a function that doesn't return any output, pass nil as the unpack
|
||||
// function. This can be useful if you just want to check that the function
|
||||
// doesn't revert.
|
||||
//
|
||||
// Call is intended to be used with contract method unpack methods in
|
||||
// bindings generated with the abigen --v2 flag. It should be
|
||||
// preferred over BoundContract.Call
|
||||
func Call[T any](c *BoundContract, opts *CallOpts, calldata []byte, unpack func([]byte) (T, error)) (T, error) {
|
||||
var defaultResult T
|
||||
packedOutput, err := c.CallRaw(opts, calldata)
|
||||
if err != nil {
|
||||
return defaultResult, err
|
||||
}
|
||||
if unpack == nil {
|
||||
if len(packedOutput) > 0 {
|
||||
return defaultResult, errors.New("contract returned data, but no unpack function was given")
|
||||
}
|
||||
return defaultResult, nil
|
||||
}
|
||||
res, err := unpack(packedOutput)
|
||||
if err != nil {
|
||||
return defaultResult, err
|
||||
}
|
||||
return res, err
|
||||
}
|
||||
|
||||
// Transact creates and submits a transaction to a contract with optional input
|
||||
// data.
|
||||
//
|
||||
// Transact is identical to BoundContract.RawTransact, and is provided as a
|
||||
// package-level method so that interactions with contracts whose bindings were
|
||||
// generated with the abigen --v2 flag are consistent (they do not require
|
||||
// calling methods on the BoundContract instance).
|
||||
func Transact(c *BoundContract, opt *TransactOpts, data []byte) (*types.Transaction, error) {
|
||||
return c.RawTransact(opt, data)
|
||||
}
|
||||
|
||||
// DeployContract creates and submits a deployment transaction based on the
|
||||
// deployer bytecode and optional ABI-encoded constructor input. It returns
|
||||
// the address and creation transaction of the pending contract, or an error
|
||||
// if the creation failed.
|
||||
//
|
||||
// To initiate the deployment of multiple contracts with one method call, see the
|
||||
// [LinkAndDeploy] method.
|
||||
func DeployContract(opts *TransactOpts, bytecode []byte, backend ContractBackend, constructorInput []byte) (common.Address, *types.Transaction, error) {
|
||||
c := NewBoundContract(common.Address{}, abi.ABI{}, backend, backend, backend)
|
||||
|
||||
tx, err := c.RawCreationTransact(opts, append(bytecode, constructorInput...))
|
||||
if err != nil {
|
||||
return common.Address{}, nil, err
|
||||
}
|
||||
return crypto.CreateAddress(opts.From, tx.Nonce()), tx, nil
|
||||
}
|
||||
|
||||
// DefaultDeployer returns a DeployFn that signs and submits creation transactions
|
||||
// using the given signer.
|
||||
//
|
||||
// The DeployFn returned by DefaultDeployer should be used by LinkAndDeploy in
|
||||
// almost all cases, unless a custom DeployFn implementation is needed.
|
||||
func DefaultDeployer(opts *TransactOpts, backend ContractBackend) DeployFn {
|
||||
return func(input []byte, deployer []byte) (common.Address, *types.Transaction, error) {
|
||||
addr, tx, err := DeployContract(opts, deployer, backend, input)
|
||||
if err != nil {
|
||||
return common.Address{}, nil, err
|
||||
}
|
||||
return addr, tx, nil
|
||||
}
|
||||
}
|
||||
361
accounts/abi/bind/v2/lib_test.go
Normal file
361
accounts/abi/bind/v2/lib_test.go
Normal file
|
|
@ -0,0 +1,361 @@
|
|||
// Copyright 2024 The go-ethereum Authors
|
||||
// This file is part of the go-ethereum library.
|
||||
//
|
||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package bind_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"math/big"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2/internal/contracts/events"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2/internal/contracts/nested_libraries"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2/internal/contracts/solc_errors"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/eth/ethconfig"
|
||||
"github.com/ethereum/go-ethereum/ethclient"
|
||||
"github.com/ethereum/go-ethereum/ethclient/simulated"
|
||||
"github.com/ethereum/go-ethereum/node"
|
||||
"github.com/ethereum/go-ethereum/params"
|
||||
)
|
||||
|
||||
var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||
var testAddr = crypto.PubkeyToAddress(testKey.PublicKey)
|
||||
|
||||
func testSetup() (*backends.SimulatedBackend, error) {
|
||||
backend := simulated.NewBackend(
|
||||
types.GenesisAlloc{
|
||||
testAddr: {Balance: big.NewInt(10000000000000000)},
|
||||
},
|
||||
func(nodeConf *node.Config, ethConf *ethconfig.Config) {
|
||||
ethConf.Genesis.Difficulty = big.NewInt(0)
|
||||
},
|
||||
)
|
||||
|
||||
// we should just be able to use the backend directly, instead of using
|
||||
// this deprecated interface. However, the simulated backend no longer
|
||||
// implements backends.SimulatedBackend...
|
||||
bindBackend := backends.SimulatedBackend{
|
||||
Backend: backend,
|
||||
Client: backend.Client(),
|
||||
}
|
||||
return &bindBackend, nil
|
||||
}
|
||||
|
||||
func makeTestDeployer(backend simulated.Client) func(input, deployer []byte) (common.Address, *types.Transaction, error) {
|
||||
chainId, _ := backend.ChainID(context.Background())
|
||||
return bind.DefaultDeployer(bind.NewKeyedTransactor(testKey, chainId), backend)
|
||||
}
|
||||
|
||||
// test that deploying a contract with library dependencies works,
|
||||
// verifying by calling method on the deployed contract.
|
||||
func TestDeploymentLibraries(t *testing.T) {
|
||||
bindBackend, err := testSetup()
|
||||
if err != nil {
|
||||
t.Fatalf("err setting up test: %v", err)
|
||||
}
|
||||
defer bindBackend.Backend.Close()
|
||||
|
||||
c := nested_libraries.NewC1()
|
||||
constructorInput := c.PackConstructor(big.NewInt(42), big.NewInt(1))
|
||||
deploymentParams := &bind.DeploymentParams{
|
||||
Contracts: []*bind.MetaData{&nested_libraries.C1MetaData},
|
||||
Inputs: map[string][]byte{nested_libraries.C1MetaData.ID: constructorInput},
|
||||
}
|
||||
res, err := bind.LinkAndDeploy(deploymentParams, makeTestDeployer(bindBackend.Client))
|
||||
if err != nil {
|
||||
t.Fatalf("err: %+v\n", err)
|
||||
}
|
||||
bindBackend.Commit()
|
||||
|
||||
if len(res.Addresses) != 5 {
|
||||
t.Fatalf("deployment should have generated 5 addresses. got %d", len(res.Addresses))
|
||||
}
|
||||
for _, tx := range res.Txs {
|
||||
_, err = bind.WaitDeployed(context.Background(), bindBackend, tx.Hash())
|
||||
if err != nil {
|
||||
t.Fatalf("error deploying library: %+v", err)
|
||||
}
|
||||
}
|
||||
|
||||
doInput := c.PackDo(big.NewInt(1))
|
||||
contractAddr := res.Addresses[nested_libraries.C1MetaData.ID]
|
||||
callOpts := &bind.CallOpts{From: common.Address{}, Context: context.Background()}
|
||||
instance := c.Instance(bindBackend, contractAddr)
|
||||
internalCallCount, err := bind.Call(instance, callOpts, doInput, c.UnpackDo)
|
||||
if err != nil {
|
||||
t.Fatalf("err unpacking result: %v", err)
|
||||
}
|
||||
if internalCallCount.Uint64() != 6 {
|
||||
t.Fatalf("expected internal call count of 6. got %d.", internalCallCount.Uint64())
|
||||
}
|
||||
}
|
||||
|
||||
// Same as TestDeployment. However, stagger the deployments with overrides:
|
||||
// first deploy the library deps and then the contract.
|
||||
func TestDeploymentWithOverrides(t *testing.T) {
|
||||
bindBackend, err := testSetup()
|
||||
if err != nil {
|
||||
t.Fatalf("err setting up test: %v", err)
|
||||
}
|
||||
defer bindBackend.Backend.Close()
|
||||
|
||||
// deploy all the library dependencies of our target contract, but not the target contract itself.
|
||||
deploymentParams := &bind.DeploymentParams{
|
||||
Contracts: nested_libraries.C1MetaData.Deps,
|
||||
}
|
||||
res, err := bind.LinkAndDeploy(deploymentParams, makeTestDeployer(bindBackend))
|
||||
if err != nil {
|
||||
t.Fatalf("err: %+v\n", err)
|
||||
}
|
||||
bindBackend.Commit()
|
||||
|
||||
if len(res.Addresses) != 4 {
|
||||
t.Fatalf("deployment should have generated 4 addresses. got %d", len(res.Addresses))
|
||||
}
|
||||
for _, tx := range res.Txs {
|
||||
_, err = bind.WaitDeployed(context.Background(), bindBackend, tx.Hash())
|
||||
if err != nil {
|
||||
t.Fatalf("error deploying library: %+v", err)
|
||||
}
|
||||
}
|
||||
|
||||
c := nested_libraries.NewC1()
|
||||
constructorInput := c.PackConstructor(big.NewInt(42), big.NewInt(1))
|
||||
overrides := res.Addresses
|
||||
|
||||
// deploy the contract
|
||||
deploymentParams = &bind.DeploymentParams{
|
||||
Contracts: []*bind.MetaData{&nested_libraries.C1MetaData},
|
||||
Inputs: map[string][]byte{nested_libraries.C1MetaData.ID: constructorInput},
|
||||
Overrides: overrides,
|
||||
}
|
||||
res, err = bind.LinkAndDeploy(deploymentParams, makeTestDeployer(bindBackend))
|
||||
if err != nil {
|
||||
t.Fatalf("err: %+v\n", err)
|
||||
}
|
||||
bindBackend.Commit()
|
||||
|
||||
if len(res.Addresses) != 1 {
|
||||
t.Fatalf("deployment should have generated 1 address. got %d", len(res.Addresses))
|
||||
}
|
||||
for _, tx := range res.Txs {
|
||||
_, err = bind.WaitDeployed(context.Background(), bindBackend, tx.Hash())
|
||||
if err != nil {
|
||||
t.Fatalf("error deploying library: %+v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// call the deployed contract and make sure it returns the correct result
|
||||
doInput := c.PackDo(big.NewInt(1))
|
||||
instance := c.Instance(bindBackend, res.Addresses[nested_libraries.C1MetaData.ID])
|
||||
callOpts := new(bind.CallOpts)
|
||||
internalCallCount, err := bind.Call(instance, callOpts, doInput, c.UnpackDo)
|
||||
if err != nil {
|
||||
t.Fatalf("error calling contract: %v", err)
|
||||
}
|
||||
if internalCallCount.Uint64() != 6 {
|
||||
t.Fatalf("expected internal call count of 6. got %d.", internalCallCount.Uint64())
|
||||
}
|
||||
}
|
||||
|
||||
// returns transaction auth to send a basic transaction from testAddr
|
||||
func defaultTxAuth() *bind.TransactOpts {
|
||||
signer := types.LatestSigner(params.AllDevChainProtocolChanges)
|
||||
opts := &bind.TransactOpts{
|
||||
From: testAddr,
|
||||
Nonce: nil,
|
||||
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
||||
signature, err := crypto.Sign(signer.Hash(tx).Bytes(), testKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
signedTx, err := tx.WithSignature(signer, signature)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return signedTx, nil
|
||||
},
|
||||
Context: context.Background(),
|
||||
}
|
||||
return opts
|
||||
}
|
||||
|
||||
func TestEvents(t *testing.T) {
|
||||
// test watch/filter logs method on a contract that emits various kinds of events (struct-containing, etc.)
|
||||
backend, err := testSetup()
|
||||
if err != nil {
|
||||
t.Fatalf("error setting up testing env: %v", err)
|
||||
}
|
||||
deploymentParams := &bind.DeploymentParams{
|
||||
Contracts: []*bind.MetaData{&events.CMetaData},
|
||||
}
|
||||
res, err := bind.LinkAndDeploy(deploymentParams, makeTestDeployer(backend))
|
||||
if err != nil {
|
||||
t.Fatalf("error deploying contract for testing: %v", err)
|
||||
}
|
||||
|
||||
backend.Commit()
|
||||
if _, err := bind.WaitDeployed(context.Background(), backend, res.Txs[events.CMetaData.ID].Hash()); err != nil {
|
||||
t.Fatalf("WaitDeployed failed %v", err)
|
||||
}
|
||||
|
||||
c := events.NewC()
|
||||
instance := c.Instance(backend, res.Addresses[events.CMetaData.ID])
|
||||
|
||||
newCBasic1Ch := make(chan *events.CBasic1)
|
||||
newCBasic2Ch := make(chan *events.CBasic2)
|
||||
watchOpts := &bind.WatchOpts{}
|
||||
sub1, err := bind.WatchEvents(instance, watchOpts, c.UnpackBasic1Event, newCBasic1Ch)
|
||||
if err != nil {
|
||||
t.Fatalf("WatchEvents returned error: %v", err)
|
||||
}
|
||||
sub2, err := bind.WatchEvents(instance, watchOpts, c.UnpackBasic2Event, newCBasic2Ch)
|
||||
if err != nil {
|
||||
t.Fatalf("WatchEvents returned error: %v", err)
|
||||
}
|
||||
defer sub1.Unsubscribe()
|
||||
defer sub2.Unsubscribe()
|
||||
|
||||
packedInput := c.PackEmitMulti()
|
||||
tx, err := bind.Transact(instance, defaultTxAuth(), packedInput)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to send transaction: %v", err)
|
||||
}
|
||||
backend.Commit()
|
||||
if _, err := bind.WaitMined(context.Background(), backend, tx.Hash()); err != nil {
|
||||
t.Fatalf("error waiting for tx to be mined: %v", err)
|
||||
}
|
||||
|
||||
timeout := time.NewTimer(2 * time.Second)
|
||||
e1Count := 0
|
||||
e2Count := 0
|
||||
for {
|
||||
select {
|
||||
case <-newCBasic1Ch:
|
||||
e1Count++
|
||||
case <-newCBasic2Ch:
|
||||
e2Count++
|
||||
case <-timeout.C:
|
||||
goto done
|
||||
}
|
||||
if e1Count == 2 && e2Count == 1 {
|
||||
break
|
||||
}
|
||||
}
|
||||
done:
|
||||
if e1Count != 2 {
|
||||
t.Fatalf("expected event type 1 count to be 2. got %d", e1Count)
|
||||
}
|
||||
if e2Count != 1 {
|
||||
t.Fatalf("expected event type 2 count to be 1. got %d", e2Count)
|
||||
}
|
||||
|
||||
// now, test that we can filter those same logs after they were included in the chain
|
||||
|
||||
filterOpts := &bind.FilterOpts{
|
||||
Start: 0,
|
||||
Context: context.Background(),
|
||||
}
|
||||
it, err := bind.FilterEvents(instance, filterOpts, c.UnpackBasic1Event)
|
||||
if err != nil {
|
||||
t.Fatalf("error filtering logs %v\n", err)
|
||||
}
|
||||
it2, err := bind.FilterEvents(instance, filterOpts, c.UnpackBasic2Event)
|
||||
if err != nil {
|
||||
t.Fatalf("error filtering logs %v\n", err)
|
||||
}
|
||||
|
||||
e1Count = 0
|
||||
e2Count = 0
|
||||
for it.Next() {
|
||||
if err := it.Error(); err != nil {
|
||||
t.Fatalf("got error while iterating events for e1: %v", err)
|
||||
}
|
||||
e1Count++
|
||||
}
|
||||
for it2.Next() {
|
||||
if err := it2.Error(); err != nil {
|
||||
t.Fatalf("got error while iterating events for e2: %v", err)
|
||||
}
|
||||
e2Count++
|
||||
}
|
||||
if e1Count != 2 {
|
||||
t.Fatalf("expected e1Count of 2 from filter call. got %d", e1Count)
|
||||
}
|
||||
if e2Count != 1 {
|
||||
t.Fatalf("expected e2Count of 1 from filter call. got %d", e1Count)
|
||||
}
|
||||
}
|
||||
|
||||
func TestErrors(t *testing.T) {
|
||||
// test watch/filter logs method on a contract that emits various kinds of events (struct-containing, etc.)
|
||||
backend, err := testSetup()
|
||||
if err != nil {
|
||||
t.Fatalf("error setting up testing env: %v", err)
|
||||
}
|
||||
deploymentParams := &bind.DeploymentParams{
|
||||
Contracts: []*bind.MetaData{&solc_errors.CMetaData},
|
||||
}
|
||||
res, err := bind.LinkAndDeploy(deploymentParams, makeTestDeployer(backend))
|
||||
if err != nil {
|
||||
t.Fatalf("error deploying contract for testing: %v", err)
|
||||
}
|
||||
|
||||
backend.Commit()
|
||||
if _, err := bind.WaitDeployed(context.Background(), backend, res.Txs[solc_errors.CMetaData.ID].Hash()); err != nil {
|
||||
t.Fatalf("WaitDeployed failed %v", err)
|
||||
}
|
||||
|
||||
c := solc_errors.NewC()
|
||||
instance := c.Instance(backend, res.Addresses[solc_errors.CMetaData.ID])
|
||||
packedInput := c.PackFoo()
|
||||
opts := &bind.CallOpts{From: res.Addresses[solc_errors.CMetaData.ID]}
|
||||
_, err = bind.Call[struct{}](instance, opts, packedInput, nil)
|
||||
if err == nil {
|
||||
t.Fatalf("expected call to fail")
|
||||
}
|
||||
raw, hasRevertErrorData := ethclient.RevertErrorData(err)
|
||||
if !hasRevertErrorData {
|
||||
t.Fatalf("expected call error to contain revert error data.")
|
||||
}
|
||||
rawUnpackedErr, err := c.UnpackError(raw)
|
||||
if err != nil {
|
||||
t.Fatalf("expected to unpack error")
|
||||
}
|
||||
|
||||
unpackedErr, ok := rawUnpackedErr.(*solc_errors.CBadThing)
|
||||
if !ok {
|
||||
t.Fatalf("unexpected type for error")
|
||||
}
|
||||
if unpackedErr.Arg1.Cmp(big.NewInt(0)) != 0 {
|
||||
t.Fatalf("bad unpacked error result: expected Arg1 field to be 0. got %s", unpackedErr.Arg1.String())
|
||||
}
|
||||
if unpackedErr.Arg2.Cmp(big.NewInt(1)) != 0 {
|
||||
t.Fatalf("bad unpacked error result: expected Arg2 field to be 1. got %s", unpackedErr.Arg2.String())
|
||||
}
|
||||
if unpackedErr.Arg3.Cmp(big.NewInt(2)) != 0 {
|
||||
t.Fatalf("bad unpacked error result: expected Arg3 to be 2. got %s", unpackedErr.Arg3.String())
|
||||
}
|
||||
if unpackedErr.Arg4 != false {
|
||||
t.Fatalf("bad unpacked error result: expected Arg4 to be false. got true")
|
||||
}
|
||||
}
|
||||
|
|
@ -29,19 +29,13 @@ import (
|
|||
|
||||
// WaitMined waits for tx to be mined on the blockchain.
|
||||
// It stops waiting when the context is canceled.
|
||||
func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*types.Receipt, error) {
|
||||
return WaitMinedHash(ctx, b, tx.Hash())
|
||||
}
|
||||
|
||||
// WaitMinedHash waits for a transaction with the provided hash to be mined on the blockchain.
|
||||
// It stops waiting when the context is canceled.
|
||||
func WaitMinedHash(ctx context.Context, b DeployBackend, hash common.Hash) (*types.Receipt, error) {
|
||||
func WaitMined(ctx context.Context, b DeployBackend, txHash common.Hash) (*types.Receipt, error) {
|
||||
queryTicker := time.NewTicker(time.Second)
|
||||
defer queryTicker.Stop()
|
||||
|
||||
logger := log.New("hash", hash)
|
||||
logger := log.New("hash", txHash)
|
||||
for {
|
||||
receipt, err := b.TransactionReceipt(ctx, hash)
|
||||
receipt, err := b.TransactionReceipt(ctx, txHash)
|
||||
if err == nil {
|
||||
return receipt, nil
|
||||
}
|
||||
|
|
@ -61,24 +55,16 @@ func WaitMinedHash(ctx context.Context, b DeployBackend, hash common.Hash) (*typ
|
|||
}
|
||||
}
|
||||
|
||||
// WaitDeployed waits for a contract deployment transaction and returns the on-chain
|
||||
// contract address when it is mined. It stops waiting when ctx is canceled.
|
||||
func WaitDeployed(ctx context.Context, b DeployBackend, tx *types.Transaction) (common.Address, error) {
|
||||
if tx.To() != nil {
|
||||
return common.Address{}, errors.New("tx is not contract creation")
|
||||
}
|
||||
return WaitDeployedHash(ctx, b, tx.Hash())
|
||||
}
|
||||
|
||||
// WaitDeployedHash waits for a contract deployment transaction with the provided hash and returns the on-chain
|
||||
// contract address when it is mined. It stops waiting when ctx is canceled.
|
||||
func WaitDeployedHash(ctx context.Context, b DeployBackend, hash common.Hash) (common.Address, error) {
|
||||
receipt, err := WaitMinedHash(ctx, b, hash)
|
||||
// WaitDeployed waits for a contract deployment transaction with the provided hash and
|
||||
// returns the on-chain contract address when it is mined. It stops waiting when ctx is
|
||||
// canceled.
|
||||
func WaitDeployed(ctx context.Context, b DeployBackend, hash common.Hash) (common.Address, error) {
|
||||
receipt, err := WaitMined(ctx, b, hash)
|
||||
if err != nil {
|
||||
return common.Address{}, err
|
||||
}
|
||||
if receipt.ContractAddress == (common.Address{}) {
|
||||
return common.Address{}, errors.New("zero address")
|
||||
return common.Address{}, ErrNoAddressInReceipt
|
||||
}
|
||||
// Check that code has indeed been deployed at the address.
|
||||
// This matters on pre-Homestead chains: OOG in the constructor
|
||||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
|
|
@ -31,8 +31,6 @@ import (
|
|||
"github.com/ethereum/go-ethereum/params"
|
||||
)
|
||||
|
||||
var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||
|
||||
var waitDeployedTests = map[string]struct {
|
||||
code string
|
||||
gas uint64
|
||||
|
|
@ -77,7 +75,7 @@ func TestWaitDeployed(t *testing.T) {
|
|||
ctx = context.Background()
|
||||
)
|
||||
go func() {
|
||||
address, err = bind.WaitDeployed(ctx, backend.Client(), tx)
|
||||
address, err = bind.WaitDeployed(ctx, backend.Client(), tx.Hash())
|
||||
close(mined)
|
||||
}()
|
||||
|
||||
|
|
@ -122,9 +120,8 @@ func TestWaitDeployedCornerCases(t *testing.T) {
|
|||
t.Errorf("failed to send transaction: %q", err)
|
||||
}
|
||||
backend.Commit()
|
||||
notContractCreation := errors.New("tx is not contract creation")
|
||||
if _, err := bind.WaitDeployed(ctx, backend.Client(), tx); err.Error() != notContractCreation.Error() {
|
||||
t.Errorf("error mismatch: want %q, got %q, ", notContractCreation, err)
|
||||
if _, err := bind.WaitDeployed(ctx, backend.Client(), tx.Hash()); err != bind.ErrNoAddressInReceipt {
|
||||
t.Errorf("error mismatch: want %q, got %q, ", bind.ErrNoAddressInReceipt, err)
|
||||
}
|
||||
|
||||
// Create a transaction that is not mined.
|
||||
|
|
@ -133,7 +130,7 @@ func TestWaitDeployedCornerCases(t *testing.T) {
|
|||
|
||||
go func() {
|
||||
contextCanceled := errors.New("context canceled")
|
||||
if _, err := bind.WaitDeployed(ctx, backend.Client(), tx); err.Error() != contextCanceled.Error() {
|
||||
if _, err := bind.WaitDeployed(ctx, backend.Client(), tx.Hash()); err.Error() != contextCanceled.Error() {
|
||||
t.Errorf("error mismatch: want %q, got %q, ", contextCanceled, err)
|
||||
}
|
||||
}()
|
||||
|
|
@ -31,6 +31,46 @@ import (
|
|||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func BenchmarkUnpack(b *testing.B) {
|
||||
testCases := []struct {
|
||||
def string
|
||||
packed string
|
||||
}{
|
||||
{
|
||||
def: `[{"type": "uint32"}]`,
|
||||
packed: "0000000000000000000000000000000000000000000000000000000000000001",
|
||||
},
|
||||
{
|
||||
def: `[{"type": "uint32[]"}]`,
|
||||
packed: "0000000000000000000000000000000000000000000000000000000000000020" +
|
||||
"0000000000000000000000000000000000000000000000000000000000000002" +
|
||||
"0000000000000000000000000000000000000000000000000000000000000001" +
|
||||
"0000000000000000000000000000000000000000000000000000000000000002",
|
||||
},
|
||||
}
|
||||
for i, test := range testCases {
|
||||
b.Run(strconv.Itoa(i), func(b *testing.B) {
|
||||
def := fmt.Sprintf(`[{ "name" : "method", "type": "function", "outputs": %s}]`, test.def)
|
||||
abi, err := JSON(strings.NewReader(def))
|
||||
if err != nil {
|
||||
b.Fatalf("invalid ABI definition %s: %v", def, err)
|
||||
}
|
||||
encb, err := hex.DecodeString(test.packed)
|
||||
if err != nil {
|
||||
b.Fatalf("invalid hex %s: %v", test.packed, err)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
var result any
|
||||
for range b.N {
|
||||
result, _ = abi.Unpack("method", encb)
|
||||
}
|
||||
_ = result
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestUnpack tests the general pack/unpack tests in packing_test.go
|
||||
func TestUnpack(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/big"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts"
|
||||
|
|
@ -249,7 +250,11 @@ func (w *trezorDriver) trezorSign(derivationPath []uint32, tx *types.Transaction
|
|||
}
|
||||
}
|
||||
// Extract the Ethereum signature and do a sanity validation
|
||||
if len(response.GetSignatureR()) == 0 || len(response.GetSignatureS()) == 0 || response.GetSignatureV() == 0 {
|
||||
if len(response.GetSignatureR()) == 0 || len(response.GetSignatureS()) == 0 {
|
||||
return common.Address{}, nil, errors.New("reply lacks signature")
|
||||
} else if response.GetSignatureV() == 0 && int(chainID.Int64()) <= (math.MaxUint32-36)/2 {
|
||||
// for chainId >= (MaxUint32-36)/2, Trezor returns signature bit only
|
||||
// https://github.com/trezor/trezor-mcu/pull/399
|
||||
return common.Address{}, nil, errors.New("reply lacks signature")
|
||||
}
|
||||
signature := append(append(response.GetSignatureR(), response.GetSignatureS()...), byte(response.GetSignatureV()))
|
||||
|
|
@ -261,7 +266,11 @@ func (w *trezorDriver) trezorSign(derivationPath []uint32, tx *types.Transaction
|
|||
} else {
|
||||
// Trezor backend does not support typed transactions yet.
|
||||
signer = types.NewEIP155Signer(chainID)
|
||||
signature[64] -= byte(chainID.Uint64()*2 + 35)
|
||||
// if chainId is above (MaxUint32 - 36) / 2 then the final v values is returned
|
||||
// directly. Otherwise, the returned value is 35 + chainid * 2.
|
||||
if signature[64] > 1 && int(chainID.Int64()) <= (math.MaxUint32-36)/2 {
|
||||
signature[64] -= byte(chainID.Uint64()*2 + 35)
|
||||
}
|
||||
}
|
||||
|
||||
// Inject the final signature into the transaction and sanity check the sender
|
||||
|
|
|
|||
|
|
@ -23,9 +23,11 @@ import (
|
|||
"github.com/ethereum/go-ethereum/beacon/light/sync"
|
||||
"github.com/ethereum/go-ethereum/beacon/params"
|
||||
"github.com/ethereum/go-ethereum/beacon/types"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/common/mclock"
|
||||
"github.com/ethereum/go-ethereum/ethdb/memorydb"
|
||||
"github.com/ethereum/go-ethereum/event"
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
"github.com/ethereum/go-ethereum/rpc"
|
||||
)
|
||||
|
||||
|
|
@ -46,7 +48,13 @@ func NewClient(config params.ClientConfig) *Client {
|
|||
var (
|
||||
db = memorydb.New()
|
||||
committeeChain = light.NewCommitteeChain(db, &config.ChainConfig, config.Threshold, !config.NoFilter)
|
||||
headTracker = light.NewHeadTracker(committeeChain, config.Threshold)
|
||||
headTracker = light.NewHeadTracker(committeeChain, config.Threshold, func(checkpoint common.Hash) {
|
||||
if saved, err := config.SaveCheckpointToFile(checkpoint); saved {
|
||||
log.Debug("Saved beacon checkpoint", "file", config.CheckpointFile, "checkpoint", checkpoint)
|
||||
} else if err != nil {
|
||||
log.Error("Failed to save beacon checkpoint", "file", config.CheckpointFile, "checkpoint", checkpoint, "error", err)
|
||||
}
|
||||
})
|
||||
)
|
||||
headSync := sync.NewHeadSync(headTracker, committeeChain)
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import (
|
|||
"github.com/ethereum/go-ethereum/beacon/params"
|
||||
"github.com/ethereum/go-ethereum/beacon/types"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||
ctypes "github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
"github.com/ethereum/go-ethereum/rpc"
|
||||
|
|
@ -104,7 +105,11 @@ func (ec *engineClient) callNewPayload(fork string, event types.ChainHeadEvent)
|
|||
method = "engine_newPayloadV4"
|
||||
parentBeaconRoot := event.BeaconHead.ParentRoot
|
||||
blobHashes := collectBlobHashes(event.Block)
|
||||
params = append(params, blobHashes, parentBeaconRoot, event.ExecRequests)
|
||||
hexRequests := make([]hexutil.Bytes, len(event.ExecRequests))
|
||||
for i := range event.ExecRequests {
|
||||
hexRequests[i] = hexutil.Bytes(event.ExecRequests[i])
|
||||
}
|
||||
params = append(params, blobHashes, parentBeaconRoot, hexRequests)
|
||||
case "deneb":
|
||||
method = "engine_newPayloadV3"
|
||||
parentBeaconRoot := event.BeaconHead.ParentRoot
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ type executionPayloadEnvelopeMarshaling struct {
|
|||
|
||||
type PayloadStatusV1 struct {
|
||||
Status string `json:"status"`
|
||||
Witness *hexutil.Bytes `json:"witness"`
|
||||
Witness *hexutil.Bytes `json:"witness,omitempty"`
|
||||
LatestValidHash *common.Hash `json:"latestValidHash"`
|
||||
ValidationError *string `json:"validationError"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,9 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/beacon/params"
|
||||
"github.com/ethereum/go-ethereum/beacon/types"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
)
|
||||
|
||||
|
|
@ -38,13 +40,15 @@ type HeadTracker struct {
|
|||
hasFinalityUpdate bool
|
||||
prefetchHead types.HeadInfo
|
||||
changeCounter uint64
|
||||
saveCheckpoint func(common.Hash)
|
||||
}
|
||||
|
||||
// NewHeadTracker creates a new HeadTracker.
|
||||
func NewHeadTracker(committeeChain *CommitteeChain, minSignerCount int) *HeadTracker {
|
||||
func NewHeadTracker(committeeChain *CommitteeChain, minSignerCount int, saveCheckpoint func(common.Hash)) *HeadTracker {
|
||||
return &HeadTracker{
|
||||
committeeChain: committeeChain,
|
||||
minSignerCount: minSignerCount,
|
||||
saveCheckpoint: saveCheckpoint,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -100,6 +104,9 @@ func (h *HeadTracker) ValidateFinality(update types.FinalityUpdate) (bool, error
|
|||
if replace {
|
||||
h.finalityUpdate, h.hasFinalityUpdate = update, true
|
||||
h.changeCounter++
|
||||
if h.saveCheckpoint != nil && update.Finalized.Slot%params.EpochLength == 0 {
|
||||
h.saveCheckpoint(update.Finalized.Hash())
|
||||
}
|
||||
}
|
||||
return replace, err
|
||||
}
|
||||
|
|
|
|||
1
beacon/params/checkpoint_holesky.hex
Normal file
1
beacon/params/checkpoint_holesky.hex
Normal file
|
|
@ -0,0 +1 @@
|
|||
0xd60e5310c5d52ced44cfb13be4e9f22a1e6a6dc56964c3cccd429182d26d72d0
|
||||
1
beacon/params/checkpoint_mainnet.hex
Normal file
1
beacon/params/checkpoint_mainnet.hex
Normal file
|
|
@ -0,0 +1 @@
|
|||
0x02f0bb348b0d45f95a9b7e2bb5705768ad06548876cee03d880a2c9dabb1ff88
|
||||
1
beacon/params/checkpoint_sepolia.hex
Normal file
1
beacon/params/checkpoint_sepolia.hex
Normal file
|
|
@ -0,0 +1 @@
|
|||
0xa0dad451a230c01be6f2492980ec5bb412d8cf33351a75e8b172b5b84a5fd03a
|
||||
|
|
@ -54,6 +54,7 @@ type ChainConfig struct {
|
|||
GenesisValidatorsRoot common.Hash // Root hash of the genesis validator set, used for signature domain calculation
|
||||
Forks Forks
|
||||
Checkpoint common.Hash
|
||||
CheckpointFile string
|
||||
}
|
||||
|
||||
// ForkAtEpoch returns the latest active fork at the given epoch.
|
||||
|
|
@ -211,3 +212,36 @@ func (f Forks) Less(i, j int) bool {
|
|||
}
|
||||
return f[i].knownIndex < f[j].knownIndex
|
||||
}
|
||||
|
||||
// SetCheckpointFile sets the checkpoint import/export file name and attempts to
|
||||
// read the checkpoint from the file if it already exists. It returns true if
|
||||
// a checkpoint has been loaded.
|
||||
func (c *ChainConfig) SetCheckpointFile(checkpointFile string) (bool, error) {
|
||||
c.CheckpointFile = checkpointFile
|
||||
file, err := os.ReadFile(checkpointFile)
|
||||
if os.IsNotExist(err) {
|
||||
return false, nil // did not load checkpoint
|
||||
}
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("failed to read beacon checkpoint file: %v", err)
|
||||
}
|
||||
cp, err := hexutil.Decode(string(file))
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("failed to decode hex string in beacon checkpoint file: %v", err)
|
||||
}
|
||||
if len(cp) != 32 {
|
||||
return false, fmt.Errorf("invalid hex string length in beacon checkpoint file: %d", len(cp))
|
||||
}
|
||||
copy(c.Checkpoint[:len(cp)], cp)
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SaveCheckpointToFile saves the given checkpoint to file if a checkpoint
|
||||
// import/export file has been specified.
|
||||
func (c *ChainConfig) SaveCheckpointToFile(checkpoint common.Hash) (bool, error) {
|
||||
if c.CheckpointFile == "" {
|
||||
return false, nil
|
||||
}
|
||||
err := os.WriteFile(c.CheckpointFile, []byte(checkpoint.Hex()), 0600)
|
||||
return err == nil, err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,25 +17,37 @@
|
|||
package params
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
)
|
||||
|
||||
//go:embed checkpoint_mainnet.hex
|
||||
var checkpointMainnet string
|
||||
|
||||
//go:embed checkpoint_sepolia.hex
|
||||
var checkpointSepolia string
|
||||
|
||||
//go:embed checkpoint_holesky.hex
|
||||
var checkpointHolesky string
|
||||
|
||||
var (
|
||||
MainnetLightConfig = (&ChainConfig{
|
||||
GenesisValidatorsRoot: common.HexToHash("0x4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95"),
|
||||
GenesisTime: 1606824023,
|
||||
Checkpoint: common.HexToHash("0x6509b691f4de4f7b083f2784938fd52f0e131675432b3fd85ea549af9aebd3d0"),
|
||||
Checkpoint: common.HexToHash(checkpointMainnet),
|
||||
}).
|
||||
AddFork("GENESIS", 0, []byte{0, 0, 0, 0}).
|
||||
AddFork("ALTAIR", 74240, []byte{1, 0, 0, 0}).
|
||||
AddFork("BELLATRIX", 144896, []byte{2, 0, 0, 0}).
|
||||
AddFork("CAPELLA", 194048, []byte{3, 0, 0, 0}).
|
||||
AddFork("DENEB", 269568, []byte{4, 0, 0, 0})
|
||||
AddFork("DENEB", 269568, []byte{4, 0, 0, 0}).
|
||||
AddFork("ELECTRA", 364032, []byte{5, 0, 0, 0})
|
||||
|
||||
SepoliaLightConfig = (&ChainConfig{
|
||||
GenesisValidatorsRoot: common.HexToHash("0xd8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078"),
|
||||
GenesisTime: 1655733600,
|
||||
Checkpoint: common.HexToHash("0x456e85f5608afab3465a0580bff8572255f6d97af0c5f939e3f7536b5edb2d3f"),
|
||||
Checkpoint: common.HexToHash(checkpointSepolia),
|
||||
}).
|
||||
AddFork("GENESIS", 0, []byte{144, 0, 0, 105}).
|
||||
AddFork("ALTAIR", 50, []byte{144, 0, 0, 112}).
|
||||
|
|
@ -47,7 +59,7 @@ var (
|
|||
HoleskyLightConfig = (&ChainConfig{
|
||||
GenesisValidatorsRoot: common.HexToHash("0x9143aa7c615a7f7115e2b6aac319c03529df8242ae705fba9df39b79c59fa8b1"),
|
||||
GenesisTime: 1695902400,
|
||||
Checkpoint: common.HexToHash("0x6456a1317f54d4b4f2cb5bc9d153b5af0988fe767ef0609f0236cf29030bcff7"),
|
||||
Checkpoint: common.HexToHash(checkpointHolesky),
|
||||
}).
|
||||
AddFork("GENESIS", 0, []byte{1, 1, 112, 0}).
|
||||
AddFork("ALTAIR", 0, []byte{2, 1, 112, 0}).
|
||||
|
|
@ -55,4 +67,17 @@ var (
|
|||
AddFork("CAPELLA", 256, []byte{4, 1, 112, 0}).
|
||||
AddFork("DENEB", 29696, []byte{5, 1, 112, 0}).
|
||||
AddFork("ELECTRA", 115968, []byte{6, 1, 112, 0})
|
||||
|
||||
HoodiLightConfig = (&ChainConfig{
|
||||
GenesisValidatorsRoot: common.HexToHash("0x212f13fc4df078b6cb7db228f1c8307566dcecf900867401a92023d7ba99cb5f"),
|
||||
GenesisTime: 1742212800,
|
||||
Checkpoint: common.HexToHash(""),
|
||||
}).
|
||||
AddFork("GENESIS", 0, common.FromHex("0x10000910")).
|
||||
AddFork("ALTAIR", 0, common.FromHex("0x20000910")).
|
||||
AddFork("BELLATRIX", 0, common.FromHex("0x30000910")).
|
||||
AddFork("CAPELLA", 0, common.FromHex("0x40000910")).
|
||||
AddFork("DENEB", 0, common.FromHex("0x50000910")).
|
||||
AddFork("ELECTRA", 2048, common.FromHex("0x60000910")).
|
||||
AddFork("FULU", 18446744073709551615, common.FromHex("0x70000910"))
|
||||
)
|
||||
|
|
|
|||
|
|
@ -5,109 +5,109 @@
|
|||
# https://github.com/ethereum/execution-spec-tests/releases/download/pectra-devnet-6%40v1.0.0/
|
||||
b69211752a3029083c020dc635fe12156ca1a6725a08559da540a0337586a77e fixtures_pectra-devnet-6.tar.gz
|
||||
|
||||
# version:golang 1.24.1
|
||||
# version:golang 1.24.3
|
||||
# https://go.dev/dl/
|
||||
8244ebf46c65607db10222b5806aeb31c1fcf8979c1b6b12f60c677e9a3c0656 go1.24.1.src.tar.gz
|
||||
8d627dc163a4bffa2b1887112ad6194af175dce108d606ed1714a089fb806033 go1.24.1.aix-ppc64.tar.gz
|
||||
addbfce2056744962e2d7436313ab93486660cf7a2e066d171b9d6f2da7c7abe go1.24.1.darwin-amd64.tar.gz
|
||||
58d529334561cff11087cd4ab18fe0b46d8d5aad88f45c02b9645f847e014512 go1.24.1.darwin-amd64.pkg
|
||||
295581b5619acc92f5106e5bcb05c51869337eb19742fdfa6c8346c18e78ff88 go1.24.1.darwin-arm64.tar.gz
|
||||
78b0fc8ddc344eb499f1a952c687cb84cbd28ba2b739cfa0d4eb042f07e44e82 go1.24.1.darwin-arm64.pkg
|
||||
e70053f56f7eb93806d80cbd5726f78509a0a467602f7bea0e2c4ee8ed7c3968 go1.24.1.dragonfly-amd64.tar.gz
|
||||
3595e2674ed8fe72e604ca59c964d3e5277aafb08475c2b1aaca2d2fd69c24fc go1.24.1.freebsd-386.tar.gz
|
||||
47d7de8bb64d5c3ee7b6723aa62d5ecb11e3568ef2249bbe1d4bbd432d37c00c go1.24.1.freebsd-amd64.tar.gz
|
||||
04eec3bcfaa14c1370cdf98e8307fac7e4853496c3045afb9c3124a29cbca205 go1.24.1.freebsd-arm.tar.gz
|
||||
51aa70146e40cfdc20927424083dc86e6223f85dc08089913a1651973b55665b go1.24.1.freebsd-arm64.tar.gz
|
||||
3c131d8e3fc285a1340f87813153e24226d3ddbd6e54f3facbd6e4c46a84655e go1.24.1.freebsd-riscv64.tar.gz
|
||||
201d09da737ba39d5367f87d4e8b31edaeeb3dc9b9c407cb8cfb40f90c5a727a go1.24.1.illumos-amd64.tar.gz
|
||||
8c530ecedbc17e42ce10177bea07ccc96a3e77c792ea1ea72173a9675d16ffa5 go1.24.1.linux-386.tar.gz
|
||||
cb2396bae64183cdccf81a9a6df0aea3bce9511fc21469fb89a0c00470088073 go1.24.1.linux-amd64.tar.gz
|
||||
8df5750ffc0281017fb6070fba450f5d22b600a02081dceef47966ffaf36a3af go1.24.1.linux-arm64.tar.gz
|
||||
6d95f8d7884bfe2364644c837f080f2b585903d0b771eb5b06044e226a4f120a go1.24.1.linux-armv6l.tar.gz
|
||||
19304a4a56e46d04604547d2d83235dc4f9b192c79832560ce337d26cc7b835a go1.24.1.linux-loong64.tar.gz
|
||||
6347be77fa5359c12a5308c8ab87147c1fc4717b0c216493d1706c3b9fcde22d go1.24.1.linux-mips.tar.gz
|
||||
1647df415f7030b82d4105670192aa7e8910e18563bb0d505192d72800cc2d21 go1.24.1.linux-mips64.tar.gz
|
||||
762da594e4ec0f9cf6defae6ef971f5f7901203ee6a2d979e317adec96657317 go1.24.1.linux-mips64le.tar.gz
|
||||
9d8133c7b23a557399fab870b5cf464079c2b623a43b214a7567cf11c254a444 go1.24.1.linux-mipsle.tar.gz
|
||||
132f10999abbaccbada47fa85462db30c423955913b14d6c692de25f4636c766 go1.24.1.linux-ppc64.tar.gz
|
||||
0fb522efcefabae6e37e69bdc444094e75bfe824ea6d4cc3cbc70c7ae1b16858 go1.24.1.linux-ppc64le.tar.gz
|
||||
eaef4323d5467ff97fb1979c8491764060dade19f02f3275a9313f9a0da3b9c0 go1.24.1.linux-riscv64.tar.gz
|
||||
6c05e14d8f11094cb56a1c50f390b6b658bed8a7cbd8d1a57e926581b7eabfce go1.24.1.linux-s390x.tar.gz
|
||||
5dbb287d343ea00d58a70b11629f32ee716dc50a6875c459ea2018df0f294cd8 go1.24.1.netbsd-386.tar.gz
|
||||
617aa3faee50ce84c343db0888e9a210c310a7203666b4ed620f31030c9fb32f go1.24.1.netbsd-amd64.tar.gz
|
||||
59a928b7080c4a6ac985946274b7c65ce1cecc0b468ecd992d17b7c12fab9296 go1.24.1.netbsd-arm.tar.gz
|
||||
28daa8d0feb4aef2af60cefa3305bb9314de7e8a05cbca41ac548964cdfe89b7 go1.24.1.netbsd-arm64.tar.gz
|
||||
b7382b2f5d99813aeac14db482faa3bfbd47a68880b607fa2a7e669e26bab9cd go1.24.1.openbsd-386.tar.gz
|
||||
2513b6537c45deead5e641c7ce7502913e7d5e6f0b21c52542fb11f81578690f go1.24.1.openbsd-amd64.tar.gz
|
||||
853c1917d4fc7b144c55a02842aa48542d5cc798dde8db96dc0fdbc263200e04 go1.24.1.openbsd-arm.tar.gz
|
||||
6bc207b91e6f6ae3347fb54616a8fb2f5c11983713846a4cef111ff3f4f94d14 go1.24.1.openbsd-arm64.tar.gz
|
||||
4279260e2f2b94ee94e81470d13db7367f4393b061fee60985528fa0fa430df4 go1.24.1.openbsd-ppc64.tar.gz
|
||||
6fc4023a0a339ee0778522364a127d94c78e62122288d47d820dba703f81dc07 go1.24.1.openbsd-riscv64.tar.gz
|
||||
b5eb9fafd77146e7e1f748acfd95559580ecc8d2f15abf432a20f58c929c7cd2 go1.24.1.plan9-386.tar.gz
|
||||
24dcad6361b141fc8cced15b092351e12a99d2e58d7013204a3013c50daf9fdd go1.24.1.plan9-amd64.tar.gz
|
||||
a026ac3b55aa1e6fdc2aaab30207a117eafbe965ed81d3aa0676409f280ddc37 go1.24.1.plan9-arm.tar.gz
|
||||
8e4f6a77388dc6e5aa481efd5abdb3b9f5c9463bb82f4db074494e04e5c84992 go1.24.1.solaris-amd64.tar.gz
|
||||
b799f4ab264eef12a014c759383ed934056608c483e0f73e34ea6caf9f1df5f9 go1.24.1.windows-386.zip
|
||||
db128981033ac82a64688a123f631e61297b6b8f52ca913145e57caa8ce94cc3 go1.24.1.windows-386.msi
|
||||
95666b551453209a2b8869d29d177285ff9573af10f085d961d7ae5440f645ce go1.24.1.windows-amd64.zip
|
||||
5968e7adcf26e68a54f1cd41ad561275a670a8e2ca5263bc375b524638557dfb go1.24.1.windows-amd64.msi
|
||||
e28c4e6d0b913955765b46157ab88ae59bb636acaa12d7bec959aa6900f1cebd go1.24.1.windows-arm64.zip
|
||||
6d352c1f154a102a5b90c480cc64bab205ccf2681e34e78a3a4d3f1ddfbc81e4 go1.24.1.windows-arm64.msi
|
||||
229c08b600b1446798109fae1f569228102c8473caba8104b6418cb5bc032878 go1.24.3.src.tar.gz
|
||||
6f6901497547db3b77c14f7f953fbcef9fa5fb84199ee2ee14a5686e66bed5a6 go1.24.3.aix-ppc64.tar.gz
|
||||
a05fa7e4043a4fec66897135219e3b8ab2202b5ef351c60c2fbb531dfb8f2900 go1.24.3.darwin-amd64.pkg
|
||||
13e6fe3fcf65689d77d40e633de1e31c6febbdbcb846eb05fc2434ed2213e92b go1.24.3.darwin-amd64.tar.gz
|
||||
97055ff4214043b39dc32e043fdd5c565df7c0a4e2fc0174e779a134c347ae0e go1.24.3.darwin-arm64.pkg
|
||||
64a3fa22142f627e78fac3018ce3d4aeace68b743eff0afda8aae0411df5e4fb go1.24.3.darwin-arm64.tar.gz
|
||||
32de3fd44d5055973978436a7f1f0ffbaae85c1b603ec6105e5c38d8a674c721 go1.24.3.dragonfly-amd64.tar.gz
|
||||
9fe6101b3797919bd7337ee5ce591954f85d59db7ae88983904db29fd64c3dd1 go1.24.3.freebsd-386.tar.gz
|
||||
6ccf4cca287e90cc28cd7954b6172f5d177a17e20b072b65f7f39636c325e2fb go1.24.3.freebsd-amd64.tar.gz
|
||||
ce45ebf389066f82a7b056b66dd650efb51fde6f8bf92a2a3ab6990f02788ebf go1.24.3.freebsd-arm.tar.gz
|
||||
8f6494a12a874d0ea57c67987829359e016960ce3ba0673273609d6ac2af589a go1.24.3.freebsd-arm64.tar.gz
|
||||
f9db392560cf0851f0bc8f2190e1978e01b4603038c27fecfc8658a695b71616 go1.24.3.freebsd-riscv64.tar.gz
|
||||
01717fff64c5d98457272002fa825d0a15e307bf6e189f2b0c23817fa033b61c go1.24.3.illumos-amd64.tar.gz
|
||||
41b1051063e68cbd2b919bf12326764fe33937cf1d32b5c529dd1a4f43dce578 go1.24.3.linux-386.tar.gz
|
||||
3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8 go1.24.3.linux-amd64.tar.gz
|
||||
a463cb59382bd7ae7d8f4c68846e73c4d589f223c589ac76871b66811ded7836 go1.24.3.linux-arm64.tar.gz
|
||||
17a392d7e826625dd12a32099df0b00b85c32d8132ed86fe917183ee5c3f88ed go1.24.3.linux-armv6l.tar.gz
|
||||
e4b003c04c902edc140153d279b42167f1ad7c229f48f1f729bbef5e65e88d1f go1.24.3.linux-loong64.tar.gz
|
||||
1c79d89edf835edf9d4336ccea7cb89bc5c0ca82b12b36b218d599a5400d60fe go1.24.3.linux-mips.tar.gz
|
||||
0b64fe147d69f4d681d8e8a035c760477531432f83d831f18d37cb9bf3652488 go1.24.3.linux-mips64.tar.gz
|
||||
396b784c255b64512dc00c302c053e43a3cbfc77518664c6ac5569aafad4d1e6 go1.24.3.linux-mips64le.tar.gz
|
||||
93898313887f14e8efbe9d7386d5da4792b2d6c492bee562993fd4c9daa75c6d go1.24.3.linux-mipsle.tar.gz
|
||||
873ae3a6a6655a7b6f820e095d9965507e8dfd3cf76bc92d75c564ecbca385f6 go1.24.3.linux-ppc64.tar.gz
|
||||
341a749d168f47b1d4dad25e32cae70849b7ceed7c290823b853c9e6b0df0856 go1.24.3.linux-ppc64le.tar.gz
|
||||
fa482f53ccb4ba280316b8c5751ea67291507280d9166f2a38fe4d9b5d5fb64b go1.24.3.linux-riscv64.tar.gz
|
||||
a87b0c2a079a0bece1620fb29a00e02b4dba17507850f837e754af7d57cda282 go1.24.3.linux-s390x.tar.gz
|
||||
63155382308db1306200aff7821aa26bf2a2dda23537dd637a9704b485b6ddf0 go1.24.3.netbsd-386.tar.gz
|
||||
fe2c5c79482958b867c08a4fc2a10a998de9c0206b08d5b3ebcb2232e8d2777c go1.24.3.netbsd-amd64.tar.gz
|
||||
e8ff77aef21521b5dd94e44282a3243309b80717414cf12f72835a45886a049f go1.24.3.netbsd-arm.tar.gz
|
||||
b337fbaf82822685940ffaa76fbcf4be5d2f0258bc819cd80bc408b491f45c04 go1.24.3.netbsd-arm64.tar.gz
|
||||
c1bb9dd8418480aa7f65452b08de3759da3bf89702be71b5a9fc084836b24ad5 go1.24.3.openbsd-386.tar.gz
|
||||
531218de748b0caaf6d1ad18921206fc12baaa89bf483a0a5e60a571c206fe6f go1.24.3.openbsd-amd64.tar.gz
|
||||
bcd0dc959986fc346969b5d4111c3c8031882d8bf8d87a2c2ecf1328962a91f2 go1.24.3.openbsd-arm.tar.gz
|
||||
00ee6f8f1c41fd2e28ad386bd7e39acce7cab84af6de835855b29d1c597335c4 go1.24.3.openbsd-arm64.tar.gz
|
||||
9f4ec0a9203ed3c54ce1a2a390ad3d45838cdb7efd85baeff857e37dfde04edd go1.24.3.openbsd-ppc64.tar.gz
|
||||
da4d6f80e2373250d8c31c32dcd1e08775c327c0d610923604660cc0e07e8cba go1.24.3.openbsd-riscv64.tar.gz
|
||||
f5d02149132eedda6c2d46b360d7da462b8a5f9e3f8567db100c2d7bff0ddcd7 go1.24.3.plan9-386.tar.gz
|
||||
175f3d79f4762a3c545d2c6393bf6b8bac24e838026869dafab06b930735c94f go1.24.3.plan9-amd64.tar.gz
|
||||
d1e4ac15095da1611659261c2228c2058756cf87d61d9fad262f76755ef26849 go1.24.3.plan9-arm.tar.gz
|
||||
e644220a6ced3c07a7acc1364193cb709a97737dd8b6792a07a8ec6d9996713e go1.24.3.solaris-amd64.tar.gz
|
||||
0d7e7dc0a31ba0cdd487415709d03b02fc9490ef111e8dfd22788a6d63316f37 go1.24.3.windows-386.msi
|
||||
c27c463a61ab849266baa0c17a6c5c4256a574ab642f609ba25c96ec965dc184 go1.24.3.windows-386.zip
|
||||
d5b7637e7e138be877d96a4501709d480e050d86a8f402bc950e72112b5aedc5 go1.24.3.windows-amd64.msi
|
||||
be9787cb08998b1860fe3513e48a5fe5b96302d358a321b58e651184fa9638b3 go1.24.3.windows-amd64.zip
|
||||
7efde2e5e8468e9caf2c7fc94f4da78a726a5031a1ed63acff7899527cdddff6 go1.24.3.windows-arm64.msi
|
||||
eec9fa736056b54dd88ecb669db2bfad39b0c48f6f9080f036dfa1ca42dc4bb5 go1.24.3.windows-arm64.zip
|
||||
|
||||
# version:golangci 1.64.6
|
||||
# version:golangci 2.0.2
|
||||
# https://github.com/golangci/golangci-lint/releases/
|
||||
# https://github.com/golangci/golangci-lint/releases/download/v1.64.6/
|
||||
08f9459e7125fed2612abd71596e04d172695921aff82120d1c1e5e9b6fff2a3 golangci-lint-1.64.6-darwin-amd64.tar.gz
|
||||
8c10d0c7c3935b8c2269d628b6a06a8f48d8fb4cc31af02fe4ce0cd18b0704c1 golangci-lint-1.64.6-darwin-arm64.tar.gz
|
||||
c07fcabb55deb8d2c4d390025568e76162d7f91b1d14bd2311be45d8d440a624 golangci-lint-1.64.6-freebsd-386.tar.gz
|
||||
8ed1ef1102e1a42983ffcaae8e06de6a540334c3a69e205c610b8a7c92d469cd golangci-lint-1.64.6-freebsd-amd64.tar.gz
|
||||
8f8dda66d1b4a85cc8a1daf1b69af6559c3eb0a41dd8033148a9ad85cfc0e1d9 golangci-lint-1.64.6-freebsd-armv6.tar.gz
|
||||
59e8ca1fa254661b2a55e96515b14a10cd02221d443054deac5b28c3c3e12d6b golangci-lint-1.64.6-freebsd-armv7.tar.gz
|
||||
e3d323d5f132e9b7593141bfe1d19c8460e65a55cea1008ec96945fed563f981 golangci-lint-1.64.6-illumos-amd64.tar.gz
|
||||
5ce910f2a864c5fbeb32a30cbd506e1b2ef215f7a0f422cd5be6370b13db6f03 golangci-lint-1.64.6-linux-386.deb
|
||||
2caab682a26b9a5fb94ba24e3a7e1404fa9eab2c12e36ae1c5548d80a1be190c golangci-lint-1.64.6-linux-386.rpm
|
||||
2d82d0a4716e6d9b70c95103054855cb4b5f20f7bbdee42297f0189955bd14b6 golangci-lint-1.64.6-linux-386.tar.gz
|
||||
9cd82503e9841abcaa57663fc899587fe90363c26d86a793a98d3080fd25e907 golangci-lint-1.64.6-linux-amd64.deb
|
||||
981aaca5e5202d4fbb162ec7080490eb67ef5d32add5fb62fb02210597acc9da golangci-lint-1.64.6-linux-amd64.rpm
|
||||
71e290acbacb7b3ba4f68f0540fb74dc180c4336ac8a6f3bdcd7fcc48b15148d golangci-lint-1.64.6-linux-amd64.tar.gz
|
||||
718016bb06c1f598a8d23c7964e2643de621dbe5808688cb38857eb0bb773c84 golangci-lint-1.64.6-linux-arm64.deb
|
||||
ddc0e7b4b10b47cf894aea157e89e3674bbb60f8f5c480110c21c49cc2c1634d golangci-lint-1.64.6-linux-arm64.rpm
|
||||
99a7ff13dec7a8781a68408b6ecb8a1c5e82786cba3189eaa91d5cdcc24362ce golangci-lint-1.64.6-linux-arm64.tar.gz
|
||||
90e360f89c244394912b8709fb83a900b6d56cf19141df2afaf9e902ef3057b1 golangci-lint-1.64.6-linux-armv6.deb
|
||||
46546ff7c98d873ffcdbee06b39dc1024fc08db4fbf1f6309360a44cf976b5c2 golangci-lint-1.64.6-linux-armv6.rpm
|
||||
e45c1a42868aca0b0ee54d14fb89da216f3b4409367cd7bce3b5f36788b4fc92 golangci-lint-1.64.6-linux-armv6.tar.gz
|
||||
3cf6ddbbbf358db3de4b64a24f9683bbe2da3f003cfdee86cb610124b57abafb golangci-lint-1.64.6-linux-armv7.deb
|
||||
508b6712710da10f11aab9ea5e63af415c932dfe7fff718e649d3100b838f797 golangci-lint-1.64.6-linux-armv7.rpm
|
||||
da9a8bbee86b4dfee73fbc17e0856ec84c5b04919eb09bf3dd5904c39ce41753 golangci-lint-1.64.6-linux-armv7.tar.gz
|
||||
ad496a58284e1e9c8ac6f993fec429dcd96c85a8c4715dbb6530a5af0dae7fbd golangci-lint-1.64.6-linux-loong64.deb
|
||||
3bd70fa737b224750254dce616d9a188570e49b894b0cdb2fd04155e2c061350 golangci-lint-1.64.6-linux-loong64.rpm
|
||||
a535af973499729f2215a84303eb0de61399057aad6901ddea1b4f73f68d5f2c golangci-lint-1.64.6-linux-loong64.tar.gz
|
||||
6ad2a1cd37ca30303a488abfca2de52aff57519901c6d8d2608656fe9fb05292 golangci-lint-1.64.6-linux-mips64.deb
|
||||
5f18369f0ca010a02c267352ebe6e3e0514c6debff49899c9e5520906c0da287 golangci-lint-1.64.6-linux-mips64.rpm
|
||||
3449d6c13307b91b0e8817f8911c07c3412cdb6931b8d101e42db3e9762e91ad golangci-lint-1.64.6-linux-mips64.tar.gz
|
||||
d4712a348f65dcaf9f6c58f1cfd6d0984d54a902873dca5e76f0d686f5c59499 golangci-lint-1.64.6-linux-mips64le.deb
|
||||
57cea4538894558cb8c956d6b69c5509e4304546abe4a467478fc9ada0c736d6 golangci-lint-1.64.6-linux-mips64le.rpm
|
||||
bc030977d44535b2152fddb2732f056d193c043992fe638ddecea21a40ef09fe golangci-lint-1.64.6-linux-mips64le.tar.gz
|
||||
1ceb4e492efa527d246c61798c581f49113756fab8c39bb3eefdb1fa97041f92 golangci-lint-1.64.6-linux-ppc64le.deb
|
||||
454e1c2b3583a8644e0c33a970fb4ce35b8f11848e1a770d9095d99d159ad0ab golangci-lint-1.64.6-linux-ppc64le.rpm
|
||||
fddf30d35923eb6c7bb57520d8645768f802bf86c4cbf5a3a13049efb9e71b82 golangci-lint-1.64.6-linux-ppc64le.tar.gz
|
||||
bd75f0dd6f65bee5821c433803b28f3c427ef3582764c3d0e7f7fae1c9d468b6 golangci-lint-1.64.6-linux-riscv64.deb
|
||||
58457207c225cbd5340c8dcb75d9a44aa890d604e28464115a3a9762febaed04 golangci-lint-1.64.6-linux-riscv64.rpm
|
||||
82639518a613a6705b7e2de5b28c278e875d782a5c97e9c1b2ac10b4ecd7852f golangci-lint-1.64.6-linux-riscv64.tar.gz
|
||||
131d69204f8ced200b1437731e987cc886edac30dc87e6e1dcbd4f833d351713 golangci-lint-1.64.6-linux-s390x.deb
|
||||
ca6caf28ca7a1df7cff720f8fd6ac4b8f2eac10c8cbfe7d2eade70876aded570 golangci-lint-1.64.6-linux-s390x.rpm
|
||||
ed966d28a6512bc2b1120029a9f78ed77f2015e330b589a731d67d59be30b0b1 golangci-lint-1.64.6-linux-s390x.tar.gz
|
||||
b181132b41943fc77ace7f9f5523085d12d3613f27774a0e35e17dd5e65ba589 golangci-lint-1.64.6-netbsd-386.tar.gz
|
||||
f7b81c426006e3c699dc8665797a462aecba8c2cd23ac4971472e55184d95bc9 golangci-lint-1.64.6-netbsd-amd64.tar.gz
|
||||
663d6fb4c3bef57b8aacdb1b1a4634075e55d294ed170724b443374860897ca6 golangci-lint-1.64.6-netbsd-arm64.tar.gz
|
||||
8c7a76ee822568cc19352bbb9b2b0863dc5e185eb07782adbbaf648afd02ebcd golangci-lint-1.64.6-netbsd-armv6.tar.gz
|
||||
0ce26d56ce78e516529e087118ba3f1bcd71d311b4c5b2bde6ec24a6e8966d85 golangci-lint-1.64.6-netbsd-armv7.tar.gz
|
||||
135d5d998168683f46e4fab308cef5aa3c282025b7de6b258f976aadfb820db7 golangci-lint-1.64.6-source.tar.gz
|
||||
ccdb0cc249531a205304a76308cfa7cda830083d083d557884416a2461148263 golangci-lint-1.64.6-windows-386.zip
|
||||
2d88f282e08e1853c70bc7c914b5f58beaa6509903d56098aeb9bc3df30ea9d5 golangci-lint-1.64.6-windows-amd64.zip
|
||||
6a3c6e7afc6916392679d7d6b95ac239827644e3e50ec4e8ca6ab1e4e6db65fe golangci-lint-1.64.6-windows-arm64.zip
|
||||
9c9c1ef9687651566987f93e76252f7526c386901d7d8aeee044ca88115da4b1 golangci-lint-1.64.6-windows-armv6.zip
|
||||
4f0df114155791799dfde8cd8cb6307fecfb17fed70b44205486ec925e2f39cf golangci-lint-1.64.6-windows-armv7.zip
|
||||
# https://github.com/golangci/golangci-lint/releases/download/v2.0.2/
|
||||
a88cbdc86b483fe44e90bf2dcc3fec2af8c754116e6edf0aa6592cac5baa7a0e golangci-lint-2.0.2-darwin-amd64.tar.gz
|
||||
664550e7954f5f4451aae99b4f7382c1a47039c66f39ca605f5d9af1a0d32b49 golangci-lint-2.0.2-darwin-arm64.tar.gz
|
||||
bda0f0f27d300502faceda8428834a76ca25986f6d9fc2bd41d201c3ed73f08e golangci-lint-2.0.2-freebsd-386.tar.gz
|
||||
1cbd0c7ade3fb027d61d38a646ec1b51be5846952b4b04a5330e7f4687f2270c golangci-lint-2.0.2-freebsd-amd64.tar.gz
|
||||
1e828a597726198b2e35acdbcc5f3aad85244d79846d2d2bdb05241c5a535f9e golangci-lint-2.0.2-freebsd-armv6.tar.gz
|
||||
848b49315dc5cddd0c9ce35e96ab33d584db0ea8fb57bcbf9784f1622bec0269 golangci-lint-2.0.2-freebsd-armv7.tar.gz
|
||||
cabf9a6beab574c7f98581eb237919e580024759e3cdc05c4d516b044dce6770 golangci-lint-2.0.2-illumos-amd64.tar.gz
|
||||
2fde80d15ed6527791f106d606120620e913c3a663c90a8596861d0a4461169e golangci-lint-2.0.2-linux-386.deb
|
||||
804bc6e350a8c613aaa0a33d8d45414a80157b0ba1b2c2335ac859f85ad98ebd golangci-lint-2.0.2-linux-386.rpm
|
||||
e64beb72fecf581e57d88ae3adb1c9d4bf022694b6bd92e3c8e460910bbdc37d golangci-lint-2.0.2-linux-386.tar.gz
|
||||
9c55aed174d7a52bb1d4006b36e7edee9023631f6b814a80cb39c9860d6f75c3 golangci-lint-2.0.2-linux-amd64.deb
|
||||
c55a2ef741a687b4c679696931f7fd4a467babd64c9457cf17bb9632fd1cecd1 golangci-lint-2.0.2-linux-amd64.rpm
|
||||
89cc8a7810dc63b9a37900da03e37c3601caf46d42265d774e0f1a5d883d53e2 golangci-lint-2.0.2-linux-amd64.tar.gz
|
||||
a3e78583c4e7ea1b63e82559f126bb3a5b12788676f158526752d53e67824b99 golangci-lint-2.0.2-linux-arm64.deb
|
||||
bd5dd52b5c9f18aa7a2904eda9a9f91c628e98623fe70b7afcbb847e2de84422 golangci-lint-2.0.2-linux-arm64.rpm
|
||||
789d5b91219ac68c2336f77d41cd7e33a910420594780f455893f8453d09595b golangci-lint-2.0.2-linux-arm64.tar.gz
|
||||
534cd4c464a66178714ed68152c1ed7aa73e5700bf409e4ed1a8363adf96afca golangci-lint-2.0.2-linux-armv6.deb
|
||||
cf7d02905a5fc80b96c9a64621693b4cc7337b1ce29986c19fd72608dafe66c5 golangci-lint-2.0.2-linux-armv6.rpm
|
||||
a0d81cb527d8fe878377f2356b5773e219b0b91832a6b59e7b9bcf9a90fe0b0e golangci-lint-2.0.2-linux-armv6.tar.gz
|
||||
dedd5be7fff8cba8fe15b658a59347ea90d7d02a9fff87f09c7687e6da05a8b6 golangci-lint-2.0.2-linux-armv7.deb
|
||||
85521b6f3ad2f5a2bc9bfe14b9b08623f764964048f75ed6dfcfaf8eb7d57cc1 golangci-lint-2.0.2-linux-armv7.rpm
|
||||
96471046c7780dda4ea680f65e92c2ef56ff58d40bcffaf6cfe9d6d48e3c27aa golangci-lint-2.0.2-linux-armv7.tar.gz
|
||||
815d914a7738e4362466b2d11004e8618b696b49e8ace13df2c2b25f28fb1e17 golangci-lint-2.0.2-linux-loong64.deb
|
||||
f16381e3d8a0f011b95e086d83d620248432b915d01f4beab4d29cfe4dc388b0 golangci-lint-2.0.2-linux-loong64.rpm
|
||||
1bd8d7714f9c92db6a0f23bae89f39c85ba047bec8eeb42b8748d30ae3228d18 golangci-lint-2.0.2-linux-loong64.tar.gz
|
||||
ea6e9d4aabb526aa298e47e8b026d8893d918c5eb919ba0ab403e315def74cc5 golangci-lint-2.0.2-linux-mips64.deb
|
||||
519d8d53af83fdc9c25cc3fba8b663331ac22ef68131d4b0084cb6f425b6f79a golangci-lint-2.0.2-linux-mips64.rpm
|
||||
80d655a0a1ac1b19dcef4b58fa2a7dadb646cc50ad08d460b5c53cdb421165e4 golangci-lint-2.0.2-linux-mips64.tar.gz
|
||||
aa0e75384bb482c865d4dfc95d23ceb25666bf20461b67a832f0eea6670312ec golangci-lint-2.0.2-linux-mips64le.deb
|
||||
f2a8b500fb69bdea1b01df6267aaa5218fa4a58aeb781c1a20d0d802fe465a52 golangci-lint-2.0.2-linux-mips64le.rpm
|
||||
e66a0c0c9a275f02d27a7caa9576112622306f001d73dfc082cf1ae446fc1242 golangci-lint-2.0.2-linux-mips64le.tar.gz
|
||||
e85ad51aac6428be2d8a37000d053697371a538a5bcbc1644caa7c5e77f6d0af golangci-lint-2.0.2-linux-ppc64le.deb
|
||||
906798365eac1944af2a9b9a303e6fd49ec9043307bc681b7a96277f7f8beea5 golangci-lint-2.0.2-linux-ppc64le.rpm
|
||||
f7f1a271b0af274d6c9ce000f5dc6e1fb194350c67bcc62494f96f791882ba92 golangci-lint-2.0.2-linux-ppc64le.tar.gz
|
||||
eea8bf643a42bf05de9780530db22923e5ab0d588f0e173594dc6518f2a25d2a golangci-lint-2.0.2-linux-riscv64.deb
|
||||
4ff40f9fe2954400836e2a011ba4744d00ffab5068a51368552dfce6aba3b81b golangci-lint-2.0.2-linux-riscv64.rpm
|
||||
531d8f225866674977d630afbf0533eb02f9bec607fb13895f7a2cd7b2e0a648 golangci-lint-2.0.2-linux-riscv64.tar.gz
|
||||
6f827647046c603f40d97ea5aadc6f48cd0bb5d19f7a3d56500c3b833d2a0342 golangci-lint-2.0.2-linux-s390x.deb
|
||||
387a090e9576d19ca86aac738172e58e07c19f2784a13bb387f4f0d75fb9c8d3 golangci-lint-2.0.2-linux-s390x.rpm
|
||||
57de1fb7722a9feb2d11ed0a007a93959d05b9db5929a392abc222e30012467e golangci-lint-2.0.2-linux-s390x.tar.gz
|
||||
ed95e0492ea86bf79eb661f0334474b2a4255093685ff587eccd797c5a54db7e golangci-lint-2.0.2-netbsd-386.tar.gz
|
||||
eab81d729778166415d349a80e568b2f2b3a781745a9be3212a92abb1e732daf golangci-lint-2.0.2-netbsd-amd64.tar.gz
|
||||
d20add73f7c2de2c3b01ed4fd7b63ffcf0a6597d5ea228d1699e92339a3cd047 golangci-lint-2.0.2-netbsd-arm64.tar.gz
|
||||
4e4f44e6057879cd62424ff1800a767d25a595c0e91d6d48809eea9186b4c739 golangci-lint-2.0.2-netbsd-armv6.tar.gz
|
||||
51ec17b16d8743ae4098a0171f04f0ed4d64561e3051b982778b0e6c306a1b03 golangci-lint-2.0.2-netbsd-armv7.tar.gz
|
||||
5482cf27b93fae1765c70ee2a95d4074d038e9dee61bdd61d017ce8893d3a4a8 golangci-lint-2.0.2-source.tar.gz
|
||||
a35d8fdf3e14079a10880dbbb7586b46faec89be96f086b244b3e565aac80313 golangci-lint-2.0.2-windows-386.zip
|
||||
fe4b946cc01366b989001215687003a9c4a7098589921f75e6228d6d8cffc15c golangci-lint-2.0.2-windows-amd64.zip
|
||||
646bd9250ef8c771d85cd22fe8e6f2397ae39599179755e3bbfa9ef97ad44090 golangci-lint-2.0.2-windows-arm64.zip
|
||||
ce1dc0bad6f8a61d64e6b3779eeb773479c175125d6f686b0e67ef9c8432d16e golangci-lint-2.0.2-windows-armv6.zip
|
||||
92684a48faabe792b11ac27ca8b25551eff940b0a1e84ad7244e98b4994962db golangci-lint-2.0.2-windows-armv7.zip
|
||||
|
||||
# This is the builder on PPA that will build Go itself (inception-y), don't modify!
|
||||
#
|
||||
|
|
|
|||
55
build/ci.go
55
build/ci.go
|
|
@ -59,6 +59,7 @@ import (
|
|||
"github.com/cespare/cp"
|
||||
"github.com/ethereum/go-ethereum/crypto/signify"
|
||||
"github.com/ethereum/go-ethereum/internal/build"
|
||||
"github.com/ethereum/go-ethereum/internal/download"
|
||||
"github.com/ethereum/go-ethereum/internal/version"
|
||||
)
|
||||
|
||||
|
|
@ -190,7 +191,7 @@ func doInstall(cmdline []string) {
|
|||
// Configure the toolchain.
|
||||
tc := build.GoToolchain{GOARCH: *arch, CC: *cc}
|
||||
if *dlgo {
|
||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
tc.Root = build.DownloadGo(csdb)
|
||||
}
|
||||
// Disable CLI markdown doc generation in release builds.
|
||||
|
|
@ -285,7 +286,7 @@ func doTest(cmdline []string) {
|
|||
flag.CommandLine.Parse(cmdline)
|
||||
|
||||
// Get test fixtures.
|
||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
downloadSpecTestFixtures(csdb, *cachedir)
|
||||
|
||||
// Configure the toolchain.
|
||||
|
|
@ -329,16 +330,11 @@ func doTest(cmdline []string) {
|
|||
}
|
||||
|
||||
// downloadSpecTestFixtures downloads and extracts the execution-spec-tests fixtures.
|
||||
func downloadSpecTestFixtures(csdb *build.ChecksumDB, cachedir string) string {
|
||||
executionSpecTestsVersion, err := build.Version(csdb, "spec-tests")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
func downloadSpecTestFixtures(csdb *download.ChecksumDB, cachedir string) string {
|
||||
ext := ".tar.gz"
|
||||
base := "fixtures_pectra-devnet-6" // TODO(s1na) rename once the version becomes part of the filename
|
||||
url := fmt.Sprintf("https://github.com/ethereum/execution-spec-tests/releases/download/%s/%s%s", executionSpecTestsVersion, base, ext)
|
||||
archivePath := filepath.Join(cachedir, base+ext)
|
||||
if err := csdb.DownloadFile(url, archivePath); err != nil {
|
||||
if err := csdb.DownloadFileFromKnownURL(archivePath); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if err := build.ExtractArchive(archivePath, executionSpecTestsDir); err != nil {
|
||||
|
|
@ -444,14 +440,13 @@ func doLint(cmdline []string) {
|
|||
|
||||
// downloadLinter downloads and unpacks golangci-lint.
|
||||
func downloadLinter(cachedir string) string {
|
||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||
version, err := build.Version(csdb, "golangci")
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
version, err := csdb.FindVersion("golangci")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
arch := runtime.GOARCH
|
||||
ext := ".tar.gz"
|
||||
|
||||
if runtime.GOOS == "windows" {
|
||||
ext = ".zip"
|
||||
}
|
||||
|
|
@ -459,9 +454,8 @@ func downloadLinter(cachedir string) string {
|
|||
arch += "v" + os.Getenv("GOARM")
|
||||
}
|
||||
base := fmt.Sprintf("golangci-lint-%s-%s-%s", version, runtime.GOOS, arch)
|
||||
url := fmt.Sprintf("https://github.com/golangci/golangci-lint/releases/download/v%s/%s%s", version, base, ext)
|
||||
archivePath := filepath.Join(cachedir, base+ext)
|
||||
if err := csdb.DownloadFile(url, archivePath); err != nil {
|
||||
if err := csdb.DownloadFileFromKnownURL(archivePath); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if err := build.ExtractArchive(archivePath, cachedir); err != nil {
|
||||
|
|
@ -497,8 +491,8 @@ func protocArchiveBaseName() (string, error) {
|
|||
// in the generate command. It returns the full path of the directory
|
||||
// containing the 'protoc-gen-go' executable.
|
||||
func downloadProtocGenGo(cachedir string) string {
|
||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||
version, err := build.Version(csdb, "protoc-gen-go")
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
version, err := csdb.FindVersion("protoc-gen-go")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
|
@ -510,10 +504,8 @@ func downloadProtocGenGo(cachedir string) string {
|
|||
archiveName += ".tar.gz"
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("https://github.com/protocolbuffers/protobuf-go/releases/download/v%s/%s", version, archiveName)
|
||||
|
||||
archivePath := path.Join(cachedir, archiveName)
|
||||
if err := csdb.DownloadFile(url, archivePath); err != nil {
|
||||
if err := csdb.DownloadFileFromKnownURL(archivePath); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
extractDest := filepath.Join(cachedir, baseName)
|
||||
|
|
@ -531,8 +523,8 @@ func downloadProtocGenGo(cachedir string) string {
|
|||
// files as a CI step. It returns the full path to the directory containing
|
||||
// the protoc executable.
|
||||
func downloadProtoc(cachedir string) string {
|
||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||
version, err := build.Version(csdb, "protoc")
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
version, err := csdb.FindVersion("protoc")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
|
@ -543,10 +535,8 @@ func downloadProtoc(cachedir string) string {
|
|||
|
||||
fileName := fmt.Sprintf("protoc-%s-%s", version, baseName)
|
||||
archiveFileName := fileName + ".zip"
|
||||
url := fmt.Sprintf("https://github.com/protocolbuffers/protobuf/releases/download/v%s/%s", version, archiveFileName)
|
||||
archivePath := filepath.Join(cachedir, archiveFileName)
|
||||
|
||||
if err := csdb.DownloadFile(url, archivePath); err != nil {
|
||||
if err := csdb.DownloadFileFromKnownURL(archivePath); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
extractDest := filepath.Join(cachedir, fileName)
|
||||
|
|
@ -826,18 +816,17 @@ func doDebianSource(cmdline []string) {
|
|||
// downloadGoBootstrapSources downloads the Go source tarball(s) that will be used
|
||||
// to bootstrap the builder Go.
|
||||
func downloadGoBootstrapSources(cachedir string) []string {
|
||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
|
||||
var bundles []string
|
||||
for _, booter := range []string{"ppa-builder-1.19", "ppa-builder-1.21", "ppa-builder-1.23"} {
|
||||
gobootVersion, err := build.Version(csdb, booter)
|
||||
gobootVersion, err := csdb.FindVersion(booter)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
file := fmt.Sprintf("go%s.src.tar.gz", gobootVersion)
|
||||
url := "https://dl.google.com/go/" + file
|
||||
dst := filepath.Join(cachedir, file)
|
||||
if err := csdb.DownloadFile(url, dst); err != nil {
|
||||
if err := csdb.DownloadFileFromKnownURL(dst); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
bundles = append(bundles, dst)
|
||||
|
|
@ -847,15 +836,14 @@ func downloadGoBootstrapSources(cachedir string) []string {
|
|||
|
||||
// downloadGoSources downloads the Go source tarball.
|
||||
func downloadGoSources(cachedir string) string {
|
||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||
dlgoVersion, err := build.Version(csdb, "golang")
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
dlgoVersion, err := csdb.FindVersion("golang")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
file := fmt.Sprintf("go%s.src.tar.gz", dlgoVersion)
|
||||
url := "https://dl.google.com/go/" + file
|
||||
dst := filepath.Join(cachedir, file)
|
||||
if err := csdb.DownloadFile(url, dst); err != nil {
|
||||
if err := csdb.DownloadFileFromKnownURL(dst); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
return dst
|
||||
|
|
@ -1181,5 +1169,6 @@ func doPurge(cmdline []string) {
|
|||
}
|
||||
|
||||
func doSanityCheck() {
|
||||
build.DownloadAndVerifyChecksums(build.MustLoadChecksums("build/checksums.txt"))
|
||||
csdb := download.MustLoadChecksums("build/checksums.txt")
|
||||
csdb.DownloadAndVerifyAll()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import (
|
|||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/abigen"
|
||||
"github.com/ethereum/go-ethereum/cmd/utils"
|
||||
"github.com/ethereum/go-ethereum/common/compiler"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
|
|
@ -63,14 +63,13 @@ var (
|
|||
Name: "out",
|
||||
Usage: "Output file for the generated binding (default = stdout)",
|
||||
}
|
||||
langFlag = &cli.StringFlag{
|
||||
Name: "lang",
|
||||
Usage: "Destination language for the bindings (go)",
|
||||
Value: "go",
|
||||
}
|
||||
aliasFlag = &cli.StringFlag{
|
||||
Name: "alias",
|
||||
Usage: "Comma separated aliases for function and event renaming, e.g. original1=alias1, original2=alias2",
|
||||
Usage: "Comma separated aliases for function and event renaming. If --v2 is set, errors are aliased as well. e.g. original1=alias1, original2=alias2",
|
||||
}
|
||||
v2Flag = &cli.BoolFlag{
|
||||
Name: "v2",
|
||||
Usage: "Generates v2 bindings",
|
||||
}
|
||||
)
|
||||
|
||||
|
|
@ -86,13 +85,13 @@ func init() {
|
|||
excFlag,
|
||||
pkgFlag,
|
||||
outFlag,
|
||||
langFlag,
|
||||
aliasFlag,
|
||||
v2Flag,
|
||||
}
|
||||
app.Action = abigen
|
||||
app.Action = generate
|
||||
}
|
||||
|
||||
func abigen(c *cli.Context) error {
|
||||
func generate(c *cli.Context) error {
|
||||
flags.CheckExclusive(c, abiFlag, jsonFlag) // Only one source can be selected.
|
||||
|
||||
if c.String(pkgFlag.Name) == "" {
|
||||
|
|
@ -101,13 +100,6 @@ func abigen(c *cli.Context) error {
|
|||
if c.String(abiFlag.Name) == "" && c.String(jsonFlag.Name) == "" {
|
||||
utils.Fatalf("Either contract ABI source (--abi) or combined-json (--combined-json) are required")
|
||||
}
|
||||
var lang bind.Lang
|
||||
switch c.String(langFlag.Name) {
|
||||
case "go":
|
||||
lang = bind.LangGo
|
||||
default:
|
||||
utils.Fatalf("Unsupported destination language \"%s\" (--lang)", c.String(langFlag.Name))
|
||||
}
|
||||
// If the entire solidity code was specified, build and bind based on that
|
||||
var (
|
||||
abis []string
|
||||
|
|
@ -219,7 +211,15 @@ func abigen(c *cli.Context) error {
|
|||
}
|
||||
}
|
||||
// Generate the contract binding
|
||||
code, err := bind.Bind(types, abis, bins, sigs, c.String(pkgFlag.Name), lang, libs, aliases)
|
||||
var (
|
||||
code string
|
||||
err error
|
||||
)
|
||||
if c.IsSet(v2Flag.Name) {
|
||||
code, err = abigen.BindV2(types, abis, bins, c.String(pkgFlag.Name), libs, aliases)
|
||||
} else {
|
||||
code, err = abigen.Bind(types, abis, bins, sigs, c.String(pkgFlag.Name), libs, aliases)
|
||||
}
|
||||
if err != nil {
|
||||
utils.Fatalf("Failed to generate ABI binding: %v", err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,10 +43,12 @@ func main() {
|
|||
utils.BeaconGenesisRootFlag,
|
||||
utils.BeaconGenesisTimeFlag,
|
||||
utils.BeaconCheckpointFlag,
|
||||
utils.BeaconCheckpointFileFlag,
|
||||
//TODO datadir for optional permanent database
|
||||
utils.MainnetFlag,
|
||||
utils.SepoliaFlag,
|
||||
utils.HoleskyFlag,
|
||||
utils.HoodiFlag,
|
||||
utils.BlsyncApiFlag,
|
||||
utils.BlsyncJWTSecretFlag,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Clef
|
||||
|
||||
Clef can be used to sign transactions and data and is meant as a(n eventual) replacement for Geth's account management. This allows DApps to not depend on Geth's account management. When a DApp wants to sign data (or a transaction), it can send the content to Clef, which will then provide the user with context and asks for permission to sign the content. If the users grants the signing request, Clef will send the signature back to the DApp.
|
||||
Clef can be used to sign transactions and data and is meant as a(n eventual) replacement for Geth's account management. This allows DApps to not depend on Geth's account management. When a DApp wants to sign data (or a transaction), it can send the content to Clef, which will then provide the user with context and ask for permission to sign the content. If the user grants the signing request, Clef will send the signature back to the DApp.
|
||||
|
||||
This setup allows a DApp to connect to a remote Ethereum node and send transactions that are locally signed. This can help in situations when a DApp is connected to an untrusted remote Ethereum node, because a local one is not available, not synchronized with the chain, or is a node that has no built-in (or limited) account management.
|
||||
|
||||
|
|
@ -123,7 +123,7 @@ The External API is **untrusted**: it does not accept credentials, nor does it e
|
|||
|
||||
Clef has one native console-based UI, for operation without any standalone tools. However, there is also an API to communicate with an external UI. To enable that UI, the signer needs to be executed with the `--stdio-ui` option, which allocates `stdin` / `stdout` for the UI API.
|
||||
|
||||
An example (insecure) proof-of-concept of has been implemented in `pythonsigner.py`.
|
||||
An example (insecure) proof-of-concept has been implemented in `pythonsigner.py`.
|
||||
|
||||
The model is as follows:
|
||||
|
||||
|
|
@ -335,7 +335,7 @@ Bash example:
|
|||
|
||||
#### Arguments
|
||||
- content type [string]: type of signed data
|
||||
- `text/validator`: hex data with custom validator defined in a contract
|
||||
- `text/validator`: hex data with a custom validator defined in a contract
|
||||
- `application/clique`: [clique](https://github.com/ethereum/EIPs/issues/225) headers
|
||||
- `text/plain`: simple hex data validated by `account_ecRecover`
|
||||
- account [address]: account to sign with
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
The `signer` binary contains a ruleset engine, implemented with [OttoVM](https://github.com/robertkrimen/otto)
|
||||
|
||||
It enables usecases like the following:
|
||||
It enables use cases like the following:
|
||||
|
||||
* I want to auto-approve transactions with contract `CasinoDapp`, with up to `0.05 ether` in value to maximum `1 ether` per 24h period
|
||||
* I want to auto-approve transaction to contract `EthAlarmClock` with `data`=`0xdeadbeef`, if `value=0`, `gas < 44k` and `gasPrice < 40Gwei`
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ func discv4Ping(ctx *cli.Context) error {
|
|||
defer disc.Close()
|
||||
|
||||
start := time.Now()
|
||||
if err := disc.Ping(n); err != nil {
|
||||
if _, err := disc.Ping(n); err != nil {
|
||||
return fmt.Errorf("node didn't respond: %v", err)
|
||||
}
|
||||
fmt.Printf("node responded to ping (RTT %v).\n", time.Since(start))
|
||||
|
|
|
|||
|
|
@ -84,7 +84,8 @@ func discv5Ping(ctx *cli.Context) error {
|
|||
disc, _ := startV5(ctx)
|
||||
defer disc.Close()
|
||||
|
||||
fmt.Println(disc.Ping(n))
|
||||
_, err := disc.Ping(n)
|
||||
fmt.Println(err)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -66,10 +66,9 @@ func (s *Suite) dialAs(key *ecdsa.PrivateKey) (*Conn, error) {
|
|||
return nil, err
|
||||
}
|
||||
conn.caps = []p2p.Cap{
|
||||
{Name: "eth", Version: 67},
|
||||
{Name: "eth", Version: 68},
|
||||
{Name: "eth", Version: 69},
|
||||
}
|
||||
conn.ourHighestProtoVersion = 68
|
||||
conn.ourHighestProtoVersion = 69
|
||||
return &conn, nil
|
||||
}
|
||||
|
||||
|
|
@ -156,7 +155,7 @@ func (c *Conn) ReadEth() (any, error) {
|
|||
var msg any
|
||||
switch int(code) {
|
||||
case eth.StatusMsg:
|
||||
msg = new(eth.StatusPacket)
|
||||
msg = new(eth.StatusPacket69)
|
||||
case eth.GetBlockHeadersMsg:
|
||||
msg = new(eth.GetBlockHeadersPacket)
|
||||
case eth.BlockHeadersMsg:
|
||||
|
|
@ -229,9 +228,21 @@ func (c *Conn) ReadSnap() (any, error) {
|
|||
}
|
||||
}
|
||||
|
||||
// dialAndPeer creates a peer connection and runs the handshake.
|
||||
func (s *Suite) dialAndPeer(status *eth.StatusPacket69) (*Conn, error) {
|
||||
c, err := s.dial()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = c.peer(s.chain, status); err != nil {
|
||||
c.Close()
|
||||
}
|
||||
return c, err
|
||||
}
|
||||
|
||||
// peer performs both the protocol handshake and the status message
|
||||
// exchange with the node in order to peer with it.
|
||||
func (c *Conn) peer(chain *Chain, status *eth.StatusPacket) error {
|
||||
func (c *Conn) peer(chain *Chain, status *eth.StatusPacket69) error {
|
||||
if err := c.handshake(); err != nil {
|
||||
return fmt.Errorf("handshake failed: %v", err)
|
||||
}
|
||||
|
|
@ -304,7 +315,7 @@ func (c *Conn) negotiateEthProtocol(caps []p2p.Cap) {
|
|||
}
|
||||
|
||||
// statusExchange performs a `Status` message exchange with the given node.
|
||||
func (c *Conn) statusExchange(chain *Chain, status *eth.StatusPacket) error {
|
||||
func (c *Conn) statusExchange(chain *Chain, status *eth.StatusPacket69) error {
|
||||
loop:
|
||||
for {
|
||||
code, data, err := c.Read()
|
||||
|
|
@ -313,12 +324,16 @@ loop:
|
|||
}
|
||||
switch code {
|
||||
case eth.StatusMsg + protoOffset(ethProto):
|
||||
msg := new(eth.StatusPacket)
|
||||
msg := new(eth.StatusPacket69)
|
||||
if err := rlp.DecodeBytes(data, &msg); err != nil {
|
||||
return fmt.Errorf("error decoding status packet: %w", err)
|
||||
}
|
||||
if have, want := msg.Head, chain.blocks[chain.Len()-1].Hash(); have != want {
|
||||
return fmt.Errorf("wrong head block in status, want: %#x (block %d) have %#x",
|
||||
if have, want := msg.LatestBlock, chain.blocks[chain.Len()-1].NumberU64(); have != want {
|
||||
return fmt.Errorf("wrong head block in status, want: %d, have %d",
|
||||
want, have)
|
||||
}
|
||||
if have, want := msg.LatestBlockHash, chain.blocks[chain.Len()-1].Hash(); have != want {
|
||||
return fmt.Errorf("wrong head block in status, want: %#x (block %d) have %#x",
|
||||
want, chain.blocks[chain.Len()-1].NumberU64(), have)
|
||||
}
|
||||
if have, want := msg.ForkID, chain.ForkID(); !reflect.DeepEqual(have, want) {
|
||||
|
|
@ -348,13 +363,14 @@ loop:
|
|||
}
|
||||
if status == nil {
|
||||
// default status message
|
||||
status = ð.StatusPacket{
|
||||
status = ð.StatusPacket69{
|
||||
ProtocolVersion: uint32(c.negotiatedProtoVersion),
|
||||
NetworkID: chain.config.ChainID.Uint64(),
|
||||
TD: chain.TD(),
|
||||
Head: chain.blocks[chain.Len()-1].Hash(),
|
||||
Genesis: chain.blocks[0].Hash(),
|
||||
ForkID: chain.ForkID(),
|
||||
EarliestBlock: 0,
|
||||
LatestBlock: chain.blocks[chain.Len()-1].NumberU64(),
|
||||
LatestBlockHash: chain.blocks[chain.Len()-1].Hash(),
|
||||
}
|
||||
}
|
||||
if err := c.Write(ethProto, eth.StatusMsg, status); err != nil {
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ const (
|
|||
// Unexported devp2p protocol lengths from p2p package.
|
||||
const (
|
||||
baseProtoLen = 16
|
||||
ethProtoLen = 17
|
||||
ethProtoLen = 18
|
||||
snapProtoLen = 8
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -68,15 +68,19 @@ func (s *Suite) EthTests() []utesting.Test {
|
|||
return []utesting.Test{
|
||||
// status
|
||||
{Name: "Status", Fn: s.TestStatus},
|
||||
{Name: "MaliciousHandshake", Fn: s.TestMaliciousHandshake},
|
||||
{Name: "BlockRangeUpdateExpired", Fn: s.TestBlockRangeUpdateHistoryExp},
|
||||
{Name: "BlockRangeUpdateFuture", Fn: s.TestBlockRangeUpdateFuture},
|
||||
{Name: "BlockRangeUpdateInvalid", Fn: s.TestBlockRangeUpdateInvalid},
|
||||
// get block headers
|
||||
{Name: "GetBlockHeaders", Fn: s.TestGetBlockHeaders},
|
||||
{Name: "GetNonexistentBlockHeaders", Fn: s.TestGetNonexistentBlockHeaders},
|
||||
{Name: "SimultaneousRequests", Fn: s.TestSimultaneousRequests},
|
||||
{Name: "SameRequestID", Fn: s.TestSameRequestID},
|
||||
{Name: "ZeroRequestID", Fn: s.TestZeroRequestID},
|
||||
// get block bodies
|
||||
// get history
|
||||
{Name: "GetBlockBodies", Fn: s.TestGetBlockBodies},
|
||||
// // malicious handshakes + status
|
||||
{Name: "MaliciousHandshake", Fn: s.TestMaliciousHandshake},
|
||||
{Name: "GetReceipts", Fn: s.TestGetReceipts},
|
||||
// test transactions
|
||||
{Name: "LargeTxRequest", Fn: s.TestLargeTxRequest, Slow: true},
|
||||
{Name: "Transaction", Fn: s.TestTransaction},
|
||||
|
|
@ -100,15 +104,11 @@ func (s *Suite) SnapTests() []utesting.Test {
|
|||
|
||||
func (s *Suite) TestStatus(t *utesting.T) {
|
||||
t.Log(`This test is just a sanity check. It performs an eth protocol handshake.`)
|
||||
|
||||
conn, err := s.dial()
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("dial failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
if err := conn.peer(s.chain, nil); err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
t.Fatal("peering failed:", err)
|
||||
}
|
||||
conn.Close()
|
||||
}
|
||||
|
||||
// headersMatch returns whether the received headers match the given request
|
||||
|
|
@ -118,15 +118,12 @@ func headersMatch(expected []*types.Header, headers []*types.Header) bool {
|
|||
|
||||
func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
|
||||
t.Log(`This test requests block headers from the node.`)
|
||||
|
||||
conn, err := s.dial()
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("dial failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
if err = conn.peer(s.chain, nil); err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
// Send headers request.
|
||||
req := ð.GetBlockHeadersPacket{
|
||||
RequestId: 33,
|
||||
|
|
@ -158,18 +155,51 @@ func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *Suite) TestGetNonexistentBlockHeaders(t *utesting.T) {
|
||||
t.Log(`This test sends GetBlockHeaders requests for nonexistent blocks (using max uint64 value)
|
||||
to check if the node disconnects after receiving multiple invalid requests.`)
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
// Create request with max uint64 value for a nonexistent block
|
||||
badReq := ð.GetBlockHeadersPacket{
|
||||
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
|
||||
Origin: eth.HashOrNumber{Number: ^uint64(0)},
|
||||
Amount: 1,
|
||||
Skip: 0,
|
||||
Reverse: false,
|
||||
},
|
||||
}
|
||||
|
||||
// Send request 10 times. Some clients are lient on the first few invalids.
|
||||
for i := 0; i < 10; i++ {
|
||||
badReq.RequestId = uint64(i)
|
||||
if err := conn.Write(ethProto, eth.GetBlockHeadersMsg, badReq); err != nil {
|
||||
if err == errDisc {
|
||||
t.Fatalf("peer disconnected after %d requests", i+1)
|
||||
}
|
||||
t.Fatalf("write failed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Check if peer disconnects at the end.
|
||||
code, _, err := conn.Read()
|
||||
if err == errDisc || code == discMsg {
|
||||
t.Fatal("peer improperly disconnected")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Suite) TestSimultaneousRequests(t *utesting.T) {
|
||||
t.Log(`This test requests blocks headers from the node, performing two requests
|
||||
concurrently, with different request IDs.`)
|
||||
|
||||
conn, err := s.dial()
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("dial failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
if err := conn.peer(s.chain, nil); err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
// Create two different requests.
|
||||
req1 := ð.GetBlockHeadersPacket{
|
||||
|
|
@ -235,15 +265,11 @@ concurrently, with different request IDs.`)
|
|||
func (s *Suite) TestSameRequestID(t *utesting.T) {
|
||||
t.Log(`This test requests block headers, performing two concurrent requests with the
|
||||
same request ID. The node should handle the request by responding to both requests.`)
|
||||
|
||||
conn, err := s.dial()
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("dial failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
if err := conn.peer(s.chain, nil); err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
// Create two different requests with the same ID.
|
||||
reqID := uint64(1234)
|
||||
|
|
@ -306,15 +332,12 @@ same request ID. The node should handle the request by responding to both reques
|
|||
func (s *Suite) TestZeroRequestID(t *utesting.T) {
|
||||
t.Log(`This test sends a GetBlockHeaders message with a request-id of zero,
|
||||
and expects a response.`)
|
||||
|
||||
conn, err := s.dial()
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("dial failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
if err := conn.peer(s.chain, nil); err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
req := ð.GetBlockHeadersPacket{
|
||||
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
|
||||
Origin: eth.HashOrNumber{Number: 0},
|
||||
|
|
@ -341,15 +364,12 @@ and expects a response.`)
|
|||
|
||||
func (s *Suite) TestGetBlockBodies(t *utesting.T) {
|
||||
t.Log(`This test sends GetBlockBodies requests to the node for known blocks in the test chain.`)
|
||||
|
||||
conn, err := s.dial()
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("dial failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
if err := conn.peer(s.chain, nil); err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
// Create block bodies request.
|
||||
req := ð.GetBlockBodiesPacket{
|
||||
RequestId: 55,
|
||||
|
|
@ -375,6 +395,47 @@ func (s *Suite) TestGetBlockBodies(t *utesting.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *Suite) TestGetReceipts(t *utesting.T) {
|
||||
t.Log(`This test sends GetReceipts requests to the node for known blocks in the test chain.`)
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatalf("peering failed: %v", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
// Find some blocks containing receipts.
|
||||
var hashes = make([]common.Hash, 0, 3)
|
||||
for i := range s.chain.Len() {
|
||||
block := s.chain.GetBlock(i)
|
||||
if len(block.Transactions()) > 0 {
|
||||
hashes = append(hashes, block.Hash())
|
||||
}
|
||||
if len(hashes) == cap(hashes) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Create block bodies request.
|
||||
req := ð.GetReceiptsPacket{
|
||||
RequestId: 66,
|
||||
GetReceiptsRequest: (eth.GetReceiptsRequest)(hashes),
|
||||
}
|
||||
if err := conn.Write(ethProto, eth.GetReceiptsMsg, req); err != nil {
|
||||
t.Fatalf("could not write to connection: %v", err)
|
||||
}
|
||||
// Wait for response.
|
||||
resp := new(eth.ReceiptsPacket[*eth.ReceiptList69])
|
||||
if err := conn.ReadMsg(ethProto, eth.ReceiptsMsg, &resp); err != nil {
|
||||
t.Fatalf("error reading block bodies msg: %v", err)
|
||||
}
|
||||
if got, want := resp.RequestId, req.RequestId; got != want {
|
||||
t.Fatalf("unexpected request id in respond", got, want)
|
||||
}
|
||||
if len(resp.List) != len(req.GetReceiptsRequest) {
|
||||
t.Fatalf("wrong bodies in response: expected %d bodies, got %d", len(req.GetReceiptsRequest), len(resp.List))
|
||||
}
|
||||
}
|
||||
|
||||
// randBuf makes a random buffer size kilobytes large.
|
||||
func randBuf(size int) []byte {
|
||||
buf := make([]byte, size*1024)
|
||||
|
|
@ -457,6 +518,97 @@ func (s *Suite) TestMaliciousHandshake(t *utesting.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *Suite) TestBlockRangeUpdateInvalid(t *utesting.T) {
|
||||
t.Log(`This test sends an invalid BlockRangeUpdate message to the node and expects to be disconnected.`)
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
conn.Write(ethProto, eth.BlockRangeUpdateMsg, ð.BlockRangeUpdatePacket{
|
||||
EarliestBlock: 10,
|
||||
LatestBlock: 8,
|
||||
LatestBlockHash: s.chain.GetBlock(8).Hash(),
|
||||
})
|
||||
|
||||
if code, _, err := conn.Read(); err != nil {
|
||||
t.Fatalf("expected disconnect, got err: %v", err)
|
||||
} else if code != discMsg {
|
||||
t.Fatalf("expected disconnect message, got msg code %d", code)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Suite) TestBlockRangeUpdateFuture(t *utesting.T) {
|
||||
t.Log(`This test sends a BlockRangeUpdate that is beyond the chain head.
|
||||
The node should accept the update and should not disonnect.`)
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
head := s.chain.Head().NumberU64()
|
||||
var hash common.Hash
|
||||
rand.Read(hash[:])
|
||||
conn.Write(ethProto, eth.BlockRangeUpdateMsg, ð.BlockRangeUpdatePacket{
|
||||
EarliestBlock: head + 10,
|
||||
LatestBlock: head + 50,
|
||||
LatestBlockHash: hash,
|
||||
})
|
||||
|
||||
// Ensure the node does not disconnect us.
|
||||
// Just send a few ping messages.
|
||||
for range 10 {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
if err := conn.Write(baseProto, pingMsg, []any{}); err != nil {
|
||||
t.Fatal("write error:", err)
|
||||
}
|
||||
code, _, err := conn.Read()
|
||||
switch {
|
||||
case err != nil:
|
||||
t.Fatal("read error:", err)
|
||||
case code == discMsg:
|
||||
t.Fatal("got disconnect")
|
||||
case code == pongMsg:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Suite) TestBlockRangeUpdateHistoryExp(t *utesting.T) {
|
||||
t.Log(`This test sends a BlockRangeUpdate announcing incomplete (expired) history.
|
||||
The node should accept the update and should not disonnect.`)
|
||||
conn, err := s.dialAndPeer(nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
head := s.chain.Head()
|
||||
conn.Write(ethProto, eth.BlockRangeUpdateMsg, ð.BlockRangeUpdatePacket{
|
||||
EarliestBlock: head.NumberU64() - 10,
|
||||
LatestBlock: head.NumberU64(),
|
||||
LatestBlockHash: head.Hash(),
|
||||
})
|
||||
|
||||
// Ensure the node does not disconnect us.
|
||||
// Just send a few ping messages.
|
||||
for range 10 {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
if err := conn.Write(baseProto, pingMsg, []any{}); err != nil {
|
||||
t.Fatal("write error:", err)
|
||||
}
|
||||
code, _, err := conn.Read()
|
||||
switch {
|
||||
case err != nil:
|
||||
t.Fatal("read error:", err)
|
||||
case code == discMsg:
|
||||
t.Fatal("got disconnect")
|
||||
case code == pongMsg:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Suite) TestTransaction(t *utesting.T) {
|
||||
t.Log(`This test sends a valid transaction to the node and checks if the
|
||||
transaction gets propagated.`)
|
||||
|
|
|
|||
|
|
@ -59,8 +59,9 @@ func (s *Suite) AllTests() []utesting.Test {
|
|||
}
|
||||
}
|
||||
|
||||
// TestPing sends PING and expects a PONG response.
|
||||
func (s *Suite) TestPing(t *utesting.T) {
|
||||
t.Log(`This test is just a sanity check. It sends PING and expects a PONG response.`)
|
||||
|
||||
conn, l1 := s.listen1(t)
|
||||
defer conn.close()
|
||||
|
||||
|
|
@ -85,9 +86,10 @@ func checkPong(t *utesting.T, pong *v5wire.Pong, ping *v5wire.Ping, c net.Packet
|
|||
}
|
||||
}
|
||||
|
||||
// TestPingLargeRequestID sends PING with a 9-byte request ID, which isn't allowed by the spec.
|
||||
// The remote node should not respond.
|
||||
func (s *Suite) TestPingLargeRequestID(t *utesting.T) {
|
||||
t.Log(`This test sends PING with a 9-byte request ID, which isn't allowed by the spec.
|
||||
The remote node should not respond.`)
|
||||
|
||||
conn, l1 := s.listen1(t)
|
||||
defer conn.close()
|
||||
|
||||
|
|
@ -104,10 +106,11 @@ func (s *Suite) TestPingLargeRequestID(t *utesting.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// TestPingMultiIP establishes a session from one IP as usual. The session is then reused
|
||||
// on another IP, which shouldn't work. The remote node should respond with WHOAREYOU for
|
||||
// the attempt from a different IP.
|
||||
func (s *Suite) TestPingMultiIP(t *utesting.T) {
|
||||
t.Log(`This test establishes a session from one IP as usual. The session is then reused
|
||||
on another IP, which shouldn't work. The remote node should respond with WHOAREYOU for
|
||||
the attempt from a different IP.`)
|
||||
|
||||
conn, l1, l2 := s.listen2(t)
|
||||
defer conn.close()
|
||||
|
||||
|
|
@ -120,6 +123,7 @@ func (s *Suite) TestPingMultiIP(t *utesting.T) {
|
|||
checkPong(t, resp.(*v5wire.Pong), ping, l1)
|
||||
|
||||
// Send on l2. This reuses the session because there is only one codec.
|
||||
t.Log("sending ping from alternate IP", l2.LocalAddr())
|
||||
ping2 := &v5wire.Ping{ReqID: conn.nextReqID()}
|
||||
conn.write(l2, ping2, nil)
|
||||
switch resp := conn.read(l2).(type) {
|
||||
|
|
@ -158,6 +162,10 @@ func (s *Suite) TestPingMultiIP(t *utesting.T) {
|
|||
// packet instead of a handshake message packet. The remote node should respond with
|
||||
// another WHOAREYOU challenge for the second packet.
|
||||
func (s *Suite) TestPingHandshakeInterrupted(t *utesting.T) {
|
||||
t.Log(`TestPingHandshakeInterrupted starts a handshake, but doesn't finish it and sends a second ordinary message
|
||||
packet instead of a handshake message packet. The remote node should respond with
|
||||
another WHOAREYOU challenge for the second packet.`)
|
||||
|
||||
conn, l1 := s.listen1(t)
|
||||
defer conn.close()
|
||||
|
||||
|
|
@ -181,8 +189,10 @@ func (s *Suite) TestPingHandshakeInterrupted(t *utesting.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// TestTalkRequest sends TALKREQ and expects an empty TALKRESP response.
|
||||
func (s *Suite) TestTalkRequest(t *utesting.T) {
|
||||
t.Log(`This test sends some examples of TALKREQ with a protocol-id of "test-protocol"
|
||||
and expects an empty TALKRESP response.`)
|
||||
|
||||
conn, l1 := s.listen1(t)
|
||||
defer conn.close()
|
||||
|
||||
|
|
@ -202,6 +212,7 @@ func (s *Suite) TestTalkRequest(t *utesting.T) {
|
|||
}
|
||||
|
||||
// Empty request ID.
|
||||
t.Log("sending TALKREQ with empty request-id")
|
||||
resp = conn.reqresp(l1, &v5wire.TalkRequest{Protocol: "test-protocol"})
|
||||
switch resp := resp.(type) {
|
||||
case *v5wire.TalkResponse:
|
||||
|
|
@ -216,8 +227,9 @@ func (s *Suite) TestTalkRequest(t *utesting.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// TestFindnodeZeroDistance checks that the remote node returns itself for FINDNODE with distance zero.
|
||||
func (s *Suite) TestFindnodeZeroDistance(t *utesting.T) {
|
||||
t.Log(`This test checks that the remote node returns itself for FINDNODE with distance zero.`)
|
||||
|
||||
conn, l1 := s.listen1(t)
|
||||
defer conn.close()
|
||||
|
||||
|
|
@ -233,9 +245,11 @@ func (s *Suite) TestFindnodeZeroDistance(t *utesting.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// TestFindnodeResults pings the node under test from multiple nodes. After waiting for them to be
|
||||
// accepted into the remote table, the test checks that they are returned by FINDNODE.
|
||||
func (s *Suite) TestFindnodeResults(t *utesting.T) {
|
||||
t.Log(`This test pings the node under test from multiple other endpoints and node identities
|
||||
(the 'bystanders'). After waiting for them to be accepted into the remote table, the test checks
|
||||
that they are returned by FINDNODE.`)
|
||||
|
||||
// Create bystanders.
|
||||
nodes := make([]*bystander, 5)
|
||||
added := make(chan enode.ID, len(nodes))
|
||||
|
|
@ -273,6 +287,7 @@ func (s *Suite) TestFindnodeResults(t *utesting.T) {
|
|||
}
|
||||
|
||||
// Send FINDNODE for all distances.
|
||||
t.Log("requesting nodes")
|
||||
conn, l1 := s.listen1(t)
|
||||
defer conn.close()
|
||||
foundNodes, err := conn.findnode(l1, dists)
|
||||
|
|
|
|||
|
|
@ -234,6 +234,8 @@ func ethFilter(args []string) (nodeFilter, error) {
|
|||
filter = forkid.NewStaticFilter(params.SepoliaChainConfig, core.DefaultSepoliaGenesisBlock().ToBlock())
|
||||
case "holesky":
|
||||
filter = forkid.NewStaticFilter(params.HoleskyChainConfig, core.DefaultHoleskyGenesisBlock().ToBlock())
|
||||
case "hoodi":
|
||||
filter = forkid.NewStaticFilter(params.HoodiChainConfig, core.DefaultHoodiGenesisBlock().ToBlock())
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown network %q", args[0])
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ which can
|
|||
1. Take a prestate, including
|
||||
- Accounts,
|
||||
- Block context information,
|
||||
- Previous blockshashes (*optional)
|
||||
- Previous block hashes (*optional)
|
||||
2. Apply a set of transactions,
|
||||
3. Apply a mining-reward (*optional),
|
||||
4. And generate a post-state, including
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import "regexp"
|
|||
// within its filename by the execution spec test (EEST).
|
||||
type testMetadata struct {
|
||||
fork string
|
||||
module string // which python module gnerated the test, e.g. eip7702
|
||||
module string // which python module generated the test, e.g. eip7702
|
||||
file string // exact file the test came from, e.g. test_gas.py
|
||||
function string // func that created the test, e.g. test_valid_mcopy_operations
|
||||
parameters string // the name of the parameters which were used to fill the test, e.g. zero_inputs
|
||||
|
|
|
|||
|
|
@ -363,9 +363,13 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
|
|||
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not parse requests logs: %v", err))
|
||||
}
|
||||
// EIP-7002
|
||||
core.ProcessWithdrawalQueue(&requests, evm)
|
||||
if err := core.ProcessWithdrawalQueue(&requests, evm); err != nil {
|
||||
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not process withdrawal requests: %v", err))
|
||||
}
|
||||
// EIP-7251
|
||||
core.ProcessConsolidationQueue(&requests, evm)
|
||||
if err := core.ProcessConsolidationQueue(&requests, evm); err != nil {
|
||||
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not process consolidation requests: %v", err))
|
||||
}
|
||||
}
|
||||
|
||||
// Commit block
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ func signUnsignedTransactions(txs []*txWithKey, signer types.Signer) (types.Tran
|
|||
if tx.protected {
|
||||
signed, err = types.SignTx(tx.tx, signer, tx.key)
|
||||
} else {
|
||||
signed, err = types.SignTx(tx.tx, types.FrontierSigner{}, tx.key)
|
||||
signed, err = types.SignTx(tx.tx, types.HomesteadSigner{}, tx.key)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, NewError(ErrorJson, fmt.Errorf("tx %d: failed to sign tx: %v", i, err))
|
||||
|
|
|
|||
|
|
@ -53,7 +53,9 @@ var stateTestCommand = &cli.Command{
|
|||
Flags: slices.Concat([]cli.Flag{
|
||||
BenchFlag,
|
||||
DumpFlag,
|
||||
forkFlag,
|
||||
HumanReadableFlag,
|
||||
idxFlag,
|
||||
RunFlag,
|
||||
}, traceFlags),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,9 +21,12 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
|
|
@ -31,12 +34,16 @@ import (
|
|||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||
"github.com/ethereum/go-ethereum/core"
|
||||
"github.com/ethereum/go-ethereum/core/history"
|
||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
||||
"github.com/ethereum/go-ethereum/core/state"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/ethdb"
|
||||
"github.com/ethereum/go-ethereum/internal/debug"
|
||||
"github.com/ethereum/go-ethereum/internal/era"
|
||||
"github.com/ethereum/go-ethereum/internal/era/eradl"
|
||||
"github.com/ethereum/go-ethereum/internal/flags"
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
"github.com/ethereum/go-ethereum/params"
|
||||
"github.com/urfave/cli/v2"
|
||||
|
|
@ -65,7 +72,7 @@ It expects the genesis file as argument.`,
|
|||
Name: "dumpgenesis",
|
||||
Usage: "Dumps genesis block JSON configuration to stdout",
|
||||
ArgsUsage: "",
|
||||
Flags: append([]cli.Flag{utils.DataDirFlag}, utils.NetworkFlags...),
|
||||
Flags: slices.Concat([]cli.Flag{utils.DataDirFlag}, utils.NetworkFlags),
|
||||
Description: `
|
||||
The dumpgenesis command prints the genesis configuration of the network preset
|
||||
if one is set. Otherwise it prints the genesis from the datadir.`,
|
||||
|
|
@ -76,12 +83,16 @@ if one is set. Otherwise it prints the genesis from the datadir.`,
|
|||
Usage: "Import a blockchain file",
|
||||
ArgsUsage: "<filename> (<filename 2> ... <filename N>) ",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.CacheFlag,
|
||||
utils.SyncModeFlag,
|
||||
utils.GCModeFlag,
|
||||
utils.SnapshotFlag,
|
||||
utils.CacheFlag,
|
||||
utils.CacheDatabaseFlag,
|
||||
utils.CacheTrieFlag,
|
||||
utils.CacheGCFlag,
|
||||
utils.CacheSnapshotFlag,
|
||||
utils.CacheNoPrefetchFlag,
|
||||
utils.CachePreimagesFlag,
|
||||
utils.NoCompactionFlag,
|
||||
utils.MetricsEnabledFlag,
|
||||
utils.MetricsEnabledExpensiveFlag,
|
||||
utils.MetricsHTTPFlag,
|
||||
|
|
@ -100,24 +111,29 @@ if one is set. Otherwise it prints the genesis from the datadir.`,
|
|||
utils.VMTraceFlag,
|
||||
utils.VMTraceJsonConfigFlag,
|
||||
utils.TransactionHistoryFlag,
|
||||
utils.LogHistoryFlag,
|
||||
utils.LogNoHistoryFlag,
|
||||
utils.LogExportCheckpointsFlag,
|
||||
utils.StateHistoryFlag,
|
||||
}, utils.DatabaseFlags),
|
||||
}, utils.DatabaseFlags, debug.Flags),
|
||||
Before: func(ctx *cli.Context) error {
|
||||
flags.MigrateGlobalFlags(ctx)
|
||||
return debug.Setup(ctx)
|
||||
},
|
||||
Description: `
|
||||
The import command imports blocks from an RLP-encoded form. The form can be one file
|
||||
with several RLP-encoded blocks, or several files can be used.
|
||||
The import command allows the import of blocks from an RLP-encoded format. This format can be a single file
|
||||
containing multiple RLP-encoded blocks, or multiple files can be given.
|
||||
|
||||
If only one file is used, import error will result in failure. If several files are used,
|
||||
processing will proceed even if an individual RLP-file import failure occurs.`,
|
||||
If only one file is used, an import error will result in the entire import process failing. If
|
||||
multiple files are processed, the import process will continue even if an individual RLP file fails
|
||||
to import successfully.`,
|
||||
}
|
||||
exportCommand = &cli.Command{
|
||||
Action: exportChain,
|
||||
Name: "export",
|
||||
Usage: "Export blockchain into file",
|
||||
ArgsUsage: "<filename> [<blockNumFirst> <blockNumLast>]",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.CacheFlag,
|
||||
utils.SyncModeFlag,
|
||||
}, utils.DatabaseFlags),
|
||||
Flags: slices.Concat([]cli.Flag{utils.CacheFlag}, utils.DatabaseFlags),
|
||||
Description: `
|
||||
Requires a first argument of the file to write to.
|
||||
Optional second and third arguments control the first and
|
||||
|
|
@ -130,12 +146,7 @@ be gzipped.`,
|
|||
Name: "import-history",
|
||||
Usage: "Import an Era archive",
|
||||
ArgsUsage: "<dir>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.TxLookupLimitFlag,
|
||||
},
|
||||
utils.DatabaseFlags,
|
||||
utils.NetworkFlags,
|
||||
),
|
||||
Flags: slices.Concat([]cli.Flag{utils.TxLookupLimitFlag, utils.TransactionHistoryFlag}, utils.DatabaseFlags, utils.NetworkFlags),
|
||||
Description: `
|
||||
The import-history command will import blocks and their corresponding receipts
|
||||
from Era archives.
|
||||
|
|
@ -146,7 +157,7 @@ from Era archives.
|
|||
Name: "export-history",
|
||||
Usage: "Export blockchain history to Era archives",
|
||||
ArgsUsage: "<dir> <first> <last>",
|
||||
Flags: slices.Concat(utils.DatabaseFlags),
|
||||
Flags: utils.DatabaseFlags,
|
||||
Description: `
|
||||
The export-history command will export blocks and their corresponding receipts
|
||||
into Era archives. Eras are typically packaged in steps of 8192 blocks.
|
||||
|
|
@ -157,10 +168,7 @@ into Era archives. Eras are typically packaged in steps of 8192 blocks.
|
|||
Name: "import-preimages",
|
||||
Usage: "Import the preimage database from an RLP stream",
|
||||
ArgsUsage: "<datafile>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.CacheFlag,
|
||||
utils.SyncModeFlag,
|
||||
}, utils.DatabaseFlags),
|
||||
Flags: slices.Concat([]cli.Flag{utils.CacheFlag}, utils.DatabaseFlags),
|
||||
Description: `
|
||||
The import-preimages command imports hash preimages from an RLP encoded stream.
|
||||
It's deprecated, please use "geth db import" instead.
|
||||
|
|
@ -185,6 +193,54 @@ It's deprecated, please use "geth db import" instead.
|
|||
This command dumps out the state for a given block (or latest, if none provided).
|
||||
`,
|
||||
}
|
||||
|
||||
pruneHistoryCommand = &cli.Command{
|
||||
Action: pruneHistory,
|
||||
Name: "prune-history",
|
||||
Usage: "Prune blockchain history (block bodies and receipts) up to the merge block",
|
||||
ArgsUsage: "",
|
||||
Flags: utils.DatabaseFlags,
|
||||
Description: `
|
||||
The prune-history command removes historical block bodies and receipts from the
|
||||
blockchain database up to the merge block, while preserving block headers. This
|
||||
helps reduce storage requirements for nodes that don't need full historical data.`,
|
||||
}
|
||||
|
||||
downloadEraCommand = &cli.Command{
|
||||
Action: downloadEra,
|
||||
Name: "download-era",
|
||||
Usage: "Fetches era1 files (pre-merge history) from an HTTP endpoint",
|
||||
ArgsUsage: "",
|
||||
Flags: slices.Concat(
|
||||
utils.DatabaseFlags,
|
||||
utils.NetworkFlags,
|
||||
[]cli.Flag{
|
||||
eraBlockFlag,
|
||||
eraEpochFlag,
|
||||
eraAllFlag,
|
||||
eraServerFlag,
|
||||
},
|
||||
),
|
||||
}
|
||||
)
|
||||
|
||||
var (
|
||||
eraBlockFlag = &cli.StringFlag{
|
||||
Name: "block",
|
||||
Usage: "Block number to fetch. (can also be a range <start>-<end>)",
|
||||
}
|
||||
eraEpochFlag = &cli.StringFlag{
|
||||
Name: "epoch",
|
||||
Usage: "Epoch number to fetch (can also be a range <start>-<end>)",
|
||||
}
|
||||
eraAllFlag = &cli.BoolFlag{
|
||||
Name: "all",
|
||||
Usage: "Download all available era1 files",
|
||||
}
|
||||
eraServerFlag = &cli.StringFlag{
|
||||
Name: "server",
|
||||
Usage: "era1 server URL",
|
||||
}
|
||||
)
|
||||
|
||||
// initGenesis will initialise the given JSON format genesis file and writes it as
|
||||
|
|
@ -230,10 +286,13 @@ func initGenesis(ctx *cli.Context) error {
|
|||
triedb := utils.MakeTrieDatabase(ctx, chaindb, ctx.Bool(utils.CachePreimagesFlag.Name), false, genesis.IsVerkle())
|
||||
defer triedb.Close()
|
||||
|
||||
_, hash, _, err := core.SetupGenesisBlockWithOverride(chaindb, triedb, genesis, &overrides)
|
||||
_, hash, compatErr, err := core.SetupGenesisBlockWithOverride(chaindb, triedb, genesis, &overrides)
|
||||
if err != nil {
|
||||
utils.Fatalf("Failed to write genesis block: %v", err)
|
||||
}
|
||||
if compatErr != nil {
|
||||
utils.Fatalf("Failed to write chain config: %v", compatErr)
|
||||
}
|
||||
log.Info("Successfully wrote genesis state", "database", "chaindata", "hash", hash)
|
||||
|
||||
return nil
|
||||
|
|
@ -319,6 +378,9 @@ func importChain(ctx *cli.Context) error {
|
|||
if err := utils.ImportChain(chain, arg); err != nil {
|
||||
importErr = err
|
||||
log.Error("Import error", "file", arg, "err", err)
|
||||
if err == utils.ErrImportInterrupted {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -415,6 +477,10 @@ func importHistory(ctx *cli.Context) error {
|
|||
network = "mainnet"
|
||||
case ctx.Bool(utils.SepoliaFlag.Name):
|
||||
network = "sepolia"
|
||||
case ctx.Bool(utils.HoleskyFlag.Name):
|
||||
network = "holesky"
|
||||
case ctx.Bool(utils.HoodiFlag.Name):
|
||||
network = "hoodi"
|
||||
}
|
||||
} else {
|
||||
// No network flag set, try to determine network based on files
|
||||
|
|
@ -438,7 +504,7 @@ func importHistory(ctx *cli.Context) error {
|
|||
network = networks[0]
|
||||
}
|
||||
|
||||
if err := utils.ImportHistory(chain, db, dir, network); err != nil {
|
||||
if err := utils.ImportHistory(chain, dir, network); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("Import done in %v\n", time.Since(start))
|
||||
|
|
@ -591,3 +657,131 @@ func hashish(x string) bool {
|
|||
_, err := strconv.Atoi(x)
|
||||
return err != nil
|
||||
}
|
||||
|
||||
func pruneHistory(ctx *cli.Context) error {
|
||||
stack, _ := makeConfigNode(ctx)
|
||||
defer stack.Close()
|
||||
|
||||
// Open the chain database
|
||||
chain, chaindb := utils.MakeChain(ctx, stack, false)
|
||||
defer chaindb.Close()
|
||||
defer chain.Stop()
|
||||
|
||||
// Determine the prune point. This will be the first PoS block.
|
||||
prunePoint, ok := history.PrunePoints[chain.Genesis().Hash()]
|
||||
if !ok || prunePoint == nil {
|
||||
return errors.New("prune point not found")
|
||||
}
|
||||
var (
|
||||
mergeBlock = prunePoint.BlockNumber
|
||||
mergeBlockHash = prunePoint.BlockHash.Hex()
|
||||
)
|
||||
|
||||
// Check we're far enough past merge to ensure all data is in freezer
|
||||
currentHeader := chain.CurrentHeader()
|
||||
if currentHeader == nil {
|
||||
return errors.New("current header not found")
|
||||
}
|
||||
if currentHeader.Number.Uint64() < mergeBlock+params.FullImmutabilityThreshold {
|
||||
return fmt.Errorf("chain not far enough past merge block, need %d more blocks",
|
||||
mergeBlock+params.FullImmutabilityThreshold-currentHeader.Number.Uint64())
|
||||
}
|
||||
|
||||
// Double-check the prune block in db has the expected hash.
|
||||
hash := rawdb.ReadCanonicalHash(chaindb, mergeBlock)
|
||||
if hash != common.HexToHash(mergeBlockHash) {
|
||||
return fmt.Errorf("merge block hash mismatch: got %s, want %s", hash.Hex(), mergeBlockHash)
|
||||
}
|
||||
|
||||
log.Info("Starting history pruning", "head", currentHeader.Number, "tail", mergeBlock, "tailHash", mergeBlockHash)
|
||||
start := time.Now()
|
||||
rawdb.PruneTransactionIndex(chaindb, mergeBlock)
|
||||
if _, err := chaindb.TruncateTail(mergeBlock); err != nil {
|
||||
return fmt.Errorf("failed to truncate ancient data: %v", err)
|
||||
}
|
||||
log.Info("History pruning completed", "tail", mergeBlock, "elapsed", common.PrettyDuration(time.Since(start)))
|
||||
|
||||
// TODO(s1na): what if there is a crash between the two prune operations?
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// downladEra is the era1 file downloader tool.
|
||||
func downloadEra(ctx *cli.Context) error {
|
||||
flags.CheckExclusive(ctx, eraBlockFlag, eraEpochFlag, eraAllFlag)
|
||||
|
||||
// Resolve the network.
|
||||
var network = "mainnet"
|
||||
if utils.IsNetworkPreset(ctx) {
|
||||
switch {
|
||||
case ctx.IsSet(utils.MainnetFlag.Name):
|
||||
case ctx.IsSet(utils.SepoliaFlag.Name):
|
||||
network = "sepolia"
|
||||
default:
|
||||
return fmt.Errorf("unsupported network, no known era1 checksums")
|
||||
}
|
||||
}
|
||||
|
||||
// Resolve the destination directory.
|
||||
stack, _ := makeConfigNode(ctx)
|
||||
defer stack.Close()
|
||||
ancients := stack.ResolveAncient("chaindata", "")
|
||||
dir := filepath.Join(ancients, "era")
|
||||
|
||||
baseURL := ctx.String(eraServerFlag.Name)
|
||||
if baseURL == "" {
|
||||
return fmt.Errorf("need --%s flag to download", eraServerFlag.Name)
|
||||
}
|
||||
|
||||
l, err := eradl.New(baseURL, network)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch {
|
||||
case ctx.IsSet(eraAllFlag.Name):
|
||||
return l.DownloadAll(dir)
|
||||
|
||||
case ctx.IsSet(eraBlockFlag.Name):
|
||||
s := ctx.String(eraBlockFlag.Name)
|
||||
start, end, ok := parseRange(s)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid block range: %q", s)
|
||||
}
|
||||
return l.DownloadBlockRange(start, end, dir)
|
||||
|
||||
case ctx.IsSet(eraEpochFlag.Name):
|
||||
s := ctx.String(eraEpochFlag.Name)
|
||||
start, end, ok := parseRange(s)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid epoch range: %q", s)
|
||||
}
|
||||
return l.DownloadEpochRange(start, end, dir)
|
||||
|
||||
default:
|
||||
return fmt.Errorf("specify one of --%s, --%s, or --%s to download", eraAllFlag.Name, eraBlockFlag.Name, eraEpochFlag.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func parseRange(s string) (start uint64, end uint64, ok bool) {
|
||||
if m, _ := regexp.MatchString("[0-9]+", s); m {
|
||||
start, err := strconv.ParseUint(s, 10, 64)
|
||||
if err != nil {
|
||||
return 0, 0, false
|
||||
}
|
||||
end = start
|
||||
return start, end, true
|
||||
}
|
||||
if m, _ := regexp.MatchString("[0-9]+-[0-9]+", s); m {
|
||||
s1, s2, _ := strings.Cut(s, "-")
|
||||
start, err := strconv.ParseUint(s1, 10, 64)
|
||||
if err != nil {
|
||||
return 0, 0, false
|
||||
}
|
||||
end, err = strconv.ParseUint(s2, 10, 64)
|
||||
if err != nil {
|
||||
return 0, 0, false
|
||||
}
|
||||
return start, end, true
|
||||
}
|
||||
return 0, 0, false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ func makeFullNode(ctx *cli.Context) *node.Node {
|
|||
|
||||
if ctx.IsSet(utils.DeveloperFlag.Name) {
|
||||
// Start dev mode.
|
||||
simBeacon, err := catalyst.NewSimulatedBeacon(ctx.Uint64(utils.DeveloperPeriodFlag.Name), eth)
|
||||
simBeacon, err := catalyst.NewSimulatedBeacon(ctx.Uint64(utils.DeveloperPeriodFlag.Name), cfg.Eth.Miner.PendingFeeRecipient, eth)
|
||||
if err != nil {
|
||||
utils.Fatalf("failed to register dev mode catalyst service: %v", err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,9 +39,8 @@ const (
|
|||
// child g gets a temporary data directory.
|
||||
func runMinimalGeth(t *testing.T, args ...string) *testgeth {
|
||||
// --holesky to make the 'writing genesis to disk' faster (no accounts)
|
||||
// --networkid=1337 to avoid cache bump
|
||||
// --syncmode=full to avoid allocating fast sync bloom
|
||||
allArgs := []string{"--holesky", "--networkid", "1337", "--authrpc.port", "0", "--syncmode=full", "--port", "0",
|
||||
allArgs := []string{"--holesky", "--authrpc.port", "0", "--syncmode=full", "--port", "0",
|
||||
"--nat", "none", "--nodiscover", "--maxpeers", "0", "--cache", "64",
|
||||
"--datadir.minfreedisk", "0"}
|
||||
return runGeth(t, append(allArgs, args...)...)
|
||||
|
|
@ -103,17 +102,17 @@ func TestAttachWelcome(t *testing.T) {
|
|||
"--http", "--http.port", httpPort,
|
||||
"--ws", "--ws.port", wsPort)
|
||||
t.Run("ipc", func(t *testing.T) {
|
||||
waitForEndpoint(t, ipc, 4*time.Second)
|
||||
waitForEndpoint(t, ipc, 2*time.Minute)
|
||||
testAttachWelcome(t, geth, "ipc:"+ipc, ipcAPIs)
|
||||
})
|
||||
t.Run("http", func(t *testing.T) {
|
||||
endpoint := "http://127.0.0.1:" + httpPort
|
||||
waitForEndpoint(t, endpoint, 4*time.Second)
|
||||
waitForEndpoint(t, endpoint, 2*time.Minute)
|
||||
testAttachWelcome(t, geth, endpoint, httpAPIs)
|
||||
})
|
||||
t.Run("ws", func(t *testing.T) {
|
||||
endpoint := "ws://127.0.0.1:" + wsPort
|
||||
waitForEndpoint(t, endpoint, 4*time.Second)
|
||||
waitForEndpoint(t, endpoint, 2*time.Minute)
|
||||
testAttachWelcome(t, geth, endpoint, httpAPIs)
|
||||
})
|
||||
geth.Kill()
|
||||
|
|
|
|||
|
|
@ -86,12 +86,10 @@ Remove blockchain and state databases`,
|
|||
},
|
||||
}
|
||||
dbInspectCmd = &cli.Command{
|
||||
Action: inspect,
|
||||
Name: "inspect",
|
||||
ArgsUsage: "<prefix> <start>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Action: inspect,
|
||||
Name: "inspect",
|
||||
ArgsUsage: "<prefix> <start>",
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Usage: "Inspect the storage size for each type of data in the database",
|
||||
Description: `This commands iterates the entire database. If the optional 'prefix' and 'start' arguments are provided, then the iteration is limited to the given subset of data.`,
|
||||
}
|
||||
|
|
@ -109,16 +107,13 @@ a data corruption.`,
|
|||
Action: dbStats,
|
||||
Name: "stats",
|
||||
Usage: "Print leveldb statistics",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
}
|
||||
dbCompactCmd = &cli.Command{
|
||||
Action: dbCompact,
|
||||
Name: "compact",
|
||||
Usage: "Compact leveldb database. WARNING: May take a very long time",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
utils.CacheFlag,
|
||||
utils.CacheDatabaseFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
|
|
@ -127,13 +122,11 @@ WARNING: This operation may take a very long time to finish, and may cause datab
|
|||
corruption if it is aborted during execution'!`,
|
||||
}
|
||||
dbGetCmd = &cli.Command{
|
||||
Action: dbGet,
|
||||
Name: "get",
|
||||
Usage: "Show the value of a database key",
|
||||
ArgsUsage: "<hex-encoded key>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Action: dbGet,
|
||||
Name: "get",
|
||||
Usage: "Show the value of a database key",
|
||||
ArgsUsage: "<hex-encoded key>",
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: "This command looks up the specified database key from the database.",
|
||||
}
|
||||
dbDeleteCmd = &cli.Command{
|
||||
|
|
@ -141,9 +134,7 @@ corruption if it is aborted during execution'!`,
|
|||
Name: "delete",
|
||||
Usage: "Delete a database key (WARNING: may corrupt your database)",
|
||||
ArgsUsage: "<hex-encoded key>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: `This command deletes the specified database key from the database.
|
||||
WARNING: This is a low-level operation which may cause database corruption!`,
|
||||
}
|
||||
|
|
@ -152,59 +143,47 @@ WARNING: This is a low-level operation which may cause database corruption!`,
|
|||
Name: "put",
|
||||
Usage: "Set the value of a database key (WARNING: may corrupt your database)",
|
||||
ArgsUsage: "<hex-encoded key> <hex-encoded value>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: `This command sets a given database key to the given value.
|
||||
WARNING: This is a low-level operation which may cause database corruption!`,
|
||||
}
|
||||
dbGetSlotsCmd = &cli.Command{
|
||||
Action: dbDumpTrie,
|
||||
Name: "dumptrie",
|
||||
Usage: "Show the storage key/values of a given storage trie",
|
||||
ArgsUsage: "<hex-encoded state root> <hex-encoded account hash> <hex-encoded storage trie root> <hex-encoded start (optional)> <int max elements (optional)>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Action: dbDumpTrie,
|
||||
Name: "dumptrie",
|
||||
Usage: "Show the storage key/values of a given storage trie",
|
||||
ArgsUsage: "<hex-encoded state root> <hex-encoded account hash> <hex-encoded storage trie root> <hex-encoded start (optional)> <int max elements (optional)>",
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: "This command looks up the specified database key from the database.",
|
||||
}
|
||||
dbDumpFreezerIndex = &cli.Command{
|
||||
Action: freezerInspect,
|
||||
Name: "freezer-index",
|
||||
Usage: "Dump out the index of a specific freezer table",
|
||||
ArgsUsage: "<freezer-type> <table-type> <start (int)> <end (int)>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Action: freezerInspect,
|
||||
Name: "freezer-index",
|
||||
Usage: "Dump out the index of a specific freezer table",
|
||||
ArgsUsage: "<freezer-type> <table-type> <start (int)> <end (int)>",
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: "This command displays information about the freezer index.",
|
||||
}
|
||||
dbImportCmd = &cli.Command{
|
||||
Action: importLDBdata,
|
||||
Name: "import",
|
||||
Usage: "Imports leveldb-data from an exported RLP dump.",
|
||||
ArgsUsage: "<dumpfile> <start (optional)",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Action: importLDBdata,
|
||||
Name: "import",
|
||||
Usage: "Imports leveldb-data from an exported RLP dump.",
|
||||
ArgsUsage: "<dumpfile> <start (optional)",
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: "The import command imports the specific chain data from an RLP encoded stream.",
|
||||
}
|
||||
dbExportCmd = &cli.Command{
|
||||
Action: exportChaindata,
|
||||
Name: "export",
|
||||
Usage: "Exports the chain data into an RLP dump. If the <dumpfile> has .gz suffix, gzip compression will be used.",
|
||||
ArgsUsage: "<type> <dumpfile>",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Action: exportChaindata,
|
||||
Name: "export",
|
||||
Usage: "Exports the chain data into an RLP dump. If the <dumpfile> has .gz suffix, gzip compression will be used.",
|
||||
ArgsUsage: "<type> <dumpfile>",
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: "Exports the specified chain data to an RLP encoded stream, optionally gzip-compressed.",
|
||||
}
|
||||
dbMetadataCmd = &cli.Command{
|
||||
Action: showMetaData,
|
||||
Name: "metadata",
|
||||
Usage: "Shows metadata about the chain status.",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Action: showMetaData,
|
||||
Name: "metadata",
|
||||
Usage: "Shows metadata about the chain status.",
|
||||
Flags: slices.Concat(utils.NetworkFlags, utils.DatabaseFlags),
|
||||
Description: "Shows metadata about the chain status.",
|
||||
}
|
||||
dbInspectHistoryCmd = &cli.Command{
|
||||
|
|
@ -213,7 +192,6 @@ WARNING: This is a low-level operation which may cause database corruption!`,
|
|||
Usage: "Inspect the state history within block range",
|
||||
ArgsUsage: "<address> [OPTIONAL <storage-slot>]",
|
||||
Flags: slices.Concat([]cli.Flag{
|
||||
utils.SyncModeFlag,
|
||||
&cli.Uint64Flag{
|
||||
Name: "start",
|
||||
Usage: "block number of the range start, zero means earliest history",
|
||||
|
|
|
|||
|
|
@ -86,17 +86,14 @@ var (
|
|||
utils.SnapshotFlag,
|
||||
utils.TxLookupLimitFlag, // deprecated
|
||||
utils.TransactionHistoryFlag,
|
||||
utils.ChainHistoryFlag,
|
||||
utils.LogHistoryFlag,
|
||||
utils.LogNoHistoryFlag,
|
||||
utils.LogExportCheckpointsFlag,
|
||||
utils.StateHistoryFlag,
|
||||
utils.LightServeFlag, // deprecated
|
||||
utils.LightIngressFlag, // deprecated
|
||||
utils.LightEgressFlag, // deprecated
|
||||
utils.LightMaxPeersFlag, // deprecated
|
||||
utils.LightNoPruneFlag, // deprecated
|
||||
utils.LightKDFFlag,
|
||||
utils.LightNoSyncServeFlag, // deprecated
|
||||
utils.EthRequiredBlocksFlag,
|
||||
utils.LegacyWhitelistFlag, // deprecated
|
||||
utils.BloomFilterSizeFlag,
|
||||
utils.CacheFlag,
|
||||
utils.CacheDatabaseFlag,
|
||||
utils.CacheTrieFlag,
|
||||
|
|
@ -138,7 +135,6 @@ var (
|
|||
utils.VMTraceJsonConfigFlag,
|
||||
utils.NetworkIdFlag,
|
||||
utils.EthStatsURLFlag,
|
||||
utils.NoCompactionFlag,
|
||||
utils.GpoBlocksFlag,
|
||||
utils.GpoPercentileFlag,
|
||||
utils.GpoMaxGasPriceFlag,
|
||||
|
|
@ -154,6 +150,7 @@ var (
|
|||
utils.BeaconGenesisRootFlag,
|
||||
utils.BeaconGenesisTimeFlag,
|
||||
utils.BeaconCheckpointFlag,
|
||||
utils.BeaconCheckpointFileFlag,
|
||||
}, utils.NetworkFlags, utils.DatabaseFlags)
|
||||
|
||||
rpcFlags = []cli.Flag{
|
||||
|
|
@ -222,6 +219,8 @@ func init() {
|
|||
removedbCommand,
|
||||
dumpCommand,
|
||||
dumpGenesisCommand,
|
||||
pruneHistoryCommand,
|
||||
downloadEraCommand,
|
||||
// See accountcmd.go:
|
||||
accountCommand,
|
||||
walletCommand,
|
||||
|
|
@ -292,6 +291,9 @@ func prepare(ctx *cli.Context) {
|
|||
case ctx.IsSet(utils.HoleskyFlag.Name):
|
||||
log.Info("Starting Geth on Holesky testnet...")
|
||||
|
||||
case ctx.IsSet(utils.HoodiFlag.Name):
|
||||
log.Info("Starting Geth on Hoodi testnet...")
|
||||
|
||||
case ctx.IsSet(utils.DeveloperFlag.Name):
|
||||
log.Info("Starting Geth in ephemeral dev mode...")
|
||||
log.Warn(`You are running Geth in --dev mode. Please note the following:
|
||||
|
|
@ -318,6 +320,7 @@ func prepare(ctx *cli.Context) {
|
|||
// Make sure we're not on any supported preconfigured testnet either
|
||||
if !ctx.IsSet(utils.HoleskyFlag.Name) &&
|
||||
!ctx.IsSet(utils.SepoliaFlag.Name) &&
|
||||
!ctx.IsSet(utils.HoodiFlag.Name) &&
|
||||
!ctx.IsSet(utils.DeveloperFlag.Name) {
|
||||
// Nope, we're really on mainnet. Bump that cache up!
|
||||
log.Info("Bumping default cache on mainnet", "provided", ctx.Int(utils.CacheFlag.Name), "updated", 4096)
|
||||
|
|
|
|||
|
|
@ -55,13 +55,16 @@ const (
|
|||
importBatchSize = 2500
|
||||
)
|
||||
|
||||
// ErrImportInterrupted is returned when the user interrupts the import process.
|
||||
var ErrImportInterrupted = errors.New("interrupted")
|
||||
|
||||
// Fatalf formats a message to standard error and exits the program.
|
||||
// The message is also printed to standard output if standard error
|
||||
// is redirected to a different file.
|
||||
func Fatalf(format string, args ...interface{}) {
|
||||
w := io.MultiWriter(os.Stdout, os.Stderr)
|
||||
if runtime.GOOS == "windows" {
|
||||
// The SameFile check below doesn't work on Windows.
|
||||
if runtime.GOOS == "windows" || runtime.GOOS == "openbsd" {
|
||||
// The SameFile check below doesn't work on Windows neither OpenBSD.
|
||||
// stdout is unlikely to get redirected though, so just print there.
|
||||
w = os.Stdout
|
||||
} else {
|
||||
|
|
@ -191,7 +194,7 @@ func ImportChain(chain *core.BlockChain, fn string) error {
|
|||
for batch := 0; ; batch++ {
|
||||
// Load a batch of RLP blocks.
|
||||
if checkInterrupt() {
|
||||
return errors.New("interrupted")
|
||||
return ErrImportInterrupted
|
||||
}
|
||||
i := 0
|
||||
for ; i < importBatchSize; i++ {
|
||||
|
|
@ -243,8 +246,9 @@ func readList(filename string) ([]string, error) {
|
|||
}
|
||||
|
||||
// ImportHistory imports Era1 files containing historical block information,
|
||||
// starting from genesis.
|
||||
func ImportHistory(chain *core.BlockChain, db ethdb.Database, dir string, network string) error {
|
||||
// starting from genesis. The assumption is held that the provided chain
|
||||
// segment in Era1 file should all be canonical and verified.
|
||||
func ImportHistory(chain *core.BlockChain, dir string, network string) error {
|
||||
if chain.CurrentSnapBlock().Number.BitLen() != 0 {
|
||||
return errors.New("history import only supported when starting from genesis")
|
||||
}
|
||||
|
|
@ -305,12 +309,8 @@ func ImportHistory(chain *core.BlockChain, db ethdb.Database, dir string, networ
|
|||
if err != nil {
|
||||
return fmt.Errorf("error reading receipts %d: %w", it.Number(), err)
|
||||
}
|
||||
if status, err := chain.HeaderChain().InsertHeaderChain([]*types.Header{block.Header()}, start); err != nil {
|
||||
return fmt.Errorf("error inserting header %d: %w", it.Number(), err)
|
||||
} else if status != core.CanonStatTy {
|
||||
return fmt.Errorf("error inserting header %d, not canon: %v", it.Number(), status)
|
||||
}
|
||||
if _, err := chain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{receipts}, 2^64-1); err != nil {
|
||||
encReceipts := types.EncodeBlockReceiptLists([]types.Receipts{receipts})
|
||||
if _, err := chain.InsertReceiptChain([]*types.Block{block}, encReceipts, 2^64-1); err != nil {
|
||||
return fmt.Errorf("error inserting body %d: %w", it.Number(), err)
|
||||
}
|
||||
imported += 1
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue