mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-25 14:16:44 +00:00
Merge pull request #1528 from maticnetwork/upstream_merge_v1.15.7
Pectra upstream merge v1.15.7
This commit is contained in:
commit
2aebd6a055
935 changed files with 98874 additions and 26046 deletions
36
.github/CODEOWNERS
vendored
Normal file
36
.github/CODEOWNERS
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# Lines starting with '#' are comments.
|
||||||
|
# Each line is a file pattern followed by one or more owners.
|
||||||
|
|
||||||
|
accounts/usbwallet/ @gballet
|
||||||
|
accounts/scwallet/ @gballet
|
||||||
|
accounts/abi/ @gballet @MariusVanDerWijden
|
||||||
|
beacon/engine/ @MariusVanDerWijden @lightclient @fjl
|
||||||
|
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
|
||||||
|
eth/catalyst/ @MariusVanDerWijden @lightclient @fjl @jwasinger
|
||||||
|
eth/tracers/ @s1na
|
||||||
|
ethclient/ @fjl
|
||||||
|
ethdb/ @rjl493456442
|
||||||
|
event/ @fjl
|
||||||
|
trie/ @rjl493456442
|
||||||
|
triedb/ @rjl493456442
|
||||||
|
core/tracing/ @s1na
|
||||||
|
graphql/ @s1na
|
||||||
|
internal/ethapi/ @fjl @s1na @lightclient
|
||||||
|
internal/era/ @lightclient
|
||||||
|
metrics/ @holiman
|
||||||
|
miner/ @MariusVanDerWijden @holiman @fjl @rjl493456442
|
||||||
|
node/ @fjl
|
||||||
|
p2p/ @fjl @zsfelfoldi
|
||||||
|
rlp/ @fjl
|
||||||
|
params/ @fjl @holiman @karalabe @gballet @rjl493456442 @zsfelfoldi
|
||||||
|
rpc/ @fjl @holiman
|
||||||
|
signer/ @holiman
|
||||||
48
.github/workflows/go.yml
vendored
Normal file
48
.github/workflows/go.yml
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
name: i386 linux tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
name: Lint
|
||||||
|
runs-on: self-hosted
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Cache build tools to avoid downloading them each time
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: build/cache
|
||||||
|
key: ${{ runner.os }}-build-tools-cache-${{ hashFiles('build/checksums.txt') }}
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: 1.23.0
|
||||||
|
cache: false
|
||||||
|
|
||||||
|
- name: Run linters
|
||||||
|
run: |
|
||||||
|
go run build/ci.go lint
|
||||||
|
go run build/ci.go check_generate
|
||||||
|
go run build/ci.go check_baddeps
|
||||||
|
|
||||||
|
build:
|
||||||
|
runs-on: self-hosted
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: 1.24.0
|
||||||
|
cache: false
|
||||||
|
- name: Run tests
|
||||||
|
run: go test -short ./...
|
||||||
|
env:
|
||||||
|
GOOS: linux
|
||||||
|
GOARCH: 386
|
||||||
14
.gitignore
vendored
14
.gitignore
vendored
|
|
@ -39,8 +39,22 @@ profile.cov
|
||||||
|
|
||||||
# IdeaIDE
|
# IdeaIDE
|
||||||
.idea
|
.idea
|
||||||
|
*.iml
|
||||||
|
|
||||||
# VS Code
|
# VS Code
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
tests/spec-tests/
|
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
|
||||||
4
.gitmodules
vendored
4
.gitmodules
vendored
|
|
@ -1,7 +1,3 @@
|
||||||
[submodule "tests"]
|
|
||||||
path = tests/testdata
|
|
||||||
url = https://github.com/ethereum/tests
|
|
||||||
shallow = true
|
|
||||||
[submodule "evm-benchmarks"]
|
[submodule "evm-benchmarks"]
|
||||||
path = tests/evm-benchmarks
|
path = tests/evm-benchmarks
|
||||||
url = https://github.com/ipsilon/evm-benchmarks
|
url = https://github.com/ipsilon/evm-benchmarks
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ linters:
|
||||||
- reassign
|
- reassign
|
||||||
- mirror
|
- mirror
|
||||||
- tenv
|
- tenv
|
||||||
|
- usetesting
|
||||||
### linters we tried and will not be using:
|
### linters we tried and will not be using:
|
||||||
###
|
###
|
||||||
# - structcheck # lots of false positives
|
# - structcheck # lots of false positives
|
||||||
|
|
|
||||||
89
.mailmap
89
.mailmap
|
|
@ -5,6 +5,9 @@ Aaron Kumavis <kumavis@users.noreply.github.com>
|
||||||
Abel Nieto <abel.nieto90@gmail.com>
|
Abel Nieto <abel.nieto90@gmail.com>
|
||||||
Abel Nieto <abel.nieto90@gmail.com> <anietoro@uwaterloo.ca>
|
Abel Nieto <abel.nieto90@gmail.com> <anietoro@uwaterloo.ca>
|
||||||
|
|
||||||
|
Adrian Sutton <adrian@oplabs.co>
|
||||||
|
Adrian Sutton <adrian@oplabs.co> <adrian@symphonious.net>
|
||||||
|
|
||||||
Afri Schoedon <58883403+q9f@users.noreply.github.com>
|
Afri Schoedon <58883403+q9f@users.noreply.github.com>
|
||||||
Afri Schoedon <5chdn@users.noreply.github.com> <58883403+q9f@users.noreply.github.com>
|
Afri Schoedon <5chdn@users.noreply.github.com> <58883403+q9f@users.noreply.github.com>
|
||||||
|
|
||||||
|
|
@ -22,6 +25,9 @@ Alexey Akhunov <akhounov@gmail.com>
|
||||||
|
|
||||||
Alon Muroch <alonmuroch@gmail.com>
|
Alon Muroch <alonmuroch@gmail.com>
|
||||||
|
|
||||||
|
Andrei Silviu Dragnea <andreidragnea.dev@gmail.com>
|
||||||
|
Andrei Silviu Dragnea <andreidragnea.dev@gmail.com> <andreisilviudragnea@gmail.com>
|
||||||
|
|
||||||
Andrey Petrov <shazow@gmail.com>
|
Andrey Petrov <shazow@gmail.com>
|
||||||
Andrey Petrov <shazow@gmail.com> <andrey.petrov@shazow.net>
|
Andrey Petrov <shazow@gmail.com> <andrey.petrov@shazow.net>
|
||||||
|
|
||||||
|
|
@ -51,11 +57,17 @@ Chris Ziogas <ziogaschr@gmail.com> <ziogas_chr@hotmail.com>
|
||||||
|
|
||||||
Christoph Jentzsch <jentzsch.software@gmail.com>
|
Christoph Jentzsch <jentzsch.software@gmail.com>
|
||||||
|
|
||||||
|
Daniel Liu <liudaniel@qq.com>
|
||||||
|
Daniel Liu <liudaniel@qq.com> <139250065@qq.com>
|
||||||
|
|
||||||
Diederik Loerakker <proto@protolambda.com>
|
Diederik Loerakker <proto@protolambda.com>
|
||||||
|
|
||||||
Dimitry Khokhlov <winsvega@mail.ru>
|
Dimitry Khokhlov <winsvega@mail.ru>
|
||||||
|
|
||||||
|
Ha ĐANG <dvietha@gmail.com>
|
||||||
|
|
||||||
Domino Valdano <dominoplural@gmail.com>
|
Domino Valdano <dominoplural@gmail.com>
|
||||||
|
Domino Valdano <dominoplural@gmail.com> <jeff@okcupid.com>
|
||||||
|
|
||||||
Edgar Aroutiounian <edgar.factorial@gmail.com>
|
Edgar Aroutiounian <edgar.factorial@gmail.com>
|
||||||
|
|
||||||
|
|
@ -82,6 +94,9 @@ Gavin Wood <i@gavwood.com>
|
||||||
|
|
||||||
Gregg Dourgarian <greggd@tempworks.com>
|
Gregg Dourgarian <greggd@tempworks.com>
|
||||||
|
|
||||||
|
guangwu <guoguangwu@magic-shield.com>
|
||||||
|
guangwu <guoguangwu@magic-shield.com> <guoguangwug@gmail.com>
|
||||||
|
|
||||||
Guillaume Ballet <gballet@gmail.com>
|
Guillaume Ballet <gballet@gmail.com>
|
||||||
Guillaume Ballet <gballet@gmail.com> <3272758+gballet@users.noreply.github.com>
|
Guillaume Ballet <gballet@gmail.com> <3272758+gballet@users.noreply.github.com>
|
||||||
|
|
||||||
|
|
@ -95,13 +110,21 @@ Heiko Hees <heiko@heiko.org>
|
||||||
Henning Diedrich <hd@eonblast.com>
|
Henning Diedrich <hd@eonblast.com>
|
||||||
Henning Diedrich <hd@eonblast.com> Drake Burroughs <wildfyre@hotmail.com>
|
Henning Diedrich <hd@eonblast.com> Drake Burroughs <wildfyre@hotmail.com>
|
||||||
|
|
||||||
|
henridf <henri@dubfer.com>
|
||||||
|
henridf <henri@dubfer.com> <henridf@gmail.com>
|
||||||
|
|
||||||
Hwanjo Heo <34005989+hwanjo@users.noreply.github.com>
|
Hwanjo Heo <34005989+hwanjo@users.noreply.github.com>
|
||||||
|
|
||||||
|
Ikko Eltociear Ashimine <eltociear@gmail.com>
|
||||||
|
|
||||||
Iskander (Alex) Sharipov <quasilyte@gmail.com>
|
Iskander (Alex) Sharipov <quasilyte@gmail.com>
|
||||||
Iskander (Alex) Sharipov <quasilyte@gmail.com> <i.sharipov@corp.vk.com>
|
Iskander (Alex) Sharipov <quasilyte@gmail.com> <i.sharipov@corp.vk.com>
|
||||||
|
|
||||||
Jae Kwon <jkwon.work@gmail.com>
|
Jae Kwon <jkwon.work@gmail.com>
|
||||||
|
|
||||||
|
James Prestwich <james@prestwi.ch>
|
||||||
|
James Prestwich <james@prestwi.ch> <10149425+prestwich@users.noreply.github.com>
|
||||||
|
|
||||||
Janoš Guljaš <janos@resenje.org> <janos@users.noreply.github.com>
|
Janoš Guljaš <janos@resenje.org> <janos@users.noreply.github.com>
|
||||||
Janoš Guljaš <janos@resenje.org> Janos Guljas <janos@resenje.org>
|
Janoš Guljaš <janos@resenje.org> Janos Guljas <janos@resenje.org>
|
||||||
|
|
||||||
|
|
@ -120,23 +143,38 @@ Jeffrey Wilcke <jeffrey@ethereum.org> <obscuren@users.noreply.github.com>
|
||||||
|
|
||||||
Jens Agerberg <github@agerberg.me>
|
Jens Agerberg <github@agerberg.me>
|
||||||
|
|
||||||
|
Jeremy Schlatter <jeremy.schlatter@gmail.com>
|
||||||
|
Jeremy Schlatter <jeremy.schlatter@gmail.com> <jeremy@jeremyschlatter.com>
|
||||||
|
|
||||||
|
John Chase <68833933+joohhnnn@users.noreply.github.com>
|
||||||
|
|
||||||
Joseph Chow <ethereum@outlook.com>
|
Joseph Chow <ethereum@outlook.com>
|
||||||
Joseph Chow <ethereum@outlook.com> ethers <TODO>
|
Joseph Chow <ethereum@outlook.com> ethers <TODO>
|
||||||
|
|
||||||
|
|
||||||
Joseph Goulden <joegoulden@gmail.com>
|
Joseph Goulden <joegoulden@gmail.com>
|
||||||
|
|
||||||
Justin Drake <drakefjustin@gmail.com>
|
Justin Drake <drakefjustin@gmail.com>
|
||||||
|
|
||||||
|
Karl Bartel <karl.bartel@clabs.co>
|
||||||
|
Karl Bartel <karl.bartel@clabs.co> <karl@karl.berlin>
|
||||||
|
|
||||||
Kenso Trabing <ktrabing@acm.org>
|
Kenso Trabing <ktrabing@acm.org>
|
||||||
Kenso Trabing <ktrabing@acm.org> <kenso.trabing@bloomwebsite.com>
|
Kenso Trabing <ktrabing@acm.org> <kenso.trabing@bloomwebsite.com>
|
||||||
|
|
||||||
|
Liyi Guo <102356659+colinlyguo@users.noreply.github.com>
|
||||||
|
|
||||||
|
lmittmann <3458786+lmittmann@users.noreply.github.com>
|
||||||
|
lmittmann <3458786+lmittmann@users.noreply.github.com> <lmittmann@users.noreply.github.com>
|
||||||
|
|
||||||
Liang Ma <liangma@liangbit.com>
|
Liang Ma <liangma@liangbit.com>
|
||||||
Liang Ma <liangma@liangbit.com> <liangma.ul@gmail.com>
|
Liang Ma <liangma@liangbit.com> <liangma.ul@gmail.com>
|
||||||
|
|
||||||
Louis Holbrook <dev@holbrook.no>
|
Louis Holbrook <dev@holbrook.no>
|
||||||
Louis Holbrook <dev@holbrook.no> <nolash@users.noreply.github.com>
|
Louis Holbrook <dev@holbrook.no> <nolash@users.noreply.github.com>
|
||||||
|
|
||||||
|
makcandrov <makcandrov@proton.me>
|
||||||
|
makcandrov <makcandrov@proton.me> <108467407+makcandrov@users.noreply.github.com>
|
||||||
|
|
||||||
Maran Hidskes <maran.hidskes@gmail.com>
|
Maran Hidskes <maran.hidskes@gmail.com>
|
||||||
|
|
||||||
Marian Oancea <contact@siteshop.ro>
|
Marian Oancea <contact@siteshop.ro>
|
||||||
|
|
@ -144,17 +182,33 @@ Marian Oancea <contact@siteshop.ro>
|
||||||
Martin Becze <mjbecze@gmail.com>
|
Martin Becze <mjbecze@gmail.com>
|
||||||
Martin Becze <mjbecze@gmail.com> <wanderer@users.noreply.github.com>
|
Martin Becze <mjbecze@gmail.com> <wanderer@users.noreply.github.com>
|
||||||
|
|
||||||
|
Martin Holst Swende <martin@swende.se>
|
||||||
|
|
||||||
Martin Lundfall <martin.lundfall@protonmail.com>
|
Martin Lundfall <martin.lundfall@protonmail.com>
|
||||||
|
|
||||||
Matt Garnett <14004106+lightclient@users.noreply.github.com>
|
Marius van der Wijden <m.vanderwijden@live.de>
|
||||||
|
Marius van der Wijden <m.vanderwijden@live.de> <115323661+vdwijden@users.noreply.github.com>
|
||||||
|
|
||||||
|
Matt Garnett <lightclient@protonmail.com>
|
||||||
|
Matt Garnett <lightclient@protonmail.com> <14004106+lightclient@users.noreply.github.com>
|
||||||
|
|
||||||
Matthew Halpern <matthalp@gmail.com>
|
Matthew Halpern <matthalp@gmail.com>
|
||||||
Matthew Halpern <matthalp@gmail.com> <matthalp@google.com>
|
Matthew Halpern <matthalp@gmail.com> <matthalp@google.com>
|
||||||
|
|
||||||
|
meowsbits <b5c6@protonmail.com>
|
||||||
|
meowsbits <b5c6@protonmail.com> <45600330+meowsbits@users.noreply.github.com>
|
||||||
|
|
||||||
Michael Riabzev <michael@starkware.co>
|
Michael Riabzev <michael@starkware.co>
|
||||||
|
|
||||||
|
Michael de Hoog <michael.dehoog@gmail.com>
|
||||||
|
Michael de Hoog <michael.dehoog@gmail.com> <michael.dehoog@coinbase.com>
|
||||||
|
|
||||||
Nchinda Nchinda <nchinda2@gmail.com>
|
Nchinda Nchinda <nchinda2@gmail.com>
|
||||||
|
|
||||||
|
Nebojsa Urosevic <nebojsa94@users.noreply.github.com>
|
||||||
|
|
||||||
|
nedifi <103940716+nedifi@users.noreply.github.com>
|
||||||
|
|
||||||
Nick Dodson <silentcicero@outlook.com>
|
Nick Dodson <silentcicero@outlook.com>
|
||||||
|
|
||||||
Nick Johnson <arachnid@notdot.net>
|
Nick Johnson <arachnid@notdot.net>
|
||||||
|
|
@ -169,6 +223,9 @@ Olivier Hervieu <olivier.hervieu@gmail.com>
|
||||||
Pascal Dierich <pascal@merkleplant.xyz>
|
Pascal Dierich <pascal@merkleplant.xyz>
|
||||||
Pascal Dierich <pascal@merkleplant.xyz> <pascal@pascaldierich.com>
|
Pascal Dierich <pascal@merkleplant.xyz> <pascal@pascaldierich.com>
|
||||||
|
|
||||||
|
Paweł Bylica <chfast@gmail.com>
|
||||||
|
Paweł Bylica <chfast@gmail.com> <pawel@ethereum.org>
|
||||||
|
|
||||||
RJ Catalano <catalanor0220@gmail.com>
|
RJ Catalano <catalanor0220@gmail.com>
|
||||||
RJ Catalano <catalanor0220@gmail.com> <rj@erisindustries.com>
|
RJ Catalano <catalanor0220@gmail.com> <rj@erisindustries.com>
|
||||||
|
|
||||||
|
|
@ -179,8 +236,22 @@ Rene Lubov <41963722+renaynay@users.noreply.github.com>
|
||||||
Robert Zaremba <robert@zaremba.ch>
|
Robert Zaremba <robert@zaremba.ch>
|
||||||
Robert Zaremba <robert@zaremba.ch> <robert.zaremba@scale-it.pl>
|
Robert Zaremba <robert@zaremba.ch> <robert.zaremba@scale-it.pl>
|
||||||
|
|
||||||
|
Roberto Bayardo <bayardo@alum.mit.edu>
|
||||||
|
Roberto Bayardo <bayardo@alum.mit.edu> <roberto.bayardo@coinbase.com>
|
||||||
|
|
||||||
Roman Mandeleil <roman.mandeleil@gmail.com>
|
Roman Mandeleil <roman.mandeleil@gmail.com>
|
||||||
|
|
||||||
|
Sebastian Stammler <seb@oplabs.co>
|
||||||
|
Sebastian Stammler <seb@oplabs.co> <stammler.s@gmail.com>
|
||||||
|
|
||||||
|
Seungbae Yu <dbadoy4874@gmail.com>
|
||||||
|
Seungbae Yu <dbadoy4874@gmail.com> <72970043+dbadoy@users.noreply.github.com>
|
||||||
|
|
||||||
|
Sina Mahmoodi <1591639+s1na@users.noreply.github.com>
|
||||||
|
|
||||||
|
Steve Milk <wangpeculiar@gmail.com>
|
||||||
|
Steve Milk <wangpeculiar@gmail.com> <915337710@qq.com>
|
||||||
|
|
||||||
Sorin Neacsu <sorin.neacsu@gmail.com>
|
Sorin Neacsu <sorin.neacsu@gmail.com>
|
||||||
Sorin Neacsu <sorin.neacsu@gmail.com> <sorin@users.noreply.github.com>
|
Sorin Neacsu <sorin.neacsu@gmail.com> <sorin@users.noreply.github.com>
|
||||||
|
|
||||||
|
|
@ -191,8 +262,14 @@ Taylor Gerring <taylor.gerring@gmail.com> <taylor.gerring@ethereum.org>
|
||||||
|
|
||||||
Thomas Bocek <tom@tomp2p.net>
|
Thomas Bocek <tom@tomp2p.net>
|
||||||
|
|
||||||
|
tianyeyouyou <tianyeyouyou@gmail.com>
|
||||||
|
tianyeyouyou <tianyeyouyou@gmail.com> <150894831+tianyeyouyou@users.noreply.github.com>
|
||||||
|
|
||||||
Tim Cooijmans <timcooijmans@gmail.com>
|
Tim Cooijmans <timcooijmans@gmail.com>
|
||||||
|
|
||||||
|
ucwong <ethereum2k@gmail.com>
|
||||||
|
ucwong <ethereum2k@gmail.com> <ucwong@126.com>
|
||||||
|
|
||||||
Valentin Wüstholz <wuestholz@gmail.com>
|
Valentin Wüstholz <wuestholz@gmail.com>
|
||||||
Valentin Wüstholz <wuestholz@gmail.com> <wuestholz@users.noreply.github.com>
|
Valentin Wüstholz <wuestholz@gmail.com> <wuestholz@users.noreply.github.com>
|
||||||
|
|
||||||
|
|
@ -221,6 +298,9 @@ Xudong Liu <33193253+r1cs@users.noreply.github.com>
|
||||||
|
|
||||||
Yohann Léon <sybiload@gmail.com>
|
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 <Zachinquarantine@protonmail.com> <zachinquarantine@yahoo.com>
|
Zachinquarantine <Zachinquarantine@protonmail.com> <zachinquarantine@yahoo.com>
|
||||||
|
|
||||||
|
|
@ -228,9 +308,4 @@ Ziyuan Zhong <zzy.albert@163.com>
|
||||||
|
|
||||||
Zsolt Felföldi <zsfelfoldi@gmail.com>
|
Zsolt Felföldi <zsfelfoldi@gmail.com>
|
||||||
|
|
||||||
meowsbits <b5c6@protonmail.com>
|
|
||||||
meowsbits <b5c6@protonmail.com> <45600330+meowsbits@users.noreply.github.com>
|
|
||||||
|
|
||||||
nedifi <103940716+nedifi@users.noreply.github.com>
|
|
||||||
|
|
||||||
Максим Чусовлянов <mchusovlianov@gmail.com>
|
Максим Чусовлянов <mchusovlianov@gmail.com>
|
||||||
|
|
|
||||||
22
.travis.yml
22
.travis.yml
|
|
@ -2,12 +2,6 @@ language: go
|
||||||
go_import_path: github.com/ethereum/go-ethereum
|
go_import_path: github.com/ethereum/go-ethereum
|
||||||
sudo: false
|
sudo: false
|
||||||
jobs:
|
jobs:
|
||||||
allow_failures:
|
|
||||||
- stage: build
|
|
||||||
os: osx
|
|
||||||
env:
|
|
||||||
- azure-osx
|
|
||||||
|
|
||||||
include:
|
include:
|
||||||
# This builder create and push the Docker images for all architectures
|
# This builder create and push the Docker images for all architectures
|
||||||
- stage: build
|
- stage: build
|
||||||
|
|
@ -15,7 +9,7 @@ jobs:
|
||||||
os: linux
|
os: linux
|
||||||
arch: amd64
|
arch: amd64
|
||||||
dist: focal
|
dist: focal
|
||||||
go: 1.23.x
|
go: 1.24.x
|
||||||
env:
|
env:
|
||||||
- docker
|
- docker
|
||||||
services:
|
services:
|
||||||
|
|
@ -25,7 +19,7 @@ jobs:
|
||||||
before_install:
|
before_install:
|
||||||
- export DOCKER_CLI_EXPERIMENTAL=enabled
|
- export DOCKER_CLI_EXPERIMENTAL=enabled
|
||||||
script:
|
script:
|
||||||
- go run build/ci.go dockerx -platform "linux/amd64,linux/arm64,linux/riscv64" -upload ethereum/client-go
|
- go run build/ci.go dockerx -platform "linux/amd64,linux/arm64,linux/riscv64" -hub ethereum/client-go -upload
|
||||||
|
|
||||||
# This builder does the Ubuntu PPA upload
|
# This builder does the Ubuntu PPA upload
|
||||||
- stage: build
|
- stage: build
|
||||||
|
|
@ -57,7 +51,7 @@ jobs:
|
||||||
os: linux
|
os: linux
|
||||||
dist: focal
|
dist: focal
|
||||||
sudo: required
|
sudo: required
|
||||||
go: 1.23.x
|
go: 1.24.x
|
||||||
env:
|
env:
|
||||||
- azure-linux
|
- azure-linux
|
||||||
git:
|
git:
|
||||||
|
|
@ -147,7 +141,7 @@ jobs:
|
||||||
os: linux
|
os: linux
|
||||||
arch: amd64
|
arch: amd64
|
||||||
dist: focal
|
dist: focal
|
||||||
go: 1.23.x
|
go: 1.24.x
|
||||||
script:
|
script:
|
||||||
- travis_wait 45 go run build/ci.go test $TEST_PACKAGES
|
- travis_wait 45 go run build/ci.go test $TEST_PACKAGES
|
||||||
|
|
||||||
|
|
@ -163,7 +157,7 @@ jobs:
|
||||||
- stage: build
|
- stage: build
|
||||||
os: linux
|
os: linux
|
||||||
dist: focal
|
dist: focal
|
||||||
go: 1.22.x
|
go: 1.23.x
|
||||||
script:
|
script:
|
||||||
- travis_wait 45 go run build/ci.go test $TEST_PACKAGES
|
- travis_wait 45 go run build/ci.go test $TEST_PACKAGES
|
||||||
|
|
||||||
|
|
@ -172,7 +166,7 @@ jobs:
|
||||||
if: type = cron || (type = push && tag ~= /^v[0-9]/)
|
if: type = cron || (type = push && tag ~= /^v[0-9]/)
|
||||||
os: linux
|
os: linux
|
||||||
dist: focal
|
dist: focal
|
||||||
go: 1.23.x
|
go: 1.24.x
|
||||||
env:
|
env:
|
||||||
- ubuntu-ppa
|
- ubuntu-ppa
|
||||||
git:
|
git:
|
||||||
|
|
@ -188,7 +182,7 @@ jobs:
|
||||||
if: type = cron
|
if: type = cron
|
||||||
os: linux
|
os: linux
|
||||||
dist: focal
|
dist: focal
|
||||||
go: 1.23.x
|
go: 1.24.x
|
||||||
env:
|
env:
|
||||||
- azure-purge
|
- azure-purge
|
||||||
git:
|
git:
|
||||||
|
|
@ -201,7 +195,7 @@ jobs:
|
||||||
if: type = cron
|
if: type = cron
|
||||||
os: linux
|
os: linux
|
||||||
dist: focal
|
dist: focal
|
||||||
go: 1.23.x
|
go: 1.24.x
|
||||||
env:
|
env:
|
||||||
- racetests
|
- racetests
|
||||||
script:
|
script:
|
||||||
|
|
|
||||||
300
AUTHORS
300
AUTHORS
|
|
@ -1,52 +1,81 @@
|
||||||
# This is the official list of go-ethereum authors for copyright purposes.
|
# This is the official list of go-ethereum authors for copyright purposes.
|
||||||
|
|
||||||
|
0xbeny <55846654+0xbeny@users.noreply.github.com>
|
||||||
|
0xbstn <bastien-bouge@hotmail.fr>
|
||||||
|
0xe3b0c4 <110295932+0xe3b0c4@users.noreply.github.com>
|
||||||
6543 <6543@obermui.de>
|
6543 <6543@obermui.de>
|
||||||
|
6xiaowu9 <736518585@qq.com>
|
||||||
a e r t h <aerth@users.noreply.github.com>
|
a e r t h <aerth@users.noreply.github.com>
|
||||||
Aaron Buchwald <aaron.buchwald56@gmail.com>
|
Aaron Buchwald <aaron.buchwald56@gmail.com>
|
||||||
|
Aaron Chen <aaronchen.lisp@gmail.com>
|
||||||
|
Aaron Kumavis <kumavis@users.noreply.github.com>
|
||||||
|
Aayush Rajasekaran <arajasek94@gmail.com>
|
||||||
Abel Nieto <abel.nieto90@gmail.com>
|
Abel Nieto <abel.nieto90@gmail.com>
|
||||||
|
Abirdcfly <fp544037857@gmail.com>
|
||||||
Adam Babik <a.babik@designfortress.com>
|
Adam Babik <a.babik@designfortress.com>
|
||||||
Adam Schmideg <adamschmideg@users.noreply.github.com>
|
Adam Schmideg <adamschmideg@users.noreply.github.com>
|
||||||
Aditya <adityasripal@gmail.com>
|
Aditya <adityasripal@gmail.com>
|
||||||
Aditya Arora <arora.aditya520@gmail.com>
|
Aditya Arora <arora.aditya520@gmail.com>
|
||||||
|
Adrian Sutton <adrian@oplabs.co>
|
||||||
Adrià Cidre <adria.cidre@gmail.com>
|
Adrià Cidre <adria.cidre@gmail.com>
|
||||||
Afanasii Kurakin <afanasy@users.noreply.github.com>
|
Afanasii Kurakin <afanasy@users.noreply.github.com>
|
||||||
Afri Schoedon <5chdn@users.noreply.github.com>
|
Afri Schoedon <5chdn@users.noreply.github.com>
|
||||||
Agustin Armellini Fischer <armellini13@gmail.com>
|
Agustin Armellini Fischer <armellini13@gmail.com>
|
||||||
|
Ahmet Avci <ahmetabdullahavci07@gmail.com>
|
||||||
Ahyun <urbanart2251@gmail.com>
|
Ahyun <urbanart2251@gmail.com>
|
||||||
Airead <fgh1987168@gmail.com>
|
Airead <fgh1987168@gmail.com>
|
||||||
Alan Chen <alanchchen@users.noreply.github.com>
|
Alan Chen <alanchchen@users.noreply.github.com>
|
||||||
Alejandro Isaza <alejandro.isaza@gmail.com>
|
Alejandro Isaza <alejandro.isaza@gmail.com>
|
||||||
Aleksey Smyrnov <i@soar.name>
|
Aleksey Smyrnov <i@soar.name>
|
||||||
Ales Katona <ales@coinbase.com>
|
Ales Katona <ales@coinbase.com>
|
||||||
|
alex <152680487+bodhi-crypo@users.noreply.github.com>
|
||||||
Alex Beregszaszi <alex@rtfs.hu>
|
Alex Beregszaszi <alex@rtfs.hu>
|
||||||
|
Alex Gartner <github@agartner.com>
|
||||||
Alex Leverington <alex@ethdev.com>
|
Alex Leverington <alex@ethdev.com>
|
||||||
Alex Mazalov <mazalov@gmail.com>
|
Alex Mazalov <mazalov@gmail.com>
|
||||||
|
Alex Mylonas <alex.a.mylonas@gmail.com>
|
||||||
Alex Pozhilenkov <alex_pozhilenkov@adoriasoft.com>
|
Alex Pozhilenkov <alex_pozhilenkov@adoriasoft.com>
|
||||||
Alex Prut <1648497+alexprut@users.noreply.github.com>
|
Alex Prut <1648497+alexprut@users.noreply.github.com>
|
||||||
|
Alex Stokes <r.alex.stokes@gmail.com>
|
||||||
Alex Wu <wuyiding@gmail.com>
|
Alex Wu <wuyiding@gmail.com>
|
||||||
|
Alexander Mint <webinfo.alexander@gmail.com>
|
||||||
Alexander van der Meij <alexandervdm@users.noreply.github.com>
|
Alexander van der Meij <alexandervdm@users.noreply.github.com>
|
||||||
Alexander Yastrebov <yastrebov.alex@gmail.com>
|
Alexander Yastrebov <yastrebov.alex@gmail.com>
|
||||||
Alexandre Van de Sande <alex.vandesande@ethdev.com>
|
Alexandre Van de Sande <alex.vandesande@ethdev.com>
|
||||||
Alexey Akhunov <akhounov@gmail.com>
|
Alexey Akhunov <akhounov@gmail.com>
|
||||||
Alexey Shekhirin <a.shekhirin@gmail.com>
|
Alexey Shekhirin <a.shekhirin@gmail.com>
|
||||||
alexwang <39109351+dipingxian2@users.noreply.github.com>
|
alexwang <39109351+dipingxian2@users.noreply.github.com>
|
||||||
|
Alfie John <alfiedotwtf@users.noreply.github.com>
|
||||||
Ali Atiia <42751398+aliatiia@users.noreply.github.com>
|
Ali Atiia <42751398+aliatiia@users.noreply.github.com>
|
||||||
Ali Hajimirza <Ali92hm@users.noreply.github.com>
|
Ali Hajimirza <Ali92hm@users.noreply.github.com>
|
||||||
|
Alvaro Sevilla <alvarosevilla95@gmail.com>
|
||||||
am2rican5 <am2rican5@gmail.com>
|
am2rican5 <am2rican5@gmail.com>
|
||||||
|
Amin Talebi <talebi242@gmail.com>
|
||||||
|
AMIR <31338382+amiremohamadi@users.noreply.github.com>
|
||||||
AmitBRD <60668103+AmitBRD@users.noreply.github.com>
|
AmitBRD <60668103+AmitBRD@users.noreply.github.com>
|
||||||
Anatole <62328077+a2br@users.noreply.github.com>
|
Anatole <62328077+a2br@users.noreply.github.com>
|
||||||
|
Andre Patta <andre_luis@outlook.com>
|
||||||
Andrea Franz <andrea@gravityblast.com>
|
Andrea Franz <andrea@gravityblast.com>
|
||||||
|
Andrei Kostakov <bps@dzen.ws>
|
||||||
Andrei Maiboroda <andrei@ethereum.org>
|
Andrei Maiboroda <andrei@ethereum.org>
|
||||||
|
Andrei Silviu Dragnea <andreidragnea.dev@gmail.com>
|
||||||
|
Andrew Ashikhmin <34320705+yperbasis@users.noreply.github.com>
|
||||||
Andrey Petrov <shazow@gmail.com>
|
Andrey Petrov <shazow@gmail.com>
|
||||||
|
Andryanau Kanstantsin <andrianov.dev@yandex.by>
|
||||||
ANOTHEL <anothel1@naver.com>
|
ANOTHEL <anothel1@naver.com>
|
||||||
Antoine Rondelet <rondelet.antoine@gmail.com>
|
Antoine Rondelet <rondelet.antoine@gmail.com>
|
||||||
Antoine Toulme <atoulme@users.noreply.github.com>
|
Antoine Toulme <atoulme@users.noreply.github.com>
|
||||||
Anton Evangelatov <anton.evangelatov@gmail.com>
|
Anton Evangelatov <anton.evangelatov@gmail.com>
|
||||||
Antonio Salazar Cardozo <savedfastcool@gmail.com>
|
Antonio Salazar Cardozo <savedfastcool@gmail.com>
|
||||||
|
Antony Denyer <email@antonydenyer.co.uk>
|
||||||
|
Anusha <63559942+anusha-ctrl@users.noreply.github.com>
|
||||||
Arba Sasmoyo <arba.sasmoyo@gmail.com>
|
Arba Sasmoyo <arba.sasmoyo@gmail.com>
|
||||||
Armani Ferrante <armaniferrante@berkeley.edu>
|
Armani Ferrante <armaniferrante@berkeley.edu>
|
||||||
Armin Braun <me@obrown.io>
|
Armin Braun <me@obrown.io>
|
||||||
Aron Fischer <github@aron.guru>
|
Aron Fischer <github@aron.guru>
|
||||||
|
Arran Schlosberg <519948+ARR4N@users.noreply.github.com>
|
||||||
|
ArtificialPB <matej.berger@hotmail.com>
|
||||||
|
Artyom Aminov <artjoma@users.noreply.github.com>
|
||||||
atsushi-ishibashi <atsushi.ishibashi@finatext.com>
|
atsushi-ishibashi <atsushi.ishibashi@finatext.com>
|
||||||
Austin Roberts <code@ausiv.com>
|
Austin Roberts <code@ausiv.com>
|
||||||
ayeowch <ayeowch@gmail.com>
|
ayeowch <ayeowch@gmail.com>
|
||||||
|
|
@ -54,83 +83,135 @@ b00ris <b00ris@mail.ru>
|
||||||
b1ackd0t <blackd0t@protonmail.com>
|
b1ackd0t <blackd0t@protonmail.com>
|
||||||
bailantaotao <Edwin@maicoin.com>
|
bailantaotao <Edwin@maicoin.com>
|
||||||
baizhenxuan <nkbai@163.com>
|
baizhenxuan <nkbai@163.com>
|
||||||
|
Bala Murali Krishna Komatireddy <krishna192reddy@gmail.com>
|
||||||
Balaji Shetty Pachai <32358081+balajipachai@users.noreply.github.com>
|
Balaji Shetty Pachai <32358081+balajipachai@users.noreply.github.com>
|
||||||
Balint Gabor <balint.g@gmail.com>
|
Balint Gabor <balint.g@gmail.com>
|
||||||
baptiste-b-pegasys <85155432+baptiste-b-pegasys@users.noreply.github.com>
|
baptiste-b-pegasys <85155432+baptiste-b-pegasys@users.noreply.github.com>
|
||||||
Bas van Kervel <bas@ethdev.com>
|
Bas van Kervel <bas@ethdev.com>
|
||||||
Benjamin Brent <benjamin@benjaminbrent.com>
|
Benjamin Brent <benjamin@benjaminbrent.com>
|
||||||
|
Benjamin Prosnitz <bprosnitz@gmail.com>
|
||||||
benma <mbencun@gmail.com>
|
benma <mbencun@gmail.com>
|
||||||
Benoit Verkindt <benoit.verkindt@gmail.com>
|
Benoit Verkindt <benoit.verkindt@gmail.com>
|
||||||
|
Bin <49082129+songzhibin97@users.noreply.github.com>
|
||||||
Binacs <bin646891055@gmail.com>
|
Binacs <bin646891055@gmail.com>
|
||||||
|
bitcoin-lightning <153181187+AtomicInnovation321@users.noreply.github.com>
|
||||||
|
bk <5810624+bkellerman@users.noreply.github.com>
|
||||||
bloonfield <bloonfield@163.com>
|
bloonfield <bloonfield@163.com>
|
||||||
|
bnovil <lzqcn2000@126.com>
|
||||||
Bo <bohende@gmail.com>
|
Bo <bohende@gmail.com>
|
||||||
Bo Ye <boy.e.computer.1982@outlook.com>
|
Bo Ye <boy.e.computer.1982@outlook.com>
|
||||||
Bob Glickstein <bobg@users.noreply.github.com>
|
Bob Glickstein <bobg@users.noreply.github.com>
|
||||||
Boqin Qin <bobbqqin@bupt.edu.cn>
|
Boqin Qin <bobbqqin@bupt.edu.cn>
|
||||||
|
BorkBorked <107079055+BorkBorked@users.noreply.github.com>
|
||||||
Brandon Harden <b.harden92@gmail.com>
|
Brandon Harden <b.harden92@gmail.com>
|
||||||
|
Brandon Liu <lzqcn2000@126.com>
|
||||||
Brent <bmperrea@gmail.com>
|
Brent <bmperrea@gmail.com>
|
||||||
Brian Schroeder <bts@gmail.com>
|
Brian Schroeder <bts@gmail.com>
|
||||||
|
Brion <4777457+cifer76@users.noreply.github.com>
|
||||||
Bruno Škvorc <bruno@skvorc.me>
|
Bruno Škvorc <bruno@skvorc.me>
|
||||||
|
buddho <galaxystroller@gmail.com>
|
||||||
|
bugmaker9371 <167614621+bugmaker9371@users.noreply.github.com>
|
||||||
C. Brown <hackdom@majoolr.io>
|
C. Brown <hackdom@majoolr.io>
|
||||||
Caesar Chad <BLUE.WEB.GEEK@gmail.com>
|
Caesar Chad <BLUE.WEB.GEEK@gmail.com>
|
||||||
|
cam-schultz <78878559+cam-schultz@users.noreply.github.com>
|
||||||
Casey Detrio <cdetrio@gmail.com>
|
Casey Detrio <cdetrio@gmail.com>
|
||||||
|
caseylove <casey4love@foxmail.com>
|
||||||
CDsigma <cdsigma271@gmail.com>
|
CDsigma <cdsigma271@gmail.com>
|
||||||
|
Cedrick <Cedrickentrep@gmail.com>
|
||||||
Ceelog <chenwei@ceelog.org>
|
Ceelog <chenwei@ceelog.org>
|
||||||
Ceyhun Onur <ceyhun.onur@avalabs.org>
|
Ceyhun Onur <ceyhun.onur@avalabs.org>
|
||||||
chabashilah <doumodoumo@gmail.com>
|
chabashilah <doumodoumo@gmail.com>
|
||||||
changhong <changhong.yu@shanbay.com>
|
changhong <changhong.yu@shanbay.com>
|
||||||
|
Charles Cooper <cooper.charles.m@gmail.com>
|
||||||
Chase Wright <mysticryuujin@gmail.com>
|
Chase Wright <mysticryuujin@gmail.com>
|
||||||
|
Chawin Aiemvaravutigul <nick41746@hotmail.com>
|
||||||
Chen Quan <terasum@163.com>
|
Chen Quan <terasum@163.com>
|
||||||
|
chen4903 <108803001+chen4903@users.noreply.github.com>
|
||||||
Cheng Li <lob4tt@gmail.com>
|
Cheng Li <lob4tt@gmail.com>
|
||||||
chenglin <910372762@qq.com>
|
chenglin <910372762@qq.com>
|
||||||
chenyufeng <yufengcode@gmail.com>
|
chenyufeng <yufengcode@gmail.com>
|
||||||
|
Chirag Garg <38765776+DeVil2O@users.noreply.github.com>
|
||||||
|
chirag-bgh <76247491+chirag-bgh@users.noreply.github.com>
|
||||||
Chris Pacia <ctpacia@gmail.com>
|
Chris Pacia <ctpacia@gmail.com>
|
||||||
Chris Ziogas <ziogaschr@gmail.com>
|
Chris Ziogas <ziogaschr@gmail.com>
|
||||||
Christian Muehlhaeuser <muesli@gmail.com>
|
Christian Muehlhaeuser <muesli@gmail.com>
|
||||||
|
Christina <156356273+cratiu222@users.noreply.github.com>
|
||||||
Christoph Jentzsch <jentzsch.software@gmail.com>
|
Christoph Jentzsch <jentzsch.software@gmail.com>
|
||||||
|
Christopher Harrison <31964100+chrischarlesharrison@users.noreply.github.com>
|
||||||
chuwt <weitaochu@gmail.com>
|
chuwt <weitaochu@gmail.com>
|
||||||
|
cocoyeal <150209682+cocoyeal@users.noreply.github.com>
|
||||||
cong <ackratos@users.noreply.github.com>
|
cong <ackratos@users.noreply.github.com>
|
||||||
Connor Stein <connor.stein@mail.mcgill.ca>
|
Connor Stein <connor.stein@mail.mcgill.ca>
|
||||||
Corey Lin <514971757@qq.com>
|
Corey Lin <514971757@qq.com>
|
||||||
courtier <derinilter@gmail.com>
|
courtier <derinilter@gmail.com>
|
||||||
cpusoft <cpusoft@live.com>
|
cpusoft <cpusoft@live.com>
|
||||||
|
crazeteam <164632007+crazeteam@users.noreply.github.com>
|
||||||
Crispin Flowerday <crispin@bitso.com>
|
Crispin Flowerday <crispin@bitso.com>
|
||||||
croath <croathliu@gmail.com>
|
croath <croathliu@gmail.com>
|
||||||
cui <523516579@qq.com>
|
cui <523516579@qq.com>
|
||||||
|
cui fliter <imcusg@gmail.com>
|
||||||
|
cuinix <65650185+cuinix@users.noreply.github.com>
|
||||||
|
Curith <oiooj@qq.com>
|
||||||
|
cygaar <97691933+cygaar@users.noreply.github.com>
|
||||||
|
Dan Cline <6798349+Rjected@users.noreply.github.com>
|
||||||
Dan DeGreef <dan.degreef@gmail.com>
|
Dan DeGreef <dan.degreef@gmail.com>
|
||||||
Dan Kinsley <dan@joincivil.com>
|
Dan Kinsley <dan@joincivil.com>
|
||||||
|
Dan Laine <daniel.laine@avalabs.org>
|
||||||
Dan Sosedoff <dan.sosedoff@gmail.com>
|
Dan Sosedoff <dan.sosedoff@gmail.com>
|
||||||
|
danceratopz <danceratopz@gmail.com>
|
||||||
Daniel A. Nagy <nagy.da@gmail.com>
|
Daniel A. Nagy <nagy.da@gmail.com>
|
||||||
|
Daniel Fernandes <711733+daferna@users.noreply.github.com>
|
||||||
|
Daniel Katzan <108216499+dkatzan@users.noreply.github.com>
|
||||||
|
Daniel Knopik <107140945+dknopik@users.noreply.github.com>
|
||||||
|
Daniel Liu <liudaniel@qq.com>
|
||||||
Daniel Perez <daniel@perez.sh>
|
Daniel Perez <daniel@perez.sh>
|
||||||
Daniel Sloof <goapsychadelic@gmail.com>
|
Daniel Sloof <goapsychadelic@gmail.com>
|
||||||
|
Danno Ferrin <danno@numisight.com>
|
||||||
|
Danyal Prout <me@dany.al>
|
||||||
Darioush Jalali <darioush.jalali@avalabs.org>
|
Darioush Jalali <darioush.jalali@avalabs.org>
|
||||||
Darrel Herbst <dherbst@gmail.com>
|
Darrel Herbst <dherbst@gmail.com>
|
||||||
|
Darren Kelly <107671032+darrenvechain@users.noreply.github.com>
|
||||||
|
dashangcun <907225865@qq.com>
|
||||||
Dave Appleton <calistralabs@gmail.com>
|
Dave Appleton <calistralabs@gmail.com>
|
||||||
Dave McGregor <dave.s.mcgregor@gmail.com>
|
Dave McGregor <dave.s.mcgregor@gmail.com>
|
||||||
David Cai <davidcai1993@yahoo.com>
|
David Cai <davidcai1993@yahoo.com>
|
||||||
|
David Dzhalaev <72649244+DavidRomanovizc@users.noreply.github.com>
|
||||||
David Huie <dahuie@gmail.com>
|
David Huie <dahuie@gmail.com>
|
||||||
|
David Murdoch <187813+davidmurdoch@users.noreply.github.com>
|
||||||
|
David Theodore <29786815+infosecual@users.noreply.github.com>
|
||||||
|
ddl <ddl196526@163.com>
|
||||||
|
Dean Eigenmann <7621705+decanus@users.noreply.github.com>
|
||||||
|
Delweng <delweng@gmail.com>
|
||||||
Denver <aeharvlee@gmail.com>
|
Denver <aeharvlee@gmail.com>
|
||||||
Derek Chiang <me@derekchiang.com>
|
Derek Chiang <me@derekchiang.com>
|
||||||
Derek Gottfrid <derek@codecubed.com>
|
Derek Gottfrid <derek@codecubed.com>
|
||||||
|
deterclosed <164524498+deterclosed@users.noreply.github.com>
|
||||||
|
Devon Bear <itsdevbear@berachain.com>
|
||||||
Di Peng <pendyaaa@gmail.com>
|
Di Peng <pendyaaa@gmail.com>
|
||||||
Diederik Loerakker <proto@protolambda.com>
|
Diederik Loerakker <proto@protolambda.com>
|
||||||
Diego Siqueira <DiSiqueira@users.noreply.github.com>
|
Diego Siqueira <DiSiqueira@users.noreply.github.com>
|
||||||
Diep Pham <mrfavadi@gmail.com>
|
Diep Pham <mrfavadi@gmail.com>
|
||||||
|
Dimitris Apostolou <dimitris.apostolou@icloud.com>
|
||||||
dipingxian2 <39109351+dipingxian2@users.noreply.github.com>
|
dipingxian2 <39109351+dipingxian2@users.noreply.github.com>
|
||||||
divergencetech <94644849+divergencetech@users.noreply.github.com>
|
divergencetech <94644849+divergencetech@users.noreply.github.com>
|
||||||
|
dknopik <107140945+dknopik@users.noreply.github.com>
|
||||||
dm4 <sunrisedm4@gmail.com>
|
dm4 <sunrisedm4@gmail.com>
|
||||||
Dmitrij Koniajev <dimchansky@gmail.com>
|
Dmitrij Koniajev <dimchansky@gmail.com>
|
||||||
Dmitry Shulyak <yashulyak@gmail.com>
|
Dmitry Shulyak <yashulyak@gmail.com>
|
||||||
Dmitry Zenovich <dzenovich@gmail.com>
|
Dmitry Zenovich <dzenovich@gmail.com>
|
||||||
Domino Valdano <dominoplural@gmail.com>
|
Domino Valdano <dominoplural@gmail.com>
|
||||||
|
DongXi Huang <418498589@qq.com>
|
||||||
Dragan Milic <dragan@netice9.com>
|
Dragan Milic <dragan@netice9.com>
|
||||||
dragonvslinux <35779158+dragononcrypto@users.noreply.github.com>
|
dragonvslinux <35779158+dragononcrypto@users.noreply.github.com>
|
||||||
|
Dylan Vassallo <dylan.vassallo@hotmail.com>
|
||||||
|
easyfold <137396765+easyfold@users.noreply.github.com>
|
||||||
Edgar Aroutiounian <edgar.factorial@gmail.com>
|
Edgar Aroutiounian <edgar.factorial@gmail.com>
|
||||||
Eduard S <eduardsanou@posteo.net>
|
Eduard S <eduardsanou@posteo.net>
|
||||||
Egon Elbre <egonelbre@gmail.com>
|
Egon Elbre <egonelbre@gmail.com>
|
||||||
Elad <theman@elad.im>
|
Elad <theman@elad.im>
|
||||||
Eli <elihanover@yahoo.com>
|
Eli <elihanover@yahoo.com>
|
||||||
Elias Naur <elias.naur@gmail.com>
|
Elias Naur <elias.naur@gmail.com>
|
||||||
|
Elias Rad <146735585+nnsW3@users.noreply.github.com>
|
||||||
Elliot Shepherd <elliot@identitii.com>
|
Elliot Shepherd <elliot@identitii.com>
|
||||||
Emil <mursalimovemeel@gmail.com>
|
Emil <mursalimovemeel@gmail.com>
|
||||||
emile <emile@users.noreply.github.com>
|
emile <emile@users.noreply.github.com>
|
||||||
|
|
@ -151,11 +232,13 @@ Evgeny <awesome.observer@yandex.com>
|
||||||
Evgeny Danilenko <6655321@bk.ru>
|
Evgeny Danilenko <6655321@bk.ru>
|
||||||
evgk <evgeniy.kamyshev@gmail.com>
|
evgk <evgeniy.kamyshev@gmail.com>
|
||||||
Evolution404 <35091674+Evolution404@users.noreply.github.com>
|
Evolution404 <35091674+Evolution404@users.noreply.github.com>
|
||||||
|
Exca-DK <85954505+Exca-DK@users.noreply.github.com>
|
||||||
EXEC <execvy@gmail.com>
|
EXEC <execvy@gmail.com>
|
||||||
Fabian Vogelsteller <fabian@frozeman.de>
|
Fabian Vogelsteller <fabian@frozeman.de>
|
||||||
Fabio Barone <fabio.barone.co@gmail.com>
|
Fabio Barone <fabio.barone.co@gmail.com>
|
||||||
Fabio Berger <fabioberger1991@gmail.com>
|
Fabio Berger <fabioberger1991@gmail.com>
|
||||||
FaceHo <facehoshi@gmail.com>
|
FaceHo <facehoshi@gmail.com>
|
||||||
|
felipe <fselmo2@gmail.com>
|
||||||
Felipe Strozberg <48066928+FelStroz@users.noreply.github.com>
|
Felipe Strozberg <48066928+FelStroz@users.noreply.github.com>
|
||||||
Felix Lange <fjl@twurst.com>
|
Felix Lange <fjl@twurst.com>
|
||||||
Ferenc Szabo <frncmx@gmail.com>
|
Ferenc Szabo <frncmx@gmail.com>
|
||||||
|
|
@ -163,68 +246,102 @@ ferhat elmas <elmas.ferhat@gmail.com>
|
||||||
Ferran Borreguero <ferranbt@protonmail.com>
|
Ferran Borreguero <ferranbt@protonmail.com>
|
||||||
Fiisio <liangcszzu@163.com>
|
Fiisio <liangcszzu@163.com>
|
||||||
Fire Man <55934298+basdevelop@users.noreply.github.com>
|
Fire Man <55934298+basdevelop@users.noreply.github.com>
|
||||||
|
FletcherMan <fanciture@163.com>
|
||||||
flowerofdream <775654398@qq.com>
|
flowerofdream <775654398@qq.com>
|
||||||
fomotrader <82184770+fomotrader@users.noreply.github.com>
|
fomotrader <82184770+fomotrader@users.noreply.github.com>
|
||||||
|
Ford <153042616+guerrierindien@users.noreply.github.com>
|
||||||
ForLina <471133417@qq.com>
|
ForLina <471133417@qq.com>
|
||||||
Frank Szendzielarz <33515470+FrankSzendzielarz@users.noreply.github.com>
|
Frank Szendzielarz <33515470+FrankSzendzielarz@users.noreply.github.com>
|
||||||
Frank Wang <eternnoir@gmail.com>
|
Frank Wang <eternnoir@gmail.com>
|
||||||
Franklin <mr_franklin@126.com>
|
Franklin <mr_franklin@126.com>
|
||||||
|
Freeman Jiang <freeman.jiang.ca@gmail.com>
|
||||||
Furkan KAMACI <furkankamaci@gmail.com>
|
Furkan KAMACI <furkankamaci@gmail.com>
|
||||||
Fuyang Deng <dengfuyang@outlook.com>
|
Fuyang Deng <dengfuyang@outlook.com>
|
||||||
GagziW <leon.stanko@rwth-aachen.de>
|
GagziW <leon.stanko@rwth-aachen.de>
|
||||||
Gary Rong <garyrong0905@gmail.com>
|
Gary Rong <garyrong0905@gmail.com>
|
||||||
Gautam Botrel <gautam.botrel@gmail.com>
|
Gautam Botrel <gautam.botrel@gmail.com>
|
||||||
|
Gealber Morales <48373523+Gealber@users.noreply.github.com>
|
||||||
|
George Ma <164313692+availhang@users.noreply.github.com>
|
||||||
George Ornbo <george@shapeshed.com>
|
George Ornbo <george@shapeshed.com>
|
||||||
|
georgehao <haohongfan@gmail.com>
|
||||||
|
gitglorythegreat <t4juu3@proton.me>
|
||||||
Giuseppe Bertone <bertone.giuseppe@gmail.com>
|
Giuseppe Bertone <bertone.giuseppe@gmail.com>
|
||||||
Greg Colvin <greg@colvin.org>
|
Greg Colvin <greg@colvin.org>
|
||||||
Gregg Dourgarian <greggd@tempworks.com>
|
Gregg Dourgarian <greggd@tempworks.com>
|
||||||
Gregory Markou <16929357+GregTheGreek@users.noreply.github.com>
|
Gregory Markou <16929357+GregTheGreek@users.noreply.github.com>
|
||||||
|
guangwu <guoguangwu@magic-shield.com>
|
||||||
|
Guido Vranken <guidovranken@users.noreply.github.com>
|
||||||
Guifel <toowik@gmail.com>
|
Guifel <toowik@gmail.com>
|
||||||
Guilherme Salgado <gsalgado@gmail.com>
|
Guilherme Salgado <gsalgado@gmail.com>
|
||||||
Guillaume Ballet <gballet@gmail.com>
|
Guillaume Ballet <gballet@gmail.com>
|
||||||
|
Guillaume Michel <guillaumemichel@users.noreply.github.com>
|
||||||
Guillaume Nicolas <guin56@gmail.com>
|
Guillaume Nicolas <guin56@gmail.com>
|
||||||
GuiltyMorishita <morilliantblue@gmail.com>
|
GuiltyMorishita <morilliantblue@gmail.com>
|
||||||
Guruprasad Kamath <48196632+gurukamath@users.noreply.github.com>
|
Guruprasad Kamath <48196632+gurukamath@users.noreply.github.com>
|
||||||
Gus <yo@soygus.com>
|
Gus <yo@soygus.com>
|
||||||
Gustav Simonsson <gustav.simonsson@gmail.com>
|
Gustav Simonsson <gustav.simonsson@gmail.com>
|
||||||
|
Gustavo Silva <GustavoRSSilva@users.noreply.github.com>
|
||||||
Gísli Kristjánsson <gislik@hamstur.is>
|
Gísli Kristjánsson <gislik@hamstur.is>
|
||||||
Ha ĐANG <dvietha@gmail.com>
|
Ha ĐANG <dvietha@gmail.com>
|
||||||
HackyMiner <hackyminer@gmail.com>
|
HackyMiner <hackyminer@gmail.com>
|
||||||
hadv <dvietha@gmail.com>
|
Halimao <1065621723@qq.com>
|
||||||
Hanjiang Yu <delacroix.yu@gmail.com>
|
Hanjiang Yu <delacroix.yu@gmail.com>
|
||||||
Hao Bryan Cheng <haobcheng@gmail.com>
|
Hao Bryan Cheng <haobcheng@gmail.com>
|
||||||
Hao Duan <duanhao0814@gmail.com>
|
Hao Duan <duanhao0814@gmail.com>
|
||||||
|
haoran <159284258+hr98w@users.noreply.github.com>
|
||||||
|
Haotian <51777534+tmelhao@users.noreply.github.com>
|
||||||
HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com>
|
HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com>
|
||||||
Harry Dutton <me@bytejedi.com>
|
Harry Dutton <me@bytejedi.com>
|
||||||
|
Harry Kalodner <harry.kalodner@gmail.com>
|
||||||
haryu703 <34744512+haryu703@users.noreply.github.com>
|
haryu703 <34744512+haryu703@users.noreply.github.com>
|
||||||
|
hattizai <hattizai@gmail.com>
|
||||||
Hendrik Hofstadt <hendrik@nexantic.com>
|
Hendrik Hofstadt <hendrik@nexantic.com>
|
||||||
Henning Diedrich <hd@eonblast.com>
|
Henning Diedrich <hd@eonblast.com>
|
||||||
henopied <13500516+henopied@users.noreply.github.com>
|
henopied <13500516+henopied@users.noreply.github.com>
|
||||||
|
henridf <henri@dubfer.com>
|
||||||
|
Henry <101552941+henry-0@users.noreply.github.com>
|
||||||
hero5512 <lvshuaino@gmail.com>
|
hero5512 <lvshuaino@gmail.com>
|
||||||
holisticode <holistic.computing@gmail.com>
|
holisticode <holistic.computing@gmail.com>
|
||||||
Hongbin Mao <hello2mao@gmail.com>
|
Hongbin Mao <hello2mao@gmail.com>
|
||||||
Hsien-Tang Kao <htkao@pm.me>
|
Hsien-Tang Kao <htkao@pm.me>
|
||||||
hsyodyssey <47173566+hsyodyssey@users.noreply.github.com>
|
hsyodyssey <47173566+hsyodyssey@users.noreply.github.com>
|
||||||
|
Hteev Oli <gethorz@proton.me>
|
||||||
Husam Ibrahim <39692071+HusamIbrahim@users.noreply.github.com>
|
Husam Ibrahim <39692071+HusamIbrahim@users.noreply.github.com>
|
||||||
Hwanjo Heo <34005989+hwanjo@users.noreply.github.com>
|
Hwanjo Heo <34005989+hwanjo@users.noreply.github.com>
|
||||||
hydai <z54981220@gmail.com>
|
hydai <z54981220@gmail.com>
|
||||||
|
hyhnet <cyrusyun@qq.com>
|
||||||
|
hyunchel <3271191+hyunchel@users.noreply.github.com>
|
||||||
Hyung-Kyu Hqueue Choi <hyungkyu.choi@gmail.com>
|
Hyung-Kyu Hqueue Choi <hyungkyu.choi@gmail.com>
|
||||||
|
Hyunsoo Shin (Lake) <hyunsooda@kaist.ac.kr>
|
||||||
|
hzysvilla <ecjgvmhc@gmail.com>
|
||||||
Håvard Anda Estensen <haavard.ae@gmail.com>
|
Håvard Anda Estensen <haavard.ae@gmail.com>
|
||||||
Ian Macalinao <me@ian.pw>
|
Ian Macalinao <me@ian.pw>
|
||||||
Ian Norden <iannordenn@gmail.com>
|
Ian Norden <iannordenn@gmail.com>
|
||||||
|
Icarus Wu <icaruswu66@qq.com>
|
||||||
icodezjb <icodezjb@163.com>
|
icodezjb <icodezjb@163.com>
|
||||||
Ikko Ashimine <eltociear@gmail.com>
|
ids <tonyhaha163@163.com>
|
||||||
|
Ignacio Hagopian <jsign.uy@gmail.com>
|
||||||
|
Ikko Eltociear Ashimine <eltociear@gmail.com>
|
||||||
Ilan Gitter <8359193+gitteri@users.noreply.github.com>
|
Ilan Gitter <8359193+gitteri@users.noreply.github.com>
|
||||||
|
imalasong <55082705+imalasong@users.noreply.github.com>
|
||||||
ImanSharaf <78227895+ImanSharaf@users.noreply.github.com>
|
ImanSharaf <78227895+ImanSharaf@users.noreply.github.com>
|
||||||
|
imulmat4 <117636097+imulmat4@users.noreply.github.com>
|
||||||
|
Inphi <mlaw2501@gmail.com>
|
||||||
|
int88 <106391185+int88@users.noreply.github.com>
|
||||||
Isidoro Ghezzi <isidoro.ghezzi@icloud.com>
|
Isidoro Ghezzi <isidoro.ghezzi@icloud.com>
|
||||||
Iskander (Alex) Sharipov <quasilyte@gmail.com>
|
Iskander (Alex) Sharipov <quasilyte@gmail.com>
|
||||||
|
Ivan Aracki <aracki.ivan@gmail.com>
|
||||||
Ivan Bogatyy <bogatyi@gmail.com>
|
Ivan Bogatyy <bogatyi@gmail.com>
|
||||||
Ivan Daniluk <ivan.daniluk@gmail.com>
|
Ivan Daniluk <ivan.daniluk@gmail.com>
|
||||||
Ivo Georgiev <ivo@strem.io>
|
Ivo Georgiev <ivo@strem.io>
|
||||||
|
j2gg0s <j2gg0s@gmail.com>
|
||||||
jacksoom <lifengliu1994@gmail.com>
|
jacksoom <lifengliu1994@gmail.com>
|
||||||
|
jackyin <648588267@qq.com>
|
||||||
Jae Kwon <jkwon.work@gmail.com>
|
Jae Kwon <jkwon.work@gmail.com>
|
||||||
James Prestwich <10149425+prestwich@users.noreply.github.com>
|
Jakub Freebit <49676311+jakub-freebit@users.noreply.github.com>
|
||||||
|
James Prestwich <james@prestwi.ch>
|
||||||
Jamie Pitts <james.pitts@gmail.com>
|
Jamie Pitts <james.pitts@gmail.com>
|
||||||
|
Janko Simonovic <simonovic86@gmail.com>
|
||||||
Janoš Guljaš <janos@resenje.org>
|
Janoš Guljaš <janos@resenje.org>
|
||||||
Jared Wasinger <j-wasinger@hotmail.com>
|
Jared Wasinger <j-wasinger@hotmail.com>
|
||||||
Jason Carver <jacarver@linkedin.com>
|
Jason Carver <jacarver@linkedin.com>
|
||||||
|
|
@ -239,42 +356,63 @@ Jeff Wentworth <jeff@curvegrid.com>
|
||||||
Jeffery Robert Walsh <rlxrlps@gmail.com>
|
Jeffery Robert Walsh <rlxrlps@gmail.com>
|
||||||
Jeffrey Wilcke <jeffrey@ethereum.org>
|
Jeffrey Wilcke <jeffrey@ethereum.org>
|
||||||
Jens Agerberg <github@agerberg.me>
|
Jens Agerberg <github@agerberg.me>
|
||||||
|
Jens W <8270201+DragonDev1906@users.noreply.github.com>
|
||||||
Jeremy McNevin <jeremy.mcnevin@optum.com>
|
Jeremy McNevin <jeremy.mcnevin@optum.com>
|
||||||
Jeremy Schlatter <jeremy.schlatter@gmail.com>
|
Jeremy Schlatter <jeremy.schlatter@gmail.com>
|
||||||
Jerzy Lasyk <jerzylasyk@gmail.com>
|
Jerzy Lasyk <jerzylasyk@gmail.com>
|
||||||
Jesse Tane <jesse.tane@gmail.com>
|
Jesse Tane <jesse.tane@gmail.com>
|
||||||
Jia Chenhui <jiachenhui1989@gmail.com>
|
Jia Chenhui <jiachenhui1989@gmail.com>
|
||||||
Jim McDonald <Jim@mcdee.net>
|
Jim McDonald <Jim@mcdee.net>
|
||||||
|
jin <35813306+lochjin@users.noreply.github.com>
|
||||||
jk-jeongkyun <45347815+jeongkyun-oh@users.noreply.github.com>
|
jk-jeongkyun <45347815+jeongkyun-oh@users.noreply.github.com>
|
||||||
jkcomment <jkcomment@gmail.com>
|
jkcomment <jkcomment@gmail.com>
|
||||||
|
Joe Netti <joe@netti.dev>
|
||||||
JoeGruffins <34998433+JoeGruffins@users.noreply.github.com>
|
JoeGruffins <34998433+JoeGruffins@users.noreply.github.com>
|
||||||
Joel Burget <joelburget@gmail.com>
|
Joel Burget <joelburget@gmail.com>
|
||||||
John C. Vernaleo <john@netpurgatory.com>
|
John C. Vernaleo <john@netpurgatory.com>
|
||||||
|
John Chase <68833933+joohhnnn@users.noreply.github.com>
|
||||||
John Difool <johndifoolpi@gmail.com>
|
John Difool <johndifoolpi@gmail.com>
|
||||||
|
John Hilliard <jhilliard@polygon.technology>
|
||||||
|
John Xu <dyxushuai@gmail.com>
|
||||||
Johns Beharry <johns@peakshift.com>
|
Johns Beharry <johns@peakshift.com>
|
||||||
|
Jolly Zhao <zhaolei@pm.me>
|
||||||
Jonas <felberj@users.noreply.github.com>
|
Jonas <felberj@users.noreply.github.com>
|
||||||
Jonathan Brown <jbrown@bluedroplet.com>
|
Jonathan Brown <jbrown@bluedroplet.com>
|
||||||
Jonathan Chappelow <chappjc@users.noreply.github.com>
|
Jonathan Chappelow <chappjc@users.noreply.github.com>
|
||||||
Jonathan Gimeno <jgimeno@gmail.com>
|
Jonathan Gimeno <jgimeno@gmail.com>
|
||||||
|
Jonathan Otto <jonathan.otto@gmail.com>
|
||||||
JoranHonig <JoranHonig@users.noreply.github.com>
|
JoranHonig <JoranHonig@users.noreply.github.com>
|
||||||
Jordan Krage <jmank88@gmail.com>
|
Jordan Krage <jmank88@gmail.com>
|
||||||
|
Jorge <jorgeacortes@users.noreply.github.com>
|
||||||
Jorropo <jorropo.pgm@gmail.com>
|
Jorropo <jorropo.pgm@gmail.com>
|
||||||
Joseph Chow <ethereum@outlook.com>
|
Joseph Chow <ethereum@outlook.com>
|
||||||
|
Joseph Cook <33655003+jmcook1186@users.noreply.github.com>
|
||||||
Joshua Colvin <jcolvin@offchainlabs.com>
|
Joshua Colvin <jcolvin@offchainlabs.com>
|
||||||
Joshua Gutow <jbgutow@gmail.com>
|
Joshua Gutow <jbgutow@gmail.com>
|
||||||
jovijovi <mageyul@hotmail.com>
|
jovijovi <mageyul@hotmail.com>
|
||||||
|
jp-imx <109574657+jp-imx@users.noreply.github.com>
|
||||||
jtakalai <juuso.takalainen@streamr.com>
|
jtakalai <juuso.takalainen@streamr.com>
|
||||||
JU HYEONG PARK <dkdkajej@gmail.com>
|
JU HYEONG PARK <dkdkajej@gmail.com>
|
||||||
Julian Y <jyap808@users.noreply.github.com>
|
Julian Y <jyap808@users.noreply.github.com>
|
||||||
Justin Clark-Casey <justincc@justincc.org>
|
Justin Clark-Casey <justincc@justincc.org>
|
||||||
|
Justin Dhillon <justin.singh.dhillon@gmail.com>
|
||||||
Justin Drake <drakefjustin@gmail.com>
|
Justin Drake <drakefjustin@gmail.com>
|
||||||
|
Justin Traglia <95511699+jtraglia@users.noreply.github.com>
|
||||||
Justus <jus@gtsbr.org>
|
Justus <jus@gtsbr.org>
|
||||||
|
KAI <35927054+ThreeAndTwo@users.noreply.github.com>
|
||||||
|
kaliubuntu0206 <139627505+kaliubuntu0206@users.noreply.github.com>
|
||||||
|
Karl Bartel <karl.bartel@clabs.co>
|
||||||
|
Karol Chojnowski <karolchojnowski95@gmail.com>
|
||||||
Kawashima <91420903+sscodereth@users.noreply.github.com>
|
Kawashima <91420903+sscodereth@users.noreply.github.com>
|
||||||
|
kazak <alright-epsilon8h@icloud.com>
|
||||||
ken10100147 <sunhongping@kanjian.com>
|
ken10100147 <sunhongping@kanjian.com>
|
||||||
Kenji Siu <kenji@isuntv.com>
|
Kenji Siu <kenji@isuntv.com>
|
||||||
Kenso Trabing <ktrabing@acm.org>
|
Kenso Trabing <ktrabing@acm.org>
|
||||||
|
Kero <keroroxx520@gmail.com>
|
||||||
|
kevaundray <kevtheappdev@gmail.com>
|
||||||
Kevin <denk.kevin@web.de>
|
Kevin <denk.kevin@web.de>
|
||||||
kevin.xu <cming.xu@gmail.com>
|
kevin.xu <cming.xu@gmail.com>
|
||||||
|
Kiarash Hajian <133909368+kiarash8112@users.noreply.github.com>
|
||||||
KibGzr <kibgzr@gmail.com>
|
KibGzr <kibgzr@gmail.com>
|
||||||
kiel barry <kiel.j.barry@gmail.com>
|
kiel barry <kiel.j.barry@gmail.com>
|
||||||
kilic <onurkilic1004@gmail.com>
|
kilic <onurkilic1004@gmail.com>
|
||||||
|
|
@ -282,8 +420,10 @@ kimmylin <30611210+kimmylin@users.noreply.github.com>
|
||||||
Kitten King <53072918+kittenking@users.noreply.github.com>
|
Kitten King <53072918+kittenking@users.noreply.github.com>
|
||||||
knarfeh <hejun1874@gmail.com>
|
knarfeh <hejun1874@gmail.com>
|
||||||
Kobi Gurkan <kobigurk@gmail.com>
|
Kobi Gurkan <kobigurk@gmail.com>
|
||||||
|
Koichi Shiraishi <zchee.io@gmail.com>
|
||||||
komika <komika@komika.org>
|
komika <komika@komika.org>
|
||||||
Konrad Feldmeier <konrad@brainbot.com>
|
Konrad Feldmeier <konrad@brainbot.com>
|
||||||
|
Kosuke Taniguchi <73885532+TaniguchiKosuke@users.noreply.github.com>
|
||||||
Kris Shinn <raggamuffin.music@gmail.com>
|
Kris Shinn <raggamuffin.music@gmail.com>
|
||||||
Kristofer Peterson <svenski123@users.noreply.github.com>
|
Kristofer Peterson <svenski123@users.noreply.github.com>
|
||||||
Kumar Anirudha <mail@anirudha.dev>
|
Kumar Anirudha <mail@anirudha.dev>
|
||||||
|
|
@ -296,6 +436,8 @@ Lefteris Karapetsas <lefteris@refu.co>
|
||||||
Leif Jurvetson <leijurv@gmail.com>
|
Leif Jurvetson <leijurv@gmail.com>
|
||||||
Leo Shklovskii <leo@thermopylae.net>
|
Leo Shklovskii <leo@thermopylae.net>
|
||||||
LeoLiao <leofantast@gmail.com>
|
LeoLiao <leofantast@gmail.com>
|
||||||
|
Leon <316032931@qq.com>
|
||||||
|
levisyin <150114626+levisyin@users.noreply.github.com>
|
||||||
Lewis Marshall <lewis@lmars.net>
|
Lewis Marshall <lewis@lmars.net>
|
||||||
lhendre <lhendre2@gmail.com>
|
lhendre <lhendre2@gmail.com>
|
||||||
Li Dongwei <lidw1988@126.com>
|
Li Dongwei <lidw1988@126.com>
|
||||||
|
|
@ -305,36 +447,58 @@ libby kent <viskovitzzz@gmail.com>
|
||||||
libotony <liboliqi@gmail.com>
|
libotony <liboliqi@gmail.com>
|
||||||
LieutenantRoger <dijsky_2015@hotmail.com>
|
LieutenantRoger <dijsky_2015@hotmail.com>
|
||||||
ligi <ligi@ligi.de>
|
ligi <ligi@ligi.de>
|
||||||
|
lilasxie <thanklilas@163.com>
|
||||||
|
Lindlof <mikael@lindlof.io>
|
||||||
Lio李欧 <lionello@users.noreply.github.com>
|
Lio李欧 <lionello@users.noreply.github.com>
|
||||||
lmittmann <lmittmann@users.noreply.github.com>
|
Liyi Guo <102356659+colinlyguo@users.noreply.github.com>
|
||||||
|
llkhacquan <3724362+llkhacquan@users.noreply.github.com>
|
||||||
|
lmittmann <3458786+lmittmann@users.noreply.github.com>
|
||||||
|
lorenzo <31852651+lorenzo-dev1@users.noreply.github.com>
|
||||||
Lorenzo Manacorda <lorenzo@kinvolk.io>
|
Lorenzo Manacorda <lorenzo@kinvolk.io>
|
||||||
Louis Holbrook <dev@holbrook.no>
|
Louis Holbrook <dev@holbrook.no>
|
||||||
Luca Zeug <luclu@users.noreply.github.com>
|
Luca Zeug <luclu@users.noreply.github.com>
|
||||||
|
Lucas <lucaslg360@gmail.com>
|
||||||
Lucas Hendren <lhendre2@gmail.com>
|
Lucas Hendren <lhendre2@gmail.com>
|
||||||
|
Luozhu <70309026+LuozhuZhang@users.noreply.github.com>
|
||||||
|
lwh <lwhile521@gmail.com>
|
||||||
lzhfromustc <43191155+lzhfromustc@users.noreply.github.com>
|
lzhfromustc <43191155+lzhfromustc@users.noreply.github.com>
|
||||||
|
Maciej Kulawik <10907694+magicxyyz@users.noreply.github.com>
|
||||||
|
Madhur Shrimal <madhur.shrimal@gmail.com>
|
||||||
Magicking <s@6120.eu>
|
Magicking <s@6120.eu>
|
||||||
|
makcandrov <makcandrov@proton.me>
|
||||||
manlio <manlio.poltronieri@gmail.com>
|
manlio <manlio.poltronieri@gmail.com>
|
||||||
|
Manoj Kumar <mnjkmr398@gmail.com>
|
||||||
Maran Hidskes <maran.hidskes@gmail.com>
|
Maran Hidskes <maran.hidskes@gmail.com>
|
||||||
|
Marcin Sobczak <77129288+marcindsobczak@users.noreply.github.com>
|
||||||
|
Marcus Baldassarre <baldassarremarcus@gmail.com>
|
||||||
Marek Kotewicz <marek.kotewicz@gmail.com>
|
Marek Kotewicz <marek.kotewicz@gmail.com>
|
||||||
Mariano Cortesi <mcortesi@gmail.com>
|
Mariano Cortesi <mcortesi@gmail.com>
|
||||||
|
Mario Vega <marioevz@gmail.com>
|
||||||
|
Marius G <90795310+bearpebble@users.noreply.github.com>
|
||||||
|
Marius Kjærstad <sandakersmann@users.noreply.github.com>
|
||||||
Marius van der Wijden <m.vanderwijden@live.de>
|
Marius van der Wijden <m.vanderwijden@live.de>
|
||||||
Mark <markya0616@gmail.com>
|
Mark <markya0616@gmail.com>
|
||||||
Mark Rushakoff <mark.rushakoff@gmail.com>
|
Mark Rushakoff <mark.rushakoff@gmail.com>
|
||||||
|
Mark Tyneway <mark.tyneway@gmail.com>
|
||||||
mark.lin <mark@maicoin.com>
|
mark.lin <mark@maicoin.com>
|
||||||
|
markus <55011443+mdymalla@users.noreply.github.com>
|
||||||
|
Marquis Shanahan <29431502+9547@users.noreply.github.com>
|
||||||
Martin Alex Philip Dawson <u1356770@gmail.com>
|
Martin Alex Philip Dawson <u1356770@gmail.com>
|
||||||
Martin Holst Swende <martin@swende.se>
|
Martin Holst Swende <martin@swende.se>
|
||||||
Martin Klepsch <martinklepsch@googlemail.com>
|
Martin Klepsch <martinklepsch@googlemail.com>
|
||||||
Martin Lundfall <martin.lundfall@protonmail.com>
|
Martin Lundfall <martin.lundfall@protonmail.com>
|
||||||
Martin Michlmayr <tbm@cyrius.com>
|
Martin Michlmayr <tbm@cyrius.com>
|
||||||
Martin Redmond <21436+reds@users.noreply.github.com>
|
Martin Redmond <21436+reds@users.noreply.github.com>
|
||||||
|
maskpp <maskpp266@gmail.com>
|
||||||
Mason Fischer <mason@kissr.co>
|
Mason Fischer <mason@kissr.co>
|
||||||
Mateusz Morusiewicz <11313015+Ruteri@users.noreply.github.com>
|
Mateusz Morusiewicz <11313015+Ruteri@users.noreply.github.com>
|
||||||
Mats Julian Olsen <mats@plysjbyen.net>
|
Mats Julian Olsen <mats@plysjbyen.net>
|
||||||
Matt Garnett <14004106+lightclient@users.noreply.github.com>
|
Matt Garnett <lightclient@protonmail.com>
|
||||||
Matt K <1036969+mkrump@users.noreply.github.com>
|
Matt K <1036969+mkrump@users.noreply.github.com>
|
||||||
Matthew Di Ferrante <mattdf@users.noreply.github.com>
|
Matthew Di Ferrante <mattdf@users.noreply.github.com>
|
||||||
Matthew Halpern <matthalp@gmail.com>
|
Matthew Halpern <matthalp@gmail.com>
|
||||||
Matthew Wampler-Doty <matthew.wampler.doty@gmail.com>
|
Matthew Wampler-Doty <matthew.wampler.doty@gmail.com>
|
||||||
|
Matthieu Vachon <matt@streamingfast.io>
|
||||||
Max Sistemich <mafrasi2@googlemail.com>
|
Max Sistemich <mafrasi2@googlemail.com>
|
||||||
Maxim Zhiburt <zhiburt@gmail.com>
|
Maxim Zhiburt <zhiburt@gmail.com>
|
||||||
Maximilian Meister <mmeister@suse.de>
|
Maximilian Meister <mmeister@suse.de>
|
||||||
|
|
@ -342,34 +506,55 @@ me020523 <me020523@gmail.com>
|
||||||
Melvin Junhee Woo <melvin.woo@groundx.xyz>
|
Melvin Junhee Woo <melvin.woo@groundx.xyz>
|
||||||
meowsbits <b5c6@protonmail.com>
|
meowsbits <b5c6@protonmail.com>
|
||||||
Micah Zoltu <micah@zoltu.net>
|
Micah Zoltu <micah@zoltu.net>
|
||||||
|
Michael de Hoog <michael.dehoog@gmail.com>
|
||||||
Michael Forney <mforney@mforney.org>
|
Michael Forney <mforney@mforney.org>
|
||||||
Michael Riabzev <michael@starkware.co>
|
Michael Riabzev <michael@starkware.co>
|
||||||
Michael Ruminer <michael.ruminer+github@gmail.com>
|
Michael Ruminer <michael.ruminer+github@gmail.com>
|
||||||
michael1011 <me@michael1011.at>
|
michael1011 <me@michael1011.at>
|
||||||
Miguel Mota <miguelmota2@gmail.com>
|
Miguel Mota <miguelmota2@gmail.com>
|
||||||
Mike Burr <mburr@nightmare.com>
|
Mike Burr <mburr@nightmare.com>
|
||||||
|
Mikel Cortes <45786396+cortze@users.noreply.github.com>
|
||||||
Mikhail Mikheev <mmvsha73@gmail.com>
|
Mikhail Mikheev <mmvsha73@gmail.com>
|
||||||
|
Mikhail Vazhnov <michael.vazhnov@gmail.com>
|
||||||
|
miles <66052478+miles-six@users.noreply.github.com>
|
||||||
|
Miles Chen <fearlesschenc@gmail.com>
|
||||||
milesvant <milesvant@gmail.com>
|
milesvant <milesvant@gmail.com>
|
||||||
|
minh-bq <97180373+minh-bq@users.noreply.github.com>
|
||||||
|
Mio <mshimmeris@gmail.com>
|
||||||
Miro <mirokuratczyk@users.noreply.github.com>
|
Miro <mirokuratczyk@users.noreply.github.com>
|
||||||
Miya Chen <miyatlchen@gmail.com>
|
Miya Chen <miyatlchen@gmail.com>
|
||||||
|
mmsqe <mavis@crypto.com>
|
||||||
|
Mobin Mohanan <47410557+tr1sm0s1n@users.noreply.github.com>
|
||||||
Mohanson <mohanson@outlook.com>
|
Mohanson <mohanson@outlook.com>
|
||||||
|
moomin <67548026+nothingmin@users.noreply.github.com>
|
||||||
mr_franklin <mr_franklin@126.com>
|
mr_franklin <mr_franklin@126.com>
|
||||||
|
Mskxn <118117161+Mskxn@users.noreply.github.com>
|
||||||
Mudit Gupta <guptamudit@ymail.com>
|
Mudit Gupta <guptamudit@ymail.com>
|
||||||
Mymskmkt <1847234666@qq.com>
|
Mymskmkt <1847234666@qq.com>
|
||||||
Nalin Bhardwaj <nalinbhardwaj@nibnalin.me>
|
Nalin Bhardwaj <nalinbhardwaj@nibnalin.me>
|
||||||
|
nand2 <nicolas@deschildre.fr>
|
||||||
|
Nathan <Nathan.l@nodereal.io>
|
||||||
|
Nathan Jo <162083209+qqqeck@users.noreply.github.com>
|
||||||
Natsu Kagami <natsukagami@gmail.com>
|
Natsu Kagami <natsukagami@gmail.com>
|
||||||
|
Naveen <116692862+naveen-imtb@users.noreply.github.com>
|
||||||
Nchinda Nchinda <nchinda2@gmail.com>
|
Nchinda Nchinda <nchinda2@gmail.com>
|
||||||
nebojsa94 <nebojsa94@users.noreply.github.com>
|
Nebojsa Urosevic <nebojsa94@users.noreply.github.com>
|
||||||
necaremus <necaremus@gmail.com>
|
necaremus <necaremus@gmail.com>
|
||||||
nedifi <103940716+nedifi@users.noreply.github.com>
|
nedifi <103940716+nedifi@users.noreply.github.com>
|
||||||
needkane <604476380@qq.com>
|
needkane <604476380@qq.com>
|
||||||
|
Newt6611 <45097780+Newt6611@users.noreply.github.com>
|
||||||
|
Ng Wei Han <47109095+weiihann@users.noreply.github.com>
|
||||||
Nguyen Kien Trung <trung.n.k@gmail.com>
|
Nguyen Kien Trung <trung.n.k@gmail.com>
|
||||||
Nguyen Sy Thanh Son <thanhson1085@gmail.com>
|
Nguyen Sy Thanh Son <thanhson1085@gmail.com>
|
||||||
Nic Jansma <nic@nicj.net>
|
Nic Jansma <nic@nicj.net>
|
||||||
|
Nicholas <nicholas.zhaoyu@gmail.com>
|
||||||
Nick Dodson <silentcicero@outlook.com>
|
Nick Dodson <silentcicero@outlook.com>
|
||||||
Nick Johnson <arachnid@notdot.net>
|
Nick Johnson <arachnid@notdot.net>
|
||||||
|
Nicola Cocchiaro <3538109+ncocchiaro@users.noreply.github.com>
|
||||||
Nicolas Feignon <nfeignon@gmail.com>
|
Nicolas Feignon <nfeignon@gmail.com>
|
||||||
|
Nicolas Gotchac <ngotchac@gmail.com>
|
||||||
Nicolas Guillaume <gunicolas@sqli.com>
|
Nicolas Guillaume <gunicolas@sqli.com>
|
||||||
|
Nikhil Suri <nikhilsuri@comcast.net>
|
||||||
Nikita Kozhemyakin <enginegl.ec@gmail.com>
|
Nikita Kozhemyakin <enginegl.ec@gmail.com>
|
||||||
Nikola Madjarevic <nikola.madjarevic@gmail.com>
|
Nikola Madjarevic <nikola.madjarevic@gmail.com>
|
||||||
Nilesh Trivedi <nilesh@hypertrack.io>
|
Nilesh Trivedi <nilesh@hypertrack.io>
|
||||||
|
|
@ -379,32 +564,47 @@ njupt-moon <1015041018@njupt.edu.cn>
|
||||||
nkbai <nkbai@163.com>
|
nkbai <nkbai@163.com>
|
||||||
noam-alchemy <76969113+noam-alchemy@users.noreply.github.com>
|
noam-alchemy <76969113+noam-alchemy@users.noreply.github.com>
|
||||||
nobody <ddean2009@163.com>
|
nobody <ddean2009@163.com>
|
||||||
|
noel <72006780+0x00Duke@users.noreply.github.com>
|
||||||
Noman <noman@noman.land>
|
Noman <noman@noman.land>
|
||||||
|
norwnd <112318969+norwnd@users.noreply.github.com>
|
||||||
nujabes403 <nujabes403@gmail.com>
|
nujabes403 <nujabes403@gmail.com>
|
||||||
Nye Liu <nyet@nyet.org>
|
Nye Liu <nyet@nyet.org>
|
||||||
|
Obtuse7772 <117080049+Obtuse7772@users.noreply.github.com>
|
||||||
Oleg Kovalov <iamolegkovalov@gmail.com>
|
Oleg Kovalov <iamolegkovalov@gmail.com>
|
||||||
Oli Bye <olibye@users.noreply.github.com>
|
Oli Bye <olibye@users.noreply.github.com>
|
||||||
Oliver Tale-Yazdi <oliver@perun.network>
|
Oliver Tale-Yazdi <oliver@perun.network>
|
||||||
Olivier Hervieu <olivier.hervieu@gmail.com>
|
Olivier Hervieu <olivier.hervieu@gmail.com>
|
||||||
|
openex <openexkevin@gmail.com>
|
||||||
Or Neeman <oneeman@gmail.com>
|
Or Neeman <oneeman@gmail.com>
|
||||||
|
oseau <harbin.kyang@gmail.com>
|
||||||
Osoro Bironga <fanosoro@gmail.com>
|
Osoro Bironga <fanosoro@gmail.com>
|
||||||
Osuke <arget-fee.free.dgm@hotmail.co.jp>
|
Osuke <arget-fee.free.dgm@hotmail.co.jp>
|
||||||
|
panicalways <113693386+panicalways@users.noreply.github.com>
|
||||||
Pantelis Peslis <pespantelis@gmail.com>
|
Pantelis Peslis <pespantelis@gmail.com>
|
||||||
|
Parithosh Jayanthi <parithosh@indenwolken.xyz>
|
||||||
|
Park Changwan <pcw109550@gmail.com>
|
||||||
Pascal Dierich <pascal@merkleplant.xyz>
|
Pascal Dierich <pascal@merkleplant.xyz>
|
||||||
Patrick O'Grady <prohb125@gmail.com>
|
Patrick O'Grady <prohb125@gmail.com>
|
||||||
Pau <pau@dabax.net>
|
Pau <pau@dabax.net>
|
||||||
|
Paul <41552663+molecula451@users.noreply.github.com>
|
||||||
Paul Berg <hello@paulrberg.com>
|
Paul Berg <hello@paulrberg.com>
|
||||||
|
Paul Lange <palango@users.noreply.github.com>
|
||||||
Paul Litvak <litvakpol@012.net.il>
|
Paul Litvak <litvakpol@012.net.il>
|
||||||
Paul-Armand Verhaegen <paularmand.verhaegen@gmail.com>
|
Paul-Armand Verhaegen <paularmand.verhaegen@gmail.com>
|
||||||
Paulo L F Casaretto <pcasaretto@gmail.com>
|
Paulo L F Casaretto <pcasaretto@gmail.com>
|
||||||
|
Pawan Dhananjay <pawandhananjay@gmail.com>
|
||||||
Paweł Bylica <chfast@gmail.com>
|
Paweł Bylica <chfast@gmail.com>
|
||||||
Pedro Gomes <otherview@gmail.com>
|
Pedro Gomes <otherview@gmail.com>
|
||||||
Pedro Pombeiro <PombeirP@users.noreply.github.com>
|
Pedro Pombeiro <PombeirP@users.noreply.github.com>
|
||||||
|
persmor <166146971+persmor@users.noreply.github.com>
|
||||||
|
Peter (bitfly) <1674920+peterbitfly@users.noreply.github.com>
|
||||||
Peter Broadhurst <peter@themumbles.net>
|
Peter Broadhurst <peter@themumbles.net>
|
||||||
peter cresswell <pcresswell@gmail.com>
|
peter cresswell <pcresswell@gmail.com>
|
||||||
Peter Pratscher <pratscher@gmail.com>
|
Peter Pratscher <pratscher@gmail.com>
|
||||||
Peter Simard <petesimard56@gmail.com>
|
Peter Simard <petesimard56@gmail.com>
|
||||||
|
Peter Straus <153843855+krauspt@users.noreply.github.com>
|
||||||
Petr Mikusek <petr@mikusek.info>
|
Petr Mikusek <petr@mikusek.info>
|
||||||
|
phenix3443 <phenix3443@gmail.com>
|
||||||
Philip Schlump <pschlump@gmail.com>
|
Philip Schlump <pschlump@gmail.com>
|
||||||
Pierre Neter <pierreneter@gmail.com>
|
Pierre Neter <pierreneter@gmail.com>
|
||||||
Pierre R <p.rousset@gmail.com>
|
Pierre R <p.rousset@gmail.com>
|
||||||
|
|
@ -412,15 +612,24 @@ piersy <pierspowlesland@gmail.com>
|
||||||
PilkyuJung <anothel1@naver.com>
|
PilkyuJung <anothel1@naver.com>
|
||||||
Piotr Dyraga <piotr.dyraga@keep.network>
|
Piotr Dyraga <piotr.dyraga@keep.network>
|
||||||
ploui <64719999+ploui@users.noreply.github.com>
|
ploui <64719999+ploui@users.noreply.github.com>
|
||||||
|
PolyMa <151764357+polymaer@users.noreply.github.com>
|
||||||
Preston Van Loon <preston@prysmaticlabs.com>
|
Preston Van Loon <preston@prysmaticlabs.com>
|
||||||
Prince Sinha <sinhaprince013@gmail.com>
|
Prince Sinha <sinhaprince013@gmail.com>
|
||||||
|
psogv0308 <psogv0308@gmail.com>
|
||||||
|
puhtaytow <18026645+puhtaytow@users.noreply.github.com>
|
||||||
Péter Szilágyi <peterke@gmail.com>
|
Péter Szilágyi <peterke@gmail.com>
|
||||||
|
qcrao <qcrao91@gmail.com>
|
||||||
qd-ethan <31876119+qdgogogo@users.noreply.github.com>
|
qd-ethan <31876119+qdgogogo@users.noreply.github.com>
|
||||||
Qian Bin <cola.tin.com@gmail.com>
|
Qian Bin <cola.tin.com@gmail.com>
|
||||||
|
qiuhaohao <trouserrr@gmail.com>
|
||||||
|
Qt <golang.chen@gmail.com>
|
||||||
|
Quentin McGaw <quentin.mcgaw@gmail.com>
|
||||||
Quest Henkart <qhenkart@gmail.com>
|
Quest Henkart <qhenkart@gmail.com>
|
||||||
|
Rachel Bousfield <nfranks@protonmail.com>
|
||||||
Rachel Franks <nfranks@protonmail.com>
|
Rachel Franks <nfranks@protonmail.com>
|
||||||
Rafael Matias <rafael@skyle.net>
|
Rafael Matias <rafael@skyle.net>
|
||||||
Raghav Sood <raghavsood@gmail.com>
|
Raghav Sood <raghavsood@gmail.com>
|
||||||
|
Rajaram Gaunker <zimbabao@gmail.com>
|
||||||
Ralph Caraveo <deckarep@gmail.com>
|
Ralph Caraveo <deckarep@gmail.com>
|
||||||
Ramesh Nair <ram@hiddentao.com>
|
Ramesh Nair <ram@hiddentao.com>
|
||||||
rangzen <public@l-homme.com>
|
rangzen <public@l-homme.com>
|
||||||
|
|
@ -430,45 +639,65 @@ rhaps107 <dod-source@yandex.ru>
|
||||||
Ricardo Catalinas Jiménez <r@untroubled.be>
|
Ricardo Catalinas Jiménez <r@untroubled.be>
|
||||||
Ricardo Domingos <ricardohsd@gmail.com>
|
Ricardo Domingos <ricardohsd@gmail.com>
|
||||||
Richard Hart <richardhart92@gmail.com>
|
Richard Hart <richardhart92@gmail.com>
|
||||||
|
RichΛrd <info@richardramos.me>
|
||||||
Rick <rick.no@groundx.xyz>
|
Rick <rick.no@groundx.xyz>
|
||||||
RJ Catalano <catalanor0220@gmail.com>
|
RJ Catalano <catalanor0220@gmail.com>
|
||||||
Rob <robert@rojotek.com>
|
Rob <robert@rojotek.com>
|
||||||
Rob Mulholand <rmulholand@8thlight.com>
|
Rob Mulholand <rmulholand@8thlight.com>
|
||||||
Robert Zaremba <robert@zaremba.ch>
|
Robert Zaremba <robert@zaremba.ch>
|
||||||
|
Roberto Bayardo <bayardo@alum.mit.edu>
|
||||||
Roc Yu <rociiu0112@gmail.com>
|
Roc Yu <rociiu0112@gmail.com>
|
||||||
|
Roman Krasiuk <rokrassyuk@gmail.com>
|
||||||
Roman Mazalov <83914728+gopherxyz@users.noreply.github.com>
|
Roman Mazalov <83914728+gopherxyz@users.noreply.github.com>
|
||||||
Ross <9055337+Chadsr@users.noreply.github.com>
|
Ross <9055337+Chadsr@users.noreply.github.com>
|
||||||
|
Rossen Krastev <rosen4obg@gmail.com>
|
||||||
|
Roy Crihfield <roy@manteia.ltd>
|
||||||
Runchao Han <elvisage941102@gmail.com>
|
Runchao Han <elvisage941102@gmail.com>
|
||||||
|
Ruohui Wang <nomaru@outlook.com>
|
||||||
Russ Cox <rsc@golang.org>
|
Russ Cox <rsc@golang.org>
|
||||||
Ryan Schneider <ryanleeschneider@gmail.com>
|
Ryan Schneider <ryanleeschneider@gmail.com>
|
||||||
|
Ryan Tinianov <tinianov@live.com>
|
||||||
ryanc414 <ryan@tokencard.io>
|
ryanc414 <ryan@tokencard.io>
|
||||||
Rémy Roy <remyroy@remyroy.com>
|
Rémy Roy <remyroy@remyroy.com>
|
||||||
S. Matthew English <s-matthew-english@users.noreply.github.com>
|
S. Matthew English <s-matthew-english@users.noreply.github.com>
|
||||||
salanfe <salanfe@users.noreply.github.com>
|
salanfe <salanfe@users.noreply.github.com>
|
||||||
Sam <39165351+Xia-Sam@users.noreply.github.com>
|
Sam <39165351+Xia-Sam@users.noreply.github.com>
|
||||||
|
Saman H. Pasha <51169592+saman-pasha@users.noreply.github.com>
|
||||||
Sammy Libre <7374093+sammy007@users.noreply.github.com>
|
Sammy Libre <7374093+sammy007@users.noreply.github.com>
|
||||||
Samuel Marks <samuelmarks@gmail.com>
|
Samuel Marks <samuelmarks@gmail.com>
|
||||||
|
Sanghee Choi <32831939+pengin7384@users.noreply.github.com>
|
||||||
|
SangIlMo <156392700+SangIlMo@users.noreply.github.com>
|
||||||
sanskarkhare <sanskarkhare47@gmail.com>
|
sanskarkhare <sanskarkhare47@gmail.com>
|
||||||
|
SanYe <kumakichi@users.noreply.github.com>
|
||||||
Sarlor <kinsleer@outlook.com>
|
Sarlor <kinsleer@outlook.com>
|
||||||
Sasuke1964 <neilperry1964@gmail.com>
|
Sasuke1964 <neilperry1964@gmail.com>
|
||||||
Satpal <28562234+SatpalSandhu61@users.noreply.github.com>
|
Satpal <28562234+SatpalSandhu61@users.noreply.github.com>
|
||||||
Saulius Grigaitis <saulius@necolt.com>
|
Saulius Grigaitis <saulius@necolt.com>
|
||||||
Sean <darcys22@gmail.com>
|
Sean <darcys22@gmail.com>
|
||||||
|
seayyyy <163325936+seay404@users.noreply.github.com>
|
||||||
|
Sebastian Stammler <seb@oplabs.co>
|
||||||
Serhat Şevki Dinçer <jfcgauss@gmail.com>
|
Serhat Şevki Dinçer <jfcgauss@gmail.com>
|
||||||
|
Seungbae Yu <dbadoy4874@gmail.com>
|
||||||
|
Seungmin Kim <a7965344@gmail.com>
|
||||||
Shane Bammel <sjb933@gmail.com>
|
Shane Bammel <sjb933@gmail.com>
|
||||||
shawn <36943337+lxex@users.noreply.github.com>
|
shawn <36943337+lxex@users.noreply.github.com>
|
||||||
shigeyuki azuchi <azuchi@chaintope.com>
|
shigeyuki azuchi <azuchi@chaintope.com>
|
||||||
Shihao Xia <charlesxsh@hotmail.com>
|
Shihao Xia <charlesxsh@hotmail.com>
|
||||||
Shiming <codingmylife@gmail.com>
|
Shiming <codingmylife@gmail.com>
|
||||||
|
Shiming Zhang <wzshiming@hotmail.com>
|
||||||
Shintaro Kaneko <kaneshin0120@gmail.com>
|
Shintaro Kaneko <kaneshin0120@gmail.com>
|
||||||
shiqinfeng1 <150627601@qq.com>
|
shiqinfeng1 <150627601@qq.com>
|
||||||
|
Shivam Sandbhor <shivam.sandbhor@gmail.com>
|
||||||
|
shivhg <shivhg@gmail.com>
|
||||||
Shuai Qi <qishuai231@gmail.com>
|
Shuai Qi <qishuai231@gmail.com>
|
||||||
Shude Li <islishude@gmail.com>
|
Shude Li <islishude@gmail.com>
|
||||||
Shunsuke Watanabe <ww.shunsuke@gmail.com>
|
Shunsuke Watanabe <ww.shunsuke@gmail.com>
|
||||||
|
shuo <shuoli84@gmail.com>
|
||||||
silence <wangsai.silence@qq.com>
|
silence <wangsai.silence@qq.com>
|
||||||
Simon Jentzsch <simon@slock.it>
|
Simon Jentzsch <simon@slock.it>
|
||||||
Sina Mahmoodi <1591639+s1na@users.noreply.github.com>
|
Sina Mahmoodi <1591639+s1na@users.noreply.github.com>
|
||||||
sixdays <lj491685571@126.com>
|
sixdays <lj491685571@126.com>
|
||||||
|
sjlee1125 <47561537+sjlee1125@users.noreply.github.com>
|
||||||
SjonHortensius <SjonHortensius@users.noreply.github.com>
|
SjonHortensius <SjonHortensius@users.noreply.github.com>
|
||||||
Slava Karpenko <slavikus@gmail.com>
|
Slava Karpenko <slavikus@gmail.com>
|
||||||
slumber1122 <slumber1122@gmail.com>
|
slumber1122 <slumber1122@gmail.com>
|
||||||
|
|
@ -477,17 +706,29 @@ soc1c <soc1c@users.noreply.github.com>
|
||||||
Sorin Neacsu <sorin.neacsu@gmail.com>
|
Sorin Neacsu <sorin.neacsu@gmail.com>
|
||||||
Sparty <vignesh.crysis@gmail.com>
|
Sparty <vignesh.crysis@gmail.com>
|
||||||
Stein Dekker <dekker.stein@gmail.com>
|
Stein Dekker <dekker.stein@gmail.com>
|
||||||
|
Stephen Flynn <ssflynn@gmail.com>
|
||||||
|
Stephen Guo <stephen.fire@gmail.com>
|
||||||
Steve Gattuso <steve@stevegattuso.me>
|
Steve Gattuso <steve@stevegattuso.me>
|
||||||
|
Steve Milk <wangpeculiar@gmail.com>
|
||||||
Steve Ruckdashel <steve.ruckdashel@gmail.com>
|
Steve Ruckdashel <steve.ruckdashel@gmail.com>
|
||||||
Steve Waldman <swaldman@mchange.com>
|
Steve Waldman <swaldman@mchange.com>
|
||||||
Steven E. Harris <seh@panix.com>
|
Steven E. Harris <seh@panix.com>
|
||||||
Steven Roose <stevenroose@gmail.com>
|
Steven Roose <stevenroose@gmail.com>
|
||||||
stompesi <stompesi@gmail.com>
|
stompesi <stompesi@gmail.com>
|
||||||
stormpang <jialinpeng@vip.qq.com>
|
stormpang <jialinpeng@vip.qq.com>
|
||||||
|
storyicon <storyicon@foxmail.com>
|
||||||
|
strykerin <dacosta.pereirafabio@gmail.com>
|
||||||
|
sudeep <sudeepdino008@gmail.com>
|
||||||
|
SuiYuan <165623542+suiyuan1314@users.noreply.github.com>
|
||||||
|
Sungwoo Kim <git@sung-woo.kim>
|
||||||
sunxiaojun2014 <sunxiaojun-xy@360.cn>
|
sunxiaojun2014 <sunxiaojun-xy@360.cn>
|
||||||
Suriyaa Sundararuban <isc.suriyaa@gmail.com>
|
Suriyaa Sundararuban <isc.suriyaa@gmail.com>
|
||||||
Sylvain Laurent <s@6120.eu>
|
Sylvain Laurent <s@6120.eu>
|
||||||
|
Szupingwang <cara4bear@gmail.com>
|
||||||
|
tactical_retreat <tactical0retreat@gmail.com>
|
||||||
|
Taeguk Kwon <xornrbboy@gmail.com>
|
||||||
Taeik Lim <sibera21@gmail.com>
|
Taeik Lim <sibera21@gmail.com>
|
||||||
|
taiking <c.tsujiyan727@gmail.com>
|
||||||
tamirms <tamir@trello.com>
|
tamirms <tamir@trello.com>
|
||||||
Tangui Clairet <tangui.clairet@gmail.com>
|
Tangui Clairet <tangui.clairet@gmail.com>
|
||||||
Tatsuya Shimoda <tacoo@users.noreply.github.com>
|
Tatsuya Shimoda <tacoo@users.noreply.github.com>
|
||||||
|
|
@ -495,21 +736,35 @@ Taylor Gerring <taylor.gerring@gmail.com>
|
||||||
TColl <38299499+TColl@users.noreply.github.com>
|
TColl <38299499+TColl@users.noreply.github.com>
|
||||||
terasum <terasum@163.com>
|
terasum <terasum@163.com>
|
||||||
tgyKomgo <52910426+tgyKomgo@users.noreply.github.com>
|
tgyKomgo <52910426+tgyKomgo@users.noreply.github.com>
|
||||||
|
Thabokani <149070269+Thabokani@users.noreply.github.com>
|
||||||
Thad Guidry <thadguidry@gmail.com>
|
Thad Guidry <thadguidry@gmail.com>
|
||||||
|
therainisme <therainisme@qq.com>
|
||||||
Thomas Bocek <tom@tomp2p.net>
|
Thomas Bocek <tom@tomp2p.net>
|
||||||
thomasmodeneis <thomas.modeneis@gmail.com>
|
thomasmodeneis <thomas.modeneis@gmail.com>
|
||||||
thumb8432 <thumb8432@gmail.com>
|
thumb8432 <thumb8432@gmail.com>
|
||||||
Ti Zhou <tizhou1986@gmail.com>
|
Ti Zhou <tizhou1986@gmail.com>
|
||||||
tia-99 <67107070+tia-99@users.noreply.github.com>
|
tia-99 <67107070+tia-99@users.noreply.github.com>
|
||||||
|
tianyeyouyou <tianyeyouyou@gmail.com>
|
||||||
|
Tien Nguyen <116023870+htiennv@users.noreply.github.com>
|
||||||
Tim Cooijmans <timcooijmans@gmail.com>
|
Tim Cooijmans <timcooijmans@gmail.com>
|
||||||
|
TinyFoxy <tiny.fox@foxmail.com>
|
||||||
Tobias Hildebrandt <79341166+tobias-hildebrandt@users.noreply.github.com>
|
Tobias Hildebrandt <79341166+tobias-hildebrandt@users.noreply.github.com>
|
||||||
|
tokikuch <msmania@users.noreply.github.com>
|
||||||
|
Tom <45168162+tomdever@users.noreply.github.com>
|
||||||
Tosh Camille <tochecamille@gmail.com>
|
Tosh Camille <tochecamille@gmail.com>
|
||||||
|
trillo <trillo8652@gmail.com>
|
||||||
|
Tristan-Wilson <87238672+Tristan-Wilson@users.noreply.github.com>
|
||||||
|
trocher <trooocher@proton.me>
|
||||||
tsarpaul <Litvakpol@012.net.il>
|
tsarpaul <Litvakpol@012.net.il>
|
||||||
|
TY <45994721+tylerK1294@users.noreply.github.com>
|
||||||
Tyler Chambers <2775339+tylerchambers@users.noreply.github.com>
|
Tyler Chambers <2775339+tylerchambers@users.noreply.github.com>
|
||||||
|
tylerni7 <tylerni7@gmail.com>
|
||||||
tzapu <alex@tzapu.com>
|
tzapu <alex@tzapu.com>
|
||||||
ucwong <ucwong@126.com>
|
ucwong <ethereum2k@gmail.com>
|
||||||
uji <49834542+uji@users.noreply.github.com>
|
uji <49834542+uji@users.noreply.github.com>
|
||||||
ult-bobonovski <alex@ultiledger.io>
|
ult-bobonovski <alex@ultiledger.io>
|
||||||
|
Undefinedor <wanghao@imwh.net>
|
||||||
|
Ursulafe <152976968+Ursulafe@users.noreply.github.com>
|
||||||
Valentin Trinqué <ValentinTrinque@users.noreply.github.com>
|
Valentin Trinqué <ValentinTrinque@users.noreply.github.com>
|
||||||
Valentin Wüstholz <wuestholz@gmail.com>
|
Valentin Wüstholz <wuestholz@gmail.com>
|
||||||
Vedhavyas Singareddi <vedhavyas.singareddi@gmail.com>
|
Vedhavyas Singareddi <vedhavyas.singareddi@gmail.com>
|
||||||
|
|
@ -528,39 +783,60 @@ Vitaly V <vvelikodny@gmail.com>
|
||||||
Vivek Anand <vivekanand1101@users.noreply.github.com>
|
Vivek Anand <vivekanand1101@users.noreply.github.com>
|
||||||
Vlad Bokov <razum2um@mail.ru>
|
Vlad Bokov <razum2um@mail.ru>
|
||||||
Vlad Gluhovsky <gluk256@gmail.com>
|
Vlad Gluhovsky <gluk256@gmail.com>
|
||||||
|
VM <112189277+sysvm@users.noreply.github.com>
|
||||||
|
vuittont60 <81072379+vuittont60@users.noreply.github.com>
|
||||||
|
wangjingcun <wangjingcun@aliyun.com>
|
||||||
|
wangyifan <wangyifan@uchicago.edu>
|
||||||
Ward Bradt <wardbradt5@gmail.com>
|
Ward Bradt <wardbradt5@gmail.com>
|
||||||
Water <44689567+codeoneline@users.noreply.github.com>
|
Water <44689567+codeoneline@users.noreply.github.com>
|
||||||
wbt <wbt@users.noreply.github.com>
|
wbt <wbt@users.noreply.github.com>
|
||||||
|
Wei Tang <acc@pacna.org>
|
||||||
weimumu <934657014@qq.com>
|
weimumu <934657014@qq.com>
|
||||||
Wenbiao Zheng <delweng@gmail.com>
|
Wenbiao Zheng <delweng@gmail.com>
|
||||||
Wenshao Zhong <wzhong20@uic.edu>
|
Wenshao Zhong <wzhong20@uic.edu>
|
||||||
|
Wihan de Beer <debeerwihan@gmail.com>
|
||||||
Will Villanueva <hello@willvillanueva.com>
|
Will Villanueva <hello@willvillanueva.com>
|
||||||
William Morriss <wjmelements@gmail.com>
|
William Morriss <wjmelements@gmail.com>
|
||||||
William Setzer <bootstrapsetzer@gmail.com>
|
William Setzer <bootstrapsetzer@gmail.com>
|
||||||
williambannas <wrschwartz@wpi.edu>
|
williambannas <wrschwartz@wpi.edu>
|
||||||
|
willian.eth <willian@ufpa.br>
|
||||||
|
winniehere <winnie050812@qq.com>
|
||||||
|
winterjihwan <113398351+winterjihwan@users.noreply.github.com>
|
||||||
wuff1996 <33193253+wuff1996@users.noreply.github.com>
|
wuff1996 <33193253+wuff1996@users.noreply.github.com>
|
||||||
Wuxiang <wuxiangzhou2010@gmail.com>
|
Wuxiang <wuxiangzhou2010@gmail.com>
|
||||||
Xiaobing Jiang <s7v7nislands@gmail.com>
|
Xiaobing Jiang <s7v7nislands@gmail.com>
|
||||||
|
xiaodong <81516175+javaandfly@users.noreply.github.com>
|
||||||
xiekeyang <xiekeyang@users.noreply.github.com>
|
xiekeyang <xiekeyang@users.noreply.github.com>
|
||||||
|
xinbenlv <zzn@zzn.im>
|
||||||
xincaosu <xincaosu@126.com>
|
xincaosu <xincaosu@126.com>
|
||||||
xinluyin <31590468+xinluyin@users.noreply.github.com>
|
xinluyin <31590468+xinluyin@users.noreply.github.com>
|
||||||
|
xiyang <90125263+JBossBC@users.noreply.github.com>
|
||||||
Xudong Liu <33193253+r1cs@users.noreply.github.com>
|
Xudong Liu <33193253+r1cs@users.noreply.github.com>
|
||||||
xwjack <XWJACK@users.noreply.github.com>
|
xwjack <XWJACK@users.noreply.github.com>
|
||||||
yahtoo <yahtoo.ma@gmail.com>
|
yahtoo <yahtoo.ma@gmail.com>
|
||||||
Yang Hau <vulxj0j8j8@gmail.com>
|
Yang Hau <vulxj0j8j8@gmail.com>
|
||||||
YaoZengzeng <yaozengzeng@zju.edu.cn>
|
YaoZengzeng <yaozengzeng@zju.edu.cn>
|
||||||
|
ycyraum <ycyraum@fastmail.com>
|
||||||
YH-Zhou <yanhong.zhou05@gmail.com>
|
YH-Zhou <yanhong.zhou05@gmail.com>
|
||||||
|
Yier <90763233+yierx@users.noreply.github.com>
|
||||||
Yihau Chen <a122092487@gmail.com>
|
Yihau Chen <a122092487@gmail.com>
|
||||||
|
yihuang <huang@crypto.com>
|
||||||
Yohann Léon <sybiload@gmail.com>
|
Yohann Léon <sybiload@gmail.com>
|
||||||
Yoichi Hirai <i@yoichihirai.com>
|
Yoichi Hirai <i@yoichihirai.com>
|
||||||
Yole <007yuyue@gmail.com>
|
Yole <007yuyue@gmail.com>
|
||||||
Yondon Fu <yondon.fu@gmail.com>
|
Yondon Fu <yondon.fu@gmail.com>
|
||||||
|
yong <33920876+yzhaoyu@users.noreply.github.com>
|
||||||
YOSHIDA Masanori <masanori.yoshida@gmail.com>
|
YOSHIDA Masanori <masanori.yoshida@gmail.com>
|
||||||
yoza <yoza.is12s@gmail.com>
|
yoza <yoza.is12s@gmail.com>
|
||||||
|
ysh0566 <ysh0566@qq.com>
|
||||||
|
yudrywet <166895665+yudrywet@users.noreply.github.com>
|
||||||
|
yujinpark <petere123123@gmail.com>
|
||||||
|
yukionfire <yukionfire@qq.com>
|
||||||
yumiel yoomee1313 <yumiel.ko@groundx.xyz>
|
yumiel yoomee1313 <yumiel.ko@groundx.xyz>
|
||||||
Yusup <awklsgrep@gmail.com>
|
Yusup <awklsgrep@gmail.com>
|
||||||
yutianwu <wzxingbupt@gmail.com>
|
yutianwu <wzxingbupt@gmail.com>
|
||||||
ywzqwwt <39263032+ywzqwwt@users.noreply.github.com>
|
ywzqwwt <39263032+ywzqwwt@users.noreply.github.com>
|
||||||
|
yzb <335357057@qq.com>
|
||||||
zaccoding <zaccoding725@gmail.com>
|
zaccoding <zaccoding725@gmail.com>
|
||||||
Zach <zach.ramsay@gmail.com>
|
Zach <zach.ramsay@gmail.com>
|
||||||
Zachinquarantine <Zachinquarantine@protonmail.com>
|
Zachinquarantine <Zachinquarantine@protonmail.com>
|
||||||
|
|
@ -568,24 +844,34 @@ zah <zahary@gmail.com>
|
||||||
Zahoor Mohamed <zahoor@zahoor.in>
|
Zahoor Mohamed <zahoor@zahoor.in>
|
||||||
Zak Cole <zak@beattiecole.com>
|
Zak Cole <zak@beattiecole.com>
|
||||||
zcheng9 <zcheng9@hawk.iit.edu>
|
zcheng9 <zcheng9@hawk.iit.edu>
|
||||||
|
zeim839 <50573884+zeim839@users.noreply.github.com>
|
||||||
zer0to0ne <36526113+zer0to0ne@users.noreply.github.com>
|
zer0to0ne <36526113+zer0to0ne@users.noreply.github.com>
|
||||||
zgfzgf <48779939+zgfzgf@users.noreply.github.com>
|
zgfzgf <48779939+zgfzgf@users.noreply.github.com>
|
||||||
Zhang Zhuo <mycinbrin@gmail.com>
|
Zhang Zhuo <mycinbrin@gmail.com>
|
||||||
zhangsoledad <787953403@qq.com>
|
zhangsoledad <787953403@qq.com>
|
||||||
zhaochonghe <41711151+zhaochonghe@users.noreply.github.com>
|
zhaochonghe <41711151+zhaochonghe@users.noreply.github.com>
|
||||||
|
zhen peng <505380967@qq.com>
|
||||||
Zhenguo Niu <Niu.ZGlinux@gmail.com>
|
Zhenguo Niu <Niu.ZGlinux@gmail.com>
|
||||||
|
Zheyuan He <ecjgvmhc@gmail.com>
|
||||||
|
Zhihao Lin <3955922+kkqy@users.noreply.github.com>
|
||||||
zhiqiangxu <652732310@qq.com>
|
zhiqiangxu <652732310@qq.com>
|
||||||
Zhou Zhiyao <ZHOU0250@e.ntu.edu.sg>
|
Zhou Zhiyao <ZHOU0250@e.ntu.edu.sg>
|
||||||
Ziyuan Zhong <zzy.albert@163.com>
|
Ziyuan Zhong <zzy.albert@163.com>
|
||||||
Zoe Nolan <github@zoenolan.org>
|
Zoe Nolan <github@zoenolan.org>
|
||||||
|
zoereco <158379334+zoereco@users.noreply.github.com>
|
||||||
|
Zoo <zoosilence@gmail.com>
|
||||||
|
Zoro <40222601+BabyHalimao@users.noreply.github.com>
|
||||||
Zou Guangxian <zouguangxian@gmail.com>
|
Zou Guangxian <zouguangxian@gmail.com>
|
||||||
Zsolt Felföldi <zsfelfoldi@gmail.com>
|
Zsolt Felföldi <zsfelfoldi@gmail.com>
|
||||||
Łukasz Kurowski <crackcomm@users.noreply.github.com>
|
Łukasz Kurowski <crackcomm@users.noreply.github.com>
|
||||||
Łukasz Zimnoch <lukaszzimnoch1994@gmail.com>
|
Łukasz Zimnoch <lukaszzimnoch1994@gmail.com>
|
||||||
ΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com>
|
ΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com>
|
||||||
Максим Чусовлянов <mchusovlianov@gmail.com>
|
Максим Чусовлянов <mchusovlianov@gmail.com>
|
||||||
|
かげ <47621124+ronething-bot@users.noreply.github.com>
|
||||||
|
スパイク <1311798+spkjp@users.noreply.github.com>
|
||||||
大彬 <hz_stb@163.com>
|
大彬 <hz_stb@163.com>
|
||||||
沉风 <myself659@users.noreply.github.com>
|
沉风 <myself659@users.noreply.github.com>
|
||||||
|
牛晓婕 <30611384+niuxiaojie81@users.noreply.github.com>
|
||||||
贺鹏飞 <hpf@hackerful.cn>
|
贺鹏飞 <hpf@hackerful.cn>
|
||||||
陈佳 <chenjiablog@gmail.com>
|
陈佳 <chenjiablog@gmail.com>
|
||||||
유용환 <33824408+eric-yoo@users.noreply.github.com>
|
유용환 <33824408+eric-yoo@users.noreply.github.com>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
# Build Geth in a stock Go builder container
|
# Build Geth in a stock Go builder container
|
||||||
FROM golang:1.23-alpine AS builder
|
FROM golang:1.24-alpine AS builder
|
||||||
|
|
||||||
RUN apk add --no-cache make gcc musl-dev linux-headers git
|
RUN apk add --no-cache make gcc musl-dev linux-headers git
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) {
|
||||||
|
|
||||||
func (abi ABI) getArguments(name string, data []byte) (Arguments, error) {
|
func (abi ABI) getArguments(name string, data []byte) (Arguments, error) {
|
||||||
// since there can't be naming collisions with contracts and events,
|
// since there can't be naming collisions with contracts and events,
|
||||||
// we need to decide whether we're calling a method or an event
|
// we need to decide whether we're calling a method, event or an error
|
||||||
var args Arguments
|
var args Arguments
|
||||||
|
|
||||||
if method, ok := abi.Methods[name]; ok {
|
if method, ok := abi.Methods[name]; ok {
|
||||||
|
|
@ -102,9 +102,11 @@ func (abi ABI) getArguments(name string, data []byte) (Arguments, error) {
|
||||||
if event, ok := abi.Events[name]; ok {
|
if event, ok := abi.Events[name]; ok {
|
||||||
args = event.Inputs
|
args = event.Inputs
|
||||||
}
|
}
|
||||||
|
if err, ok := abi.Errors[name]; ok {
|
||||||
|
args = err.Inputs
|
||||||
|
}
|
||||||
if args == nil {
|
if args == nil {
|
||||||
return nil, fmt.Errorf("abi: could not locate named method or event: %s", name)
|
return nil, fmt.Errorf("abi: could not locate named method, event or error: %s", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
return args, nil
|
return args, nil
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
"github.com/ethereum/go-ethereum/internal/testrand"
|
||||||
)
|
)
|
||||||
|
|
||||||
const jsondata = `
|
const jsondata = `
|
||||||
|
|
@ -333,6 +334,38 @@ func TestCustomErrors(t *testing.T) {
|
||||||
check("MyError", "MyError(uint256)")
|
check("MyError", "MyError(uint256)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCustomErrorUnpackIntoInterface(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
errorName := "MyError"
|
||||||
|
json := fmt.Sprintf(`[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"%s","type":"error"}]`, errorName)
|
||||||
|
abi, err := JSON(strings.NewReader(json))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
type MyError struct {
|
||||||
|
Sender common.Address
|
||||||
|
Balance *big.Int
|
||||||
|
}
|
||||||
|
|
||||||
|
sender := testrand.Address()
|
||||||
|
balance := new(big.Int).SetBytes(testrand.Bytes(8))
|
||||||
|
encoded, err := abi.Errors[errorName].Inputs.Pack(sender, balance)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
result := MyError{}
|
||||||
|
err = abi.UnpackIntoInterface(&result, errorName, encoded)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if result.Sender != sender {
|
||||||
|
t.Errorf("expected %x got %x", sender, result.Sender)
|
||||||
|
}
|
||||||
|
if result.Balance.Cmp(balance) != 0 {
|
||||||
|
t.Errorf("expected %v got %v", balance, result.Balance)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestMultiPack(t *testing.T) {
|
func TestMultiPack(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
abi, err := JSON(strings.NewReader(jsondata))
|
abi, err := JSON(strings.NewReader(jsondata))
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,11 @@
|
||||||
// You should have received a copy of the GNU Lesser General Public License
|
// 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/>.
|
// 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:
|
// 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
|
// https://geth.ethereum.org/docs/developers/dapp-developer/native-bindings
|
||||||
package bind
|
package abigen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
@ -33,13 +33,6 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"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 {
|
func isKeyWord(arg string) bool {
|
||||||
switch arg {
|
switch arg {
|
||||||
case "break":
|
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
|
// 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
|
// enforces compile time type safety and naming convention as opposed to having to
|
||||||
// manually maintain hard coded strings that break on runtime.
|
// 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 (
|
var (
|
||||||
// contracts is the map of each individual contract requested binding
|
// contracts is the map of each individual contract requested binding
|
||||||
contracts = make(map[string]*tmplContract)
|
contracts = make(map[string]*tmplContract)
|
||||||
|
|
@ -127,14 +120,14 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
|
|
||||||
for _, input := range evmABI.Constructor.Inputs {
|
for _, input := range evmABI.Constructor.Inputs {
|
||||||
if hasStruct(input.Type) {
|
if hasStruct(input.Type) {
|
||||||
bindStructType[lang](input.Type, structs)
|
bindStructType(input.Type, structs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, original := range evmABI.Methods {
|
for _, original := range evmABI.Methods {
|
||||||
// Normalize the method for capital cases and non-anonymous inputs/outputs
|
// Normalize the method for capital cases and non-anonymous inputs/outputs
|
||||||
normalized := original
|
normalized := original
|
||||||
normalizedName := methodNormalizer[lang](alias(aliases, original.Name))
|
normalizedName := abi.ToCamelCase(alias(aliases, original.Name))
|
||||||
// Ensure there is no duplicated identifier
|
// Ensure there is no duplicated identifier
|
||||||
var identifiers = callIdentifiers
|
var identifiers = callIdentifiers
|
||||||
if !original.IsConstant() {
|
if !original.IsConstant() {
|
||||||
|
|
@ -164,7 +157,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasStruct(input.Type) {
|
if hasStruct(input.Type) {
|
||||||
bindStructType[lang](input.Type, structs)
|
bindStructType(input.Type, structs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -173,11 +166,11 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
|
|
||||||
for j, output := range normalized.Outputs {
|
for j, output := range normalized.Outputs {
|
||||||
if output.Name != "" {
|
if output.Name != "" {
|
||||||
normalized.Outputs[j].Name = capitalise(output.Name)
|
normalized.Outputs[j].Name = abi.ToCamelCase(output.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasStruct(output.Type) {
|
if hasStruct(output.Type) {
|
||||||
bindStructType[lang](output.Type, structs)
|
bindStructType(output.Type, structs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Append the methods to the call or transact lists
|
// Append the methods to the call or transact lists
|
||||||
|
|
@ -197,7 +190,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
normalized := original
|
normalized := original
|
||||||
|
|
||||||
// Ensure there is no duplicated identifier
|
// 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.
|
// Name shouldn't start with a digit. It will make the generated code invalid.
|
||||||
if len(normalizedName) > 0 && unicode.IsDigit(rune(normalizedName[0])) {
|
if len(normalizedName) > 0 && unicode.IsDigit(rune(normalizedName[0])) {
|
||||||
normalizedName = fmt.Sprintf("E%s", normalizedName)
|
normalizedName = fmt.Sprintf("E%s", normalizedName)
|
||||||
|
|
@ -224,8 +217,8 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
// Event is a bit special, we need to define event struct in binding,
|
// Event is a bit special, we need to define event struct in binding,
|
||||||
// ensure there is no camel-case-style name conflict.
|
// ensure there is no camel-case-style name conflict.
|
||||||
for index := 0; ; index++ {
|
for index := 0; ; index++ {
|
||||||
if !used[capitalise(normalized.Inputs[j].Name)] {
|
if !used[abi.ToCamelCase(normalized.Inputs[j].Name)] {
|
||||||
used[capitalise(normalized.Inputs[j].Name)] = true
|
used[abi.ToCamelCase(normalized.Inputs[j].Name)] = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -233,7 +226,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasStruct(input.Type) {
|
if hasStruct(input.Type) {
|
||||||
bindStructType[lang](input.Type, structs)
|
bindStructType(input.Type, structs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Append the event to the accumulator list
|
// Append the event to the accumulator list
|
||||||
|
|
@ -249,7 +242,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
}
|
}
|
||||||
|
|
||||||
contracts[types[i]] = &tmplContract{
|
contracts[types[i]] = &tmplContract{
|
||||||
Type: capitalise(types[i]),
|
Type: abi.ToCamelCase(types[i]),
|
||||||
InputABI: strings.ReplaceAll(strippedABI, "\"", "\\\""),
|
InputABI: strings.ReplaceAll(strippedABI, "\"", "\\\""),
|
||||||
InputBin: strings.TrimPrefix(strings.TrimSpace(bytecodes[i]), "0x"),
|
InputBin: strings.TrimPrefix(strings.TrimSpace(bytecodes[i]), "0x"),
|
||||||
Constructor: evmABI.Constructor,
|
Constructor: evmABI.Constructor,
|
||||||
|
|
@ -260,6 +253,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
Events: events,
|
Events: events,
|
||||||
Libraries: make(map[string]string),
|
Libraries: make(map[string]string),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function 4-byte signatures are stored in the same sequence
|
// Function 4-byte signatures are stored in the same sequence
|
||||||
// as types, if available.
|
// as types, if available.
|
||||||
if len(fsigs) > i {
|
if len(fsigs) > i {
|
||||||
|
|
@ -286,6 +280,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
_, ok := isLib[types[i]]
|
_, ok := isLib[types[i]]
|
||||||
contracts[types[i]].Library = ok
|
contracts[types[i]].Library = ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate the contract template data content and render it
|
// Generate the contract template data content and render it
|
||||||
data := &tmplData{
|
data := &tmplData{
|
||||||
Package: pkg,
|
Package: pkg,
|
||||||
|
|
@ -296,38 +291,25 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]
|
||||||
buffer := new(bytes.Buffer)
|
buffer := new(bytes.Buffer)
|
||||||
|
|
||||||
funcs := map[string]interface{}{
|
funcs := map[string]interface{}{
|
||||||
"bindtype": bindType[lang],
|
"bindtype": bindType,
|
||||||
"bindtopictype": bindTopicType[lang],
|
"bindtopictype": bindTopicType,
|
||||||
"namedtype": namedType[lang],
|
"capitalise": abi.ToCamelCase,
|
||||||
"capitalise": capitalise,
|
|
||||||
"decapitalise": decapitalise,
|
"decapitalise": decapitalise,
|
||||||
}
|
}
|
||||||
|
tmpl := template.Must(template.New("").Funcs(funcs).Parse(tmplSource))
|
||||||
tmpl := template.Must(template.New("").Funcs(funcs).Parse(tmplSource[lang]))
|
|
||||||
if err := tmpl.Execute(buffer, data); err != nil {
|
if err := tmpl.Execute(buffer, data); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
// For Go bindings pass the code through gofmt to clean it up
|
// Pass the code through gofmt to clean it up
|
||||||
if lang == LangGo {
|
code, err := format.Source(buffer.Bytes())
|
||||||
code, err := format.Source(buffer.Bytes())
|
if err != nil {
|
||||||
if err != nil {
|
return "", fmt.Errorf("%v\n%s", err, buffer)
|
||||||
return "", fmt.Errorf("%v\n%s", err, buffer)
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(code), nil
|
|
||||||
}
|
}
|
||||||
// For all others just return as is for now
|
return string(code), nil
|
||||||
return buffer.String(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// bindType is a set of type binders that convert Solidity types to some supported
|
// bindBasicType converts basic solidity types(except array, slice and tuple) to Go ones.
|
||||||
// programming language types.
|
func bindBasicType(kind abi.Type) string {
|
||||||
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 {
|
|
||||||
switch kind.T {
|
switch kind.T {
|
||||||
case abi.AddressTy:
|
case abi.AddressTy:
|
||||||
return "common.Address"
|
return "common.Address"
|
||||||
|
|
@ -351,32 +333,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
|
// from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly
|
||||||
// mapped will use an upscaled type (e.g. BigDecimal).
|
// 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 {
|
switch kind.T {
|
||||||
case abi.TupleTy:
|
case abi.TupleTy:
|
||||||
return structs[kind.TupleRawName+kind.String()].Name
|
return structs[kind.TupleRawName+kind.String()].Name
|
||||||
case abi.ArrayTy:
|
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:
|
case abi.SliceTy:
|
||||||
return "[]" + bindTypeGo(*kind.Elem, structs)
|
return "[]" + bindType(*kind.Elem, structs)
|
||||||
default:
|
default:
|
||||||
return bindBasicTypeGo(kind)
|
return bindBasicType(kind)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// bindTopicType is a set of type binders that convert Solidity types to some
|
// bindTopicType converts a Solidity topic type to a Go one. It is almost the same
|
||||||
// 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
|
|
||||||
// functionality as for simple types, but dynamic types get converted to hashes.
|
// functionality as for simple types, but dynamic types get converted to hashes.
|
||||||
func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
func bindTopicType(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||||
bound := bindTypeGo(kind, structs)
|
bound := bindType(kind, structs)
|
||||||
|
|
||||||
// todo(rjl493456442) according solidity documentation, indexed event
|
// todo(rjl493456442) according solidity documentation, indexed event
|
||||||
// parameters that are not value types i.e. arrays and structs are not
|
// parameters that are not value types i.e. arrays and structs are not
|
||||||
|
|
@ -391,16 +367,10 @@ func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||||
return bound
|
return bound
|
||||||
}
|
}
|
||||||
|
|
||||||
// bindStructType is a set of type binders that convert Solidity tuple types to some supported
|
// bindStructType converts a Solidity tuple type to a Go one and records the mapping
|
||||||
// programming language struct definition.
|
// in the given map. Notably, this function will resolve and record nested struct
|
||||||
var bindStructType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{
|
// recursively.
|
||||||
LangGo: bindStructTypeGo,
|
func bindStructType(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
switch kind.T {
|
switch kind.T {
|
||||||
case abi.TupleTy:
|
case abi.TupleTy:
|
||||||
// We compose a raw struct name and a canonical parameter expression
|
// We compose a raw struct name and a canonical parameter expression
|
||||||
|
|
@ -420,19 +390,21 @@ func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||||
)
|
)
|
||||||
|
|
||||||
for i, elem := range kind.TupleElems {
|
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] })
|
name = abi.ResolveNameConflict(name, func(s string) bool { return names[s] })
|
||||||
names[name] = true
|
names[name] = true
|
||||||
|
fields = append(fields, &tmplField{
|
||||||
fields = append(fields, &tmplField{Type: bindStructTypeGo(*elem, structs), Name: name, SolKind: *elem})
|
Type: bindStructType(*elem, structs),
|
||||||
|
Name: name,
|
||||||
|
SolKind: *elem,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
name := kind.TupleRawName
|
name := kind.TupleRawName
|
||||||
if name == "" {
|
if name == "" {
|
||||||
name = fmt.Sprintf("Struct%d", len(structs))
|
name = fmt.Sprintf("Struct%d", len(structs))
|
||||||
}
|
}
|
||||||
|
name = abi.ToCamelCase(name)
|
||||||
name = capitalise(name)
|
|
||||||
|
|
||||||
structs[id] = &tmplStruct{
|
structs[id] = &tmplStruct{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
|
@ -441,20 +413,14 @@ func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
|
||||||
|
|
||||||
return name
|
return name
|
||||||
case abi.ArrayTy:
|
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:
|
case abi.SliceTy:
|
||||||
return "[]" + bindStructTypeGo(*kind.Elem, structs)
|
return "[]" + bindStructType(*kind.Elem, structs)
|
||||||
default:
|
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
|
// alias returns an alias of the given string based on the aliasing rules
|
||||||
// or returns itself if no rule is matched.
|
// or returns itself if no rule is matched.
|
||||||
func alias(aliases map[string]string, n string) string {
|
func alias(aliases map[string]string, n string) string {
|
||||||
|
|
@ -465,21 +431,11 @@ func alias(aliases map[string]string, n string) string {
|
||||||
return n
|
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.
|
// decapitalise makes a camel-case string which starts with a lower case character.
|
||||||
func decapitalise(input string) string {
|
func decapitalise(input string) string {
|
||||||
if len(input) == 0 {
|
if len(input) == 0 {
|
||||||
return input
|
return input
|
||||||
}
|
}
|
||||||
|
|
||||||
goForm := abi.ToCamelCase(input)
|
goForm := abi.ToCamelCase(input)
|
||||||
|
|
||||||
return strings.ToLower(goForm[:1]) + goForm[1:]
|
return strings.ToLower(goForm[:1]) + goForm[1:]
|
||||||
|
|
@ -501,7 +457,7 @@ func structured(args abi.Arguments) bool {
|
||||||
}
|
}
|
||||||
// If the field name is empty when normalized or collides (var, Var, _var, _Var),
|
// If the field name is empty when normalized or collides (var, Var, _var, _Var),
|
||||||
// we can't organize into a struct
|
// we can't organize into a struct
|
||||||
field := capitalise(out.Name)
|
field := abi.ToCamelCase(out.Name)
|
||||||
if field == "" || exists[field] {
|
if field == "" || exists[field] {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
// You should have received a copy of the GNU Lesser General Public License
|
// 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/>.
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package bind
|
package abigen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -2072,20 +2072,22 @@ var bindTests = []struct {
|
||||||
|
|
||||||
// Tests that packages generated by the binder can be successfully compiled and
|
// Tests that packages generated by the binder can be successfully compiled and
|
||||||
// the requested tester run against it.
|
// the requested tester run against it.
|
||||||
func TestGolangBindings(t *testing.T) {
|
func TestBindings(t *testing.T) {
|
||||||
t.Skip("skipping test until we can fix it")
|
t.Skip("skipping test until we can fix it")
|
||||||
// Skip the test if no Go command can be found
|
// Skip the test if no Go command can be found
|
||||||
gocmd := runtime.GOROOT() + "/bin/go"
|
gocmd := runtime.GOROOT() + "/bin/go"
|
||||||
if !common.FileExist(gocmd) {
|
if !common.FileExist(gocmd) {
|
||||||
t.Skip("go sdk not found for testing")
|
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 {
|
if err := os.MkdirAll(pkg, 0700); err != nil {
|
||||||
t.Fatalf("failed to create package: %v", err)
|
t.Fatalf("failed to create package: %v", err)
|
||||||
}
|
}
|
||||||
|
t.Log("tmpdir", pkg)
|
||||||
|
|
||||||
// Generate the test suite for all the contracts
|
// Generate the test suite for all the contracts
|
||||||
for i, tt := range bindTests {
|
for i, tt := range bindTests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
|
@ -2096,7 +2098,7 @@ func TestGolangBindings(t *testing.T) {
|
||||||
types = []string{tt.name}
|
types = []string{tt.name}
|
||||||
}
|
}
|
||||||
// Generate the binding and create a Go source file in the workspace
|
// 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 {
|
if err != nil {
|
||||||
t.Fatalf("test %d: failed to generate binding: %v", i, err)
|
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
|
// 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/>.
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package bind
|
package abigen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "embed"
|
_ "embed"
|
||||||
|
"strings"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||||
)
|
)
|
||||||
|
|
@ -42,10 +44,48 @@ type tmplContract struct {
|
||||||
Fallback *tmplMethod // Additional special fallback function
|
Fallback *tmplMethod // Additional special fallback function
|
||||||
Receive *tmplMethod // Additional special receive function
|
Receive *tmplMethod // Additional special receive function
|
||||||
Events map[string]*tmplEvent // Contract events accessors
|
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
|
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
|
// tmplMethod is a wrapper around an abi.Method that contains a few preprocessed
|
||||||
// and cached data fields.
|
// and cached data fields.
|
||||||
type tmplMethod struct {
|
type tmplMethod struct {
|
||||||
|
|
@ -61,6 +101,13 @@ type tmplEvent struct {
|
||||||
Normalized abi.Event // Normalized version of the parsed fields
|
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
|
// tmplField is a wrapper around a struct field with binding language
|
||||||
// struct type definition and relative filed name.
|
// struct type definition and relative filed name.
|
||||||
type tmplField struct {
|
type tmplField struct {
|
||||||
|
|
@ -76,14 +123,14 @@ type tmplStruct struct {
|
||||||
Fields []*tmplField // Struct fields definition depends on the binding language.
|
Fields []*tmplField // Struct fields definition depends on the binding language.
|
||||||
}
|
}
|
||||||
|
|
||||||
// tmplSource is language to template mapping containing all the supported
|
// tmplSource is the Go source template that the generated Go contract binding
|
||||||
// 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
|
|
||||||
// is based on.
|
// is based on.
|
||||||
//
|
//
|
||||||
//go:embed source.go.tpl
|
//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
|
||||||
|
}
|
||||||
110
accounts/abi/abigen/testdata/v2/structs-abi.go.txt
vendored
Normal file
110
accounts/abi/abigen/testdata/v2/structs-abi.go.txt
vendored
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
// Code generated via abigen V2 - DO NOT EDIT.
|
||||||
|
// This file is a generated binding and any manual changes will be lost.
|
||||||
|
|
||||||
|
package v1bindtests
|
||||||
|
|
||||||
|
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: "Structs",
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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(backend, addr, c.abi)
|
||||||
|
}
|
||||||
|
|
||||||
|
// F is the Go binding used to pack the parameters required for calling
|
||||||
|
// the contract method 0x28811f59.
|
||||||
|
//
|
||||||
|
// Solidity: function F() view returns((bytes32)[] a, uint256[] c, bool[] d)
|
||||||
|
func (structs *Structs) PackF() ([]byte, error) {
|
||||||
|
return structs.abi.Pack("F")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ret := new(FOutput)
|
||||||
|
ret.A = *abi.ConvertType(out[0], new([]Struct0)).(*[]Struct0)
|
||||||
|
ret.C = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)
|
||||||
|
ret.D = *abi.ConvertType(out[2], new([]bool)).(*[]bool)
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// G is the Go binding used to pack the parameters required for calling
|
||||||
|
// the contract method 0x6fecb623.
|
||||||
|
//
|
||||||
|
// Solidity: function G() view returns((bytes32)[] a)
|
||||||
|
func (structs *Structs) PackG() ([]byte, error) {
|
||||||
|
return structs.abi.Pack("G")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 nil, err
|
||||||
|
}
|
||||||
|
out0 := *abi.ConvertType(out[0], new([]Struct0)).(*[]Struct0)
|
||||||
|
return &out0, nil
|
||||||
|
}
|
||||||
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
|
||||||
|
}
|
||||||
|
|
@ -81,20 +81,19 @@ func (arguments Arguments) isTuple() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unpack performs the operation hexdata -> Go format.
|
// 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(data) == 0 {
|
||||||
if len(arguments.NonIndexed()) != 0 {
|
if len(arguments.NonIndexed()) != 0 {
|
||||||
return nil, errors.New("abi: attempting to unmarshal an empty string while arguments are expected")
|
return nil, errors.New("abi: attempting to unmarshal an empty string while arguments are expected")
|
||||||
}
|
}
|
||||||
|
return make([]any, 0), nil
|
||||||
return make([]interface{}, 0), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return arguments.UnpackValues(data)
|
return arguments.UnpackValues(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnpackIntoMap performs the operation hexdata -> mapping of argument name to argument value.
|
// 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
|
// Make sure map is not nil
|
||||||
if v == nil {
|
if v == nil {
|
||||||
return errors.New("abi: cannot unpack into a nil map")
|
return errors.New("abi: cannot unpack into a nil map")
|
||||||
|
|
@ -121,7 +120,7 @@ func (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy performs the operation go format -> provided struct.
|
// 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
|
// make sure the passed value is arguments pointer
|
||||||
if reflect.Ptr != reflect.ValueOf(v).Kind() {
|
if reflect.Ptr != reflect.ValueOf(v).Kind() {
|
||||||
return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
|
return fmt.Errorf("abi: Unpack(non-pointer %T)", v)
|
||||||
|
|
@ -143,7 +142,7 @@ func (arguments Arguments) Copy(v interface{}, values []interface{}) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// copyAtomic copies ( hexdata -> go ) a single value
|
// 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()
|
dst := reflect.ValueOf(v).Elem()
|
||||||
src := reflect.ValueOf(marshalledValues)
|
src := reflect.ValueOf(marshalledValues)
|
||||||
|
|
||||||
|
|
@ -155,7 +154,7 @@ func (arguments Arguments) copyAtomic(v interface{}, marshalledValues interface{
|
||||||
}
|
}
|
||||||
|
|
||||||
// copyTuple copies a batch of values from marshalledValues to v.
|
// 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()
|
value := reflect.ValueOf(v).Elem()
|
||||||
nonIndexedArgs := arguments.NonIndexed()
|
nonIndexedArgs := arguments.NonIndexed()
|
||||||
|
|
||||||
|
|
@ -203,12 +202,17 @@ func (arguments Arguments) copyTuple(v interface{}, marshalledValues []interface
|
||||||
// UnpackValues can be used to unpack ABI-encoded hexdata according to the ABI-specification,
|
// 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
|
// 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.
|
// values. An atomic argument will be a list with one element.
|
||||||
func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) {
|
func (arguments Arguments) UnpackValues(data []byte) ([]any, error) {
|
||||||
nonIndexedArgs := arguments.NonIndexed()
|
var (
|
||||||
retval := make([]interface{}, 0, len(nonIndexedArgs))
|
retval = make([]any, 0)
|
||||||
|
virtualArgs = 0
|
||||||
|
index = 0
|
||||||
|
)
|
||||||
|
|
||||||
virtualArgs := 0
|
for _, arg := range arguments {
|
||||||
for index, arg := range nonIndexedArgs {
|
if arg.Indexed {
|
||||||
|
continue
|
||||||
|
}
|
||||||
marshalledValue, err := toGoType((index+virtualArgs)*32, arg.Type, data)
|
marshalledValue, err := toGoType((index+virtualArgs)*32, arg.Type, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -233,6 +237,7 @@ func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = append(retval, marshalledValue)
|
retval = append(retval, marshalledValue)
|
||||||
|
index++
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval, nil
|
return retval, nil
|
||||||
|
|
@ -240,12 +245,12 @@ func (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) {
|
||||||
|
|
||||||
// PackValues performs the operation Go format -> Hexdata.
|
// PackValues performs the operation Go format -> Hexdata.
|
||||||
// It is the semantic opposite of UnpackValues.
|
// 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...)
|
return arguments.Pack(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pack performs the operation Go format -> Hexdata.
|
// 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
|
// Make sure arguments match up and pack them
|
||||||
abiArgs := arguments
|
abiArgs := arguments
|
||||||
if len(args) != len(abiArgs) {
|
if len(args) != len(abiArgs) {
|
||||||
|
|
|
||||||
|
|
@ -1,191 +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(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -33,18 +33,18 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/consensus/ethash"
|
"github.com/ethereum/go-ethereum/consensus/ethash"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/bloombits"
|
"github.com/ethereum/go-ethereum/core/filtermaps"
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
"github.com/ethereum/go-ethereum/core/rawdb"
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
"github.com/ethereum/go-ethereum/eth/filters"
|
"github.com/ethereum/go-ethereum/eth/filters"
|
||||||
|
"github.com/ethereum/go-ethereum/ethclient/simulated"
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
"github.com/ethereum/go-ethereum/event"
|
"github.com/ethereum/go-ethereum/event"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
"github.com/holiman/uint256"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// BOR
|
// BOR
|
||||||
|
|
@ -66,6 +66,9 @@ var (
|
||||||
// ChainReader, ChainStateReader, ContractBackend, ContractCaller, ContractFilterer, ContractTransactor,
|
// ChainReader, ChainStateReader, ContractBackend, ContractCaller, ContractFilterer, ContractTransactor,
|
||||||
// DeployBackend, GasEstimator, GasPricer, LogFilterer, PendingContractCaller, TransactionReader, and TransactionSender
|
// DeployBackend, GasEstimator, GasPricer, LogFilterer, PendingContractCaller, TransactionReader, and TransactionSender
|
||||||
type SimulatedBackend struct {
|
type SimulatedBackend struct {
|
||||||
|
*simulated.Backend
|
||||||
|
simulated.Client
|
||||||
|
|
||||||
database ethdb.Database // In memory database to store our testing data
|
database ethdb.Database // In memory database to store our testing data
|
||||||
blockchain *core.BlockChain // Ethereum blockchain to handle the consensus
|
blockchain *core.BlockChain // Ethereum blockchain to handle the consensus
|
||||||
|
|
||||||
|
|
@ -227,7 +230,7 @@ func (b *SimulatedBackend) CodeAtHash(ctx context.Context, contract common.Addre
|
||||||
}
|
}
|
||||||
|
|
||||||
// BalanceAt returns the wei balance of a certain account in the blockchain.
|
// BalanceAt returns the wei balance of a certain account in the blockchain.
|
||||||
func (b *SimulatedBackend) BalanceAt(ctx context.Context, contract common.Address, blockNumber *big.Int) (*uint256.Int, error) {
|
func (b *SimulatedBackend) BalanceAt(ctx context.Context, contract common.Address, blockNumber *big.Int) (*big.Int, error) {
|
||||||
b.mu.Lock()
|
b.mu.Lock()
|
||||||
defer b.mu.Unlock()
|
defer b.mu.Unlock()
|
||||||
|
|
||||||
|
|
@ -235,7 +238,7 @@ func (b *SimulatedBackend) BalanceAt(ctx context.Context, contract common.Addres
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return stateDB.GetBalance(contract), nil
|
return stateDB.GetBalance(contract).ToBig(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NonceAt returns the nonce of a certain account in the blockchain.
|
// NonceAt returns the nonce of a certain account in the blockchain.
|
||||||
|
|
@ -707,9 +710,8 @@ func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallM
|
||||||
|
|
||||||
// Create a new environment which holds all relevant information
|
// Create a new environment which holds all relevant information
|
||||||
// about the transaction and calling mechanisms.
|
// about the transaction and calling mechanisms.
|
||||||
txContext := core.NewEVMTxContext(msg)
|
|
||||||
evmContext := core.NewEVMBlockContext(header, b.blockchain, nil)
|
evmContext := core.NewEVMBlockContext(header, b.blockchain, nil)
|
||||||
vmEnv := vm.NewEVM(evmContext, txContext, stateDB, b.config, vm.Config{NoBaseFee: true})
|
vmEnv := vm.NewEVM(evmContext, stateDB, b.config, vm.Config{NoBaseFee: true})
|
||||||
gasPool := new(core.GasPool).AddGas(gomath.MaxUint64)
|
gasPool := new(core.GasPool).AddGas(gomath.MaxUint64)
|
||||||
|
|
||||||
return core.ApplyMessage(vmEnv, msg, gasPool, context.Background())
|
return core.ApplyMessage(vmEnv, msg, gasPool, context.Background())
|
||||||
|
|
@ -963,10 +965,6 @@ func (fb *filterBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event
|
||||||
|
|
||||||
func (fb *filterBackend) BloomStatus() (uint64, uint64) { return 4096, 0 }
|
func (fb *filterBackend) BloomStatus() (uint64, uint64) { return 4096, 0 }
|
||||||
|
|
||||||
func (fb *filterBackend) ServiceFilter(ctx context.Context, ms *bloombits.MatcherSession) {
|
|
||||||
panic("not supported")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fb *filterBackend) ChainConfig() *params.ChainConfig {
|
func (fb *filterBackend) ChainConfig() *params.ChainConfig {
|
||||||
panic("not supported")
|
panic("not supported")
|
||||||
}
|
}
|
||||||
|
|
@ -975,6 +973,10 @@ func (fb *filterBackend) CurrentHeader() *types.Header {
|
||||||
panic("not supported")
|
panic("not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fb *filterBackend) NewMatcherBackend() filtermaps.MatcherBackend {
|
||||||
|
panic("not supported")
|
||||||
|
}
|
||||||
|
|
||||||
func nullSubscription() event.Subscription {
|
func nullSubscription() event.Subscription {
|
||||||
return event.NewSubscription(func(quit <-chan struct{}) error {
|
return event.NewSubscription(func(quit <-chan struct{}) error {
|
||||||
<-quit
|
<-quit
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSimulatedBackend(t *testing.T) {
|
func TestSimulatedBackend(t *testing.T) {
|
||||||
defer goleak.VerifyNone(t, leak.IgnoreList()...)
|
// The goroutine leak we're ignoring is actually not a real leak
|
||||||
|
// it's a known behavior of the OpenCensus package that we're using for metrics and monitoring
|
||||||
|
defer goleak.VerifyNone(t, append(leak.IgnoreList(), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"))...)
|
||||||
var gasLimit uint64 = 8000029
|
var gasLimit uint64 = 8000029
|
||||||
|
|
||||||
key, _ := crypto.GenerateKey() // nolint: gosec
|
key, _ := crypto.GenerateKey() // nolint: gosec
|
||||||
|
|
@ -142,10 +144,6 @@ func TestNewSimulatedBackend(t *testing.T) {
|
||||||
t.Errorf("expected sim config to equal params.AllEthashProtocolChanges, got %v", sim.config)
|
t.Errorf("expected sim config to equal params.AllEthashProtocolChanges, got %v", sim.config)
|
||||||
}
|
}
|
||||||
|
|
||||||
if sim.blockchain.Config() != params.AllEthashProtocolChanges {
|
|
||||||
t.Errorf("expected sim blockchain config to equal params.AllEthashProtocolChanges, got %v", sim.config)
|
|
||||||
}
|
|
||||||
|
|
||||||
stateDB, _ := sim.blockchain.State()
|
stateDB, _ := sim.blockchain.State()
|
||||||
|
|
||||||
bal := stateDB.GetBalance(testAddr)
|
bal := stateDB.GetBalance(testAddr)
|
||||||
|
|
@ -229,7 +227,7 @@ func TestNewAdjustTimeFail(t *testing.T) {
|
||||||
func TestBalanceAt(t *testing.T) {
|
func TestBalanceAt(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
|
testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
|
||||||
expectedBal := uint256.NewInt(10000000000000000)
|
expectedBal := uint256.NewInt(10000000000000000).ToBig()
|
||||||
|
|
||||||
sim := simTestBackend(testAddr)
|
sim := simTestBackend(testAddr)
|
||||||
defer sim.Close()
|
defer sim.Close()
|
||||||
|
|
|
||||||
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
|
// ErrNoCodeAfterDeploy is returned by WaitDeployed if contract creation leaves
|
||||||
// an empty contract behind.
|
// an empty contract behind.
|
||||||
ErrNoCodeAfterDeploy = errors.New("no contract code after deployment")
|
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
|
// ContractCaller defines the methods needed to allow operating with a contract on a read
|
||||||
|
|
@ -118,3 +123,11 @@ type ContractBackend interface {
|
||||||
ContractTransactor
|
ContractTransactor
|
||||||
ContractFilterer
|
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"
|
"sync"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum"
|
"github.com/ethereum/go-ethereum"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/event"
|
"github.com/ethereum/go-ethereum/event"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -89,28 +89,43 @@ type WatchOpts struct {
|
||||||
|
|
||||||
// MetaData collects all metadata for a bound contract.
|
// MetaData collects all metadata for a bound contract.
|
||||||
type MetaData struct {
|
type MetaData struct {
|
||||||
mu sync.Mutex
|
Bin string // deployer bytecode (as a hex string)
|
||||||
Sigs map[string]string
|
ABI string // the raw ABI definition (JSON)
|
||||||
Bin string
|
Deps []*MetaData // library dependencies of the contract
|
||||||
ABI string
|
|
||||||
ab *abi.ABI
|
// 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()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
|
|
||||||
if m.ab != nil {
|
if m.parsedABI != nil {
|
||||||
return m.ab, nil
|
return m.parsedABI, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if parsed, err := abi.JSON(strings.NewReader(m.ABI)); err != nil {
|
if parsed, err := abi.JSON(strings.NewReader(m.ABI)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else {
|
} else {
|
||||||
m.ab = &parsed
|
m.parsedABI = &parsed
|
||||||
}
|
}
|
||||||
|
return m.parsedABI, nil
|
||||||
return m.ab, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoundContract is the base wrapper object that reflects a contract on the
|
// BoundContract is the base wrapper object that reflects a contract on the
|
||||||
|
|
@ -136,39 +151,13 @@ 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
|
// 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
|
// 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, a slice of interfaces for anonymous returns and a struct for named
|
||||||
// returns.
|
// returns.
|
||||||
func (c *BoundContract) Call(opts *CallOpts, results *[]interface{}, method string, params ...interface{}) error {
|
func (c *BoundContract) Call(opts *CallOpts, results *[]any, method string, params ...any) error {
|
||||||
// Don't crash on a lazy user
|
|
||||||
if opts == nil {
|
|
||||||
opts = new(CallOpts)
|
|
||||||
}
|
|
||||||
|
|
||||||
if results == nil {
|
if results == nil {
|
||||||
results = new([]interface{})
|
results = new([]any)
|
||||||
}
|
}
|
||||||
// Pack the input, call and unpack the results
|
// Pack the input, call and unpack the results
|
||||||
input, err := c.abi.Pack(method, params...)
|
input, err := c.abi.Pack(method, params...)
|
||||||
|
|
@ -176,63 +165,9 @@ func (c *BoundContract) Call(opts *CallOpts, results *[]interface{}, method stri
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
output, err := c.call(opts, input)
|
||||||
msg = ethereum.CallMsg{From: opts.From, To: &c.address, Data: input}
|
if err != nil {
|
||||||
ctx = ensureContext(opts.Context)
|
return err
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(*results) == 0 {
|
if len(*results) == 0 {
|
||||||
|
|
@ -247,26 +182,97 @@ func (c *BoundContract) Call(opts *CallOpts, results *[]interface{}, method stri
|
||||||
return c.abi.UnpackIntoInterface(res[0], method, output)
|
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.
|
// 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
|
// Otherwise pack up the parameters and invoke the contract
|
||||||
input, err := c.abi.Pack(method, params...)
|
input, err := c.abi.Pack(method, params...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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)
|
return c.transact(opts, &c.address, input)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RawTransact initiates a transaction with the given raw calldata as the input.
|
// RawTransact initiates a transaction with the given raw calldata as the input.
|
||||||
// It's usually used to initiate transactions for invoking **Fallback** function.
|
// It's usually used to initiate transactions for invoking **Fallback** function.
|
||||||
func (c *BoundContract) RawTransact(opts *TransactOpts, calldata []byte) (*types.Transaction, error) {
|
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)
|
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
|
// Transfer initiates a plain transaction to move funds to the contract, calling
|
||||||
// its default method if one is available.
|
// its default method if one is available.
|
||||||
func (c *BoundContract) Transfer(opts *TransactOpts) (*types.Transaction, error) {
|
func (c *BoundContract) Transfer(opts *TransactOpts) (*types.Transaction, error) {
|
||||||
|
|
@ -393,13 +399,14 @@ func (c *BoundContract) estimateGasLimit(opts *TransactOpts, contract *common.Ad
|
||||||
}
|
}
|
||||||
|
|
||||||
msg := ethereum.CallMsg{
|
msg := ethereum.CallMsg{
|
||||||
From: opts.From,
|
From: opts.From,
|
||||||
To: contract,
|
To: contract,
|
||||||
GasPrice: gasPrice,
|
GasPrice: gasPrice,
|
||||||
GasTipCap: gasTipCap,
|
GasTipCap: gasTipCap,
|
||||||
GasFeeCap: gasFeeCap,
|
GasFeeCap: gasFeeCap,
|
||||||
Value: value,
|
Value: value,
|
||||||
Data: input,
|
Data: input,
|
||||||
|
AccessList: opts.AccessList,
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.transactor.EstimateGas(ensureContext(opts.Context), msg)
|
return c.transactor.EstimateGas(ensureContext(opts.Context), msg)
|
||||||
|
|
@ -467,14 +474,13 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i
|
||||||
|
|
||||||
// FilterLogs filters contract logs for past blocks, returning the necessary
|
// FilterLogs filters contract logs for past blocks, returning the necessary
|
||||||
// channels to construct a strongly typed bound iterator on top of them.
|
// 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
|
// Don't crash on a lazy user
|
||||||
if opts == nil {
|
if opts == nil {
|
||||||
opts = new(FilterOpts)
|
opts = new(FilterOpts)
|
||||||
}
|
}
|
||||||
// Append the event selector to the query parameters and construct the topic set
|
// 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...)
|
topics, err := abi.MakeTopics(query...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
|
@ -514,13 +520,13 @@ func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]int
|
||||||
|
|
||||||
// WatchLogs filters subscribes to contract logs for future blocks, returning a
|
// WatchLogs filters subscribes to contract logs for future blocks, returning a
|
||||||
// subscription object that can be used to tear down the watcher.
|
// 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
|
// Don't crash on a lazy user
|
||||||
if opts == nil {
|
if opts == nil {
|
||||||
opts = new(WatchOpts)
|
opts = new(WatchOpts)
|
||||||
}
|
}
|
||||||
// Append the event selector to the query parameters and construct the topic set
|
// 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...)
|
topics, err := abi.MakeTopics(query...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -546,7 +552,7 @@ func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]inter
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnpackLog unpacks a retrieved log into the provided output structure.
|
// 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.
|
// Anonymous events are not supported.
|
||||||
if len(log.Topics) == 0 {
|
if len(log.Topics) == 0 {
|
||||||
return errNoEventSignature
|
return errNoEventSignature
|
||||||
|
|
@ -574,7 +580,7 @@ func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnpackLogIntoMap unpacks a retrieved log into the provided map.
|
// 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.
|
// Anonymous events are not supported.
|
||||||
if len(log.Topics) == 0 {
|
if len(log.Topics) == 0 {
|
||||||
return errNoEventSignature
|
return errNoEventSignature
|
||||||
|
|
@ -26,13 +26,14 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum"
|
"github.com/ethereum/go-ethereum"
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
"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"
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/internal/ethapi"
|
"github.com/ethereum/go-ethereum/internal/ethapi"
|
||||||
|
"github.com/ethereum/go-ethereum/internal/ethapi/override"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
@ -97,7 +98,7 @@ func (mc *mockCaller) CallContract(ctx context.Context, call ethereum.CallMsg, b
|
||||||
return mc.callContractBytes, mc.callContractErr
|
return mc.callContractBytes, mc.callContractErr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mc *mockCaller) CallWithState(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash *rpc.BlockNumberOrHash, state *state.StateDB, overrides *ethapi.StateOverride, blockOverrides *ethapi.BlockOverrides) (hexutil.Bytes, error) {
|
func (mc *mockCaller) CallWithState(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash *rpc.BlockNumberOrHash, state *state.StateDB, overrides *override.StateOverride, blockOverrides *override.BlockOverrides) (hexutil.Bytes, error) {
|
||||||
return mc.CallContract(ctx, ethereum.CallMsg{}, nil)
|
return mc.CallContract(ctx, ethereum.CallMsg{}, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
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,14 +29,13 @@ import (
|
||||||
|
|
||||||
// WaitMined waits for tx to be mined on the blockchain.
|
// WaitMined waits for tx to be mined on the blockchain.
|
||||||
// It stops waiting when the context is canceled.
|
// It stops waiting when the context is canceled.
|
||||||
func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*types.Receipt, error) {
|
func WaitMined(ctx context.Context, b DeployBackend, txHash common.Hash) (*types.Receipt, error) {
|
||||||
queryTicker := time.NewTicker(time.Second)
|
queryTicker := time.NewTicker(time.Second)
|
||||||
defer queryTicker.Stop()
|
defer queryTicker.Stop()
|
||||||
|
|
||||||
logger := log.New("hash", tx.Hash())
|
logger := log.New("hash", txHash)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
receipt, err := b.TransactionReceipt(ctx, tx.Hash())
|
receipt, err := b.TransactionReceipt(ctx, txHash)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return receipt, nil
|
return receipt, nil
|
||||||
}
|
}
|
||||||
|
|
@ -56,20 +55,17 @@ func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*ty
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitDeployed waits for a contract deployment transaction and returns the on-chain
|
// WaitDeployed waits for a contract deployment transaction with the provided hash and
|
||||||
// contract address when it is mined. It stops waiting when ctx is canceled.
|
// returns the on-chain contract address when it is mined. It stops waiting when ctx is
|
||||||
func WaitDeployed(ctx context.Context, b DeployBackend, tx *types.Transaction) (common.Address, error) {
|
// canceled.
|
||||||
if tx.To() != nil {
|
func WaitDeployed(ctx context.Context, b DeployBackend, hash common.Hash) (common.Address, error) {
|
||||||
return common.Address{}, errors.New("tx is not contract creation")
|
receipt, err := WaitMined(ctx, b, hash)
|
||||||
}
|
|
||||||
|
|
||||||
receipt, err := WaitMined(ctx, b, tx)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.Address{}, err
|
return common.Address{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if receipt.ContractAddress == (common.Address{}) {
|
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.
|
// Check that code has indeed been deployed at the address.
|
||||||
// This matters on pre-Homestead chains: OOG in the constructor
|
// This matters on pre-Homestead chains: OOG in the constructor
|
||||||
|
|
@ -23,16 +23,14 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/v2"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
|
||||||
|
|
||||||
var waitDeployedTests = map[string]struct {
|
var waitDeployedTests = map[string]struct {
|
||||||
code string
|
code string
|
||||||
gas uint64
|
gas uint64
|
||||||
|
|
@ -79,8 +77,7 @@ func TestWaitDeployed(t *testing.T) {
|
||||||
)
|
)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
address, err = bind.WaitDeployed(ctx, backend, tx)
|
address, err = bind.WaitDeployed(ctx, backend.Client, tx.Hash())
|
||||||
|
|
||||||
close(mined)
|
close(mined)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
@ -128,9 +125,8 @@ func TestWaitDeployedCornerCases(t *testing.T) {
|
||||||
t.Errorf("failed to send transaction: %q", err)
|
t.Errorf("failed to send transaction: %q", err)
|
||||||
}
|
}
|
||||||
backend.Commit()
|
backend.Commit()
|
||||||
notContractCreation := errors.New("tx is not contract creation")
|
if _, err := bind.WaitDeployed(ctx, backend.Client, tx.Hash()); err != bind.ErrNoAddressInReceipt {
|
||||||
if _, err := bind.WaitDeployed(ctx, backend, tx); err.Error() != notContractCreation.Error() {
|
t.Errorf("error mismatch: want %q, got %q, ", bind.ErrNoAddressInReceipt, err)
|
||||||
t.Errorf("error mismatch: want %q, got %q, ", notContractCreation, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a transaction that is not mined.
|
// Create a transaction that is not mined.
|
||||||
|
|
@ -139,7 +135,7 @@ func TestWaitDeployedCornerCases(t *testing.T) {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
contextCanceled := errors.New("context canceled")
|
contextCanceled := errors.New("context canceled")
|
||||||
if _, err := bind.WaitDeployed(ctx, backend, 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)
|
t.Errorf("error mismatch: want %q, got %q, ", contextCanceled, err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
@ -43,7 +43,7 @@ func MakeTopics(query ...[]interface{}) ([][]common.Hash, error) {
|
||||||
case common.Address:
|
case common.Address:
|
||||||
copy(topic[common.HashLength-common.AddressLength:], rule[:])
|
copy(topic[common.HashLength-common.AddressLength:], rule[:])
|
||||||
case *big.Int:
|
case *big.Int:
|
||||||
copy(topic[:], math.U256Bytes(rule))
|
copy(topic[:], math.U256Bytes(new(big.Int).Set(rule)))
|
||||||
case bool:
|
case bool:
|
||||||
if rule {
|
if rule {
|
||||||
topic[common.HashLength-1] = 1
|
topic[common.HashLength-1] = 1
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,23 @@ func TestMakeTopics(t *testing.T) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t.Run("does not mutate big.Int", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
want := [][]common.Hash{{common.HexToHash("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")}}
|
||||||
|
|
||||||
|
in := big.NewInt(-1)
|
||||||
|
got, err := MakeTopics([]interface{}{in})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("makeTopics() error = %v", err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, want) {
|
||||||
|
t.Fatalf("makeTopics() = %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
if orig := big.NewInt(-1); in.Cmp(orig) != 0 {
|
||||||
|
t.Fatalf("makeTopics() mutated an input parameter from %v to %v", orig, in)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type args struct {
|
type args struct {
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,46 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"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
|
// TestUnpack tests the general pack/unpack tests in packing_test.go
|
||||||
func TestUnpack(t *testing.T) {
|
func TestUnpack(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,9 @@ const (
|
||||||
// of starting any background processes such as automatic key derivation.
|
// of starting any background processes such as automatic key derivation.
|
||||||
WalletOpened
|
WalletOpened
|
||||||
|
|
||||||
// WalletDropped
|
// WalletDropped is fired when a wallet is removed or disconnected, either via USB
|
||||||
|
// or due to a filesystem event in the keystore. This event indicates that the wallet
|
||||||
|
// is no longer available for operations.
|
||||||
WalletDropped
|
WalletDropped
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
2
accounts/external/backend.go
vendored
2
accounts/external/backend.go
vendored
|
|
@ -234,7 +234,7 @@ func (api *ExternalSigner) SignTx(account accounts.Account, tx *types.Transactio
|
||||||
switch tx.Type() {
|
switch tx.Type() {
|
||||||
case types.LegacyTxType, types.AccessListTxType:
|
case types.LegacyTxType, types.AccessListTxType:
|
||||||
args.GasPrice = (*hexutil.Big)(tx.GasPrice())
|
args.GasPrice = (*hexutil.Big)(tx.GasPrice())
|
||||||
case types.DynamicFeeTxType, types.BlobTxType:
|
case types.DynamicFeeTxType, types.BlobTxType, types.SetCodeTxType:
|
||||||
args.MaxFeePerGas = (*hexutil.Big)(tx.GasFeeCap())
|
args.MaxFeePerGas = (*hexutil.Big)(tx.GasFeeCap())
|
||||||
args.MaxPriorityFeePerGas = (*hexutil.Big)(tx.GasTipCap())
|
args.MaxPriorityFeePerGas = (*hexutil.Big)(tx.GasTipCap())
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ func NewLedgerHub() (*Hub, error) {
|
||||||
return newHub(LedgerScheme, 0x2c97, []uint16{
|
return newHub(LedgerScheme, 0x2c97, []uint16{
|
||||||
|
|
||||||
// Device definitions taken from
|
// Device definitions taken from
|
||||||
// https://github.com/LedgerHQ/ledger-live/blob/38012bc8899e0f07149ea9cfe7e64b2c146bc92b/libs/ledgerjs/packages/devices/src/index.ts
|
// https://github.com/LedgerHQ/ledger-live/blob/595cb73b7e6622dbbcfc11867082ddc886f1bf01/libs/ledgerjs/packages/devices/src/index.ts
|
||||||
|
|
||||||
// Original product IDs
|
// Original product IDs
|
||||||
0x0000, /* Ledger Blue */
|
0x0000, /* Ledger Blue */
|
||||||
|
|
@ -81,18 +81,14 @@ func NewLedgerHub() (*Hub, error) {
|
||||||
0x0004, /* Ledger Nano X */
|
0x0004, /* Ledger Nano X */
|
||||||
0x0005, /* Ledger Nano S Plus */
|
0x0005, /* Ledger Nano S Plus */
|
||||||
0x0006, /* Ledger Nano FTS */
|
0x0006, /* Ledger Nano FTS */
|
||||||
|
0x0007, /* Ledger Flex */
|
||||||
|
|
||||||
0x0015, /* HID + U2F + WebUSB Ledger Blue */
|
0x0000, /* WebUSB Ledger Blue */
|
||||||
0x1015, /* HID + U2F + WebUSB Ledger Nano S */
|
0x1000, /* WebUSB Ledger Nano S */
|
||||||
0x4015, /* HID + U2F + WebUSB Ledger Nano X */
|
0x4000, /* WebUSB Ledger Nano X */
|
||||||
0x5015, /* HID + U2F + WebUSB Ledger Nano S Plus */
|
0x5000, /* WebUSB Ledger Nano S Plus */
|
||||||
0x6015, /* HID + U2F + WebUSB Ledger Nano FTS */
|
0x6000, /* WebUSB Ledger Nano FTS */
|
||||||
|
0x7000, /* WebUSB Ledger Flex */
|
||||||
0x0011, /* HID + WebUSB Ledger Blue */
|
|
||||||
0x1011, /* HID + WebUSB Ledger Nano S */
|
|
||||||
0x4011, /* HID + WebUSB Ledger Nano X */
|
|
||||||
0x5011, /* HID + WebUSB Ledger Nano S Plus */
|
|
||||||
0x6011, /* HID + WebUSB Ledger Nano FTS */
|
|
||||||
}, 0xffa0, 0, newLedgerDriver)
|
}, 0xffa0, 0, newLedgerDriver)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -190,8 +186,11 @@ func (hub *Hub) refreshWallets() {
|
||||||
|
|
||||||
for _, info := range infos {
|
for _, info := range infos {
|
||||||
for _, id := range hub.productIDs {
|
for _, id := range hub.productIDs {
|
||||||
|
// We check both the raw ProductID (legacy) and just the upper byte, as Ledger
|
||||||
|
// uses `MMII`, encoding a model (MM) and an interface bitfield (II)
|
||||||
|
mmOnly := info.ProductID & 0xff00
|
||||||
// Windows and Macos use UsageID matching, Linux uses Interface matching
|
// Windows and Macos use UsageID matching, Linux uses Interface matching
|
||||||
if info.ProductID == id && (info.UsagePage == hub.usageID || info.Interface == hub.endpointID) {
|
if (info.ProductID == id || mmOnly == id) && (info.UsagePage == hub.usageID || info.Interface == hub.endpointID) {
|
||||||
devices = append(devices, info)
|
devices = append(devices, info)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@ for:
|
||||||
- image: Ubuntu
|
- image: Ubuntu
|
||||||
build_script:
|
build_script:
|
||||||
- go run build/ci.go lint
|
- go run build/ci.go lint
|
||||||
- go run build/ci.go check_tidy
|
|
||||||
- go run build/ci.go check_generate
|
- go run build/ci.go check_generate
|
||||||
- go run build/ci.go check_baddeps
|
- go run build/ci.go check_baddeps
|
||||||
- go run build/ci.go install -dlgo
|
- go run build/ci.go install -dlgo
|
||||||
|
|
|
||||||
|
|
@ -156,8 +156,9 @@ func (s *beaconBlockSync) updateEventFeed() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.chainHeadFeed.Send(types.ChainHeadEvent{
|
s.chainHeadFeed.Send(types.ChainHeadEvent{
|
||||||
BeaconHead: optimistic.Attested.Header,
|
BeaconHead: optimistic.Attested.Header,
|
||||||
Block: execBlock,
|
Block: execBlock,
|
||||||
Finalized: finalizedHash,
|
ExecRequests: headBlock.ExecutionRequestsList(),
|
||||||
|
Finalized: finalizedHash,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,11 @@ func (ec *engineClient) callNewPayload(fork string, event types.ChainHeadEvent)
|
||||||
params = []any{execData}
|
params = []any{execData}
|
||||||
)
|
)
|
||||||
switch fork {
|
switch fork {
|
||||||
|
case "electra":
|
||||||
|
method = "engine_newPayloadV4"
|
||||||
|
parentBeaconRoot := event.BeaconHead.ParentRoot
|
||||||
|
blobHashes := collectBlobHashes(event.Block)
|
||||||
|
params = append(params, blobHashes, parentBeaconRoot, event.ExecRequests)
|
||||||
case "deneb":
|
case "deneb":
|
||||||
method = "engine_newPayloadV3"
|
method = "engine_newPayloadV3"
|
||||||
parentBeaconRoot := event.BeaconHead.ParentRoot
|
parentBeaconRoot := event.BeaconHead.ParentRoot
|
||||||
|
|
@ -135,7 +140,7 @@ func (ec *engineClient) callForkchoiceUpdated(fork string, event types.ChainHead
|
||||||
|
|
||||||
var method string
|
var method string
|
||||||
switch fork {
|
switch fork {
|
||||||
case "deneb":
|
case "deneb", "electra":
|
||||||
method = "engine_forkchoiceUpdatedV3"
|
method = "engine_forkchoiceUpdatedV3"
|
||||||
case "capella":
|
case "capella":
|
||||||
method = "engine_forkchoiceUpdatedV2"
|
method = "engine_forkchoiceUpdatedV2"
|
||||||
|
|
|
||||||
|
|
@ -270,15 +270,7 @@ func ExecutableDataToBlockNoHash(data ExecutableData, versionedHashes []common.H
|
||||||
|
|
||||||
var requestsHash *common.Hash
|
var requestsHash *common.Hash
|
||||||
if requests != nil {
|
if requests != nil {
|
||||||
// Put back request type byte.
|
h := types.CalcRequestsHash(requests)
|
||||||
typedRequests := make([][]byte, len(requests))
|
|
||||||
for i, reqdata := range requests {
|
|
||||||
typedReqdata := make([]byte, len(reqdata)+1)
|
|
||||||
typedReqdata[0] = byte(i)
|
|
||||||
copy(typedReqdata[1:], reqdata)
|
|
||||||
typedRequests[i] = typedReqdata
|
|
||||||
}
|
|
||||||
h := types.CalcRequestsHash(typedRequests)
|
|
||||||
requestsHash = &h
|
requestsHash = &h
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -348,20 +340,11 @@ func BlockToExecutableData(block *types.Block, fees *big.Int, sidecars []*types.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove type byte in requests.
|
|
||||||
var plainRequests [][]byte
|
|
||||||
if requests != nil {
|
|
||||||
plainRequests = make([][]byte, len(requests))
|
|
||||||
for i, reqdata := range requests {
|
|
||||||
plainRequests[i] = reqdata[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &ExecutionPayloadEnvelope{
|
return &ExecutionPayloadEnvelope{
|
||||||
ExecutionPayload: data,
|
ExecutionPayload: data,
|
||||||
BlockValue: fees,
|
BlockValue: fees,
|
||||||
BlobsBundle: &bundle,
|
BlobsBundle: &bundle,
|
||||||
Requests: plainRequests,
|
Requests: requests,
|
||||||
Override: false,
|
Override: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,6 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
type CommitteeUpdate struct {
|
type CommitteeUpdate struct {
|
||||||
Version string
|
|
||||||
Update types.LightClientUpdate
|
Update types.LightClientUpdate
|
||||||
NextSyncCommittee types.SerializedSyncCommittee
|
NextSyncCommittee types.SerializedSyncCommittee
|
||||||
}
|
}
|
||||||
|
|
@ -81,9 +80,9 @@ func (u *CommitteeUpdate) UnmarshalJSON(input []byte) error {
|
||||||
if err := json.Unmarshal(input, &dec); err != nil {
|
if err := json.Unmarshal(input, &dec); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
u.Version = dec.Version
|
|
||||||
u.NextSyncCommittee = dec.Data.NextSyncCommittee
|
u.NextSyncCommittee = dec.Data.NextSyncCommittee
|
||||||
u.Update = types.LightClientUpdate{
|
u.Update = types.LightClientUpdate{
|
||||||
|
Version: dec.Version,
|
||||||
AttestedHeader: types.SignedHeader{
|
AttestedHeader: types.SignedHeader{
|
||||||
Header: dec.Data.Header.Beacon,
|
Header: dec.Data.Header.Beacon,
|
||||||
Signature: dec.Data.SyncAggregate,
|
Signature: dec.Data.SyncAggregate,
|
||||||
|
|
@ -206,7 +205,7 @@ func (api *BeaconLightApi) GetOptimisticUpdate() (types.OptimisticUpdate, error)
|
||||||
|
|
||||||
func decodeOptimisticUpdate(enc []byte) (types.OptimisticUpdate, error) {
|
func decodeOptimisticUpdate(enc []byte) (types.OptimisticUpdate, error) {
|
||||||
var data struct {
|
var data struct {
|
||||||
Version string
|
Version string `json:"version"`
|
||||||
Data struct {
|
Data struct {
|
||||||
Attested jsonHeaderWithExecProof `json:"attested_header"`
|
Attested jsonHeaderWithExecProof `json:"attested_header"`
|
||||||
Aggregate types.SyncAggregate `json:"sync_aggregate"`
|
Aggregate types.SyncAggregate `json:"sync_aggregate"`
|
||||||
|
|
@ -259,7 +258,7 @@ func (api *BeaconLightApi) GetFinalityUpdate() (types.FinalityUpdate, error) {
|
||||||
|
|
||||||
func decodeFinalityUpdate(enc []byte) (types.FinalityUpdate, error) {
|
func decodeFinalityUpdate(enc []byte) (types.FinalityUpdate, error) {
|
||||||
var data struct {
|
var data struct {
|
||||||
Version string
|
Version string `json:"version"`
|
||||||
Data struct {
|
Data struct {
|
||||||
Attested jsonHeaderWithExecProof `json:"attested_header"`
|
Attested jsonHeaderWithExecProof `json:"attested_header"`
|
||||||
Finalized jsonHeaderWithExecProof `json:"finalized_header"`
|
Finalized jsonHeaderWithExecProof `json:"finalized_header"`
|
||||||
|
|
@ -289,6 +288,7 @@ func decodeFinalityUpdate(enc []byte) (types.FinalityUpdate, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return types.FinalityUpdate{
|
return types.FinalityUpdate{
|
||||||
|
Version: data.Version,
|
||||||
Attested: types.HeaderWithExecProof{
|
Attested: types.HeaderWithExecProof{
|
||||||
Header: data.Data.Attested.Beacon,
|
Header: data.Data.Attested.Beacon,
|
||||||
PayloadHeader: attestedExecHeader,
|
PayloadHeader: attestedExecHeader,
|
||||||
|
|
@ -355,7 +355,8 @@ func (api *BeaconLightApi) GetCheckpointData(checkpointHash common.Hash) (*types
|
||||||
// See data structure definition here:
|
// See data structure definition here:
|
||||||
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientbootstrap
|
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientbootstrap
|
||||||
type bootstrapData struct {
|
type bootstrapData struct {
|
||||||
Data struct {
|
Version string `json:"version"`
|
||||||
|
Data struct {
|
||||||
Header jsonBeaconHeader `json:"header"`
|
Header jsonBeaconHeader `json:"header"`
|
||||||
Committee *types.SerializedSyncCommittee `json:"current_sync_committee"`
|
Committee *types.SerializedSyncCommittee `json:"current_sync_committee"`
|
||||||
CommitteeBranch merkle.Values `json:"current_sync_committee_branch"`
|
CommitteeBranch merkle.Values `json:"current_sync_committee_branch"`
|
||||||
|
|
@ -374,6 +375,7 @@ func (api *BeaconLightApi) GetCheckpointData(checkpointHash common.Hash) (*types
|
||||||
return nil, fmt.Errorf("invalid checkpoint block header, have %v want %v", header.Hash(), checkpointHash)
|
return nil, fmt.Errorf("invalid checkpoint block header, have %v want %v", header.Hash(), checkpointHash)
|
||||||
}
|
}
|
||||||
checkpoint := &types.BootstrapData{
|
checkpoint := &types.BootstrapData{
|
||||||
|
Version: data.Version,
|
||||||
Header: header,
|
Header: header,
|
||||||
CommitteeBranch: data.Data.CommitteeBranch,
|
CommitteeBranch: data.Data.CommitteeBranch,
|
||||||
CommitteeRoot: data.Data.Committee.Root(),
|
CommitteeRoot: data.Data.Committee.Root(),
|
||||||
|
|
@ -395,7 +397,7 @@ func (api *BeaconLightApi) GetBeaconBlock(blockRoot common.Hash) (*types.BeaconB
|
||||||
}
|
}
|
||||||
|
|
||||||
var beaconBlockMessage struct {
|
var beaconBlockMessage struct {
|
||||||
Version string
|
Version string `json:"version"`
|
||||||
Data struct {
|
Data struct {
|
||||||
Message json.RawMessage `json:"message"`
|
Message json.RawMessage `json:"message"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2023 The go-ethereum Authors
|
// Copyright 2024 The go-ethereum Authors
|
||||||
// This file is part of the go-ethereum library.
|
// This file is part of the go-ethereum library.
|
||||||
//
|
//
|
||||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||||
|
|
|
||||||
|
|
@ -39,10 +39,10 @@ func GenerateTestUpdate(config *params.ChainConfig, period uint64, committee, ne
|
||||||
var attestedHeader types.Header
|
var attestedHeader types.Header
|
||||||
if finalizedHeader {
|
if finalizedHeader {
|
||||||
update.FinalizedHeader = new(types.Header)
|
update.FinalizedHeader = new(types.Header)
|
||||||
*update.FinalizedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+100, params.StateIndexNextSyncCommittee, merkle.Value(update.NextSyncCommitteeRoot))
|
*update.FinalizedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+100, params.StateIndexNextSyncCommittee(""), merkle.Value(update.NextSyncCommitteeRoot))
|
||||||
attestedHeader, update.FinalityBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexFinalBlock, merkle.Value(update.FinalizedHeader.Hash()))
|
attestedHeader, update.FinalityBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexFinalBlock(""), merkle.Value(update.FinalizedHeader.Hash()))
|
||||||
} else {
|
} else {
|
||||||
attestedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+2000, params.StateIndexNextSyncCommittee, merkle.Value(update.NextSyncCommitteeRoot))
|
attestedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+2000, params.StateIndexNextSyncCommittee(""), merkle.Value(update.NextSyncCommitteeRoot))
|
||||||
}
|
}
|
||||||
update.AttestedHeader = GenerateTestSignedHeader(attestedHeader, config, committee, attestedHeader.Slot+1, signerCount)
|
update.AttestedHeader = GenerateTestSignedHeader(attestedHeader, config, committee, attestedHeader.Slot+1, signerCount)
|
||||||
return update
|
return update
|
||||||
|
|
@ -63,7 +63,7 @@ func GenerateTestSignedHeader(header types.Header, config *params.ChainConfig, c
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateTestCheckpoint(period uint64, committee *types.SerializedSyncCommittee) *types.BootstrapData {
|
func GenerateTestCheckpoint(period uint64, committee *types.SerializedSyncCommittee) *types.BootstrapData {
|
||||||
header, branch := makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexSyncCommittee, merkle.Value(committee.Root()))
|
header, branch := makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexSyncCommittee(""), merkle.Value(committee.Root()))
|
||||||
return &types.BootstrapData{
|
return &types.BootstrapData{
|
||||||
Header: header,
|
Header: header,
|
||||||
Committee: committee,
|
Committee: committee,
|
||||||
|
|
|
||||||
1
beacon/params/checkpoint_holesky.hex
Normal file
1
beacon/params/checkpoint_holesky.hex
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0xf5606a019f0f1006e9ec2070695045f4334450362a48da4c5965314510e0b4c3
|
||||||
1
beacon/params/checkpoint_mainnet.hex
Normal file
1
beacon/params/checkpoint_mainnet.hex
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0x3c0cb4aa83beded1803d262664ba4392b1023f334d9cca02dc3a6925987ebe91
|
||||||
1
beacon/params/checkpoint_sepolia.hex
Normal file
1
beacon/params/checkpoint_sepolia.hex
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
0xa8d56457aa414523d93659aef1f7409bbfb72ad75e94d917c8c0b1baa38153ef
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2016 The go-ethereum Authors
|
// Copyright 2024 The go-ethereum Authors
|
||||||
// This file is part of the go-ethereum library.
|
// This file is part of the go-ethereum library.
|
||||||
//
|
//
|
||||||
// The go-ethereum library is free software: you can redistribute it and/or modify
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||||
|
|
@ -17,14 +17,25 @@
|
||||||
package params
|
package params
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
_ "embed"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"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 (
|
var (
|
||||||
MainnetLightConfig = (&ChainConfig{
|
MainnetLightConfig = (&ChainConfig{
|
||||||
GenesisValidatorsRoot: common.HexToHash("0x4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95"),
|
GenesisValidatorsRoot: common.HexToHash("0x4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95"),
|
||||||
GenesisTime: 1606824023,
|
GenesisTime: 1606824023,
|
||||||
Checkpoint: common.HexToHash("0x6509b691f4de4f7b083f2784938fd52f0e131675432b3fd85ea549af9aebd3d0"),
|
Checkpoint: common.HexToHash(checkpointMainnet),
|
||||||
}).
|
}).
|
||||||
AddFork("GENESIS", 0, []byte{0, 0, 0, 0}).
|
AddFork("GENESIS", 0, []byte{0, 0, 0, 0}).
|
||||||
AddFork("ALTAIR", 74240, []byte{1, 0, 0, 0}).
|
AddFork("ALTAIR", 74240, []byte{1, 0, 0, 0}).
|
||||||
|
|
@ -35,22 +46,37 @@ var (
|
||||||
SepoliaLightConfig = (&ChainConfig{
|
SepoliaLightConfig = (&ChainConfig{
|
||||||
GenesisValidatorsRoot: common.HexToHash("0xd8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078"),
|
GenesisValidatorsRoot: common.HexToHash("0xd8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078"),
|
||||||
GenesisTime: 1655733600,
|
GenesisTime: 1655733600,
|
||||||
Checkpoint: common.HexToHash("0x456e85f5608afab3465a0580bff8572255f6d97af0c5f939e3f7536b5edb2d3f"),
|
Checkpoint: common.HexToHash(checkpointSepolia),
|
||||||
}).
|
}).
|
||||||
AddFork("GENESIS", 0, []byte{144, 0, 0, 105}).
|
AddFork("GENESIS", 0, []byte{144, 0, 0, 105}).
|
||||||
AddFork("ALTAIR", 50, []byte{144, 0, 0, 112}).
|
AddFork("ALTAIR", 50, []byte{144, 0, 0, 112}).
|
||||||
AddFork("BELLATRIX", 100, []byte{144, 0, 0, 113}).
|
AddFork("BELLATRIX", 100, []byte{144, 0, 0, 113}).
|
||||||
AddFork("CAPELLA", 56832, []byte{144, 0, 0, 114}).
|
AddFork("CAPELLA", 56832, []byte{144, 0, 0, 114}).
|
||||||
AddFork("DENEB", 132608, []byte{144, 0, 0, 115})
|
AddFork("DENEB", 132608, []byte{144, 0, 0, 115}).
|
||||||
|
AddFork("ELECTRA", 222464, []byte{144, 0, 0, 116})
|
||||||
|
|
||||||
HoleskyLightConfig = (&ChainConfig{
|
HoleskyLightConfig = (&ChainConfig{
|
||||||
GenesisValidatorsRoot: common.HexToHash("0x9143aa7c615a7f7115e2b6aac319c03529df8242ae705fba9df39b79c59fa8b1"),
|
GenesisValidatorsRoot: common.HexToHash("0x9143aa7c615a7f7115e2b6aac319c03529df8242ae705fba9df39b79c59fa8b1"),
|
||||||
GenesisTime: 1695902400,
|
GenesisTime: 1695902400,
|
||||||
Checkpoint: common.HexToHash("0x6456a1317f54d4b4f2cb5bc9d153b5af0988fe767ef0609f0236cf29030bcff7"),
|
Checkpoint: common.HexToHash(checkpointHolesky),
|
||||||
}).
|
}).
|
||||||
AddFork("GENESIS", 0, []byte{1, 1, 112, 0}).
|
AddFork("GENESIS", 0, []byte{1, 1, 112, 0}).
|
||||||
AddFork("ALTAIR", 0, []byte{2, 1, 112, 0}).
|
AddFork("ALTAIR", 0, []byte{2, 1, 112, 0}).
|
||||||
AddFork("BELLATRIX", 0, []byte{3, 1, 112, 0}).
|
AddFork("BELLATRIX", 0, []byte{3, 1, 112, 0}).
|
||||||
AddFork("CAPELLA", 256, []byte{4, 1, 112, 0}).
|
AddFork("CAPELLA", 256, []byte{4, 1, 112, 0}).
|
||||||
AddFork("DENEB", 29696, []byte{5, 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"))
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -29,18 +29,46 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
StateIndexGenesisTime = 32
|
StateIndexGenesisTime = 32
|
||||||
StateIndexGenesisValidators = 33
|
StateIndexGenesisValidators = 33
|
||||||
StateIndexForkVersion = 141
|
StateIndexForkVersion = 141
|
||||||
StateIndexLatestHeader = 36
|
StateIndexLatestHeader = 36
|
||||||
StateIndexBlockRoots = 37
|
StateIndexBlockRoots = 37
|
||||||
StateIndexStateRoots = 38
|
StateIndexStateRoots = 38
|
||||||
StateIndexHistoricRoots = 39
|
StateIndexHistoricRoots = 39
|
||||||
StateIndexFinalBlock = 105
|
StateIndexFinalBlockOld = 105
|
||||||
StateIndexSyncCommittee = 54
|
StateIndexFinalBlockElectra = 169
|
||||||
StateIndexNextSyncCommittee = 55
|
StateIndexSyncCommitteeOld = 54
|
||||||
StateIndexExecPayload = 56
|
StateIndexSyncCommitteeElectra = 86
|
||||||
StateIndexExecHead = 908
|
StateIndexNextSyncCommitteeOld = 55
|
||||||
|
StateIndexNextSyncCommitteeElectra = 87
|
||||||
|
StateIndexExecPayload = 56
|
||||||
|
StateIndexExecHead = 908
|
||||||
|
|
||||||
BodyIndexExecPayload = 25
|
BodyIndexExecPayload = 25
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func StateIndexFinalBlock(forkName string) uint64 {
|
||||||
|
switch forkName {
|
||||||
|
case "bellatrix", "capella", "deneb":
|
||||||
|
return StateIndexFinalBlockOld
|
||||||
|
default:
|
||||||
|
return StateIndexFinalBlockElectra
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func StateIndexSyncCommittee(forkName string) uint64 {
|
||||||
|
switch forkName {
|
||||||
|
case "bellatrix", "capella", "deneb":
|
||||||
|
return StateIndexSyncCommitteeOld
|
||||||
|
default:
|
||||||
|
return StateIndexSyncCommitteeElectra
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func StateIndexNextSyncCommittee(forkName string) uint64 {
|
||||||
|
switch forkName {
|
||||||
|
case "bellatrix", "capella", "deneb":
|
||||||
|
return StateIndexNextSyncCommitteeOld
|
||||||
|
default:
|
||||||
|
return StateIndexNextSyncCommitteeElectra
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,16 +17,21 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/protolambda/zrnt/eth2/beacon/capella"
|
|
||||||
zrntcommon "github.com/protolambda/zrnt/eth2/beacon/common"
|
zrntcommon "github.com/protolambda/zrnt/eth2/beacon/common"
|
||||||
"github.com/protolambda/zrnt/eth2/beacon/deneb"
|
|
||||||
"github.com/protolambda/zrnt/eth2/configs"
|
"github.com/protolambda/zrnt/eth2/configs"
|
||||||
|
"github.com/protolambda/ztyp/codec"
|
||||||
"github.com/protolambda/ztyp/tree"
|
"github.com/protolambda/ztyp/tree"
|
||||||
|
|
||||||
|
// beacon forks
|
||||||
|
"github.com/protolambda/zrnt/eth2/beacon/capella"
|
||||||
|
"github.com/protolambda/zrnt/eth2/beacon/deneb"
|
||||||
|
"github.com/protolambda/zrnt/eth2/beacon/electra"
|
||||||
)
|
)
|
||||||
|
|
||||||
type blockObject interface {
|
type blockObject interface {
|
||||||
|
|
@ -43,10 +48,12 @@ type BeaconBlock struct {
|
||||||
func BlockFromJSON(forkName string, data []byte) (*BeaconBlock, error) {
|
func BlockFromJSON(forkName string, data []byte) (*BeaconBlock, error) {
|
||||||
var obj blockObject
|
var obj blockObject
|
||||||
switch forkName {
|
switch forkName {
|
||||||
case "deneb":
|
|
||||||
obj = new(deneb.BeaconBlock)
|
|
||||||
case "capella":
|
case "capella":
|
||||||
obj = new(capella.BeaconBlock)
|
obj = new(capella.BeaconBlock)
|
||||||
|
case "deneb":
|
||||||
|
obj = new(deneb.BeaconBlock)
|
||||||
|
case "electra":
|
||||||
|
obj = new(electra.BeaconBlock)
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unsupported fork: %s", forkName)
|
return nil, fmt.Errorf("unsupported fork: %s", forkName)
|
||||||
}
|
}
|
||||||
|
|
@ -63,6 +70,8 @@ func NewBeaconBlock(obj blockObject) *BeaconBlock {
|
||||||
return &BeaconBlock{obj}
|
return &BeaconBlock{obj}
|
||||||
case *deneb.BeaconBlock:
|
case *deneb.BeaconBlock:
|
||||||
return &BeaconBlock{obj}
|
return &BeaconBlock{obj}
|
||||||
|
case *electra.BeaconBlock:
|
||||||
|
return &BeaconBlock{obj}
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("unsupported block type %T", obj))
|
panic(fmt.Errorf("unsupported block type %T", obj))
|
||||||
}
|
}
|
||||||
|
|
@ -75,6 +84,8 @@ func (b *BeaconBlock) Slot() uint64 {
|
||||||
return uint64(obj.Slot)
|
return uint64(obj.Slot)
|
||||||
case *deneb.BeaconBlock:
|
case *deneb.BeaconBlock:
|
||||||
return uint64(obj.Slot)
|
return uint64(obj.Slot)
|
||||||
|
case *electra.BeaconBlock:
|
||||||
|
return uint64(obj.Slot)
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("unsupported block type %T", b.blockObj))
|
panic(fmt.Errorf("unsupported block type %T", b.blockObj))
|
||||||
}
|
}
|
||||||
|
|
@ -84,9 +95,12 @@ func (b *BeaconBlock) Slot() uint64 {
|
||||||
func (b *BeaconBlock) ExecutionPayload() (*types.Block, error) {
|
func (b *BeaconBlock) ExecutionPayload() (*types.Block, error) {
|
||||||
switch obj := b.blockObj.(type) {
|
switch obj := b.blockObj.(type) {
|
||||||
case *capella.BeaconBlock:
|
case *capella.BeaconBlock:
|
||||||
return convertPayload(&obj.Body.ExecutionPayload, &obj.ParentRoot)
|
return convertPayload(&obj.Body.ExecutionPayload, &obj.ParentRoot, nil)
|
||||||
case *deneb.BeaconBlock:
|
case *deneb.BeaconBlock:
|
||||||
return convertPayload(&obj.Body.ExecutionPayload, &obj.ParentRoot)
|
return convertPayload(&obj.Body.ExecutionPayload, &obj.ParentRoot, nil)
|
||||||
|
case *electra.BeaconBlock:
|
||||||
|
requests := b.ExecutionRequestsList()
|
||||||
|
return convertPayload(&obj.Body.ExecutionPayload, &obj.ParentRoot, requests)
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("unsupported block type %T", b.blockObj))
|
panic(fmt.Errorf("unsupported block type %T", b.blockObj))
|
||||||
}
|
}
|
||||||
|
|
@ -99,6 +113,8 @@ func (b *BeaconBlock) Header() Header {
|
||||||
return headerFromZRNT(obj.Header(configs.Mainnet))
|
return headerFromZRNT(obj.Header(configs.Mainnet))
|
||||||
case *deneb.BeaconBlock:
|
case *deneb.BeaconBlock:
|
||||||
return headerFromZRNT(obj.Header(configs.Mainnet))
|
return headerFromZRNT(obj.Header(configs.Mainnet))
|
||||||
|
case *electra.BeaconBlock:
|
||||||
|
return headerFromZRNT(obj.Header(configs.Mainnet))
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("unsupported block type %T", b.blockObj))
|
panic(fmt.Errorf("unsupported block type %T", b.blockObj))
|
||||||
}
|
}
|
||||||
|
|
@ -108,3 +124,38 @@ func (b *BeaconBlock) Header() Header {
|
||||||
func (b *BeaconBlock) Root() common.Hash {
|
func (b *BeaconBlock) Root() common.Hash {
|
||||||
return common.Hash(b.blockObj.HashTreeRoot(configs.Mainnet, tree.GetHashFn()))
|
return common.Hash(b.blockObj.HashTreeRoot(configs.Mainnet, tree.GetHashFn()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExecutionRequestsList returns the execution layer requests of the block.
|
||||||
|
func (b *BeaconBlock) ExecutionRequestsList() [][]byte {
|
||||||
|
switch obj := b.blockObj.(type) {
|
||||||
|
case *capella.BeaconBlock, *deneb.BeaconBlock:
|
||||||
|
return nil
|
||||||
|
case *electra.BeaconBlock:
|
||||||
|
r := obj.Body.ExecutionRequests
|
||||||
|
return marshalRequests(configs.Mainnet,
|
||||||
|
&r.Deposits,
|
||||||
|
&r.Withdrawals,
|
||||||
|
&r.Consolidations,
|
||||||
|
)
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("unsupported block type %T", b.blockObj))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func marshalRequests(spec *zrntcommon.Spec, items ...zrntcommon.SpecObj) (list [][]byte) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
list = [][]byte{}
|
||||||
|
for typ, data := range items {
|
||||||
|
buf.Reset()
|
||||||
|
buf.WriteByte(byte(typ))
|
||||||
|
w := codec.NewEncodingWriter(&buf)
|
||||||
|
if err := data.Serialize(spec, w); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if buf.Len() == 1 {
|
||||||
|
continue // skip empty requests
|
||||||
|
}
|
||||||
|
list = append(list, bytes.Clone(buf.Bytes()))
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,27 @@ func TestBlockFromJSON(t *testing.T) {
|
||||||
wantBlockHash common.Hash
|
wantBlockHash common.Hash
|
||||||
}
|
}
|
||||||
tests := []blocktest{
|
tests := []blocktest{
|
||||||
|
{
|
||||||
|
file: "block_electra_withdrawals.json",
|
||||||
|
version: "electra",
|
||||||
|
wantSlot: 151850,
|
||||||
|
wantBlockNumber: 141654,
|
||||||
|
wantBlockHash: common.HexToHash("0xf6730485a38be5ada3e110990a2c7adaabd2e8d4a49782134f1a8bfbc246a5d7"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
file: "block_electra_deposits.json",
|
||||||
|
version: "electra",
|
||||||
|
wantSlot: 151016,
|
||||||
|
wantBlockNumber: 140858,
|
||||||
|
wantBlockHash: common.HexToHash("0x1f2637170986346c7993d5adbadbebbf4c9ed89c6a4d2dff653db99c8c168076"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
file: "block_electra_consolidations.json",
|
||||||
|
version: "electra",
|
||||||
|
wantSlot: 151717,
|
||||||
|
wantBlockNumber: 141529,
|
||||||
|
wantBlockHash: common.HexToHash("0xc8807f7a1f96b0a073ff27065776dd21eff6b7e64079c60bffd33f690efbb330"),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
file: "block_deneb.json",
|
file: "block_deneb.json",
|
||||||
version: "deneb",
|
version: "deneb",
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,12 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/beacon/merkle"
|
"github.com/ethereum/go-ethereum/beacon/merkle"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/protolambda/zrnt/eth2/beacon/capella"
|
|
||||||
zrntcommon "github.com/protolambda/zrnt/eth2/beacon/common"
|
zrntcommon "github.com/protolambda/zrnt/eth2/beacon/common"
|
||||||
"github.com/protolambda/zrnt/eth2/beacon/deneb"
|
|
||||||
"github.com/protolambda/ztyp/tree"
|
"github.com/protolambda/ztyp/tree"
|
||||||
|
|
||||||
|
// beacon chain forks
|
||||||
|
"github.com/protolambda/zrnt/eth2/beacon/capella"
|
||||||
|
"github.com/protolambda/zrnt/eth2/beacon/deneb"
|
||||||
)
|
)
|
||||||
|
|
||||||
type headerObject interface {
|
type headerObject interface {
|
||||||
|
|
@ -43,7 +45,7 @@ func ExecutionHeaderFromJSON(forkName string, data []byte) (*ExecutionHeader, er
|
||||||
switch forkName {
|
switch forkName {
|
||||||
case "capella":
|
case "capella":
|
||||||
obj = new(capella.ExecutionPayloadHeader)
|
obj = new(capella.ExecutionPayloadHeader)
|
||||||
case "deneb":
|
case "deneb", "electra": // note: the payload type was not changed in electra
|
||||||
obj = new(deneb.ExecutionPayloadHeader)
|
obj = new(deneb.ExecutionPayloadHeader)
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unsupported fork: %s", forkName)
|
return nil, fmt.Errorf("unsupported fork: %s", forkName)
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ type payloadType interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertPayload converts a beacon chain execution payload to types.Block.
|
// convertPayload converts a beacon chain execution payload to types.Block.
|
||||||
func convertPayload[T payloadType](payload T, parentRoot *zrntcommon.Root) (*types.Block, error) {
|
func convertPayload[T payloadType](payload T, parentRoot *zrntcommon.Root, requests [][]byte) (*types.Block, error) {
|
||||||
var (
|
var (
|
||||||
header types.Header
|
header types.Header
|
||||||
transactions []*types.Transaction
|
transactions []*types.Transaction
|
||||||
|
|
@ -62,7 +62,10 @@ func convertPayload[T payloadType](payload T, parentRoot *zrntcommon.Root) (*typ
|
||||||
default:
|
default:
|
||||||
panic("unsupported block type")
|
panic("unsupported block type")
|
||||||
}
|
}
|
||||||
|
if requests != nil {
|
||||||
|
reqHash := types.CalcRequestsHash(requests)
|
||||||
|
header.RequestsHash = &reqHash
|
||||||
|
}
|
||||||
block := types.NewBlockWithHeader(&header).WithBody(types.Body{Transactions: transactions, Withdrawals: withdrawals})
|
block := types.NewBlockWithHeader(&header).WithBody(types.Body{Transactions: transactions, Withdrawals: withdrawals})
|
||||||
if hash := block.Hash(); hash != expectedHash {
|
if hash := block.Hash(); hash != expectedHash {
|
||||||
return nil, fmt.Errorf("sanity check failed, payload hash does not match (expected %x, got %x)", expectedHash, hash)
|
return nil, fmt.Errorf("sanity check failed, payload hash does not match (expected %x, got %x)", expectedHash, hash)
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ type HeadInfo struct {
|
||||||
// together with a proof through a beacon header and corresponding state.
|
// together with a proof through a beacon header and corresponding state.
|
||||||
// Note: BootstrapData is fetched from a server based on a known checkpoint hash.
|
// Note: BootstrapData is fetched from a server based on a known checkpoint hash.
|
||||||
type BootstrapData struct {
|
type BootstrapData struct {
|
||||||
|
Version string
|
||||||
Header Header
|
Header Header
|
||||||
CommitteeRoot common.Hash
|
CommitteeRoot common.Hash
|
||||||
Committee *SerializedSyncCommittee `rlp:"-"`
|
Committee *SerializedSyncCommittee `rlp:"-"`
|
||||||
|
|
@ -47,7 +48,7 @@ func (c *BootstrapData) Validate() error {
|
||||||
if c.CommitteeRoot != c.Committee.Root() {
|
if c.CommitteeRoot != c.Committee.Root() {
|
||||||
return errors.New("wrong committee root")
|
return errors.New("wrong committee root")
|
||||||
}
|
}
|
||||||
return merkle.VerifyProof(c.Header.StateRoot, params.StateIndexSyncCommittee, c.CommitteeBranch, merkle.Value(c.CommitteeRoot))
|
return merkle.VerifyProof(c.Header.StateRoot, params.StateIndexSyncCommittee(c.Version), c.CommitteeBranch, merkle.Value(c.CommitteeRoot))
|
||||||
}
|
}
|
||||||
|
|
||||||
// LightClientUpdate is a proof of the next sync committee root based on a header
|
// LightClientUpdate is a proof of the next sync committee root based on a header
|
||||||
|
|
@ -59,6 +60,7 @@ func (c *BootstrapData) Validate() error {
|
||||||
// See data structure definition here:
|
// See data structure definition here:
|
||||||
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientupdate
|
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientupdate
|
||||||
type LightClientUpdate struct {
|
type LightClientUpdate struct {
|
||||||
|
Version string
|
||||||
AttestedHeader SignedHeader // Arbitrary header out of the period signed by the sync committee
|
AttestedHeader SignedHeader // Arbitrary header out of the period signed by the sync committee
|
||||||
NextSyncCommitteeRoot common.Hash // Sync committee of the next period advertised in the current one
|
NextSyncCommitteeRoot common.Hash // Sync committee of the next period advertised in the current one
|
||||||
NextSyncCommitteeBranch merkle.Values // Proof for the next period's sync committee
|
NextSyncCommitteeBranch merkle.Values // Proof for the next period's sync committee
|
||||||
|
|
@ -79,11 +81,11 @@ func (update *LightClientUpdate) Validate() error {
|
||||||
if update.FinalizedHeader.SyncPeriod() != period {
|
if update.FinalizedHeader.SyncPeriod() != period {
|
||||||
return errors.New("finalized header is from different period")
|
return errors.New("finalized header is from different period")
|
||||||
}
|
}
|
||||||
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexFinalBlock, update.FinalityBranch, merkle.Value(update.FinalizedHeader.Hash())); err != nil {
|
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexFinalBlock(update.Version), update.FinalityBranch, merkle.Value(update.FinalizedHeader.Hash())); err != nil {
|
||||||
return fmt.Errorf("invalid finalized header proof: %w", err)
|
return fmt.Errorf("invalid finalized header proof: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexNextSyncCommittee, update.NextSyncCommitteeBranch, merkle.Value(update.NextSyncCommitteeRoot)); err != nil {
|
if err := merkle.VerifyProof(update.AttestedHeader.Header.StateRoot, params.StateIndexNextSyncCommittee(update.Version), update.NextSyncCommitteeBranch, merkle.Value(update.NextSyncCommitteeRoot)); err != nil {
|
||||||
return fmt.Errorf("invalid next sync committee proof: %w", err)
|
return fmt.Errorf("invalid next sync committee proof: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -194,6 +196,7 @@ func (u *OptimisticUpdate) Validate() error {
|
||||||
// See data structure definition here:
|
// See data structure definition here:
|
||||||
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientfinalityupdate
|
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/sync-protocol.md#lightclientfinalityupdate
|
||||||
type FinalityUpdate struct {
|
type FinalityUpdate struct {
|
||||||
|
Version string
|
||||||
Attested, Finalized HeaderWithExecProof
|
Attested, Finalized HeaderWithExecProof
|
||||||
FinalityBranch merkle.Values
|
FinalityBranch merkle.Values
|
||||||
// Sync committee BLS signature aggregate
|
// Sync committee BLS signature aggregate
|
||||||
|
|
@ -223,14 +226,15 @@ func (u *FinalityUpdate) Validate() error {
|
||||||
if err := u.Finalized.Validate(); err != nil {
|
if err := u.Finalized.Validate(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return merkle.VerifyProof(u.Attested.StateRoot, params.StateIndexFinalBlock, u.FinalityBranch, merkle.Value(u.Finalized.Hash()))
|
return merkle.VerifyProof(u.Attested.StateRoot, params.StateIndexFinalBlock(u.Version), u.FinalityBranch, merkle.Value(u.Finalized.Hash()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ChainHeadEvent returns an authenticated execution payload associated with the
|
// ChainHeadEvent returns an authenticated execution payload associated with the
|
||||||
// latest accepted head of the beacon chain, along with the hash of the latest
|
// latest accepted head of the beacon chain, along with the hash of the latest
|
||||||
// finalized execution block.
|
// finalized execution block.
|
||||||
type ChainHeadEvent struct {
|
type ChainHeadEvent struct {
|
||||||
BeaconHead Header
|
BeaconHead Header
|
||||||
Block *ctypes.Block
|
Block *ctypes.Block
|
||||||
Finalized common.Hash
|
ExecRequests [][]byte // execution layer requests (added in Electra)
|
||||||
|
Finalized common.Hash // latest finalized block hash
|
||||||
}
|
}
|
||||||
|
|
|
||||||
194
beacon/types/testdata/block_electra_consolidations.json
vendored
Normal file
194
beacon/types/testdata/block_electra_consolidations.json
vendored
Normal file
|
|
@ -0,0 +1,194 @@
|
||||||
|
{
|
||||||
|
"slot": "151717",
|
||||||
|
"proposer_index": "20165",
|
||||||
|
"parent_root": "0x0b968237e4cd877e1b5f146da849d5a228cba9b9020c10095cdf177ff0cbdca9",
|
||||||
|
"state_root": "0xc99af23f66c2b3c964b5301f314ffae1add20b1d88b3a9d8a95c72110b06b2fd",
|
||||||
|
"body": {
|
||||||
|
"randao_reveal": "0x81126bf1b4491dd0906c2d82615b34b8d3f779096bcf0a5f0ddda2a6da2b6c1858d3359a0b70cf66af69fc649bf6683e0520b3b14edcde3d6bd75b394d0812c5fd232350e6e3b5e9e6b262219c788ca2e74fa15a1e02e034b091d6c694aaeccd",
|
||||||
|
"eth1_data": {
|
||||||
|
"deposit_root": "0x8654042dec994aa6fc1a36fd0f4ebb2a49d1b27ada9460b045e2ea2a15718cc2",
|
||||||
|
"deposit_count": "10010",
|
||||||
|
"block_hash": "0xb358182abdc706e4a7ca709816043ebb23f3d93e943ca0becdfb9202abecd2d3"
|
||||||
|
},
|
||||||
|
"graffiti": "0x6c69676874686f7573652d676574682d33000000000000000000000000000000",
|
||||||
|
"proposer_slashings": [],
|
||||||
|
"attester_slashings": [],
|
||||||
|
"attestations": [
|
||||||
|
{
|
||||||
|
"aggregation_bits": "0xfefffffffffff7ffbfefffdff7ff77ffffffffffdfe7ffffffffbfffffff7fbfffeffffffffffffffffffffffffffffffbffffffffffeffffeffffffffffeffffffbfffbfffffffffffffffffebfffffffff7ffffffdffffffffffffffffffffffffbfff7fffffffffffffffffffffefffffffffff7ffffffffeffffffffffffff7fffeffffffdfffffffff7ff7fffff7bffffffffbfffffffffffffdfff7ffffffffeffffffffffffffffffffdffffbffffffffffffff7ff6fffffffffffffffffffffffffffffefffff7fffefffeffffdffbffffff3fffdfdfbfffffffffffffffffdffdfffffffffffffffffffffff7ffffffffeffd7ffffffffffffffffffbff7ffeffffffffffbfffdfffffffffffffffffffff7fff0f",
|
||||||
|
"data": {
|
||||||
|
"slot": "151716",
|
||||||
|
"index": "0",
|
||||||
|
"beacon_block_root": "0x0b968237e4cd877e1b5f146da849d5a228cba9b9020c10095cdf177ff0cbdca9",
|
||||||
|
"source": {
|
||||||
|
"epoch": "4740",
|
||||||
|
"root": "0x75198e06e7a0fe301a524212e6376d2222e421fb3cfd1ef0dcb637bf6d20deac"
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"epoch": "4741",
|
||||||
|
"root": "0x8bb6fe4f7ea104312914c88ac84534e4da2ff8207790060f4ba903aaf231678e"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"signature": "0x9138d56149037ae150d8c544c8b609a250fe5e3d66cb36e5d2dd618a642dd79bfa45ec1da014f24872410ddf9ecba28907bec2ea0e5581694871746fbeba9c4e5a553725b03feba05272a11a327b02bae60da8144d333eb019568cf64eb8a43d",
|
||||||
|
"committee_bits": "0xffff010000000000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"aggregation_bits": "0xbdfffffffdffffffffffffffffffefffffffffffffffffffffffbffffffffffffffffffffffffffbffffdfffffffbfffffffffffffffffff7efffffffffffffffffffdffffffffff7ffffff3fffffffffffffbfdffff7ff7ffffffffffffffff7fffdffffffffffffdfffffffffffffffbffffffffffffffffbfffffffffdfffffffffffffffffffffffffffeffeffffffffffefffffffffffffffffffffdfdffefffffffffffffdfffffffffffffffffeffefffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffefffffffdfffffffffffdffffffffffbffffffffffffffeffffffffffd9ffffdfffffffffffffffffffffffffbfffdfffffffffffffffffffffffffdfffffff07",
|
||||||
|
"data": {
|
||||||
|
"slot": "151715",
|
||||||
|
"index": "0",
|
||||||
|
"beacon_block_root": "0x3fe0c30d4be1a2e83c5109a35fd811fe20f783952199e0d10b485985510edafa",
|
||||||
|
"source": {
|
||||||
|
"epoch": "4740",
|
||||||
|
"root": "0x75198e06e7a0fe301a524212e6376d2222e421fb3cfd1ef0dcb637bf6d20deac"
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"epoch": "4741",
|
||||||
|
"root": "0x8bb6fe4f7ea104312914c88ac84534e4da2ff8207790060f4ba903aaf231678e"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"signature": "0xb1653ef5666f3ec1ef9ba39036cc6a361b96b3b82ae9ccd6aa7c83c63e358843c054de6022915421360c04ab343b4cee104f2d5d357454f0ca5d86bc24f2524520f27621624c3e78b0e0915a59cd3ba583eb380dbf984265ffe720eef9201b04",
|
||||||
|
"committee_bits": "0xffff010000000000"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"deposits": [],
|
||||||
|
"voluntary_exits": [],
|
||||||
|
"sync_aggregate": {
|
||||||
|
"sync_committee_bits": "0xf7f7fffffffbff6ffffffbfffffffdffffffeff7ffdf7fffffffffffffffffffffffffffffffffffffffffffef777dffffffff7ffeffffebffbf9ffffbffffff",
|
||||||
|
"sync_committee_signature": "0x99a90d385ef2a1c8d7c8d96bdfc9aa03065532f4415709efbade179de42a8b1c9b736a5d08377c3f9d3a9c220dcd95c61986ba9cc0b735b2c23ac6b8128fc5851e4057c7c469b94ae25c2d0c560793b12021dfb29d34d78e085b8cb8a952f4ba"
|
||||||
|
},
|
||||||
|
"execution_payload": {
|
||||||
|
"parent_hash": "0xdeab769383aabae234218751c24b5c286c54b7e8545308767217c48ee8a66a03",
|
||||||
|
"fee_recipient": "0xb9e79d19f651a941757b35830232e7efc77e1c79",
|
||||||
|
"state_root": "0xb1a9669102c2f7d49af01c4831923cb6f030c6a98b334ecb4d307b6c0c7698a7",
|
||||||
|
"receipts_root": "0xcd85cea85d138342fef326c1c73eb4fc4479f1fc567e7687c5757c39b5a20c34",
|
||||||
|
"logs_bloom": "0x00200000000000000000000080000000000000000000100000000000200000000000000000800000000080000000000000000000000010000000000000000000000020000000010001800408000000200000040000000000000000000000000000000000000000000000000000000008000000000000000000000810000040000000000000000000008000000000000000000000000000080000004410000000800000000000000000000000000000000000000001000000000000000000000000000002000000000000000000000000000000000000001000000000000000000000000000000000010200000000000000000000000000000000000000000000",
|
||||||
|
"prev_randao": "0x1e00579f0d5b1861c9e0978a213dc67e0fc4296458f392e378d06b4b85b4a8c3",
|
||||||
|
"block_number": "141529",
|
||||||
|
"gas_limit": "30000000",
|
||||||
|
"gas_used": "207715",
|
||||||
|
"timestamp": "1740424464",
|
||||||
|
"extra_data": "0xf09f90bce29aa1f09fa496",
|
||||||
|
"base_fee_per_gas": "7",
|
||||||
|
"block_hash": "0xc8807f7a1f96b0a073ff27065776dd21eff6b7e64079c60bffd33f690efbb330",
|
||||||
|
"transactions": [
|
||||||
|
"0x02f9017b8501a588771083013b2285012a05f2008512a05f2000830249f094d27d57804f09a93989e290cf12cb872c39ad2ad280b901040cc7326300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000005693ed58622afdb000000000000000000000000b3db4f6329df01ac317a70200f6614e1cd0db6f7000000000000000000000000fc7360b3b28cf4204268a8354dbec60720d155d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d0ada425f6835193b8507d7de3a77ec1bd6c5377000000000000000000000000c8ae6c2d3f6695e41b5cb149beae76600f4ac97dc080a0ee5a62cc99129e5aad3d6b2de4f169dbcfc3b17878bfa9e944879f2899f5d16ba013bc53a251af668e24bfd2157c52a7168e5cbc235cd3615b6f5f733e0bdfc5c2",
|
||||||
|
"0x02f8d18501a5887710038459682f008459682f0e8301395c940000bbddc7ce488642fb579f8b00f3a59000725101b860aa01b02b16b7a56850cc9b7e1275e8d49e16fc12bd30b4bdf2ef68b5543822b2466101cb541b8815b5ca1721120e4f9da3dc91086418a5680fe3037dba62dda3de79dd22bb41036719c3771f140b419586ae7d9bdf3b10d88850909d4556b19bc001a07ce67cc0fe3ce5e16083414de6c422bbb8d61e2f345b25fc60c8bf58af8a52d3a024b28ae0bae9e75bb588466a4a0ec84d27b4df8127dc58a50cf80b2edc5add54",
|
||||||
|
"0x02f8708501a58877108219a7800782520894f97e180c050e5ab072211ad2c213eb5aee4df13487025494cb85b9c880c080a08a3568a5f66c85d336f3b98586760753bf3960dc22b5a7edb7551fed54637727a033e49b70c561443b3cccc06e8656e4ac23820f1911800473776d92c0a6014f1b"
|
||||||
|
],
|
||||||
|
"withdrawals": [
|
||||||
|
{
|
||||||
|
"index": "491304",
|
||||||
|
"validator_index": "71416",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491305",
|
||||||
|
"validator_index": "71417",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491306",
|
||||||
|
"validator_index": "71418",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491307",
|
||||||
|
"validator_index": "71419",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491308",
|
||||||
|
"validator_index": "71420",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491309",
|
||||||
|
"validator_index": "71421",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491310",
|
||||||
|
"validator_index": "71422",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "59212"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491311",
|
||||||
|
"validator_index": "71423",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491312",
|
||||||
|
"validator_index": "71424",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "59263"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491313",
|
||||||
|
"validator_index": "71425",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491314",
|
||||||
|
"validator_index": "71426",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491315",
|
||||||
|
"validator_index": "71427",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491316",
|
||||||
|
"validator_index": "71428",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491317",
|
||||||
|
"validator_index": "71429",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491318",
|
||||||
|
"validator_index": "71430",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "491319",
|
||||||
|
"validator_index": "71431",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "67541"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"blob_gas_used": "0",
|
||||||
|
"excess_blob_gas": "69468160"
|
||||||
|
},
|
||||||
|
"bls_to_execution_changes": [],
|
||||||
|
"blob_kzg_commitments": [],
|
||||||
|
"execution_requests": {
|
||||||
|
"deposits": [],
|
||||||
|
"withdrawals": [],
|
||||||
|
"consolidations": [
|
||||||
|
{
|
||||||
|
"source_address": "0xb57a360b34e22c598a9b0da37c5b9a7825da4db6",
|
||||||
|
"source_pubkey": "0xaa01b02b16b7a56850cc9b7e1275e8d49e16fc12bd30b4bdf2ef68b5543822b2466101cb541b8815b5ca1721120e4f9d",
|
||||||
|
"target_pubkey": "0xa3dc91086418a5680fe3037dba62dda3de79dd22bb41036719c3771f140b419586ae7d9bdf3b10d88850909d4556b19b"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
305
beacon/types/testdata/block_electra_deposits.json
vendored
Normal file
305
beacon/types/testdata/block_electra_deposits.json
vendored
Normal file
|
|
@ -0,0 +1,305 @@
|
||||||
|
{
|
||||||
|
"slot": "151016",
|
||||||
|
"proposer_index": "27017",
|
||||||
|
"parent_root": "0x2f135d2fe887c6012e78b25b8adecc33bc268c8057e444422f9fbdbb02730a30",
|
||||||
|
"state_root": "0x62a65efc3b24c02a29c4fdab5edf076329024a05dfc944b35f920a38d07b24ac",
|
||||||
|
"body": {
|
||||||
|
"randao_reveal": "0xb765dc7a976fb26b7cf8df404055cbab5e7665dfc1106ed4373709840d99312fb5f782a44c25294cece2f55e0cde6d1515504693574ddfb9bbcfb47c21763efed46b91cb47cefb5a14c78dd53f491d51e40b36eaf26e23e1edc49875e8c734cc",
|
||||||
|
"eth1_data": {
|
||||||
|
"deposit_root": "0x8654042dec994aa6fc1a36fd0f4ebb2a49d1b27ada9460b045e2ea2a15718cc2",
|
||||||
|
"deposit_count": "10010",
|
||||||
|
"block_hash": "0x28f59400e7becd79cfe3b14f36dd58fc27826849247dbfd1e4d09448806f8955"
|
||||||
|
},
|
||||||
|
"graffiti": "0x6c69676874686f7573652d6e65746865726d696e642d33000000000000000000",
|
||||||
|
"proposer_slashings": [],
|
||||||
|
"attester_slashings": [],
|
||||||
|
"attestations": [
|
||||||
|
{
|
||||||
|
"aggregation_bits": "0xff7bffdffbffffffffffffefffffffdfffffffffffffffffffffffffffffffbfffffffffffffffffffffffffffffff7ff7efffffffffffdfffffffffefffbf7fffffffffffffffdfffffeffffff7ffff7efffffffbfffdffffdfffffffffffbffffbffffffffffffffefffbfefffffffffffffffffffffeffbfffffffffff7fff7bffbfffffffffffffffff7fffffdfffffffffffb7fffffffffffffffffbffffffffffdf7fffffffefbeffffffeffffffff7fffffdfb5dff7fffffffdffefffffffd7ffffeffeffffffffffdfffffffffffffffff5fff7ffffffffffbffffdf7ff77ffff9fffffffffffffffffffff7fcfcffffffffffff7ffffffff7ffffffdffffffffffffffefffffffdfbfffffffffafbfbf7fffdff0f",
|
||||||
|
"data": {
|
||||||
|
"slot": "151015",
|
||||||
|
"index": "0",
|
||||||
|
"beacon_block_root": "0x2f135d2fe887c6012e78b25b8adecc33bc268c8057e444422f9fbdbb02730a30",
|
||||||
|
"source": {
|
||||||
|
"epoch": "4718",
|
||||||
|
"root": "0x6567f31ab5ccc3a0b0cd5d27abf183ed36704f817d09cb9dbe183da83cf07bf2"
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"epoch": "4719",
|
||||||
|
"root": "0x49ce68a9103d485d81d74d0c744a3fde20657c4cb81fb13b12cee75a2a29804f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"signature": "0xb7ad39b499b0e5b8a22849b068c98a08fe611d45a2f43e30fa449e657436e685e9e2a9bfae3a3128baf939f4394c0f2717835b0756e3177cb38d58775618ff6607fb68f362d60b9f865daff0ac239da49690e8fe439aa0dc27e2d4196beac98a",
|
||||||
|
"committee_bits": "0xffff010000000000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"aggregation_bits": "0x0108000000201040400000000000000208",
|
||||||
|
"data": {
|
||||||
|
"slot": "151015",
|
||||||
|
"index": "0",
|
||||||
|
"beacon_block_root": "0x2f135d2fe887c6012e78b25b8adecc33bc268c8057e444422f9fbdbb02730a30",
|
||||||
|
"source": {
|
||||||
|
"epoch": "4718",
|
||||||
|
"root": "0x6567f31ab5ccc3a0b0cd5d27abf183ed36704f817d09cb9dbe183da83cf07bf2"
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"epoch": "4719",
|
||||||
|
"root": "0x49ce68a9103d485d81d74d0c744a3fde20657c4cb81fb13b12cee75a2a29804f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"signature": "0x833659ce0cf0ea303c1df6d0754f5303392789c91498635bcd339f0056c496e770072f025eb962793105137c424d80af05a6ebe8d6e7f9de48121fbc362b91d1644f23ce3728ddfab680ff2c064fc73a049389116a56409ae35d675b37c59e92",
|
||||||
|
"committee_bits": "0x4000000000000000"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"deposits": [],
|
||||||
|
"voluntary_exits": [],
|
||||||
|
"sync_aggregate": {
|
||||||
|
"sync_committee_bits": "0xf7f7fffffffbff6ffffffbfffffffdffffffeff7ffdf7ffffeffffffffffffffffffffffffffffffffffffffef777dffffffff7ffeffffebffbf9ffffbffffff",
|
||||||
|
"sync_committee_signature": "0xa7be0f119fee5d9f9409d508b2291e1d8d81d3b9edd64d7a68d12f9b1a84bd50230618e4db78ef6e7f1e2f3e6aa56e2807985b25d52750a56b9d1b087ae3bca80c3a0b091e52c3797d82778acdf877e42b8fb18598d9fc56e9e469ebdd5c15e1"
|
||||||
|
},
|
||||||
|
"execution_payload": {
|
||||||
|
"parent_hash": "0x52ad968c44fe260e5bb67b63c3ede2ade269a23641d27fcceba237065784c89e",
|
||||||
|
"fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134",
|
||||||
|
"state_root": "0x34ecb1a20d718e06f69e4ec6b6ad86c75603149a207480b03a077d0231668805",
|
||||||
|
"receipts_root": "0xd2da2f149a53d2c26982187652ecdf1114ae5301359c0ee6752c2b78dd97ea02",
|
||||||
|
"logs_bloom": "0x10200000000000000000000080000000000000000000100000000000200000000000000000800000000080000000000000000000000010000000000000000000000020000000010001800408000000200000000000000000000004000000000000000000000000000000000000000008000000000000000000000810000040000000000000000000008000000000000000000000000000080000004010400000800000000000000000020000000000000000000000000000000000000000000000000002000000000000000000000000000000000000001000000000000000000000000000000000010200000000000000000008000000000000000000000000",
|
||||||
|
"prev_randao": "0xb45479ddbad8fc0733b7762aed1a5b5861712b29bc20c2c0e34dc5e6722e82c9",
|
||||||
|
"block_number": "140858",
|
||||||
|
"gas_limit": "30029295",
|
||||||
|
"gas_used": "2383293",
|
||||||
|
"timestamp": "1740416052",
|
||||||
|
"extra_data": "0x4e65746865726d696e64",
|
||||||
|
"base_fee_per_gas": "7",
|
||||||
|
"block_hash": "0x1f2637170986346c7993d5adbadbebbf4c9ed89c6a4d2dff653db99c8c168076",
|
||||||
|
"transactions": [
|
||||||
|
"0x03f901198501a5887710821dd184773594008477359407830186a0946e8d9c2108be0894bd30c8525c71d1bbcb31912e80b8808b177fd73255e0d6bd6e8a142b0572ba8f34d66075cf829e3fab19009fb1a8a5d057276080527fd8fff3f3f4d3b02314aa185d801e8d378d88992aa540c8b093c1e4264b68777c60a0527f69df553e04f0a6a7435a5650668958d47f9d4187d2ff2e72a91d8d9f74928c8c60c0527f8d8f0c90c68115c209dcec644ae93d4d05c0830f4240e1a001359c559c4114b7919abca725d032f48ab4519d2857567795ca4f49345e65a280a091007fbb893a18315106cbcb53bf044d6a5c0ea7098e0b6198727c3983ebc628a06c9abb0a1ded37b6305a5711831f03fce5e467a70dbc9c0c724ebd18b200a202",
|
||||||
|
"0x03f901198501a5887710821ae084773594008477359407830186a0949ae53a8e1ac8eeab1feece735b3d840634e30c4980b8807fb45278a2777c8ecd11eb2c2052276fd12c86bdb2373aa59d293c6b0ae1e8df076051527f8c9bb0742b467c164d5aad3087f92355c3f8cd0c291ca87b086e86fffa73780e6071527f8b11001c065ced40db4a5b2c43de47fde7a3b22f8919b39acd8d0b309df8a40a6091527fa49bf4a805c16f59556bec2665b647e02cee4fc0830f4240e1a0019da1702b651bd92e079ca2e801671cf22f3d3b6c097a185275dca50784123f80a039e483afa3751d7d758f2273fb19ac2143e5ce225eec49244f0aa358dc9fcb13a02e4a552312d68db400acc3898835e0aa32f46b8ef786ad6e2fbb0d933c51c551",
|
||||||
|
"0x03f901198501a5887710821dd284773594008477359407830186a0943c9f26a8f3c71bd76665e89a50f5f70d9953901e80b880605c60fe5360ce60ff53606f61010053604b6101015360fc6101025360396101035360e36101045360b36101055360926101065360e061010753601461010853605261010953607361010a53609561010b5360c861010c53608a61010d5360d261010e5360bd61010f5360ff61011053603461011153603761011253609e6101c0830f4240e1a001f8b21450b076ae1037e2e42f8a6899f01f793a2bee9f59e00ee520af66d56a80a0e97e75f469a7478d725c078e7d5b6979018753556850a61cfcd01cd2c87f02c8a024a8247013e502c09f4d7981f912995c44978f9680c261829bb3f0ec86627ea6",
|
||||||
|
"0x03f901198501a588771082398384773594008477359407830186a09401abea29659e5e97c95107f20bb753cd3e09bbbb80b880600060335dc61f7ffede24c98d6f2e886373c1dd99c824ad17b93cd6cca65a8856cd72972eea737960665260b3608653601a60875360f660885360ab6089536024608a536043608b536001608c536038608d537f15db390ca3613b231b40c801210901ec898c67f53aa7864f903944c3e3568817601b527f23a5a30cb6c97aa2c0830f4240e1a001c543c4e8d14cbdfb690f66b63b8b4c4fbd3963b1a555c6ab3ae43b08367b7880a065b7869dd9655457013e3e88c7866205124bec055f51b41e1fa92acce78b994aa07b83ebb8f12ba28df90ebd3eda8858204f2ff0eccb7ad8be10fafcb249bb3fdc",
|
||||||
|
"0x03f901198501a5887710821ae184773594008477359407830186a0946a5e2c588bb18c17cdadb44f82d22a895da0d62480b8806000632a674ca35d600060f15d60e249603c49604d496097497f8474c6950d31f88091bd7bed171350e494e797be9c933f1288dabacbbb84810e60c1527f84f66da36ef2af9007aa316630acc16ee30260d66c55ec449fdf03fb20860c8660e1527fba2768ed15416619a048e1b79c81583af46d1f3ff8141279fd98cb2326e0c0830f4240e1a0018ddeb1837db4291ad48990f90ac5bca82d10b9d3d73eebf1aa5c314cf91abd01a010004635691cfef330e4bb27701074e719e65c037e4182be65becc5e1945522ca02cb00278eb15a555f9ce56dcdf783135e8aa6c852816497d389190e63ae304e6",
|
||||||
|
"0x03f901198501a5887710821dd384773594008477359407830186a094000f3df6d732807ef1319fb7b8bb8522d0beac0280b8807f9a8968ca7a94768406d68b36a066e74dcadc49bc3605fdb95370ae9040470a4860eb527f0d8c1c38ee4b5dbf2b28f10ecc705f9cd2a9a36cfeff6c433efb8bd7c99626e061010b527fbbc1026522b0e497dc9722fc477fb7344969fbb16d66e31cc6e03de9a23178e361012b527f63ed37d8ac0e69b5609744b3ada8384a1dc0830f4240e1a0014cd492e6c4d129d4d3b22182ea5a5a632f3320aebbb6251d0ad724a747391a80a0c07736c5db2bc49a29ac00df7b32abf94978bcea15e65423b5cdd7d35df126dfa06b3f8c10978fc3e1cd60753975ed21762bf99a59fb29cd8e0a970321ee72ba9d",
|
||||||
|
"0x03f901198501a588771082398484773594008477359407830186a094dc547f9b829e446d70566195aecc6a5977e5860a80b880600060335dc61f7ffede24c98d6f2e886373c1dd99c824ad17b93cd6cca65a8856cd72972eea737960665260b3608653601a60875360f660885360ab6089536024608a536043608b536001608c536038608d537f15db390ca3613b231b40c801210901ec898c67f53aa7864f903944c3e3568817601b527f23a5a30cb6c97aa2c0830f4240e1a00150e9783b2dae0fabae7243e90ddc1dbab17e6a0934ba2434aac62f27cdb2d001a0ad1f8b4409159784a76bc7abe3a89003139274ff8215bfb50da2ffaa8b312cc8a032aa53063bbae96713f93714c830c536949c843cc09a3dde8cb2ebdfcfe5d613",
|
||||||
|
"0x03f901198501a588771082398584773594008477359407830186a0947a40026a3b9a41754a95eec8c92c6b99886f440c80b880600060335dc61f7ffede24c98d6f2e886373c1dd99c824ad17b93cd6cca65a8856cd72972eea737960665260b3608653601a60875360f660885360ab6089536024608a536043608b536001608c536038608d537f15db390ca3613b231b40c801210901ec898c67f53aa7864f903944c3e3568817601b527f23a5a30cb6c97aa2c0830f4240e1a001bae560947db14e3ed438ca8504783d40c9047191f49933b1d5e1ec8208583a80a0237ae7f13f17c0f994513c83636e1ac7e4d7c722221b51778352dfab41864310a036cba8ec5a2d31e6342f6afc914e3ba9dbfad0db22d29cb74e46e170ae2b09a9",
|
||||||
|
"0x03f901198501a58877108236ff84773594008477359407830186a094000f3df6d732807ef1319fb7b8bb8522d0beac0280b8807fc51dcb985e3563ad803460f85ed4746c57bf060d8e2259116646a0002c898fb360ea52606561010a5360a761010b53600561010c53604861010d53600761010e5360a661010f5360986101105360a96101115360b06101125360dc6101135360e6610114536071610115536060610116536091610117536084610118536041c0830f4240e1a00118b3d58c9a58f76bb27cff8ee97664f8b88ea8ec955abc1463805d2b96428d01a00eb390be8ce5900249b939af5bf2ca243ed1902ea6b1bc3bf372f8028b95861fa048dadfa661c274595edc2cf2797b9ec4dc873cd6a75d7329293f873c4335438a",
|
||||||
|
"0x02f9017b8501a58877108301391785012a05f2008512a05f2000830249f094d27d57804f09a93989e290cf12cb872c39ad2ad280b901040cc7326300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000ee86442fcd06c0000000000000000000000000000b3db4f6329df01ac317a70200f6614e1cd0db6f7000000000000000000000000fc7360b3b28cf4204268a8354dbec60720d155d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c8ae6c2d3f6695e41b5cb149beae76600f4ac97d000000000000000000000000d0ada425f6835193b8507d7de3a77ec1bd6c5377c080a0bb753e1df11f4e15f7b1f44c04d738b30e0849b804bb786f7fba10edc3d7668ca05d7151817aca075c8d7bf9ba2b74e9294d28de1c4b8d3e5b138669e89324885c",
|
||||||
|
"0xf873836181cc847735940782520894fcb6e353ad4f79245c7cb704abcffe2f4868424188058d15e1762800008085034b10ee43a031323a053c2013914ed32e251907c3311e4218561cdd8c25eaf8672355e66720a046900db9b5826610a5208c61a6e0c9f64178a76caefd64037db69b997295bf5c",
|
||||||
|
"0xf873836181cd8477359407825208940d3de4256d6322683fdea9ee23765ccbfcb83da488058d15e1762800008085034b10ee44a0cde1811bcf855221edb3b337e6bdd6bf26b11c9387768fba8597daff950ad5cca07867720bce30276937c2d806024791f158a64862ec35a036ff1dbb01d16be959",
|
||||||
|
"0xf873836181ce8477359407825208946021752d8d9b2f221d4fea4349dea34ddbcfce5088058d15e1762800008085034b10ee43a0f833125f6025471a4f351c2777d5841a23e4f6002c51161855004820fb91eaafa01722b78eba514ac450c0459568b4dc9521bb797a7c601c5c8825cd5e006f71a7",
|
||||||
|
"0xf873836181cf84773594078252089461e296d527edc89e831cf593ec341f16197eeafb88058d15e1762800008085034b10ee44a0151e6c4bedcf29fafb9ef50f81f7e573d75ba42e00c46e91b9761de3e13cdc37a047bc54be6c3493ceb0949a3324ee1cb93c8058c9db71fbfb5c16ffdb472c0fed",
|
||||||
|
"0xf873836181d0847735940782520894cf7317ee7a3b497ecf634b94bff60ff91b92574788058d15e1762800008085034b10ee44a0c6e018c4eb28bab20355104705e0570a371c157dc592e503713bcce730953d76a0279412202acdd26ab9d03c2edb129aa974fc39c86a0ecbef410c0a69d27789d9",
|
||||||
|
"0xf873836181d18477359407825208947e7b519df31f77ced83eea1b16aedb6dcb0f0b2488058d15e1762800008085034b10ee44a08fe9e5cd6238d8e3e21ab280bca46ce43c23620b1f81b386265efbcbdb106385a018945e95e62a6148cbf35649e1e2ec4835491b4e4b6216e316c4932c96220ecb",
|
||||||
|
"0xf873836181d284773594078252089488a075e0fb1c9309a200a8bf0a88b214bf7ceb8d88058d15e1762800008085034b10ee43a090b175e1335dc2c4450dd3a0543e19e2635aebea5675c94eac1cce52c7ce3d64a021aab7cccb861a1c30d876526a4ef0b7e217d784fc89cbd02e8c6d63ad35b0ba",
|
||||||
|
"0xf873836181d3847735940782520894c8d7cfb58f3ac02568e6505bf3fb5eb6f080703988058d15e1762800008085034b10ee43a06d530baafa0a899792978df61bf5adc6028be85be12f55c687e44f1740dc22ffa06d4196c744ecfed500c4ad0fa17947c12238227155acea265edb7c7461571259",
|
||||||
|
"0xf873836181d4847735940782520894e0132e8d7b1b766e0ade5543d6c6c0b2d5a2f01d88058d15e1762800008085034b10ee43a007e42562bf3a9a058fb1803d7c423ea0d7113fc98788be2a6b4d982210066139a02a24a9efb9f88cc53ad464b62601af3e54fedd8305e1b98670bfc8dab223c596",
|
||||||
|
"0xf873836181d5847735940782520894eb674c0411db79654afdc1e131f3b6e734baee6c88058d15e1762800008085034b10ee44a0e197786db41e4d21914f319e669aa504f1e821d2cd17b39a396b1b85b5348025a00b1efe1355fcb919642f14f7609893afe70017eaa999d531e6f77fbdc5d28029",
|
||||||
|
"0xf873836181d6847735940782520894dc07c60993cf689438b8c85f86b0ed938dca77ea88058d15e1762800008085034b10ee43a0f00a06c5148f52c55b2f65668a757c9d0011e7924032b88c771e3934e0bab6a4a0480e37e4cd116cedecd7de44cdb91c698ad896abbd3b08e2651773dea497e8e6",
|
||||||
|
"0xf873836181d7847735940782520894110ddc93db59ed31a03518510221ec2f35d28f2f88058d15e1762800008085034b10ee43a047c9b1fb51b626b40cb2707269a8ad6a7391c467864e4423efa3b4ede8bf6d3ea028314d010ef79d04027fec9c0efb0bbad7ef386e110bc8e07797e78f484cb51d",
|
||||||
|
"0xf873836181d8847735940782520894b599a876aaac824cfce21bdf15627c9fd8634c3088058d15e1762800008085034b10ee43a0630d66f57eae656309cdcf02dbf20db3bf960c77fa0c66b72de13b7852b0c8d7a00541603caf792d410387983650ec5799d9eaac5761296b3ad09f26fbe40fe251",
|
||||||
|
"0xf873836181d9847735940782520894d36e5540dd71acbd6416d60252c4d7c34a3c824588058d15e1762800008085034b10ee43a0dd6a775844cc76e89ab1b2bd43d266b3b1b6e34a8d129cc1c1f7ce28c44b2439a01ab09f383573d80274ed64053a079902796c2e6e4cc19abf0271d37e2db4a0d0",
|
||||||
|
"0xf873836181da8477359407825208943adeca35af56206a74987a8fe13c669365c770cf88058d15e1762800008085034b10ee43a0a8f36c6870413fdea217d52c0b6bb3d6b55a837e7907ad2a3979da577f9f1763a0646ed9c93233cae748988a3a33debd3411706a2a88c3349d2702da1b5a728cea",
|
||||||
|
"0xf873836181db847735940782520894d77b95acd12f7b4b5692b55717b7bbca1165195488058d15e1762800008085034b10ee43a052069ecf399b7323e46892858d2d99668d7554b581245656d97768972f533683a009824b000ffa65ec5acc5210674b12ec2b92f45214e2af2c541a9da825baa9f6",
|
||||||
|
"0xf873836181dc847735940782520894f388bf5766b5ed5d4e1cbf15772e677dbfa80b0088058d15e1762800008085034b10ee44a0532fcb541538ee4041bd97e09c0f86fde22760d4d3e3922b48d2fec22c41503fa00aab5d1fc4438ea787d42f08508c82cc8c9940583217eaf25e9cd12e53241b4b",
|
||||||
|
"0xf873836181dd84773594078252089435d4996296e58560e6ef47787d51b55f1e2bd92a88058d15e1762800008085034b10ee43a01c2172f632447d91029c0bb197b6f29c6f16be40ddbc45637132aae1734dfbf2a06c7e9868cb7e95d72edd545e173887a45d405e3597da99067985d8e7343ba224",
|
||||||
|
"0xf873836181de847735940782520894a4c3b77b898e53d6095f11c53a1ce272cff9af3188058d15e1762800008085034b10ee43a02ba7caf4ef662c4a459f11d2ff90c970c8b4d5ab27e201b8f80e12d763a46f57a02e1f114037a153d9ad303e5633753785bd7c73c5cb0b9f3bb8159312eb0692a4",
|
||||||
|
"0xf873836181df8477359407825208946e84f6113fc1919714f0266705813fb81a17181f88058d15e1762800008085034b10ee44a07ac801acd1375d7bc7d5a7e54553be58976519169de1e2e14186494087a0b4baa043a9a4311283cbcbca29255de9e3bf1e688d73a0e4e20ff8d8b5a2e16b6e630c",
|
||||||
|
"0xf873836181e0847735940782520894e9ae1a806004e1452baae0493920815aadd8479888058d15e1762800008085034b10ee43a02fb8319f5613dbf37419d177b132306a7c55b2d72d04522d6eceab27ddba4f82a03f1b125a7c93ff5e6c278df26ebf8411fd9317112424a26dabc5a23557712272",
|
||||||
|
"0xf873836181e1847735940782520894fe1905d8ebd20e037274eef441283c811ea82c1688058d15e1762800008085034b10ee43a0224ee510dbb1e0ef70a7a016bd1512039fcf3af0af9a34b9b1cc2ee90a002339a02b7a11a1ff4a20c1253069e4b899ef0aa2f2702c3c4460d478f92a9a43e00b67",
|
||||||
|
"0xf873836181e28477359407825208946adece88e477f53a143a4c29d97940df2ec768e088058d15e1762800008085034b10ee43a08590ee9e8715492a2e5c1390f4e389143c410e1d416f5202994b516f51e7eafba03159c4853aeaf69bf1c44c4e6cc8e449bc7d42eba79384cd8b133659d38159e5",
|
||||||
|
"0xf873836181e38477359407825208940d34d140a7376892c4593fcea3ae26f5d6f202d788058d15e1762800008085034b10ee43a01a115564422f4e9fe3d1e51202e25ad90705509c2b827423bd9a766d67e6c6d1a00fbc0b850c9835c6a75a4baef78f29458f592ca83447dbe1c5f14c38724a86d0",
|
||||||
|
"0xf873836181e4847735940782520894d1c7fa75b9bc55d041fcdf215f3e3a351c9f9edc88058d15e1762800008085034b10ee44a0f1bcf05bfdd6d0d2a4345f86c2875dd7bfa685745427754fd3b524a69664114ea0674e3c62d1e0b5ac4d79cbc972ea51e2183201f879e17b9061671107089fcdda",
|
||||||
|
"0xf873836181e5847735940782520894418ebe350a8c6387bf5e42f3502742af8e0781f188058d15e1762800008085034b10ee44a02b5935a36f3240d235d2574f6a0d97f432aa4443da752e1101479a9392b124d3a0674f43bb33455d22e08224c584a2f206cb6ac4a86aa312f8d63b75f99fef5764",
|
||||||
|
"0xf873836181e684773594078252089484914d2770c711d27888c775c547b1d933b48c4788058d15e1762800008085034b10ee44a0c94d55923ef4bd2e4c0a83f31e36dc49f2ef84bda5a4dba429795ffe33bb6574a04101d4d64e212019cdeb93c8e2ec7488405c2f716acb64e5ab70ca4689c4a370",
|
||||||
|
"0xf873836181e78477359407825208948f51e560b85edf2e653c689c4e9fac02ce0556b888058d15e1762800008085034b10ee43a081e8fb2724b676b50ed6a9dd02a3dfdbeb1cd715cbe485cfa98a204c5a7a35dea04d7f13607047239a65d798a199a66460d89f3334a79f49587fbb58ad499e1a1b",
|
||||||
|
"0xf873836181e8847735940782520894ee2503205c24dc66346e356f13f333fb8782d35888058d15e1762800008085034b10ee44a098b33a8231bf024845d5bf52add950edc4b1c53f23b03b8b5439ffcbfa034522a03dced7a7342c7d2eb201d8225009a41527dd98f7a6475a8a65660feb4c68d6d6",
|
||||||
|
"0xf873836181e9847735940782520894096ba6c59bd667a0fea9a356bcc988e4d9f2d8eb88058d15e1762800008085034b10ee44a0c3a8d920e1f80f5139f70822ca6c899edf0bc17c8fb3c7f3a1318ddea7d62c7aa054e14fb1325f2a23214fc6ba3abf11ea547e01a1d95a3e490c3b1f9af277ec90",
|
||||||
|
"0xf873836181ea847735940782520894da0adce4f1dc7debe7b2b52e8fe9ace6c7ea9c6688058d15e1762800008085034b10ee43a0755d9805b1d15d1392d860e86df05834fd94a61d18c22956907ac7c1bc982892a063de885856b515242c33c31f9cee81d23aee55fd632b88d86fcdb3f8566af3ef",
|
||||||
|
"0xf873836181eb847735940782520894af7d412aeab7525c0541dc3aa6c1085cfb8c909988058d15e1762800008085034b10ee44a0b91c06dd7e4010c5d7b3f66285f4c139e22480773fb053409950ffe5bce7b720a0397f1b6ef9424dd5e30b07c110fa5b009cf86bfe92a98e994427d595dd9586fe",
|
||||||
|
"0xf873836181ec8477359407825208943cf8c0d567261eaf4ac0872d33a9f48af361769f88058d15e1762800008085034b10ee44a0828618325c9586073c8199d866e9001a7b9ae129a29cc60cb43aca355175b13ea07f885bfcc7b096b6c47e0122bef7f0295712f0810a78ab4f0b53112561d2c84a",
|
||||||
|
"0xf873836181ed8477359407825208944779242587ba9e828999249eadd82984430f484388058d15e1762800008085034b10ee44a0dd150d77fe8d9073a20510992f5eb8c70380327f5483064a6f42fb547465ccb3a04cb3406733b1e7318315255edccbad06adf0e6a3fe13f01389c5c95245cc8150",
|
||||||
|
"0xf873836181ee847735940782520894ea531cfe2de357ecff3855b88dbd07f60b03cdca88058d15e1762800008085034b10ee43a08c72279cb318e4dacdfaf265959cd7f31002a1521113bc7e65851ab8ac2aed06a008340ab82a4a61f91d3e5f4594629b6a422fe11e8d6b39b2a145eabf15f3bbf8",
|
||||||
|
"0xf873836181ef847735940782520894d00b5f53ea2a66ad33c3fee304bb22857dfb8a8788058d15e1762800008085034b10ee44a0ebb567f7d111eb54667984476e3a271c99220942e20e96f713ef9b4ae5728404a040bae6c5b88e58b0e02d1218df7ae41d9b3b99d2180eddf8ba770976852de483",
|
||||||
|
"0xf873836181f08477359407825208947ead29f6616f78f21a951c9686dd257be7b8efe488058d15e1762800008085034b10ee43a0f749f26b7f700cb7bfbbb6e37206553e64ae70307f33cb60455bee1da135d4a6a072467439050b5a0d411d90c92fe6fb17676189d3fa8a0ad27ec4dbcdc03c14cb",
|
||||||
|
"0xf873836181f1847735940782520894d503c13ee55c1ea128357d4018ec58d0d5e5c3db88058d15e1762800008085034b10ee44a0adbe9e31e5a740ee0b52a69b0cc85a718c799309df72991bc856c364f9b85f28a051a55333b441a7255a63e0fe6918aff4b6269576ef99763190c784624f8f7e45",
|
||||||
|
"0xf873836181f28477359407825208944ac670d8760faf780468638ef80034876ed8918d88058d15e1762800008085034b10ee43a0636ee52b3e021114085c7413cbaab77013b432fd41cbf0a88dbd8d145e8a1125a02d15ffe159ec762142907b2e8b5e04b804361a399b23ff335ee4b996f7ee0a81",
|
||||||
|
"0xf873836181f384773594078252089424ffb8c97ce443f8d3265ba3316defcfc07c659c88058d15e1762800008085034b10ee44a03c4c9d42c3a76c275f8f167cc846e62a16e2d4f54418b0303f64f0a1f2122fcda034d0cd15b9d14b118eb7a2e5bf9a464043e5b1935e740ca557fd05b47328b092",
|
||||||
|
"0xf873836181f48477359407825208940c5cafc547ab98c9ceaa1c07fdd6bf7820aeb95488058d15e1762800008085034b10ee44a064728de799b66a56f3f634bca37944e0027ab9be12419d2e976bacfe295c5854a03a4b830c50b7c1cf39511b592ac20634bb54e6afb795dddbfc6c322bf6ac85fb",
|
||||||
|
"0xf873836181f5847735940782520894db8d964741c53e55df9c2d4e9414c6c96482874e88058d15e1762800008085034b10ee44a0d56eac7a793978c4a8356bf94024e3fe292d9f61f594c3bc847a49c4c94df56fa059b143fedac3f768e936b63291180c1fe34415d27888e1b90326d28b4567fd53",
|
||||||
|
"0xf873836181f6847735940782520894ba85bb35ae6ff7a34745993fcf92b9afd34124f188058d15e1762800008085034b10ee44a0b368c25c6edfe52749b1377664c2886a5c09f89d12c63078ba635dad22ae3ec7a004d02d8cec691a288092fd337f4a9c18eb4d15493cd512cb963a3be9cd9c0b04",
|
||||||
|
"0xf873836181f784773594078252089458871015f5a2d3948264f7c16ad194c80ffd531d88058d15e1762800008085034b10ee44a0c6ecc87a4c18d2476757ca03080992de68e24b16826e35d0a26b6d137a4b6be8a065defc8e1b910d228675e323898baf81d24633cf57549021e64678e4e41bb78c",
|
||||||
|
"0xf873836181f88477359407825208942a90af45df70b0031f218cc122598ddf3e10469f88058d15e1762800008085034b10ee43a010c9e461dbdac507e73c5c2092f83c780fd91de482b1db746544dca8adbabb9da05f1c695251e7fcb4fa0a655f5d64845e597fb3f2a948326dda2e7a87fa74ea50",
|
||||||
|
"0xf873836181f9847735940782520894761bbaaea6ceb265f5262c3b559adc2ad3ed2f0988058d15e1762800008085034b10ee44a01e238f26c7ed2a54504a1ff05ab2cdffd5306c80281f61e3a93f950b2c965014a00739c6e4e75c3c312636bef62ff6fb8a1c0d0c71dd34f117e19bc58fd9353e1d",
|
||||||
|
"0xf873836181fa847735940782520894dfe86f51c5e603f1420d1f0ab366bd3bfe23d2a788058d15e1762800008085034b10ee43a06994565ae218ce6ce28078aa4924a01207584026a892fd82b4bc8c187d8bf1c2a02b44cbe2120bbf57c777b2321e2b54e3d8015a6484e109bf761e07e38b22c9d9",
|
||||||
|
"0xf873836181fb847735940782520894d616547158b05ab5079106dc0336d72763a7287188058d15e1762800008085034b10ee43a01559edc6eb87baba522ba21cd45da85f76be8adceeca311a378035d723efa31da063253dd048dbe7e7c7285a5b1b23dfce7655e060c5b9523f56c6de6b7fa30ec0",
|
||||||
|
"0xf873836181fc847735940782520894dc68cd278cb7f5f666ce7b0a3a214a8540ed4dfa88058d15e1762800008085034b10ee43a067f63eb982417af7de349aa9cf07889ed0d7423407995926b8044fe7525154eaa00417db33f88ae9c142950ef84ae18f47445fa7c26b6a482df6ffb5e13ca89cad",
|
||||||
|
"0xf873836181fd84773594078252089411f8107da05b6905e8cc0227ca3b0c6eb764fac088058d15e1762800008085034b10ee43a06594ca7cfdb0ee036f1735bbd3f2971be1da00edefc122a0214807828a7ead31a075a11a79283bd39456153246494d408c61f18f27022c4bb888b5742e1c66e3ef",
|
||||||
|
"0xf873836181fe84773594078252089404da906545679850a7ee0ef6836e183031bedc8888058d15e1762800008085034b10ee43a062c55b09cc71c0c3e34bb97dc8e3d9e9918929f0c9490309090bc430bf6eb722a05f733500640bd0f6e61952424a3d9bd5dfde0ba3cda5be598489f0859df6c919",
|
||||||
|
"0xf873836181ff8477359407825208948bdc25c43c010fd3db6281fcd8f7a0bed18838e388058d15e1762800008085034b10ee43a02518ed9188048e9a9666de8a3983dd208c2e582a18720a2605baaaffdb2ef4aaa0510893d599ed7e303b7027e9c9453a8f25409735ae782faad9fb3afefe4e458a",
|
||||||
|
"0xf87383618200847735940782520894af16f746b8a834a383fd0597d941fee52b7791eb88058d15e1762800008085034b10ee43a0d8b4839aed9b334066a24ef5295f456fba1d0fc6d783b7d18012cdb2c18861e2a07a74bd5a40d360c32bceb00be00d3e6e608f39b04a13ecc3ed4672900f5c54b3",
|
||||||
|
"0xf873836182018477359407825208940c5c736600f8ea58ccb89aa72e3f3634651fd55188058d15e1762800008085034b10ee44a033c53fbdc9c86cf60777c5d2bd192f57d36628c672a7ca61352effbe7fa781f4a01943da2502b48ee6b3b936769270da655c8d955c9a390e0c186ee5d3646d1d27",
|
||||||
|
"0xf873836182028477359407825208946f475e0f0e9eda58556fddc04de9b1a9b6a4cfb488058d15e1762800008085034b10ee43a00a00563e58ee9203cba306e432af000938b1e2e2daebbb7d06210c0b3cdac601a05d0f1492b63df3df5ac1310fccbdc3e0863d8c3c7231186df265d32abe00f87f",
|
||||||
|
"0xf873836182038477359407825208949b2e76498a695c4dc7d0890069cffa84a9581d2488058d15e1762800008085034b10ee44a0cb83570f01c24cdef394144b462fd9b7753337794a84fbb89c68e40038491487a03cb5dbc916553e4534921cc0c0d7e9d3c12afc7bb345ecf88e030c8d6f275a1c",
|
||||||
|
"0xf87383618204847735940782520894e2d2b2069f4a54fcc171223ff0c17adbd743c28588058d15e1762800008085034b10ee43a01e6d349911a4261a944c289ec6594cb1d6414fbc96240ea5d0a134cb75cf5ff2a042dcc7cfe31d1260bc5093627e0fbace0f87812d37cfbcffe7beff500dfff385",
|
||||||
|
"0xf87383618205847735940782520894386bd49f04322544f3c7178fa5ae1a24b947b45488058d15e1762800008085034b10ee44a06e76a8890665419b746548fd24bf999efa9eda82b509a2a13dff3c8d8774d239a00c54e75e6280c2368a3cc742f1c6c6d4853cdff6aa71afb3b59939283a70ba70",
|
||||||
|
"0xf8738361820684773594078252089400af839c3fc067fafc2e0a205858d6957f0dd18d88058d15e1762800008085034b10ee44a06e90bb215dedf42450c3529ecacc852df6fa5c4d76b04b673d2dee5162f77afda061c0f17a6fb4eaafd5c1792bd780e256ae93b8197eba1f739d3483b6018b34c8",
|
||||||
|
"0xf87383618207847735940782520894ebb6d32a650afa9221b55a11c6a6de52b6f07cd788058d15e1762800008085034b10ee44a0bb5b7a794279609699dcfef3544af96e2f36e1a080d9df5ae2f0d065d897e7f6a020b02a03622daf550239dbffa1d81c3637dfcc4267f19ec86deccf77005c7b3c",
|
||||||
|
"0xf87383618208847735940782520894011d26a3a9adc9203c8943a6a77aa8657af5242088058d15e1762800008085034b10ee43a0033c85b6bc49bc1122163ed03061ffd5a580e70621a77877108c975f6280374da03a2ebd53fa8a5b2c0676e05e87ce8ae0f64f2a1304c1c01fb0a353ca084123f6",
|
||||||
|
"0xf873836182098477359407825208949c85bc61a89fb5abd957e6c819c653fc1aa0d11b88058d15e1762800008085034b10ee44a02c511d53e802a2653fe1284802c56362ce7f36936030da8f2afabc9369812b8fa02ca196683edf5a07038d65d12d23b607d331558f8e8bbe1bb3638b3f87ed1e5d",
|
||||||
|
"0xf8738361820a847735940782520894bd8e8435b7897d87cf7cedb5cf8c5dd865dbf72088058d15e1762800008085034b10ee44a0dc65a971d20e6b631f9ce091c891068600846b80a519b897dc90d85cf493b67ea075b4159b6bb958d789c05bfbdab2f58bffe006f1bc6481f5e5fbd0c0de87e0ab",
|
||||||
|
"0xf8738361820b847735940782520894adebee2e3ff041078b62380d001c6e51b4f1559888058d15e1762800008085034b10ee44a0dc5c31ab6d48576b337145ca3480f20403342d4632db7e3c58a5c2a3722aad36a0088bee3e8da14156e74abd4b830ce7dadd9aa5acc682b0a5f441e2c579930dd5",
|
||||||
|
"0xf8738361820c84773594078252089471e94c459c9f05085fc0d34b5f21e648e05dc6b388058d15e1762800008085034b10ee44a0cc7dd758523571aa417ca7e92ce18fa344eb09ae4030cbe67a20749a5f25cfa6a079260f268e88f5349a96d339a543c81800ddac65ded5bf66ff69bb8d2cf6ac8a",
|
||||||
|
"0xf8738361820d8477359407825208947c1fe317db82c9298b87c56c3194178271b621e188058d15e1762800008085034b10ee43a03670f304b0cfec63bbb48f6adea22daabf97cb5066464b66dc8b0c5062547c94a046ff008a93f3ce2964b77be87730cd5e4fe706832955148580869189edd18d1e",
|
||||||
|
"0xf8738361820e847735940782520894e069d1c9abf5127bdc3a164fb93b96bfa9f74ce088058d15e1762800008085034b10ee43a0118c5332b8e96e0938c49205cd48c34651dac16e06b177fe9ccb3c4a5714a818a0335ee8a457a31e10f6ece6faa85587e2527e69e7287f9cbfcbe977033091d5cb",
|
||||||
|
"0xf8738361820f847735940782520894b9bbddd1eb6ef8fb1bdc6a853d5ad7486a9487dd88058d15e1762800008085034b10ee44a0fd2a39184707e76817b5132d4f680f58b814ae07053bff5444341964029676bfa03a96b5d6be262592e72f19bc64ca930f1e76a6655d89ac3640aa927ea066f679",
|
||||||
|
"0xf87383618210847735940782520894a804387cdaf986d45831e8074efb2115af053f7a88058d15e1762800008085034b10ee44a03809b662c3a9d240d7b7f9e2cb4fb8d50b1e421b4548180704aedea809b2218ea063c9d8136461e93058f75ae91000d4e6f0cf21ff74d5c91c340209c1d04f0bff",
|
||||||
|
"0xf87383618211847735940782520894f23501d784a041fc911b4c86c2bfb1f63ec170ea88058d15e1762800008085034b10ee44a02af9b021ce8467c713e9ba2dd9a948cdc1d67dd04117868b6897831a4c9b2448a06bb0aa527519e251ec40b747f25dc7c7c2ed689022ac4dd80c4a40c37efa06b3",
|
||||||
|
"0xf873836182128477359407825208943928be2a7058088313c0fb3294014e88a3c5ed4a88058d15e1762800008085034b10ee44a098ea195f842b013d76e62b19cb989e3d853ca5b84602bad0b777ecdfebc2f0dba0540fdd9b2a2ddcb4a634bf63186c80987bcb9c19d0025ca0cbefba565e4afbbb",
|
||||||
|
"0xf87383618213847735940782520894196aa07204141478459c14106ef5e5282efe995788058d15e1762800008085034b10ee43a0b817d9e63a606c505074d41ce01c53612ba083cd4b39adaff884c869d539fd6ca06dd3bd03aefe17446e3354dcf4864a712e4ac2e4c59701a41a4f7ffbc937adcd",
|
||||||
|
"0xf87383618214847735940782520894763cbf89560e2da270000822abda9584db693fa388058d15e1762800008085034b10ee43a09b856c0c79b5f977db2d9c26992f9e2a113e86dfde2fa684ae4a28a45fdf7dd3a078ac54eacbdc28a7b98176c5c79becb1ebee800186c48b664a643ae760cf0318",
|
||||||
|
"0xf873836182158477359407825208947feaea0ff70ffc9eec2104f57f7136aff4dea68088058d15e1762800008085034b10ee43a0a5d30ceced18dbf6684a5ce409f654f359ad2d6105ca8cfb6c66d0ad18fa840ca06a3f64c8d043f06d2b0d26fde83f003aeb24904226fea3712af38e2c7c805a96",
|
||||||
|
"0xf87383618216847735940782520894e5466aacd9dd6d3bb35060a1ccc76a438de88ca188058d15e1762800008085034b10ee44a0b2646589ce46644bddfb0bbe5f5dfe9700a82accbc4ef29997094913c1ad85a1a01b65a1ac0f935af862b93dd79559b685d2c6afdf93795e70fc3cf174f95a7d9f",
|
||||||
|
"0xf87383618217847735940782520894f670980415cfe8c4f8d10645ecf974c9a2fea00e88058d15e1762800008085034b10ee43a06f2d0bca0b319a77accb02cf01e2edf5fff3f5cb38fc99d25a2d19642027e359a05223e3bce8700a92b7770fe92d7c50527505230cea7a5ab05e90c5a7959e0cc1",
|
||||||
|
"0xf87383618218847735940782520894a29115bce7829ffdd989b7cf1bdd1eac06a2cb3688058d15e1762800008085034b10ee44a09377c8d9a2e30c4c08b6d81fb5b645b6c4938d4047858668cbb6ddd3d67b2433a079e9b9182f4c0c6291a470f6dde8846b0aa729676224081d29940f0c319c54a0",
|
||||||
|
"0xf873836182198477359407825208948f528aa67dc1846c893465fa1c8c26556bc5fe1988058d15e1762800008085034b10ee43a00e35ce7ac258b4230bbc01045e9b5e1789543dbd324e975504c0c60e9cb5cbcfa057879da45fe069aa050ff7734b6e59b5e127db0f1921b973885ff3ef6aebe3db",
|
||||||
|
"0xf8738361821a8477359407825208944dc4ec6ac43c8c45777292db987203c0248e17b788058d15e1762800008085034b10ee43a03b63fd365340ceebecdb997d2b4bb41b336683c02eb1139cb1791d286ee13246a003ea3888ed23e1f986d8d3b9d560281d3484dd2fe974c25f7216c90568208b45",
|
||||||
|
"0xf8738361821b8477359407825208940d2f39f251cb547cba567a31e5e9f93c19dffa8588058d15e1762800008085034b10ee44a050f14998905eb10dc8e53395da51b21b0eefde3bc103b615d6f97d7b44f26e36a008ae2d148621eefa13ef0e3fb6ce1d259c62c8e057180ed49d761fab9d312b93",
|
||||||
|
"0xf8738361821c8477359407825208949eb31fb94ce5111e2a04cb9d156b513887ccbd0088058d15e1762800008085034b10ee44a07e88781530f943cd64ca63c2b7133bf8ed704356622be4b54f08751b54bf1d2ba00fa89ce3cc8f773cc83a72b7d58327740c41c95679e7003522c489ab9f66f88f",
|
||||||
|
"0xf8738361821d84773594078252089404b88ef83f8c41b1465d360a1e82f07ae190892a88058d15e1762800008085034b10ee43a096a28917edd16daee0707b0459a228fb5e006a5b9714a5d9cdac681a6960836ca02bce226c902887909a8bba3ad618153e90ff2d93e3825a42b72181bd18154d87",
|
||||||
|
"0xf8738361821e847735940782520894af23e04b04fbe15630eadd32a6f27a5a65ea554a88058d15e1762800008085034b10ee44a01dd4f73c1317ed5bd565999aa5fc130e388378ccd9f9641ed6a213d357d7bb7ea03e94fdad16c029234002c3ee24d382fae242f60bb58340c2a45488e57ad1bcb1",
|
||||||
|
"0xf8738361821f847735940782520894746cdff371e3f1e905b3ac52280078bac2dec7dd88058d15e1762800008085034b10ee43a02a4b086a715feb49bb892f026c3995f4235ced4da4a500bd3c960af2c3853ecfa03c14793e2606d25e7b5469a04bca55f50af24abe997afa154ef276ebfc7a6e6c",
|
||||||
|
"0xf87383618220847735940782520894c33e5155bdbf1a0a7ceb1b80f8586c5cda5c378188058d15e1762800008085034b10ee44a0b23359e18485b91d7599425b986ebb19cee52960533f993c24998636ec169a82a028d4cd7d4bc768fe29a6a3f32065b0a59188239808fbe5bb39e90ccd8eb43989",
|
||||||
|
"0xf87383618221847735940782520894e7fdef5f5219068f3d0f88a7445005574c66279888058d15e1762800008085034b10ee43a0101fbd3be6b8fc9c5a7f5c8f3c9fec2abcedbac8ab3c7247df2c98e6b968af38a019c11ee7058d8a6eeceb2e8cb45492f442eaaaa7fff37cc7fdd9d17e92e3bfaa",
|
||||||
|
"0xf87383618222847735940782520894f0a81a63c5e09b0bd08e027de48058e377d3732d88058d15e1762800008085034b10ee44a0f0e999e581df579e31fae928c52a7df96a1524d38f2e41bf4893ae7c4a083a48a022e1d07f18385e6d2f9fce94a25d042f4dee7eabb2df53d9ef694ba27869bb29",
|
||||||
|
"0xf873836182238477359407825208949878ab34dc3b4a63c80fdb733491472c11d59a5688058d15e1762800008085034b10ee44a0d719bfbbfbdbdab38420d454322ccf418defe93e5d81dffc354e0324d4ebd5dda05859b730b918a46f7e58bc0858aee845eeb07e64a6be8df0357a18b519b3c00b",
|
||||||
|
"0xf87383618224847735940782520894912859bebae3086ac7a062dee5d68aa8ed2d71ec88058d15e1762800008085034b10ee43a0a73cddf5a57016d0cf7e7f91e0e6e419f1a3e6485159868817ff0383fee03b4ba02a0cbafef77b725e6e3adf60c14463316b2d6780536e29d411044bf9d4a0518f",
|
||||||
|
"0xf873836182258477359407825208945a0b737ed85049410e5ea61f444d07d5c8c0359f88058d15e1762800008085034b10ee44a06cea82c78f91a7e463a6493ae9aed4039cb220686ed4b650c89e4160835d1a30a062d3191502b312090301ea3dd63b6b29f4e64622639a6e080d4a15a1b2b22ae0",
|
||||||
|
"0xf87383618226847735940782520894305a5dfd46e6128abce28c03b3ad971f4e4915ff88058d15e1762800008085034b10ee44a06ee9ca5a35966737addbde05c3702020db87737e2f3fe6f783023e69ef49c84da067ac4e87f6f02258d33cc1507006ed81501d1398428016f0b99eac2bd23f54d2",
|
||||||
|
"0x02f9021e8501a5887710808477359407847735940782dfad9442424242424242424242424242424242424242428901bc16d674ec800000b901a422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200eabd7137c45a0f283d7839ca69f6bbcee6adc41416bc9e01c31e8ca86b767390000000000000000000000000000000000000000000000000000000000000030a3dc91086418a5680fe3037dba62dda3de79dd22bb41036719c3771f140b419586ae7d9bdf3b10d88850909d4556b19b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020010000000000000000000000bf3da697ab02552a5da95f267075cbe495d1ecb30000000000000000000000000000000000000000000000000000000000000060896bccd536b4a30c4c3ce5877544574c624dff09f100abcb2df38df7c797069aed3213f1320fe77e4cf89907fb23fe4601a9008fdbac478412f8d6a5eb4c53b12c3848c29ced5ded2a7e3fbeb1e1dc4f58a563d761f7ea80c06088126e0dd9eac001a0ccca64755c8eae02419698251ccdc9e3691d2caaf5a104cf9542383c1a548d2da00ac0d62ff682d5edf5746aa633e34a5e8e789ec3eccdbd63b8d12fb80862d80c"
|
||||||
|
],
|
||||||
|
"withdrawals": [
|
||||||
|
{
|
||||||
|
"index": "481571",
|
||||||
|
"validator_index": "71016",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481572",
|
||||||
|
"validator_index": "71017",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481573",
|
||||||
|
"validator_index": "71018",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481574",
|
||||||
|
"validator_index": "71019",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481575",
|
||||||
|
"validator_index": "71020",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481576",
|
||||||
|
"validator_index": "71021",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481577",
|
||||||
|
"validator_index": "71022",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481578",
|
||||||
|
"validator_index": "71023",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481579",
|
||||||
|
"validator_index": "71024",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481580",
|
||||||
|
"validator_index": "71025",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481581",
|
||||||
|
"validator_index": "71026",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481582",
|
||||||
|
"validator_index": "71027",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481583",
|
||||||
|
"validator_index": "71028",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481584",
|
||||||
|
"validator_index": "71029",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481585",
|
||||||
|
"validator_index": "71030",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": "481586",
|
||||||
|
"validator_index": "71031",
|
||||||
|
"address": "0x7bf8bca0ccd13d04fd466539989efe2adcb0ca7e",
|
||||||
|
"amount": "34197"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"blob_gas_used": "1179648",
|
||||||
|
"excess_blob_gas": "67895296"
|
||||||
|
},
|
||||||
|
"bls_to_execution_changes": [],
|
||||||
|
"blob_kzg_commitments": [
|
||||||
|
"0x92549576706cd5a855ea6a82537d1c7190c8d7d439f4dcbcf4b9b2bd34c4712d14f4ed041644bca5659e1826570e58b8",
|
||||||
|
"0xac58961e240bb13fd49d4cd60ace53bf3b6205ab7aee98987f3e589680fbe9d3febf3991150dd2ce0a785b9c7ceb42e2",
|
||||||
|
"0x83945613f3af6994e24c48b02a39a7c0e9c98f168c0c12ce3bf1d5bc267236ed6770c9c8a1fd7d7a9152066ccfa7147e",
|
||||||
|
"0x9334f6af7b93b7c1ee1cbac56bd38e9d9d6e50dd110bcee546333ec3ba0702c4aabe16b332ebc657967c66e9789a3a69",
|
||||||
|
"0xa43089b05e5987070bdbc3b8742bb30d7c34ea0e81518dc26ccb3f3a97c23df6d96f2cf1000ff985b494cc04743c5e2a",
|
||||||
|
"0xb45aefd32b12b74523a1082102de20e6965b31fb493228a12247e85165346087be8e54f435a60e9c96c1af716d4477c9",
|
||||||
|
"0x93c5be3093d114302d2dbd86f132c925d7de78bf977c0fd47e0e2c2dff528af381989fe0e50dc82e48d7f5c34d02f6ed",
|
||||||
|
"0x8a6a84e0ad21a30bacb75e8d0d5c3cf9fa89bb4d72a3cb4462a771cc533227aee35a21030258bb6b5869bebb3075be69",
|
||||||
|
"0xb54c1dd86ee3f132994ed666988cbdfd9a2b775697ce3e17139850cfe6ab2a5f250a1e2e9103fbe241582eca35d26b25"
|
||||||
|
],
|
||||||
|
"execution_requests": {
|
||||||
|
"deposits": [
|
||||||
|
{
|
||||||
|
"pubkey": "0xa3dc91086418a5680fe3037dba62dda3de79dd22bb41036719c3771f140b419586ae7d9bdf3b10d88850909d4556b19b",
|
||||||
|
"withdrawal_credentials": "0x010000000000000000000000bf3da697ab02552a5da95f267075cbe495d1ecb3",
|
||||||
|
"amount": "32000000000",
|
||||||
|
"signature": "0x896bccd536b4a30c4c3ce5877544574c624dff09f100abcb2df38df7c797069aed3213f1320fe77e4cf89907fb23fe4601a9008fdbac478412f8d6a5eb4c53b12c3848c29ced5ded2a7e3fbeb1e1dc4f58a563d761f7ea80c06088126e0dd9ea",
|
||||||
|
"index": "10011"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"withdrawals": [],
|
||||||
|
"consolidations": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
232
beacon/types/testdata/block_electra_withdrawals.json
vendored
Normal file
232
beacon/types/testdata/block_electra_withdrawals.json
vendored
Normal file
|
|
@ -0,0 +1,232 @@
|
||||||
|
{
|
||||||
|
"slot": "151850",
|
||||||
|
"proposer_index": "38060",
|
||||||
|
"parent_root": "0xcedd94fbf2ebaf371384911b85bb3073eadcca25eeb4ab29d14acd95cd88bcfb",
|
||||||
|
"state_root": "0x611fa0d96bedd90a2474b2e67f93f5a5edf82af93443079b58658c6739207a30",
|
||||||
|
"body": {
|
||||||
|
"randao_reveal": "0xa69041c990d2c6cab84d979be3c9db5081026874c8e37750c4274a355a7acf06f7fbc88857db3c20c84309f61026b20917a99fc826123ae930dba33dc92ced07ebdd57b45b1760fa08309c67fef843ee33ffef518e2ce9cb3c41da9e65d6f6f6",
|
||||||
|
"eth1_data": {
|
||||||
|
"deposit_root": "0xd70a234731285c6804c2a4f56711ddb8c82c99740f207854891028af34e27e5e",
|
||||||
|
"deposit_count": "0",
|
||||||
|
"block_hash": "0x1b60b6c9500355aa0ff7e1654482fea15eee29f2d52a25aeae859df953c0f7d4"
|
||||||
|
},
|
||||||
|
"graffiti": "0x74656b752d676574682d3420544b656466343463616147456230323761393061",
|
||||||
|
"proposer_slashings": [],
|
||||||
|
"attester_slashings": [],
|
||||||
|
"attestations": [
|
||||||
|
{
|
||||||
|
"aggregation_bits": "0xfffffffffffffffff7fefeffffffffffffffffffffff7fffffffffffffffffffbffffffffffffbfffffbf7ffbfffffbdfff7ffdfffffffffffffffbff3fefffffffff7fffffdfbfafffffffffffffffffffffffdffffffffffdff7ffffffffffffffffffffdffffdffffffffffffdfffffffffbf7ffffffffffdfffffffffffffffeffffffeffffffffbfefffffefefdffffffffeff7fffffffd7ffbfffffffffffdfffffffdffdbfffffdfdfefffffffffffffffffffff7d9ffffffffdffffffeffffffffeffffffffaf3ffffffffffffff7bfffff7ffffffeffffdffdfffffffffffffffffffffdffffeffefffffffffffbfffffffffffffffd7ffbffffeffdffffbfffffffffffdfffffffefbfffffffffbfffdfdff7f0f",
|
||||||
|
"data": {
|
||||||
|
"slot": "151849",
|
||||||
|
"index": "0",
|
||||||
|
"beacon_block_root": "0xcedd94fbf2ebaf371384911b85bb3073eadcca25eeb4ab29d14acd95cd88bcfb",
|
||||||
|
"source": {
|
||||||
|
"epoch": "4744",
|
||||||
|
"root": "0x810ed886bb9706fc2df193e2272e3a864eae69b43ca5797789f865b562cc3456"
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"epoch": "4745",
|
||||||
|
"root": "0x9a8e0a72cf9f99379750c1c8b403c6daed6138c4577610e36d4b405f4f7e307b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"signature": "0xaffbe8cdd9c06cb23046969189e66e3c825ac6d0d7170334d9a5d8e7797d47069dbf96f391a86f0eb4b1c6d2eca55b34123567907c3342b4bbe31e520a0e0be813d5986f2d679a2b1f9ee0072bdbde35bf56affc060fd33556733e57103ca4bd",
|
||||||
|
"committee_bits": "0xffff010000000000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"aggregation_bits": "0x00000000002000000000000000100000000000800000000000000000000000000001",
|
||||||
|
"data": {
|
||||||
|
"slot": "151849",
|
||||||
|
"index": "0",
|
||||||
|
"beacon_block_root": "0x2bafda2b58819919eb49363290dfc50050f3f57cd6a0112ab4b5d4a42ba7c821",
|
||||||
|
"source": {
|
||||||
|
"epoch": "4744",
|
||||||
|
"root": "0x810ed886bb9706fc2df193e2272e3a864eae69b43ca5797789f865b562cc3456"
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"epoch": "4745",
|
||||||
|
"root": "0x9a8e0a72cf9f99379750c1c8b403c6daed6138c4577610e36d4b405f4f7e307b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"signature": "0xa56ae375f437178909c0bf4ea632b94dff322f63bf383c816693c6f9841fb24fa7de3440fbc749cfc0c0d55e341c466b0f019dc77758dae97362c23ce1f8f71d8aab12f7491874d2d7c3e197037f313c840646da75c40577ebc0cdd239524f1a",
|
||||||
|
"committee_bits": "0x8010000000000000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"aggregation_bits": "0x0000000000000000000000000000000400000000000000000000000000000001000000000000000000000000000040000010",
|
||||||
|
"data": {
|
||||||
|
"slot": "151848",
|
||||||
|
"index": "0",
|
||||||
|
"beacon_block_root": "0x85f3e44f8ea07968ddbca17eafd5b6ae402560a120ce96ae8ab9f06fe9bc2deb",
|
||||||
|
"source": {
|
||||||
|
"epoch": "4744",
|
||||||
|
"root": "0x810ed886bb9706fc2df193e2272e3a864eae69b43ca5797789f865b562cc3456"
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"epoch": "4745",
|
||||||
|
"root": "0x9a8e0a72cf9f99379750c1c8b403c6daed6138c4577610e36d4b405f4f7e307b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"signature": "0x93c1542a02328cda2a26b7a2bdf02480fc244608c232d8239a6519ab5899588b531cc383f1a6462e37167ab6b85eead40296ceda75a9da55805bffd8631642b2197cc3c2684070b68f2543ad406ff992a9f9a3f852f9a4cce664400f4a0850da",
|
||||||
|
"committee_bits": "0xd000000000000000"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"deposits": [],
|
||||||
|
"voluntary_exits": [],
|
||||||
|
"sync_aggregate": {
|
||||||
|
"sync_committee_bits": "0xf7f7fffffffbff6ffffffbfffffffdffffffeff7ffdf7ffffeffffffffffffffffffffffffffffffffffffffef777dffffffff7ffeffffebffbf9ffffbffffff",
|
||||||
|
"sync_committee_signature": "0x86b38c811f1415024af4bdc7b60bbea76e938f326595aa7238ca047bf336ff74707e9da3052d3d376766901b2d097fd5140de9bd4a9c0a5fbd4f12e0ac6ae472d8493a87e6e9bd69590d39ef6f142f7b2990938cd56e54e48bd9a9a55e1a40a1"
|
||||||
|
},
|
||||||
|
"execution_payload": {
|
||||||
|
"parent_hash": "0xef54f75df413929ddfa60638b93feab47a0ad57e7585069308dc3b31beb42e05",
|
||||||
|
"fee_recipient": "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134",
|
||||||
|
"state_root": "0xa694a1983a7427b1ee0524a1619573db4e8f48368d13dde2a1103142e1e77cbb",
|
||||||
|
"receipts_root": "0x72a0eed2e520b8f791fc8dcafa8a94c3e411cba82097af3fb0287d3698c7bf0a",
|
||||||
|
"logs_bloom": "0x00200000008000000000000080000040000000000000100000000000200000000000000000800000000080000000000000000000000010000000000000000000000020000000010001800408000000220000000000000000000000000000000000000000000000000000000000000008000000000000000000000810000040000000000000000000008000000000000000000000000000080000004010000000800000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000001000000000000000000000000000000000010200000000000000000000000000000000000000000000",
|
||||||
|
"prev_randao": "0xbad3a8687ee866a509e9b22c4bd16d16ac2fc5a134fe8ce3477552604e5870c6",
|
||||||
|
"block_number": "141654",
|
||||||
|
"gas_limit": "30000000",
|
||||||
|
"gas_used": "2716694",
|
||||||
|
"timestamp": "1740426060",
|
||||||
|
"extra_data": "0xd883010f01846765746888676f312e32332e36856c696e7578",
|
||||||
|
"base_fee_per_gas": "7",
|
||||||
|
"block_hash": "0xf6730485a38be5ada3e110990a2c7adaabd2e8d4a49782134f1a8bfbc246a5d7",
|
||||||
|
"transactions": [
|
||||||
|
"0x02f9017b8501a588771083013b8485012a05f2008512a05f2000830249f094d27d57804f09a93989e290cf12cb872c39ad2ad280b901040cc7326300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000056e915d8da78e50000000000000000000000000b3db4f6329df01ac317a70200f6614e1cd0db6f7000000000000000000000000fc7360b3b28cf4204268a8354dbec60720d155d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d0ada425f6835193b8507d7de3a77ec1bd6c5377000000000000000000000000c8ae6c2d3f6695e41b5cb149beae76600f4ac97dc080a0212407d77d016985f42a043805a755a10b29c905c7e104c4c0f4bc00f0128ab0a0153258c0796acf19214c28c4554d82022c0f5b14c324068acc895d6e365a43fc",
|
||||||
|
"0xf873836202478477359407825208946177843db3138ae69679a54b95cf345ed759450d88058d15e1762800008085034b10ee44a0797cebc48b0b84885aae6d7be2e45bb148b09f6a58c7bc35f6d4b0ed4218d4c1a0671bebb2c27f37350c18bc626f7096e22233e8243828efb5831d8de85e230f15",
|
||||||
|
"0xf87383620248847735940782520894687704db07e902e9a8b3754031d168d46e3d586e88058d15e1762800008085034b10ee43a003a4493dbfa34810445419bea223d56ef71737f28a1c821a46862b173c3a06e8a01fe9f6643b5054a85e45ae0413118dc1c0de71ead60704241fa40ed8ecb432b9",
|
||||||
|
"0xf8738362024984773594078252089415e6a5a2e131dd5467fa1ff3acd104f45ee5940b88058d15e1762800008085034b10ee44a0c8c7a7b76c6525400c1ce5d7dba14548060d36d2bc4bd846a7a7425217d66957a025449e02d5bcf26d422dfbf41bae2de5e8468d7399043c12da8bbb7f5fb02eed",
|
||||||
|
"0xf8738362024a84773594078252089480c4c7125967139acaa931ee984a9db4100e0f3b88058d15e1762800008085034b10ee43a01ff07f88e3ef809a7326f7912323ddbed12184b573230d4f269969a48602a5aca052831c32b936474c7e200297135e951b8948130a61f0064ef5bce0fd8ff421f2",
|
||||||
|
"0xf8738362024b847735940782520894d08a63244fcd28b0aec5075052cdce31ba04fead88058d15e1762800008085034b10ee44a01fd39c5fc58bff2729959025ef99dda0614160f06289efc56e6ccb0b67bf209aa002ec26712f5595db24e57dbef108c3f4e8b1863d71dc0a6746d944c10353f209",
|
||||||
|
"0xf8738362024c8477359407825208940b06ef8be65fcda88f2dbae5813480f997ee8e3588058d15e1762800008085034b10ee44a0095291ad41e987063ba52692f06dbb29612393dcb40ae89ee3571e660c65db81a07a59182d51c5d07fcd8fc48adf3667a50d9b39185619c52938c741303603609e",
|
||||||
|
"0xf8738362024d8477359407825208941cb96c5809da5977f99f69c11ee58bae5711c5f188058d15e1762800008085034b10ee44a065c2371b3cded7aee9ffbd9383f86970b06b191d93b1485991f3d25686d86c38a0067905277c21e7402e8af63e6ae6b577d9c669db4a78f61c887cb7bd4c8b117a",
|
||||||
|
"0xf8738362024e8477359407825208942aa48ee899410a6d97c01b0bb0eeaf1771cc435b88058d15e1762800008085034b10ee43a099694c115ac14278bbc982204081457ec7b12404a86010dfc6877b87a3571bffa0117d6a284e25bda56b7fa75d26ac4429c38659a8f339280f1b7df051fcea84ee",
|
||||||
|
"0xf8738362024f84773594078252089407b9d920dd8e8d83dc1125c94fc0b3cdcdf602fb88058d15e1762800008085034b10ee43a0b7068fc0a17b7f6dbef5a97f10202748f9f45be2d47a54658d0c4d7da0f0d653a03362d98c11472ab5dad42e39de5175cf756d9fe022a8d0628f5d6da7b5b7525c",
|
||||||
|
"0xf87383620250847735940782520894fcb6e353ad4f79245c7cb704abcffe2f4868424188058d15e1762800008085034b10ee43a0ed028a4990f492396d8e86f9b0b58f934a8ee54938cbed8f83d68c29752f0bc3a062ce81c4edca14179ec5ce4d046e5d612c23d59f6744599bfd6ec71deb4ce2cf",
|
||||||
|
"0xf873836202518477359407825208940d3de4256d6322683fdea9ee23765ccbfcb83da488058d15e1762800008085034b10ee44a026d858e4cee789dfedcce3d7f52c8b1e5553a59c41894652dad1fec3f2dfe7f6a04935cb6ee45e295ecbd0d8ece2860f6697786d439c1f8e066e8ceca802bc705b",
|
||||||
|
"0xf873836202528477359407825208946021752d8d9b2f221d4fea4349dea34ddbcfce5088058d15e1762800008085034b10ee43a0d68f1b33afc775f5ee8e35d72a2abfa5966f6fc6f24cbc74498cc49163554898a02c8fbf6de58c657a47db2deb478659bcc31d92ab1697b336169010d3d937409d",
|
||||||
|
"0xf8738362025384773594078252089461e296d527edc89e831cf593ec341f16197eeafb88058d15e1762800008085034b10ee44a0cbf42d8ee53861132879567876c2d3d4361a2bde5a8a03d673e8a9e02e2f2198a0315ae79bef63a5105373ab4bc82f4d981674ddf22f555a414394252de873bc7a",
|
||||||
|
"0xf87383620254847735940782520894cf7317ee7a3b497ecf634b94bff60ff91b92574788058d15e1762800008085034b10ee44a033f4bfc7c5f798824317332a8e1cbc5dc6c3008aa09cb66dd090aa3c2a5cca1da013d43f1901fe898eab79bf8491a7eeb84373a187ec4d181ff1d2e5815cdce8f7",
|
||||||
|
"0xf873836202558477359407825208947e7b519df31f77ced83eea1b16aedb6dcb0f0b2488058d15e1762800008085034b10ee43a0268a7ead7124d86048cc864fc1ae417c5bc72d569c506a08bfd95abd1a3869eea02ca3d7363cb6f6507d81f070784cb74edb060228c93f740815fe96aa7d884574",
|
||||||
|
"0xf8738362025684773594078252089488a075e0fb1c9309a200a8bf0a88b214bf7ceb8d88058d15e1762800008085034b10ee43a064a8c228105a6a32632607e256ebb266a1b4ee37fd624ffc1f1ba939cef76066a0221b7fdbf2e6eba0742990b2b6d715f813599ec7ff01cd839901424230e5b0eb",
|
||||||
|
"0xf87283620257847735940782520894c8d7cfb58f3ac02568e6505bf3fb5eb6f080703988058d15e1762800008085034b10ee449f9df05b5989b41018aae438d7cf6eaab197ac212e434f3c4d97b08a2490b802a02732feacef45e05a73bbf32caf062f0d84bc2daaef88a9527b1ffbcb44a17a21",
|
||||||
|
"0xf87383620258847735940782520894e0132e8d7b1b766e0ade5543d6c6c0b2d5a2f01d88058d15e1762800008085034b10ee43a029a831ae211d616087569490c670fe44a681465a30144626e9787ea7174d0e01a05fc1c4037e8b7ffc15ced7750833ec8771f1b4d65d1e68381c68cf9523e44c98",
|
||||||
|
"0xf87383620259847735940782520894eb674c0411db79654afdc1e131f3b6e734baee6c88058d15e1762800008085034b10ee44a01064ff856cbb0bfbcc61383cae3aed541f6fe1e011e86bb842efd25e88429539a046a0b8db35289c2285d917ec68ca78cc2ee7492d8ef7c1e11e63b64d8530c121",
|
||||||
|
"0xf8738362025a847735940782520894dc07c60993cf689438b8c85f86b0ed938dca77ea88058d15e1762800008085034b10ee44a06f9e81bd4cdb2847e729b1ef1a331a663fc7531ed74a09e59ad02920db531f2da058e52df9092b08b45e4a9b961f431af4dfbb0bd86a48cc162c3e2f0d56d5658a",
|
||||||
|
"0xf8738362025b847735940782520894110ddc93db59ed31a03518510221ec2f35d28f2f88058d15e1762800008085034b10ee43a02eade5940ccc8290dc553ef3027d086985b03a19cd97928e258c3f4f7b1523aca0549d6ef116c9932490e49144b0287b6bbb702584a17576291241ac15ffc94bb5",
|
||||||
|
"0xf8738362025c847735940782520894b599a876aaac824cfce21bdf15627c9fd8634c3088058d15e1762800008085034b10ee44a03cd476a5d252e0b18d8d0809f26fe3871b62091cfb43d08dabd0c5874dce3590a063b5231c6c7190ac4e87985d997d46ef4c8bf3177953272fd1d0df9de95a506c",
|
||||||
|
"0xf8738362025d847735940782520894d36e5540dd71acbd6416d60252c4d7c34a3c824588058d15e1762800008085034b10ee44a07d9bd59a5a4480d84722885e29cd6d33f1cf04a98dcd8e3dcf7321f0fbcbdd74a0354eadbc5e2cac079487f00d57f5fccbcea7936010a7509e6712f8ce39806dbd",
|
||||||
|
"0xf8738362025e8477359407825208943adeca35af56206a74987a8fe13c669365c770cf88058d15e1762800008085034b10ee43a0a7df3bd9baf87afa5894782cf23385baebd8128d2ff7a1a971234ecf3e6ac7dfa03c811122700ebe14becfa56791483c58a1810dcb7cdd7b3ac3e2ff0b0e1e042c",
|
||||||
|
"0xf8738362025f847735940782520894d77b95acd12f7b4b5692b55717b7bbca1165195488058d15e1762800008085034b10ee43a0d1b54826d1311a0903886ef61521910679cdaa3cfa70f14b672ea803a955c15fa05e881bdf984a03ba04042f26b46c82cb55662cb3eb23c40618e17cfe1e91d80a",
|
||||||
|
"0xf87383620260847735940782520894f388bf5766b5ed5d4e1cbf15772e677dbfa80b0088058d15e1762800008085034b10ee43a0ab360b7a78ca54508f199cce95ea4c443482716205c32237b2be1dcfd1cb011aa02fc48513039fd6fa6bd608c9dfbb1965d2e15e70ab6cd67b781ba486bab2d093",
|
||||||
|
"0xf8738362026184773594078252089435d4996296e58560e6ef47787d51b55f1e2bd92a88058d15e1762800008085034b10ee43a0621eee5a891fdd819305e26ee2a6152e752381b29f7e2af5597bca6ed0f9c441a0747cdd3922479fd516c01172d6562a238576486d0fa084b9f3e603f304b4edea",
|
||||||
|
"0xf87383620262847735940782520894a4c3b77b898e53d6095f11c53a1ce272cff9af3188058d15e1762800008085034b10ee43a0a73f452201074e6cb8fb75a74da059a7e0928fed9ded27dd17bc4cfd93a22443a0674b3c5006a65687aa6802133fd29c77e68cef8a315175f677e9b6b0dbab56b6",
|
||||||
|
"0xf873836202638477359407825208946e84f6113fc1919714f0266705813fb81a17181f88058d15e1762800008085034b10ee44a0f054fd8871770486554e18096985f02ee95c032b9be137a8e0026f619b55d2c1a02a4855957e29e3d20223cc41194d0be22f7ef7cf436df2783754147bff8a5c04",
|
||||||
|
"0xf87383620264847735940782520894e9ae1a806004e1452baae0493920815aadd8479888058d15e1762800008085034b10ee43a0b475580a478780d91e262e2b1697d1faa216effee65d00d2b6357acb47b1ac54a015abc88732edd4be13376b6f910c5b5c6c1929210bf25f384a49fcb48aeb069f",
|
||||||
|
"0xf87383620265847735940782520894fe1905d8ebd20e037274eef441283c811ea82c1688058d15e1762800008085034b10ee43a089466e0fb9624d16c977ac2d64276e4700c47ef9ff4c8cfce8c801109e8b0b77a05c6b093850d7e34da5d445e203900087275573e83681eda656e3638ec3661547",
|
||||||
|
"0xf873836202668477359407825208946adece88e477f53a143a4c29d97940df2ec768e088058d15e1762800008085034b10ee44a071f1a5b69f6c8ae0393c4390adb7a3271f99af0c01524e277690ea199dcc2da1a03e887397647eea176bb4d7f7743a0f812a1223da3b465134e4f7b47a267379ef",
|
||||||
|
"0xf873836202678477359407825208940d34d140a7376892c4593fcea3ae26f5d6f202d788058d15e1762800008085034b10ee43a044af0ef032fe68acae258743e7a913b65bb1bcecd04e3ca23ff4b1c35f8ea248a0180e9622e1cbc136d45607eed1371a21adec0f1e76c9f60ce48de13798462ba4",
|
||||||
|
"0xf87383620268847735940782520894d1c7fa75b9bc55d041fcdf215f3e3a351c9f9edc88058d15e1762800008085034b10ee44a08b91903cf64c5ea1ef70728d84f3d6c3460e9b0373e39e25e5601a859578388fa059180173244f606fb86eb64187a39db3e6eea697b8eb725d44a348523e1a48c3",
|
||||||
|
"0xf87383620269847735940782520894418ebe350a8c6387bf5e42f3502742af8e0781f188058d15e1762800008085034b10ee44a084bd185a547656a0e4d8cc84cb47b77509f857bd5de7d6c56182c143665bb7b5a068b10a9e4d24f54d7af772976d4c9806828af12e763207efa4c47e1352590719",
|
||||||
|
"0xf8738362026a84773594078252089484914d2770c711d27888c775c547b1d933b48c4788058d15e1762800008085034b10ee43a0dd2129a3c3b56301435d67d5da0e8b4e5eaff46e6d30f49608c5b5d50c5e9dfba037b1663d9a8a20bf14f205817728934e3c6f0ec10642c2d24b54e46c0e3160b5",
|
||||||
|
"0xf8738362026b8477359407825208948f51e560b85edf2e653c689c4e9fac02ce0556b888058d15e1762800008085034b10ee43a009ca07e74aa8d418f7888718ed9014b539c60efb053116aa8e02b0cfc9930e7da05eb1a866237575f7f7de2051f622a8e45192cf7ef57c143eeffac1a54dda4082",
|
||||||
|
"0xf8738362026c847735940782520894ee2503205c24dc66346e356f13f333fb8782d35888058d15e1762800008085034b10ee43a0f02a886b4bd63232f0c1247c969d3d80c4881b5ea9fc1419564e38dd67f1831aa067f136cfa69edd0fced8be030956974d94a08e3ddbdaf29129e65ebb719dbdb9",
|
||||||
|
"0xf8728362026d847735940782520894096ba6c59bd667a0fea9a356bcc988e4d9f2d8eb88058d15e1762800008085034b10ee43a0a6b9529f9e732c69e23688f6c5644dd7a73162e427eb9356a1dcf1759a6fee3b9fc127e4986c286784fde59cad6c3f1efd1c7f6d4f7e5088f5c7a74d386b0949",
|
||||||
|
"0xf8738362026e847735940782520894da0adce4f1dc7debe7b2b52e8fe9ace6c7ea9c6688058d15e1762800008085034b10ee44a0734e8f035d7479da4857ce0e09202d497d831594ec24ff722106c8c7608963fea00a1f8a360c43f0b5fd58a71a2c2c5afe895aa5a15320b052baf1b44434cfe6ac",
|
||||||
|
"0xf8738362026f847735940782520894af7d412aeab7525c0541dc3aa6c1085cfb8c909988058d15e1762800008085034b10ee43a099e288225e6dbbdc77753aa08f3efbb9f0b96d7def768d9854e855fe01610cd8a034f2d3aae0864b7afd5e691f33bc2d28083110f0111112936da8f45d98319630",
|
||||||
|
"0xf873836202708477359407825208943cf8c0d567261eaf4ac0872d33a9f48af361769f88058d15e1762800008085034b10ee44a00f20fba4abb6ee417a1f0bdbf776b0d5dbaabc81ecaaba9c58f45360208e33c7a05dde3f3f6b92919e408a0aa72937c33523734a0a2cca772fa2147273d7be1c3b",
|
||||||
|
"0xf873836202718477359407825208944779242587ba9e828999249eadd82984430f484388058d15e1762800008085034b10ee43a09b5e17f912c9fb7f803b43c2c1397b01b8ab205ff682a4423f0a8214a2e79197a0521997071cda90e04ca276220e6f7dcff723c5d27224528fa3601ef3a2221494",
|
||||||
|
"0xf87383620272847735940782520894ea531cfe2de357ecff3855b88dbd07f60b03cdca88058d15e1762800008085034b10ee43a0022fc439ceef6778c85bcb9b86eca5cbfa6ac349baa54887159c8585af0e6ecba01080d90e6b555cccd88b693af79881d7f17247b01b3ca62c281c7ddf200ecc79",
|
||||||
|
"0xf87383620273847735940782520894d00b5f53ea2a66ad33c3fee304bb22857dfb8a8788058d15e1762800008085034b10ee43a042e9e53473b2553d37080c3a8836b183ec8f3b41f47e9bbec02e3aebb7dcdfe1a070bafb99da6e92cf4090bff7eca3c3c8044cb46a9f05f544a0b56a521255d324",
|
||||||
|
"0xf873836202748477359407825208947ead29f6616f78f21a951c9686dd257be7b8efe488058d15e1762800008085034b10ee43a0a04cae14d43584a0fed384fc6d981238e3cd2302a7fbdbc5245192068abed008a05aef32306b51b2320199e8f3f11280bae5f677b99907b6244ba892d1d441ec12",
|
||||||
|
"0xf87383620275847735940782520894d503c13ee55c1ea128357d4018ec58d0d5e5c3db88058d15e1762800008085034b10ee43a0e280df73654670e3cf5ae5aeee1e1931e98cf29ff874ce7d32790f8233d5b287a01892f9b5e6902f7dde4411566c1ed3c499703b0801a0c4b1a9dc1b023d6443a8",
|
||||||
|
"0xf873836202768477359407825208944ac670d8760faf780468638ef80034876ed8918d88058d15e1762800008085034b10ee43a0514dcddc1910947d09fa8a6c0e6f6cf7d05fb4d5bf158bda354d2e6c6348d581a0047981492e9b9eff0ea70bacfaecba069aa2b2c5269c8469cac42d9b11d19383",
|
||||||
|
"0xf8738362027784773594078252089424ffb8c97ce443f8d3265ba3316defcfc07c659c88058d15e1762800008085034b10ee44a07fc741180d071dead819a84ba1be1f2eeb518caf707ceadeaad03ea9edecc80aa060eccb7fc130827b061d57c5fb3e168a30dccc1fd4ba6b69df65cf82f78a6bba",
|
||||||
|
"0xf873836202788477359407825208940c5cafc547ab98c9ceaa1c07fdd6bf7820aeb95488058d15e1762800008085034b10ee44a0787e06914cf15a0d5c805c92ee953eba7efc3f9ba09ca62d0ed2f3b6167ffa60a014fa025423178902bb480a1823bd9cd17a55f7c2fedac8a42f81b834c4f5b547",
|
||||||
|
"0xf87383620279847735940782520894db8d964741c53e55df9c2d4e9414c6c96482874e88058d15e1762800008085034b10ee43a0ee3e494f464ab6384f2a856e3e4a82b581b60dff1494c5d31d8ffac33133c4dda00fe28dc8352736880aeb0df3b34c846d9e48e056f0ee34115866abd2e4cb9cc9",
|
||||||
|
"0xf8738362027a847735940782520894ba85bb35ae6ff7a34745993fcf92b9afd34124f188058d15e1762800008085034b10ee44a0697c551925faba103e19343af9b1373c15a915c94c2c2b2248754707ba6753efa0195134d1de635393b68258bbc3a6130da2f6f28e3a21f53cf7c0d309e8604a91",
|
||||||
|
"0xf8738362027b84773594078252089458871015f5a2d3948264f7c16ad194c80ffd531d88058d15e1762800008085034b10ee44a065fd5136b42302cd12e08ce81d4bbbac0bedb774eb07df3ec89e10d1bd0e3eb3a053ef3a9a4b6b0fc0afc2aa8f0fd6eeeb0f8d79df5010395e68401b34a9c1b932",
|
||||||
|
"0xf8738362027c8477359407825208942a90af45df70b0031f218cc122598ddf3e10469f88058d15e1762800008085034b10ee44a0b8318c8dc899f7a1c0c57fbe9199901c927788d51460a971328870dd05516748a02811349e21979f97393c1c0707f508bcc9edf7e8932a2058c62fc503c6e298f9",
|
||||||
|
"0xf8738362027d847735940782520894761bbaaea6ceb265f5262c3b559adc2ad3ed2f0988058d15e1762800008085034b10ee43a0ee810426bf67a8873cc6dc0f41887bc6dcaff093a620b980db51343e80b828a6a05fdaf2729c1dee2029a5bc9174920d1bd16a253e2a20ab69fb4cce9a22bbcb44",
|
||||||
|
"0xf8738362027e847735940782520894dfe86f51c5e603f1420d1f0ab366bd3bfe23d2a788058d15e1762800008085034b10ee43a053c6702a09db8bfbc3560bc380816ed7c119a95700fc9cc7cb44c631637876aba02bddd96beafe8592027d38a9596efed58b08361c863a905fabf4dac4b6fc22da",
|
||||||
|
"0xf8738362027f847735940782520894d616547158b05ab5079106dc0336d72763a7287188058d15e1762800008085034b10ee44a05fce463f3ede6e6ea82f59b0e2f1356aa6cc9e4a2092186ff4eeac6144f3d70ea05870f706fea0bb3e813e3ecdacdaa82ad6234cf8cc051d15b0aa5fc041943aff",
|
||||||
|
"0xf87383620280847735940782520894dc68cd278cb7f5f666ce7b0a3a214a8540ed4dfa88058d15e1762800008085034b10ee43a0e376459fbce80ca4941fdeb313efbe587a7567cf3a34c477df38b7409b043e69a03ba4f66d19838df4276344d1c44253d83789e1c77ee8a40d4c8c447789723386",
|
||||||
|
"0xf8738362028184773594078252089411f8107da05b6905e8cc0227ca3b0c6eb764fac088058d15e1762800008085034b10ee44a03bcb59ba309b004c55ba3df3eec064e22fcfb5a57c8e5ca0ff146bda02774a75a07ed6d73ad8a0daa1f1c98430ad5e5fbdb4748554c8ffa0233638077e79deac03",
|
||||||
|
"0xf8738362028284773594078252089404da906545679850a7ee0ef6836e183031bedc8888058d15e1762800008085034b10ee43a0094da8f36bc9c6ebb5f92ed23a48067f0efc5307094da7c5890a942f654748c2a05883676b2416160acf153351fc86c771a56bf4251aa134897a73cea3c3f4f7b2",
|
||||||
|
"0xf873836202838477359407825208948bdc25c43c010fd3db6281fcd8f7a0bed18838e388058d15e1762800008085034b10ee44a0dac96e3d17998ae7886f80455c92444fc078f832b424e31c7c4d1cc1c09d5d2ba07104abf0bbd8433c357d0ae0d9ddfaa3e7d8dea15644912d51931b448bbfdada",
|
||||||
|
"0xf87383620284847735940782520894af16f746b8a834a383fd0597d941fee52b7791eb88058d15e1762800008085034b10ee44a0294814d951013410c28b152df0361a6bdf245cc987ab30a7304251188641d609a05a530ee23d27f69768191325ffe65582ece63791bf09fe197f504fa57bfd5146",
|
||||||
|
"0xf873836202858477359407825208940c5c736600f8ea58ccb89aa72e3f3634651fd55188058d15e1762800008085034b10ee44a0c1e93262c0f669d8dcafbe0b69d6fa444595b9991e0ab2d643ca82c32bb95779a07890187282502da60706b81047b42099ec2fcf12f967cada17ea595b8d2d50bf",
|
||||||
|
"0xf873836202868477359407825208946f475e0f0e9eda58556fddc04de9b1a9b6a4cfb488058d15e1762800008085034b10ee43a02954b5ef28644f34235fa8a78138f8a20f451ee904bbcb557ee0d6a57aadebbda01e380d4925b3eeafe722cffec0811d4b546f2962dab2415247a609d017aa6830",
|
||||||
|
"0xf873836202878477359407825208949b2e76498a695c4dc7d0890069cffa84a9581d2488058d15e1762800008085034b10ee43a0c4c1ad80c72b77662bdc60e5d9d2f8a7d4f7d5e591f7d36bf75792603c350a48a075948e3ef779497e000693a717ebd926dc2f1040a9fe108067b827470250cb5f",
|
||||||
|
"0xf87383620288847735940782520894e2d2b2069f4a54fcc171223ff0c17adbd743c28588058d15e1762800008085034b10ee44a0c081205b252b273039c2e97df9831d3f3660a5d9c6432de2d9005d24bc1c949fa015a60d2b5a33cbc1d41626d844ab093695cffb1d445a7059bc30a0ee70130bba",
|
||||||
|
"0xf87383620289847735940782520894386bd49f04322544f3c7178fa5ae1a24b947b45488058d15e1762800008085034b10ee44a02a76823c284c6d383ce1605f433ee24e9d25755d9914355e7ec0a2e747a31aaca023bfe68b343ec5da856c221a08e42325e2fd465cafa52872885e471e87a26783",
|
||||||
|
"0xf8738362028a84773594078252089400af839c3fc067fafc2e0a205858d6957f0dd18d88058d15e1762800008085034b10ee43a02dd6ac183d86166f2d48f9e5798998beb2492203130dc29a8ccd60d682c68241a060f45d781a16584462adde0ca311cdd99a0c46c8e96c772e10dec6e21958ca64",
|
||||||
|
"0xf8738362028b847735940782520894ebb6d32a650afa9221b55a11c6a6de52b6f07cd788058d15e1762800008085034b10ee44a0d7d9588987d423ddf1180b35560d0cc8c350c4eddf3b4f04d491bd952d1ee939a07b95e674b777c204738e34c332a4c96e067d1fd530ca4e17196c9c8a2a84428b",
|
||||||
|
"0xf8738362028c847735940782520894011d26a3a9adc9203c8943a6a77aa8657af5242088058d15e1762800008085034b10ee44a0780c40f1a71ed2631a01df292f842ee8a8dc98d1b80d0685d92ac22dfc2fffe2a051a4e8f7bae167c3124d47938c54639fff25e9b159507881f6b9d891eb50d805",
|
||||||
|
"0xf8738362028d8477359407825208949c85bc61a89fb5abd957e6c819c653fc1aa0d11b88058d15e1762800008085034b10ee43a0f041d0b9537468ebf005b0fad79296b1b74e63af050e13f31999737130346deba02d50794faca4b4e1515287ae2690e4d7b7855f29a56a6d644f8c828b6d30a997",
|
||||||
|
"0xf8728362028e847735940782520894bd8e8435b7897d87cf7cedb5cf8c5dd865dbf72088058d15e1762800008085034b10ee439fcc0821fc19eab1c1e6e15d7447aed84f079a3d178cbc9e865e6009a58b558ea006d296a4d03301ff9663336813b95368dd3553f88d2635ec7559416445f214b4",
|
||||||
|
"0xf8738362028f847735940782520894adebee2e3ff041078b62380d001c6e51b4f1559888058d15e1762800008085034b10ee44a0e67f178fbd1a91014a87c50bf50898474c1fd80cc782aa05cc2d7efc427d5c13a045ddd298df67dfac72dab9b255066e81b4a1a7988e61b6c3b0318b788733e0fd",
|
||||||
|
"0xf8738362029084773594078252089471e94c459c9f05085fc0d34b5f21e648e05dc6b388058d15e1762800008085034b10ee44a0f16ec0330912b815ea3ad0d955766eebe92031c7a2d64bf786b7f55bb4f63798a03d03f718b4de0f491a08315e6fac7fe9ee98098ceb3d27ec4128da1f4b4f8153",
|
||||||
|
"0xf873836202918477359407825208947c1fe317db82c9298b87c56c3194178271b621e188058d15e1762800008085034b10ee43a089edd1266f626652a65dddd34bcecd33cf0975ad6664cec15b706910d41d23b0a055f7752a91aa4759e5c84a4bb2180ac78810ef99246e52e8974fea996efaf8d4",
|
||||||
|
"0xf87383620292847735940782520894e069d1c9abf5127bdc3a164fb93b96bfa9f74ce088058d15e1762800008085034b10ee43a00a809e015ed5159d60be66d8b65efa57f72be941e9928d889c6be888096896e6a0724239814c01e730b19dd093cee6384864964e59d34d84cf1e9a8116a11a7155",
|
||||||
|
"0xf87383620293847735940782520894b9bbddd1eb6ef8fb1bdc6a853d5ad7486a9487dd88058d15e1762800008085034b10ee44a08717c8d1194e516264fb1ea3cb78b73f5dd507d17823eff675c97bf304a90b2da05a96d1bfd29677fa4e97fd37bc4e4962a9ab6f99fcf1c74bf4749a97adaf0e3c",
|
||||||
|
"0xf87383620294847735940782520894a804387cdaf986d45831e8074efb2115af053f7a88058d15e1762800008085034b10ee44a00d92c86dad2165ddae28c5081638c3eea7a54bf7c15f75d2e3a0d52af40d3c97a043c833c190d2e78ce01fa96a331e475fc41f7b51622bf4f081e4831de49ba07e",
|
||||||
|
"0xf87383620295847735940782520894f23501d784a041fc911b4c86c2bfb1f63ec170ea88058d15e1762800008085034b10ee43a05d27e028f1ef0555f022f214e222a33266971b98098643ba84578f70598781f0a0548bd8b2ba26f7f4b96bea6187981f5af5c36cbe0c57558d6144eb7590668a70",
|
||||||
|
"0xf873836202968477359407825208943928be2a7058088313c0fb3294014e88a3c5ed4a88058d15e1762800008085034b10ee44a092c573d072e4fbd59fbe85d740fb99b1cc94a97c0896020b1eb4c50a0c1194b2a07edd4babced9ec70bb660fefae771aaf3244341da1e3123b42e6885a933c3d2d",
|
||||||
|
"0xf87383620297847735940782520894196aa07204141478459c14106ef5e5282efe995788058d15e1762800008085034b10ee43a08d6b3fa7173e77e69d0c9a851396dd8b457d32e15a916082002f367acc0605bea06c7319e1eabe15b1887633080dac1be3e3611861e2ead80487a0858b24f2f9ee",
|
||||||
|
"0xf87383620298847735940782520894763cbf89560e2da270000822abda9584db693fa388058d15e1762800008085034b10ee44a06a92950880b902296ea1c6d8ade6011d7249107a520c4935dee51dd59de41389a04701288ac10e1ede1468e197258e7b38a5157ed96cffdde2c99314fc9e64e260",
|
||||||
|
"0xf873836202998477359407825208947feaea0ff70ffc9eec2104f57f7136aff4dea68088058d15e1762800008085034b10ee44a04d90fec69d1b3ffa4e21a81a12bde21223baf92be9c972ec983454d8271870a0a0159b7c2b5238c515755b3f7812afbb5d4726a957a9c9767c3d4c044f83274185",
|
||||||
|
"0xf8738362029a847735940782520894e5466aacd9dd6d3bb35060a1ccc76a438de88ca188058d15e1762800008085034b10ee43a0837538d8e417194bed46f36eeba282fecbbb58bcbefc6f7e018c42a73ae81345a038b1d65f0d27ade5bf1d263fb67c758e76d1ef797cca936f3412e355074fb994",
|
||||||
|
"0xf8738362029b847735940782520894f670980415cfe8c4f8d10645ecf974c9a2fea00e88058d15e1762800008085034b10ee43a0ac3f8bba9b19c4d9a3a0d03ed515f81da94b6ac72284b4d8a27c4922aae659c0a078c566cccfde53296c238d408e0ab3dd4a07df1199c12b673be05e45195bbc4e",
|
||||||
|
"0xf8738362029c847735940782520894a29115bce7829ffdd989b7cf1bdd1eac06a2cb3688058d15e1762800008085034b10ee44a01edd6db1f63d1c384edf6bfc0c3253fb8bdf175c913b62fc5d0c76dd2c7bd411a004a5ceb0c53728dbefccd21e5342f25e90fc4e3de69661a96a2b6e8eabe99580",
|
||||||
|
"0xf8738362029d8477359407825208948f528aa67dc1846c893465fa1c8c26556bc5fe1988058d15e1762800008085034b10ee44a0b8eaa2b524d2970d341996da7babffdaf92160c755e9b4ba6e453e800a93c5fea05b0bf41c26aefc1fa29539c34d32f42174fe27846ef4ea8427f9f64414ab2994",
|
||||||
|
"0xf8738362029e8477359407825208944dc4ec6ac43c8c45777292db987203c0248e17b788058d15e1762800008085034b10ee43a061f4bd7053ee4bcc8d1a3edf748d9d3a585134c1fa61129951a094d5069705a6a03e45012ff902405e6c78e0e7d8be2abbc079b8c79af32022f3f6ded85a023a22",
|
||||||
|
"0xf8738362029f8477359407825208940d2f39f251cb547cba567a31e5e9f93c19dffa8588058d15e1762800008085034b10ee44a0bcc76559b8384c5f31678d1efe17f1c7c9267ee4e50c688421fe269a18ff8ab5a07ededd086d4f210c05ac901c987a1b30106cd76e7cef0a6723bb1dc1b20ccd30",
|
||||||
|
"0xf873836202a08477359407825208949eb31fb94ce5111e2a04cb9d156b513887ccbd0088058d15e1762800008085034b10ee44a0deb981e565672e01dcc8cd6514c459fd3936380d87f7fadb2660f7c350ac2e51a014849dcb352073dc9663c0a289710145efd7428cbe0c88213611432761ad93b9",
|
||||||
|
"0xf873836202a184773594078252089404b88ef83f8c41b1465d360a1e82f07ae190892a88058d15e1762800008085034b10ee44a07e3e84ca883d7d8d4e51f36454609b4e6b313a98ea8d226d47682612ae87f812a052687dd82b4f62e8449f7c0034b950e82c78aab8a5518592ba5b652c72b36017",
|
||||||
|
"0xf873836202a2847735940782520894af23e04b04fbe15630eadd32a6f27a5a65ea554a88058d15e1762800008085034b10ee43a0b90c86c8c6d5254ebdb8b82640ab629ccd6eb9acebfcf53b931949872d9aa6d9a02cbee4611a01bc2d694b3a3b86070ef762b497fbb2b9a9c3bca6b8c0112f97d4",
|
||||||
|
"0xf873836202a3847735940782520894746cdff371e3f1e905b3ac52280078bac2dec7dd88058d15e1762800008085034b10ee44a0751ea5aa4636525bec891fd848390f6e032587d1bbda675c0e393e410844a1d6a032fdeac6961819450d3059c61f97b60f5cd50e27a18c392539719af3f194f53f",
|
||||||
|
"0xf873836202a4847735940782520894c33e5155bdbf1a0a7ceb1b80f8586c5cda5c378188058d15e1762800008085034b10ee43a02fb25f3cb803a573ca57d7782a90267f5e2e92fd018f01fd7c5152beb3e2e179a0732710f218d2b8fa87143dd9c10e239aa7269da3dd08ed081cdef99fc28f2561",
|
||||||
|
"0xf873836202a5847735940782520894e7fdef5f5219068f3d0f88a7445005574c66279888058d15e1762800008085034b10ee43a0f06655172c1d09a30c06930a24caadcd736beba5b63aa137ef0701e57820bceaa01821754fd8180b0ff357c500232f2008e703d2ac6b6fe0a14c202a1c039bdcc7",
|
||||||
|
"0xf873836202a6847735940782520894f0a81a63c5e09b0bd08e027de48058e377d3732d88058d15e1762800008085034b10ee43a0443ce407a5a49665e5b7847293b62446a2bf6d5885309b75c72c93cc715f8202a05151017b926df1bcfff2c3309e4771f2310b5ed0ded4503e6c4e57d78cc2b380",
|
||||||
|
"0xf873836202a78477359407825208949878ab34dc3b4a63c80fdb733491472c11d59a5688058d15e1762800008085034b10ee43a084ae376d4ecb7d0e23df6dd426999005f05fbcfffb8e1916d13e53f492fa058ca03b42dfaf1fcff5912e20d3bc9d0e26f61ca37a0c2647a62d20e443db23ebf400",
|
||||||
|
"0xf873836202a8847735940782520894912859bebae3086ac7a062dee5d68aa8ed2d71ec88058d15e1762800008085034b10ee44a0e9172415691d94476adc2c2fb0b5d68285ce83ab024dc53166f870decec3a4eba07e5f2f8a52145948789e57e3311da5edcbf563307ff0987342424f4e23055673",
|
||||||
|
"0xf873836202a98477359407825208945a0b737ed85049410e5ea61f444d07d5c8c0359f88058d15e1762800008085034b10ee43a0db10a0538cfe66a2152e6ed531eb5be016ec5f1cead127b91b8f123e54efd8e3a046c6477c90bae429b65e594b254a396bfddfdc15e1e3cec9ffa26a46a4884ccf",
|
||||||
|
"0xf873836202aa847735940782520894305a5dfd46e6128abce28c03b3ad971f4e4915ff88058d15e1762800008085034b10ee43a074cf4ff900d6170b4266deced030c14cb92d9872837e9cbae3b768c3f561d1c8a0252ba383431d7108ac2402bc6f8f807177496bd9997643994a9c33dfeda303b4",
|
||||||
|
"0x03f901198501a58877108216c784773594008477359407830186a094dba34be211bf539e27107cbe7e6893770280aec580b880297fb846f12a980aebe1d5b1187b2e6660f3e68f457379b59395a0411b9859c25842606f527f16e565e886e3afcd0ede18e04e3c827adf9e5c54db37870db32c31a18813d44c608f5260b660af53605b60b053605760b153603060b25360f060b35360e760b453600060425d600060c95d600060895d600060e95d7f25818248c0830f4240e1a001b7f74a7d5bae21aaf16e7b2d2ca7f47c800636b2a3f8b519aabb4b3541708801a0faebdfbd5a7832abed65c7fe25ffdb498b0c19c70cd53a1ec53e3de6c25ca0eaa03690227cf2f99e38b48a44f739fd63b00482017bee063657b418d85e68cd2094",
|
||||||
|
"0x03f901198501a5887710823ba784773594008477359407830186a09409fc772d0857550724b07b850a4323f39112aaaa80b8800a7f9b44ddad8f17bce75dceb28c1eafa80fbfaf4e0d793fc9fc42489c913ffec7906023527f0d1debc2884eec1a57d882e7085ae952d5d76b3e168370cc9af6294ccb55a7ca604352606460635360d96064536042606553603a60665360f1606753609160685360cb606953600c606a536055606b536043606c53603b606d53c0830f4240e1a00159f296fad44019f3cfa307df01412afa1643a67ccafae96c83d43b6758ffe080a04b6af5cfdca885787b508751e15ebeddc4ae4f5e88035002a72fe720ed9c1808a07781ed6c6f1778c74f692c9b966d1c27185045042cf386eab20543852afd7d9f",
|
||||||
|
"0x03f901198501a5887710823ba884773594008477359407830186a094000000000000000000000000000000000000000080b8801660f660ce53604b60cf53601260d053600b63df83d68853600263df83d68953604f63df83d68a53601b63df83d68b5360b263df83d68c53601363df83d68d5360f663df83d68e537f93ad362c9daf922157be015981847c3d63de3a139a88e7824d2c62693233acba60e4527fb97203d3cc1f05cb5b3a18ba38b93d6eae2675c0830f4240e1a00125c14e94773c0f2504208d25925d0def274e4cd05be154b64484cd55068b9401a01f25239f9cf530e73210788333c06832ede4d25811fbd5288f1c6ec09626a848a0142054f5501636d093d1f8fd9a18991a035ff8272ccc4b732e618929c5ae60a1",
|
||||||
|
"0x03f901198501a5887710823ba984773594008477359407830186a094000000000000000000000000000000000000000080b8807f1c1e1707ec5a3c08643377106467f9d8cf7343cddde951134184de69c4a0ab5f60cd527f496d383985b30e2192e37082533c4040429f17d2d8066cbbb0df4ce5f1bcc72760ed527f934a6a5a54f24b814ed3df79092d3215e14b5fe7c1ae730e377b17777e7d3afc61010d527f324e451356f8780882a2abd81a56fa0ad656c0830f4240e1a0017fde88c70f2ed440c9dbdcee3973e4d7b85d3a65a7d3db7289a2a16db2f00480a0064a83db9cfa03f6af8b2e48c5b383d57f3de72c1a556bdb89f84ac5a33ef294a07a99426dd140e3f729bf681e9493c93b9f5466afab8bd43b08d44b83121e2c66",
|
||||||
|
"0x03f901198501a5887710823baa84773594008477359407830186a0947a40026a3b9a41754a95eec8c92c6b99886f440c80b8806000603d5d6000605e5d7f2a4466d55bb88fa289d012628a52864aca1c1e1707ec5a3c08643377106467f9606d527fd8cf7343cddde951134184de69c4a0ab5f496d383985b30e2192e37082533c40608d527f40429f17d2d8066cbbb0df4ce5f1bcc727934a6a5a54f24b814ed3df79092d3260ad527f15e14b5fe7c1ae730ec0830f4240e1a00122ad5c899f52d21eba94a21044753587639cf91301db410de58f73d740feef01a02d622199b408f02048f237a3cee8de1cbe7c79de5fe0342f1a6cba7d9d5c53cea012cae1d118329a17eb3cef8d2a24ce1a96afdb6ef7c0fd58f11041f9ebb458a6",
|
||||||
|
"0x03f901198501a5887710823bab84773594008477359407830186a09401abea29659e5e97c95107f20bb753cd3e09bbbb80b8807f1fcc4bfabba1d810c2e9750fe5f9f3c70adf76d7a54bdf886617f1a099584d2860d8527f410b6d3e2670b1d7b668f22f9b6d1e5bb1b4d12d4bc198e2b642cd9eef1ebf4e60f8527f753d66f7de6d60873b96cac74055a2c05f1822dd662fe1e18b5962e191d8cc88610118527ffd19563f4930341b9ae50f37f40c3519b4a8c0830f4240e1a001ff78fe5af972c7cce1be875aba37ff8b7367ab34a0879d0fde2873c1c34e3301a013580cd6864dabb7ae62de736772696075a507b26d352eecea97581662b11762a03a47f80d8b09c0ed5686c0082aeaa569bd7200bb6cd4a89507c391da4aae8882",
|
||||||
|
"0x03f901198501a5887710823bac84773594008477359407830186a09401abea29659e5e97c95107f20bb753cd3e09bbbb80b8807febcd375a4548f911bbf94fb20a71723f2bcdf90b1893dede0d86ea0086c94f4663ded9bec5527fa75fc1bbd45e9a2357080a88f65a12c678ad697d56a558ddc54d4bb74c6c6d2663ded9bee5527f75eaa5150042917e755fc935fc3a8af87bf91944c7e3f00eebbf3a6574e80f4663ded9bf05527f27014ac42049105c03fbc0830f4240e1a001466f18955590485e681c566fab7923ffc11c44febd37dfa460e4ae57b2bcc301a08ac71347df4693d6fd98be1cfbdc5b7cc1ddc75f2512d1b85df24c9e1c754563a02145852bc429244eb4311fa25b529d4245e0a1b79581e829e251f92edaaf209a",
|
||||||
|
"0x03f9013b8501a5887710823bad84773594008477359407830186a09409fc772d0857550724b07b850a4323f39112aaaa80b8807f9e664ccecd377f7cccdc8eacb44927d06ad21fa62b767c61a984a997b503e76a6021527f9884bb7e3c5262eabd6dc6f0daaf38581cc4e7387f25237ef70b3765d9f7f69d6041527f263c0b0f9697916d24f51e6443f9ddc9c00ee8795c6563b153305d4e889ff9336061527f3a7664aab6aa9ff375049c342739cf230af714c0830f4240f842a001148d696bf857b798a51d3cf76e1f30c0ff18dbdb67b4e4651ceb9a81bfe319a0014516a223e4dd099c56e3320d0f6b50e061e00a6548964a52ac15bba57028ed01a05077e103e2aabb0f6f8712c96fdee81a4a4b8b53404286535eb188b02be775dda021063c5abd0394b12c6935dd209bdc413472f558539469806e5baffeea1d00ef",
|
||||||
|
"0x02f8a98501a5887710078459682f008459682f0e830137a19400000961ef480eb55e80d19ad83579a64c00700201b83882586e0c10f84614733e5752428cbbe809e3699d9a3bc5bc604e81169e6a59304352237e39c8e6644acae5f595f1a8640000000001312d00c001a01d67ab7c6569f238adca00963a31b5bd856960affb9d738ceb78085800ba29e1a0495ad28ef784fb388e2145af0778bfc08386cb0695d1c0ca1022fabff8ccd9a9"
|
||||||
|
],
|
||||||
|
"withdrawals": [],
|
||||||
|
"blob_gas_used": "1179648",
|
||||||
|
"excess_blob_gas": "68812800"
|
||||||
|
},
|
||||||
|
"bls_to_execution_changes": [],
|
||||||
|
"blob_kzg_commitments": [
|
||||||
|
"0x82b6012a3307f01e0ec06ce5768f093c75b731e81aa16f08afe60e2e457e2f4370f13ea15baac9c10ad8956cb1599f47",
|
||||||
|
"0xa758a4d6c5dd35ec363c80f21dbee519db19aa0f69c1318b70dc01738555b97f7607793d072946019e4050b8b8e5105b",
|
||||||
|
"0xa49b025f2a1c657f4c07df7cb04d430aeafacdc1cf9afaf841cdcb019ba3f61d6151241fcda0b2851f9d5adcd2a67bdb",
|
||||||
|
"0xb909fcb4f35d2bdb684643f0dc3fbaae73024b7d2e771656cc0117fe34143aa29d882454285d340dbb1c6dcd1cff2d0c",
|
||||||
|
"0xb9c826af3dbc163bddc7bcd0230b87f57193bf567ee7fa35fc17f970dfe620dee074c61776fb37fc19958996e5cf585f",
|
||||||
|
"0x8ef3c784f8070d96f4a834640b6d76e589508ac121177a323f49b3a1073b9592d23464487a31a36974c8e571d8573d46",
|
||||||
|
"0xa8ddab3b3301512e74e7d83b472af200f35d4b8a4df6ea783363035e2250a90ba473f31ea382c4c275e9c37621098dd0",
|
||||||
|
"0xa33e2ae43573502a30c5f98a9a33c8a6879333f96d24fdff686544fd01b99130114d741e076ff873fb649fe44ab5e81d",
|
||||||
|
"0x8f01d73cad9ce715598a653f48e9b9003abf2d2084890fc722c1eab65a4678146e81618b84d227652513723f4088cda3"
|
||||||
|
],
|
||||||
|
"execution_requests": {
|
||||||
|
"deposits": [],
|
||||||
|
"withdrawals": [
|
||||||
|
{
|
||||||
|
"source_address": "0x4b6C4667921A132eE6eD26a2DE7654adaE481E4d",
|
||||||
|
"validator_pubkey": "0x82586e0c10f84614733e5752428cbbe809e3699d9a3bc5bc604e81169e6a59304352237e39c8e6644acae5f595f1a864",
|
||||||
|
"amount": "20000000"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consolidations": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,106 +1,131 @@
|
||||||
# This file contains sha256 checksums of optional build dependencies.
|
# This file contains sha256 checksums of optional build dependencies.
|
||||||
|
|
||||||
# version:spec-tests 2.1.0
|
# version:spec-tests pectra-devnet-6@v1.0.0
|
||||||
# https://github.com/ethereum/execution-spec-tests/releases
|
# https://github.com/ethereum/execution-spec-tests/releases
|
||||||
# https://github.com/ethereum/execution-spec-tests/releases/download/v2.1.0/
|
# https://github.com/ethereum/execution-spec-tests/releases/download/pectra-devnet-6%40v1.0.0/
|
||||||
ca89c76851b0900bfcc3cbb9a26cbece1f3d7c64a3bed38723e914713290df6c fixtures_develop.tar.gz
|
b69211752a3029083c020dc635fe12156ca1a6725a08559da540a0337586a77e fixtures_pectra-devnet-6.tar.gz
|
||||||
|
|
||||||
# version:golang 1.23.3
|
# version:golang 1.24.1
|
||||||
# https://go.dev/dl/
|
# https://go.dev/dl/
|
||||||
8d6a77332487557c6afa2421131b50f83db4ae3c579c3bc72e670ee1f6968599 go1.23.3.src.tar.gz
|
8244ebf46c65607db10222b5806aeb31c1fcf8979c1b6b12f60c677e9a3c0656 go1.24.1.src.tar.gz
|
||||||
bdbf2a243ed4a121c9988684e5b15989cb244c1ff9e41ca823d0187b5c859114 go1.23.3.aix-ppc64.tar.gz
|
8d627dc163a4bffa2b1887112ad6194af175dce108d606ed1714a089fb806033 go1.24.1.aix-ppc64.tar.gz
|
||||||
b79c77bbdf61e6e486aa6bea9286f3f7969c28e2ff7686ce10c334f746bfb724 go1.23.3.darwin-amd64.pkg
|
addbfce2056744962e2d7436313ab93486660cf7a2e066d171b9d6f2da7c7abe go1.24.1.darwin-amd64.tar.gz
|
||||||
c7e024d5c0bc81845070f23598caf02f05b8ae88fd4ad2cd3e236ddbea833ad2 go1.23.3.darwin-amd64.tar.gz
|
58d529334561cff11087cd4ab18fe0b46d8d5aad88f45c02b9645f847e014512 go1.24.1.darwin-amd64.pkg
|
||||||
3e764df0db8f3c7470b9ff641954a380510a4822613c06bd5a195fd083f4731d go1.23.3.darwin-arm64.pkg
|
295581b5619acc92f5106e5bcb05c51869337eb19742fdfa6c8346c18e78ff88 go1.24.1.darwin-arm64.tar.gz
|
||||||
31e119fe9bde6e105407a32558d5b5fa6ca11e2bd17f8b7b2f8a06aba16a0632 go1.23.3.darwin-arm64.tar.gz
|
78b0fc8ddc344eb499f1a952c687cb84cbd28ba2b739cfa0d4eb042f07e44e82 go1.24.1.darwin-arm64.pkg
|
||||||
3872c9a98331050a242afe63fa6abc8fc313aca83dcaefda318e903309ac0c8d go1.23.3.dragonfly-amd64.tar.gz
|
e70053f56f7eb93806d80cbd5726f78509a0a467602f7bea0e2c4ee8ed7c3968 go1.24.1.dragonfly-amd64.tar.gz
|
||||||
69479fa016ec5b4605885643ce0c2dd5c583e02353978feb6de38c961863b9cc go1.23.3.freebsd-386.tar.gz
|
3595e2674ed8fe72e604ca59c964d3e5277aafb08475c2b1aaca2d2fd69c24fc go1.24.1.freebsd-386.tar.gz
|
||||||
bf1de22a900646ef4f79480ed88337856d47089cc610f87e6fef46f6b8db0e1f go1.23.3.freebsd-amd64.tar.gz
|
47d7de8bb64d5c3ee7b6723aa62d5ecb11e3568ef2249bbe1d4bbd432d37c00c go1.24.1.freebsd-amd64.tar.gz
|
||||||
e461f866479bc36bdd4cfec32bfecb1bb243152268a1b3223de109410dec3407 go1.23.3.freebsd-arm.tar.gz
|
04eec3bcfaa14c1370cdf98e8307fac7e4853496c3045afb9c3124a29cbca205 go1.24.1.freebsd-arm.tar.gz
|
||||||
24154b4018a45540aefeb6b5b9ffdcc8d9a8cdb78cd7fec262787b89fed19997 go1.23.3.freebsd-arm64.tar.gz
|
51aa70146e40cfdc20927424083dc86e6223f85dc08089913a1651973b55665b go1.24.1.freebsd-arm64.tar.gz
|
||||||
218f3f1532e61dd65c330c2a5fc85bec18cc3690489763e62ffa9bb9fc85a68e go1.23.3.freebsd-riscv64.tar.gz
|
3c131d8e3fc285a1340f87813153e24226d3ddbd6e54f3facbd6e4c46a84655e go1.24.1.freebsd-riscv64.tar.gz
|
||||||
24e3f34858b8687c31f5e5ab9e46d27fb613b0d50a94261c500cebb2d79c0672 go1.23.3.illumos-amd64.tar.gz
|
201d09da737ba39d5367f87d4e8b31edaeeb3dc9b9c407cb8cfb40f90c5a727a go1.24.1.illumos-amd64.tar.gz
|
||||||
3d7b00191a43c50d28e0903a0c576104bc7e171a8670de419d41111c08dfa299 go1.23.3.linux-386.tar.gz
|
8c530ecedbc17e42ce10177bea07ccc96a3e77c792ea1ea72173a9675d16ffa5 go1.24.1.linux-386.tar.gz
|
||||||
a0afb9744c00648bafb1b90b4aba5bdb86f424f02f9275399ce0c20b93a2c3a8 go1.23.3.linux-amd64.tar.gz
|
cb2396bae64183cdccf81a9a6df0aea3bce9511fc21469fb89a0c00470088073 go1.24.1.linux-amd64.tar.gz
|
||||||
1f7cbd7f668ea32a107ecd41b6488aaee1f5d77a66efd885b175494439d4e1ce go1.23.3.linux-arm64.tar.gz
|
8df5750ffc0281017fb6070fba450f5d22b600a02081dceef47966ffaf36a3af go1.24.1.linux-arm64.tar.gz
|
||||||
5f0332754beffc65af65a7b2da76e9dd997567d0d81b6f4f71d3588dc7b4cb00 go1.23.3.linux-armv6l.tar.gz
|
6d95f8d7884bfe2364644c837f080f2b585903d0b771eb5b06044e226a4f120a go1.24.1.linux-armv6l.tar.gz
|
||||||
1d0161a8946c7d99f717bad23631738408511f9f87e78d852224a023d8882ad8 go1.23.3.linux-loong64.tar.gz
|
19304a4a56e46d04604547d2d83235dc4f9b192c79832560ce337d26cc7b835a go1.24.1.linux-loong64.tar.gz
|
||||||
e924a7c9027f521f8a3563541ed0f89a4db3ef005b6b71263415b38e0b46e63a go1.23.3.linux-mips.tar.gz
|
6347be77fa5359c12a5308c8ab87147c1fc4717b0c216493d1706c3b9fcde22d go1.24.1.linux-mips.tar.gz
|
||||||
4cdf8c38165627f032c2b17cdd95e4aafff40d75fc873824d4c94914284098ca go1.23.3.linux-mips64.tar.gz
|
1647df415f7030b82d4105670192aa7e8910e18563bb0d505192d72800cc2d21 go1.24.1.linux-mips64.tar.gz
|
||||||
5e49347e7325d2e268fb14040529b704e66eed77154cc73a919e9167d8527a2f go1.23.3.linux-mips64le.tar.gz
|
762da594e4ec0f9cf6defae6ef971f5f7901203ee6a2d979e317adec96657317 go1.24.1.linux-mips64le.tar.gz
|
||||||
142eabc17cee99403e895383ed7a6b7b40e740e8c2f73b79352bb9d1242fbd98 go1.23.3.linux-mipsle.tar.gz
|
9d8133c7b23a557399fab870b5cf464079c2b623a43b214a7567cf11c254a444 go1.24.1.linux-mipsle.tar.gz
|
||||||
96ad61ba6b6cc0f5adfd75e65231c61e7db26d8236f01117023899528164d1b0 go1.23.3.linux-ppc64.tar.gz
|
132f10999abbaccbada47fa85462db30c423955913b14d6c692de25f4636c766 go1.24.1.linux-ppc64.tar.gz
|
||||||
e3b926c81e8099d3cee6e6e270b85b39c3bd44263f8d3df29aacb4d7e00507c8 go1.23.3.linux-ppc64le.tar.gz
|
0fb522efcefabae6e37e69bdc444094e75bfe824ea6d4cc3cbc70c7ae1b16858 go1.24.1.linux-ppc64le.tar.gz
|
||||||
324e03b6f59be841dfbaeabc466224b0f0905f5ad3a225b7c0703090e6c4b1a5 go1.23.3.linux-riscv64.tar.gz
|
eaef4323d5467ff97fb1979c8491764060dade19f02f3275a9313f9a0da3b9c0 go1.24.1.linux-riscv64.tar.gz
|
||||||
6bd72fcef72b046b6282c2d1f2c38f31600e4fe9361fcd8341500c754fb09c38 go1.23.3.linux-s390x.tar.gz
|
6c05e14d8f11094cb56a1c50f390b6b658bed8a7cbd8d1a57e926581b7eabfce go1.24.1.linux-s390x.tar.gz
|
||||||
5df382337fe2e4ea6adaafa823da5e083513a97534a38f89d691dd6f599084ca go1.23.3.netbsd-386.tar.gz
|
5dbb287d343ea00d58a70b11629f32ee716dc50a6875c459ea2018df0f294cd8 go1.24.1.netbsd-386.tar.gz
|
||||||
9ae7cb6095a3e91182ac03547167e230fddd4941ed02dbdb6af663b2a53d9db7 go1.23.3.netbsd-amd64.tar.gz
|
617aa3faee50ce84c343db0888e9a210c310a7203666b4ed620f31030c9fb32f go1.24.1.netbsd-amd64.tar.gz
|
||||||
4a452c4134a9bea6213d8925d322f26b01c0eccda1330585bb2b241c76a0c3ea go1.23.3.netbsd-arm.tar.gz
|
59a928b7080c4a6ac985946274b7c65ce1cecc0b468ecd992d17b7c12fab9296 go1.24.1.netbsd-arm.tar.gz
|
||||||
8ff3b5184d840148dbca061c04dca35a7070dc894255d3b755066bd76a7094dc go1.23.3.netbsd-arm64.tar.gz
|
28daa8d0feb4aef2af60cefa3305bb9314de7e8a05cbca41ac548964cdfe89b7 go1.24.1.netbsd-arm64.tar.gz
|
||||||
5b6940922e68ac1162a704a8b583fb4f039f955bfe97c35a56c40269cbcff9b1 go1.23.3.openbsd-386.tar.gz
|
b7382b2f5d99813aeac14db482faa3bfbd47a68880b607fa2a7e669e26bab9cd go1.24.1.openbsd-386.tar.gz
|
||||||
6ae4aeb6a88f3754b10ecec90422a30fb8bf86c3187be2be9408d67a5a235ace go1.23.3.openbsd-amd64.tar.gz
|
2513b6537c45deead5e641c7ce7502913e7d5e6f0b21c52542fb11f81578690f go1.24.1.openbsd-amd64.tar.gz
|
||||||
e5eae226391b60c4d1ea1022663f55b225c6d7bab67f31fbafd5dd7a04684006 go1.23.3.openbsd-arm.tar.gz
|
853c1917d4fc7b144c55a02842aa48542d5cc798dde8db96dc0fdbc263200e04 go1.24.1.openbsd-arm.tar.gz
|
||||||
e12b2c04535e0bf5561d54831122b410d708519c1ec2c56b0c2350b15243c331 go1.23.3.openbsd-arm64.tar.gz
|
6bc207b91e6f6ae3347fb54616a8fb2f5c11983713846a4cef111ff3f4f94d14 go1.24.1.openbsd-arm64.tar.gz
|
||||||
599818e4062166d7a112f6f3fcca2dd4e2cdd3111fe48f9757bd8debf38c7f52 go1.23.3.openbsd-ppc64.tar.gz
|
4279260e2f2b94ee94e81470d13db7367f4393b061fee60985528fa0fa430df4 go1.24.1.openbsd-ppc64.tar.gz
|
||||||
9ca4db8cab2a07d561f5b2a9397793684ab3b22326add1fe8cda8a545a1693db go1.23.3.openbsd-riscv64.tar.gz
|
6fc4023a0a339ee0778522364a127d94c78e62122288d47d820dba703f81dc07 go1.24.1.openbsd-riscv64.tar.gz
|
||||||
8fca1ec2aced936e0170605378ee7f0acb38f002490321f67fc83728ee281967 go1.23.3.plan9-386.tar.gz
|
b5eb9fafd77146e7e1f748acfd95559580ecc8d2f15abf432a20f58c929c7cd2 go1.24.1.plan9-386.tar.gz
|
||||||
22d663692224fc1933a97f61d9fe49815e3b9ef1c2be97046505683fdf2e23c7 go1.23.3.plan9-amd64.tar.gz
|
24dcad6361b141fc8cced15b092351e12a99d2e58d7013204a3013c50daf9fdd go1.24.1.plan9-amd64.tar.gz
|
||||||
d0417a702d0e776d57e450fa2ce1ce7efa199a636644776862dbf946c409a462 go1.23.3.plan9-arm.tar.gz
|
a026ac3b55aa1e6fdc2aaab30207a117eafbe965ed81d3aa0676409f280ddc37 go1.24.1.plan9-arm.tar.gz
|
||||||
b5d9db1c02e0ca266a142eb687bd7749890c30872b09a4a0ffcd491425039754 go1.23.3.solaris-amd64.tar.gz
|
8e4f6a77388dc6e5aa481efd5abdb3b9f5c9463bb82f4db074494e04e5c84992 go1.24.1.solaris-amd64.tar.gz
|
||||||
14b7baf4af2046013b74dfac6e9a0a7403f15ee9940a16890bc028dfd32c49ac go1.23.3.windows-386.msi
|
b799f4ab264eef12a014c759383ed934056608c483e0f73e34ea6caf9f1df5f9 go1.24.1.windows-386.zip
|
||||||
23da9089ea6c5612d718f13c26e9bfc9aaaabe222838075346a8191d48f9dfe5 go1.23.3.windows-386.zip
|
db128981033ac82a64688a123f631e61297b6b8f52ca913145e57caa8ce94cc3 go1.24.1.windows-386.msi
|
||||||
614f0e3eed82245dfb4356d4e8d5b96abecca6a4c4f0168c0e389e4dd6284db8 go1.23.3.windows-amd64.msi
|
95666b551453209a2b8869d29d177285ff9573af10f085d961d7ae5440f645ce go1.24.1.windows-amd64.zip
|
||||||
81968b563642096b8a7521171e2be6e77ff6f44032f7493b7bdec9d33f44f31d go1.23.3.windows-amd64.zip
|
5968e7adcf26e68a54f1cd41ad561275a670a8e2ca5263bc375b524638557dfb go1.24.1.windows-amd64.msi
|
||||||
c9951eecad732c59dfde6dc4803fa9253eb074663c61035c8d856f4d2eb146cb go1.23.3.windows-arm.msi
|
e28c4e6d0b913955765b46157ab88ae59bb636acaa12d7bec959aa6900f1cebd go1.24.1.windows-arm64.zip
|
||||||
1a7db02be47deada42082d21d63eba0013f93375cfa0e7768962f1295a469022 go1.23.3.windows-arm.zip
|
6d352c1f154a102a5b90c480cc64bab205ccf2681e34e78a3a4d3f1ddfbc81e4 go1.24.1.windows-arm64.msi
|
||||||
a74e3e195219af4330b93c71cd4b736b709a5654a07cc37eebe181c4984afb82 go1.23.3.windows-arm64.msi
|
|
||||||
dbdfa868b1a3f8c62950373e4975d83f90dd8b869a3907319af8384919bcaffe go1.23.3.windows-arm64.zip
|
|
||||||
|
|
||||||
# version:golangci 1.61.0
|
# version:golangci 1.64.6
|
||||||
# https://github.com/golangci/golangci-lint/releases/
|
# https://github.com/golangci/golangci-lint/releases/
|
||||||
# https://github.com/golangci/golangci-lint/releases/download/v1.61.0/
|
# https://github.com/golangci/golangci-lint/releases/download/v1.64.6/
|
||||||
5c280ef3284f80c54fd90d73dc39ca276953949da1db03eb9dd0fbf868cc6e55 golangci-lint-1.61.0-darwin-amd64.tar.gz
|
08f9459e7125fed2612abd71596e04d172695921aff82120d1c1e5e9b6fff2a3 golangci-lint-1.64.6-darwin-amd64.tar.gz
|
||||||
544334890701e4e04a6e574bc010bea8945205c08c44cced73745a6378012d36 golangci-lint-1.61.0-darwin-arm64.tar.gz
|
8c10d0c7c3935b8c2269d628b6a06a8f48d8fb4cc31af02fe4ce0cd18b0704c1 golangci-lint-1.64.6-darwin-arm64.tar.gz
|
||||||
e885a6f561092055930ebd298914d80e8fd2e10d2b1e9942836c2c6a115301fa golangci-lint-1.61.0-freebsd-386.tar.gz
|
c07fcabb55deb8d2c4d390025568e76162d7f91b1d14bd2311be45d8d440a624 golangci-lint-1.64.6-freebsd-386.tar.gz
|
||||||
b13f6a3f11f65e7ff66b734d7554df3bbae0f485768848424e7554ed289e19c2 golangci-lint-1.61.0-freebsd-amd64.tar.gz
|
8ed1ef1102e1a42983ffcaae8e06de6a540334c3a69e205c610b8a7c92d469cd golangci-lint-1.64.6-freebsd-amd64.tar.gz
|
||||||
cd8e7bbe5b8f33ed1597aa1cc588da96a3b9f22e1b9ae60d93511eae1a0ee8c5 golangci-lint-1.61.0-freebsd-armv6.tar.gz
|
8f8dda66d1b4a85cc8a1daf1b69af6559c3eb0a41dd8033148a9ad85cfc0e1d9 golangci-lint-1.64.6-freebsd-armv6.tar.gz
|
||||||
7ade524dbd88bd250968f45e190af90e151fa5ee63dd6aa7f7bb90e8155db61d golangci-lint-1.61.0-freebsd-armv7.tar.gz
|
59e8ca1fa254661b2a55e96515b14a10cd02221d443054deac5b28c3c3e12d6b golangci-lint-1.64.6-freebsd-armv7.tar.gz
|
||||||
0fe3cd8a1ed8d9f54f48670a5af3df056d6040d94017057f0f4d65c930660ad9 golangci-lint-1.61.0-illumos-amd64.tar.gz
|
e3d323d5f132e9b7593141bfe1d19c8460e65a55cea1008ec96945fed563f981 golangci-lint-1.64.6-illumos-amd64.tar.gz
|
||||||
b463fc5053a612abd26393ebaff1d85d7d56058946f4f0f7bf25ed44ea899415 golangci-lint-1.61.0-linux-386.tar.gz
|
5ce910f2a864c5fbeb32a30cbd506e1b2ef215f7a0f422cd5be6370b13db6f03 golangci-lint-1.64.6-linux-386.deb
|
||||||
77cb0af99379d9a21d5dc8c38364d060e864a01bd2f3e30b5e8cc550c3a54111 golangci-lint-1.61.0-linux-amd64.tar.gz
|
2caab682a26b9a5fb94ba24e3a7e1404fa9eab2c12e36ae1c5548d80a1be190c golangci-lint-1.64.6-linux-386.rpm
|
||||||
af60ac05566d9351615cb31b4cc070185c25bf8cbd9b09c1873aa5ec6f3cc17e golangci-lint-1.61.0-linux-arm64.tar.gz
|
2d82d0a4716e6d9b70c95103054855cb4b5f20f7bbdee42297f0189955bd14b6 golangci-lint-1.64.6-linux-386.tar.gz
|
||||||
1f307f2fcc5d7d674062a967a0d83a7091e300529aa237ec6ad2b3dd14c897f5 golangci-lint-1.61.0-linux-armv6.tar.gz
|
9cd82503e9841abcaa57663fc899587fe90363c26d86a793a98d3080fd25e907 golangci-lint-1.64.6-linux-amd64.deb
|
||||||
3ad8cbaae75a547450844811300f99c4cd290277398e43d22b9eb1792d15af4c golangci-lint-1.61.0-linux-armv7.tar.gz
|
981aaca5e5202d4fbb162ec7080490eb67ef5d32add5fb62fb02210597acc9da golangci-lint-1.64.6-linux-amd64.rpm
|
||||||
9be2ca67d961d7699079739cf6f7c8291c5183d57e34d1677de21ca19d0bd3ed golangci-lint-1.61.0-linux-loong64.tar.gz
|
71e290acbacb7b3ba4f68f0540fb74dc180c4336ac8a6f3bdcd7fcc48b15148d golangci-lint-1.64.6-linux-amd64.tar.gz
|
||||||
90d005e1648115ebf0861b408eab9c936079a24763e883058b0a227cd3135d31 golangci-lint-1.61.0-linux-mips64.tar.gz
|
718016bb06c1f598a8d23c7964e2643de621dbe5808688cb38857eb0bb773c84 golangci-lint-1.64.6-linux-arm64.deb
|
||||||
6d2ed4f49407115460b8c10ccfc40fd177e0887a48864a2879dd16e84ba2a48c golangci-lint-1.61.0-linux-mips64le.tar.gz
|
ddc0e7b4b10b47cf894aea157e89e3674bbb60f8f5c480110c21c49cc2c1634d golangci-lint-1.64.6-linux-arm64.rpm
|
||||||
633089589af5a58b7430afb6eee107d4e9c99e8d91711ddc219eb13a07e8d3b8 golangci-lint-1.61.0-linux-ppc64le.tar.gz
|
99a7ff13dec7a8781a68408b6ecb8a1c5e82786cba3189eaa91d5cdcc24362ce golangci-lint-1.64.6-linux-arm64.tar.gz
|
||||||
4c1a097d9e0d1b4a8144dae6a1f5583a38d662f3bdc1498c4e954b6ed856be98 golangci-lint-1.61.0-linux-riscv64.tar.gz
|
90e360f89c244394912b8709fb83a900b6d56cf19141df2afaf9e902ef3057b1 golangci-lint-1.64.6-linux-armv6.deb
|
||||||
30581d3c987d287b7064617f1a2694143e10dffc40bc25be6636006ee82d7e1c golangci-lint-1.61.0-linux-s390x.tar.gz
|
46546ff7c98d873ffcdbee06b39dc1024fc08db4fbf1f6309360a44cf976b5c2 golangci-lint-1.64.6-linux-armv6.rpm
|
||||||
42530bf8100bd43c07f5efe6d92148ba6c5a7a712d510c6f24be85af6571d5eb golangci-lint-1.61.0-netbsd-386.tar.gz
|
e45c1a42868aca0b0ee54d14fb89da216f3b4409367cd7bce3b5f36788b4fc92 golangci-lint-1.64.6-linux-armv6.tar.gz
|
||||||
b8bb07c920f6601edf718d5e82ec0784fd590b0992b42b6ec18da99f26013ed4 golangci-lint-1.61.0-netbsd-amd64.tar.gz
|
3cf6ddbbbf358db3de4b64a24f9683bbe2da3f003cfdee86cb610124b57abafb golangci-lint-1.64.6-linux-armv7.deb
|
||||||
353a51527c60bd0776b0891b03f247c791986f625fca689d121972c624e54198 golangci-lint-1.61.0-netbsd-arm64.tar.gz
|
508b6712710da10f11aab9ea5e63af415c932dfe7fff718e649d3100b838f797 golangci-lint-1.64.6-linux-armv7.rpm
|
||||||
957a6272c3137910514225704c5dac0723b9c65eb7d9587366a997736e2d7580 golangci-lint-1.61.0-netbsd-armv6.tar.gz
|
da9a8bbee86b4dfee73fbc17e0856ec84c5b04919eb09bf3dd5904c39ce41753 golangci-lint-1.64.6-linux-armv7.tar.gz
|
||||||
a89eb28ff7f18f5cd52b914739360fa95cf2f643de4adeca46e26bec3a07e8d8 golangci-lint-1.61.0-netbsd-armv7.tar.gz
|
ad496a58284e1e9c8ac6f993fec429dcd96c85a8c4715dbb6530a5af0dae7fbd golangci-lint-1.64.6-linux-loong64.deb
|
||||||
d8d74c43600b271393000717a4ed157d7a15bb85bab7db2efad9b63a694d4634 golangci-lint-1.61.0-windows-386.zip
|
3bd70fa737b224750254dce616d9a188570e49b894b0cdb2fd04155e2c061350 golangci-lint-1.64.6-linux-loong64.rpm
|
||||||
e7bc2a81929a50f830244d6d2e657cce4f19a59aff49fa9000176ff34fda64ce golangci-lint-1.61.0-windows-amd64.zip
|
a535af973499729f2215a84303eb0de61399057aad6901ddea1b4f73f68d5f2c golangci-lint-1.64.6-linux-loong64.tar.gz
|
||||||
ed97c221596dd771e3dd9344872c140340bee2e819cd7a90afa1de752f1f2e0f golangci-lint-1.61.0-windows-arm64.zip
|
6ad2a1cd37ca30303a488abfca2de52aff57519901c6d8d2608656fe9fb05292 golangci-lint-1.64.6-linux-mips64.deb
|
||||||
4b365233948b13d02d45928a5c390045e00945e919747b9887b5f260247541ae golangci-lint-1.61.0-windows-armv6.zip
|
5f18369f0ca010a02c267352ebe6e3e0514c6debff49899c9e5520906c0da287 golangci-lint-1.64.6-linux-mips64.rpm
|
||||||
595538fb64d152173959d28f6235227f9cd969a828e5af0c4e960d02af4ffd0e golangci-lint-1.61.0-windows-armv7.zip
|
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
|
||||||
|
|
||||||
# This is the builder on PPA that will build Go itself (inception-y), don't modify!
|
# This is the builder on PPA that will build Go itself (inception-y), don't modify!
|
||||||
#
|
#
|
||||||
# This version is fine to be old and full of security holes, we just use it
|
# This version is fine to be old and full of security holes, we just use it
|
||||||
# to build the latest Go. Don't change it.
|
# to build the latest Go. Don't change it.
|
||||||
#
|
#
|
||||||
# version:ppa-builder-1 1.19.6
|
# version:ppa-builder-1.19 1.19.6
|
||||||
# https://go.dev/dl/
|
# https://go.dev/dl/
|
||||||
d7f0013f82e6d7f862cc6cb5c8cdb48eef5f2e239b35baa97e2f1a7466043767 go1.19.6.src.tar.gz
|
d7f0013f82e6d7f862cc6cb5c8cdb48eef5f2e239b35baa97e2f1a7466043767 go1.19.6.src.tar.gz
|
||||||
|
|
||||||
# version:ppa-builder-2 1.21.9
|
# version:ppa-builder-1.21 1.21.9
|
||||||
# https://go.dev/dl/
|
# https://go.dev/dl/
|
||||||
58f0c5ced45a0012bce2ff7a9df03e128abcc8818ebabe5027bb92bafe20e421 go1.21.9.src.tar.gz
|
58f0c5ced45a0012bce2ff7a9df03e128abcc8818ebabe5027bb92bafe20e421 go1.21.9.src.tar.gz
|
||||||
|
|
||||||
|
# version:ppa-builder-1.23 1.23.6
|
||||||
|
# https://go.dev/dl/
|
||||||
|
039c5b04e65279daceee8a6f71e70bd05cf5b801782b6f77c6e19e2ed0511222 go1.23.6.src.tar.gz
|
||||||
|
|
||||||
# version:protoc 27.1
|
# version:protoc 27.1
|
||||||
# https://github.com/protocolbuffers/protobuf/releases/
|
# https://github.com/protocolbuffers/protobuf/releases/
|
||||||
# https://github.com/protocolbuffers/protobuf/releases/download/v27.1/
|
# https://github.com/protocolbuffers/protobuf/releases/download/v27.1/
|
||||||
|
|
|
||||||
72
build/ci.go
72
build/ci.go
|
|
@ -25,8 +25,7 @@ Usage: go run build/ci.go <command> <command flags/arguments>
|
||||||
Available commands are:
|
Available commands are:
|
||||||
|
|
||||||
lint -- runs certain pre-selected linters
|
lint -- runs certain pre-selected linters
|
||||||
check_tidy -- verifies that everything is 'go mod tidy'-ed
|
check_generate -- verifies that 'go generate' and 'go mod tidy' do not produce changes
|
||||||
check_generate -- verifies that everything is 'go generate'-ed
|
|
||||||
check_baddeps -- verifies that certain dependencies are avoided
|
check_baddeps -- verifies that certain dependencies are avoided
|
||||||
|
|
||||||
install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables
|
install [ -arch architecture ] [ -cc compiler ] [ packages... ] -- builds packages and executables
|
||||||
|
|
@ -75,7 +74,6 @@ var (
|
||||||
allToolsArchiveFiles = []string{
|
allToolsArchiveFiles = []string{
|
||||||
"COPYING",
|
"COPYING",
|
||||||
executablePath("abigen"),
|
executablePath("abigen"),
|
||||||
executablePath("bootnode"),
|
|
||||||
executablePath("evm"),
|
executablePath("evm"),
|
||||||
executablePath("geth"),
|
executablePath("geth"),
|
||||||
executablePath("rlpdump"),
|
executablePath("rlpdump"),
|
||||||
|
|
@ -88,10 +86,6 @@ var (
|
||||||
BinaryName: "abigen",
|
BinaryName: "abigen",
|
||||||
Description: "Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages.",
|
Description: "Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages.",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
BinaryName: "bootnode",
|
|
||||||
Description: "Ethereum bootnode.",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
BinaryName: "evm",
|
BinaryName: "evm",
|
||||||
Description: "Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode.",
|
Description: "Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode.",
|
||||||
|
|
@ -161,8 +155,6 @@ func main() {
|
||||||
doTest(os.Args[2:])
|
doTest(os.Args[2:])
|
||||||
case "lint":
|
case "lint":
|
||||||
doLint(os.Args[2:])
|
doLint(os.Args[2:])
|
||||||
case "check_tidy":
|
|
||||||
doCheckTidy()
|
|
||||||
case "check_generate":
|
case "check_generate":
|
||||||
doCheckGenerate()
|
doCheckGenerate()
|
||||||
case "check_baddeps":
|
case "check_baddeps":
|
||||||
|
|
@ -257,7 +249,7 @@ func buildFlags(env build.Environment, staticLinking bool, buildTags []string) (
|
||||||
// See https://sourceware.org/binutils/docs-2.23.1/ld/Options.html#Options
|
// See https://sourceware.org/binutils/docs-2.23.1/ld/Options.html#Options
|
||||||
// regarding the options --build-id=none and --strip-all. It is needed for
|
// regarding the options --build-id=none and --strip-all. It is needed for
|
||||||
// reproducible builds; removing references to temporary files in C-land, and
|
// reproducible builds; removing references to temporary files in C-land, and
|
||||||
// making build-id reproducably absent.
|
// making build-id reproducibly absent.
|
||||||
extld := []string{"-Wl,-z,stack-size=0x800000,--build-id=none,--strip-all"}
|
extld := []string{"-Wl,-z,stack-size=0x800000,--build-id=none,--strip-all"}
|
||||||
if staticLinking {
|
if staticLinking {
|
||||||
extld = append(extld, "-static")
|
extld = append(extld, "-static")
|
||||||
|
|
@ -304,8 +296,8 @@ func doTest(cmdline []string) {
|
||||||
}
|
}
|
||||||
gotest := tc.Go("test")
|
gotest := tc.Go("test")
|
||||||
|
|
||||||
// CI needs a bit more time for the statetests (default 10m).
|
// CI needs a bit more time for the statetests (default 45m).
|
||||||
gotest.Args = append(gotest.Args, "-timeout=30m")
|
gotest.Args = append(gotest.Args, "-timeout=45m")
|
||||||
|
|
||||||
// Enable CKZG backend in CI.
|
// Enable CKZG backend in CI.
|
||||||
gotest.Args = append(gotest.Args, "-tags=ckzg")
|
gotest.Args = append(gotest.Args, "-tags=ckzg")
|
||||||
|
|
@ -344,8 +336,8 @@ func downloadSpecTestFixtures(csdb *build.ChecksumDB, cachedir string) string {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
ext := ".tar.gz"
|
ext := ".tar.gz"
|
||||||
base := "fixtures_develop" // TODO(MariusVanDerWijden) rename once the version becomes part of the filename
|
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/v%s/%s%s", executionSpecTestsVersion, base, ext)
|
url := fmt.Sprintf("https://github.com/ethereum/execution-spec-tests/releases/download/%s/%s%s", executionSpecTestsVersion, base, ext)
|
||||||
archivePath := filepath.Join(cachedir, base+ext)
|
archivePath := filepath.Join(cachedir, base+ext)
|
||||||
if err := csdb.DownloadFile(url, archivePath); err != nil {
|
if err := csdb.DownloadFile(url, archivePath); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
@ -358,22 +350,6 @@ func downloadSpecTestFixtures(csdb *build.ChecksumDB, cachedir string) string {
|
||||||
|
|
||||||
// doCheckTidy assets that the Go modules files are tidied already.
|
// doCheckTidy assets that the Go modules files are tidied already.
|
||||||
func doCheckTidy() {
|
func doCheckTidy() {
|
||||||
targets := []string{"go.mod", "go.sum"}
|
|
||||||
|
|
||||||
hashes, err := build.HashFiles(targets)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("failed to hash go.mod/go.sum: %v", err)
|
|
||||||
}
|
|
||||||
build.MustRun(new(build.GoToolchain).Go("mod", "tidy"))
|
|
||||||
|
|
||||||
tidied, err := build.HashFiles(targets)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("failed to rehash go.mod/go.sum: %v", err)
|
|
||||||
}
|
|
||||||
if updates := build.DiffHashes(hashes, tidied); len(updates) > 0 {
|
|
||||||
log.Fatalf("files changed on running 'go mod tidy': %v", updates)
|
|
||||||
}
|
|
||||||
fmt.Println("No untidy module files detected.")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// doCheckGenerate ensures that re-generating generated files does not cause
|
// doCheckGenerate ensures that re-generating generated files does not cause
|
||||||
|
|
@ -381,12 +357,13 @@ func doCheckTidy() {
|
||||||
func doCheckGenerate() {
|
func doCheckGenerate() {
|
||||||
var (
|
var (
|
||||||
cachedir = flag.String("cachedir", "./build/cache", "directory for caching binaries.")
|
cachedir = flag.String("cachedir", "./build/cache", "directory for caching binaries.")
|
||||||
|
tc = new(build.GoToolchain)
|
||||||
)
|
)
|
||||||
// Compute the origin hashes of all the files
|
// Compute the origin hashes of all the files
|
||||||
var hashes map[string][32]byte
|
var hashes map[string][32]byte
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
hashes, err = build.HashFolder(".", []string{"tests/testdata", "build/cache"})
|
hashes, err = build.HashFolder(".", []string{"tests/testdata", "build/cache", ".git"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error computing hashes", "err", err)
|
log.Fatal("Error computing hashes", "err", err)
|
||||||
}
|
}
|
||||||
|
|
@ -395,13 +372,13 @@ func doCheckGenerate() {
|
||||||
protocPath = downloadProtoc(*cachedir)
|
protocPath = downloadProtoc(*cachedir)
|
||||||
protocGenGoPath = downloadProtocGenGo(*cachedir)
|
protocGenGoPath = downloadProtocGenGo(*cachedir)
|
||||||
)
|
)
|
||||||
c := new(build.GoToolchain).Go("generate", "./...")
|
c := tc.Go("generate", "./...")
|
||||||
pathList := []string{filepath.Join(protocPath, "bin"), protocGenGoPath, os.Getenv("PATH")}
|
pathList := []string{filepath.Join(protocPath, "bin"), protocGenGoPath, os.Getenv("PATH")}
|
||||||
c.Env = append(c.Env, "PATH="+strings.Join(pathList, string(os.PathListSeparator)))
|
c.Env = append(c.Env, "PATH="+strings.Join(pathList, string(os.PathListSeparator)))
|
||||||
build.MustRun(c)
|
build.MustRun(c)
|
||||||
|
|
||||||
// Check if generate file hashes have changed
|
// Check if generate file hashes have changed
|
||||||
generated, err := build.HashFolder(".", []string{"tests/testdata", "build/cache"})
|
generated, err := build.HashFolder(".", []string{"tests/testdata", "build/cache", ".git"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error re-computing hashes: %v", err)
|
log.Fatalf("Error re-computing hashes: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -413,6 +390,10 @@ func doCheckGenerate() {
|
||||||
log.Fatal("One or more generated files were updated by running 'go generate ./...'")
|
log.Fatal("One or more generated files were updated by running 'go generate ./...'")
|
||||||
}
|
}
|
||||||
fmt.Println("No stale files detected.")
|
fmt.Println("No stale files detected.")
|
||||||
|
|
||||||
|
// Run go mod tidy check.
|
||||||
|
build.MustRun(tc.Go("mod", "tidy", "-diff"))
|
||||||
|
fmt.Println("No untidy module files detected.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// doCheckBadDeps verifies whether certain unintended dependencies between some
|
// doCheckBadDeps verifies whether certain unintended dependencies between some
|
||||||
|
|
@ -690,7 +671,8 @@ func maybeSkipArchive(env build.Environment) {
|
||||||
func doDockerBuildx(cmdline []string) {
|
func doDockerBuildx(cmdline []string) {
|
||||||
var (
|
var (
|
||||||
platform = flag.String("platform", "", `Push a multi-arch docker image for the specified architectures (usually "linux/amd64,linux/arm64")`)
|
platform = flag.String("platform", "", `Push a multi-arch docker image for the specified architectures (usually "linux/amd64,linux/arm64")`)
|
||||||
upload = flag.String("upload", "", `Where to upload the docker image (usually "ethereum/client-go")`)
|
hubImage = flag.String("hub", "ethereum/client-go", `Where to upload the docker image`)
|
||||||
|
upload = flag.Bool("upload", false, `Whether to trigger upload`)
|
||||||
)
|
)
|
||||||
flag.CommandLine.Parse(cmdline)
|
flag.CommandLine.Parse(cmdline)
|
||||||
|
|
||||||
|
|
@ -725,25 +707,33 @@ func doDockerBuildx(cmdline []string) {
|
||||||
tags = []string{"stable", fmt.Sprintf("release-%v", version.Family), "v" + version.Semantic}
|
tags = []string{"stable", fmt.Sprintf("release-%v", version.Family), "v" + version.Semantic}
|
||||||
}
|
}
|
||||||
// Need to create a mult-arch builder
|
// Need to create a mult-arch builder
|
||||||
build.MustRunCommand("docker", "buildx", "create", "--use", "--name", "multi-arch-builder", "--platform", *platform)
|
check := exec.Command("docker", "buildx", "inspect", "multi-arch-builder")
|
||||||
|
if check.Run() != nil {
|
||||||
|
build.MustRunCommand("docker", "buildx", "create", "--use", "--name", "multi-arch-builder", "--platform", *platform)
|
||||||
|
}
|
||||||
|
|
||||||
for _, spec := range []struct {
|
for _, spec := range []struct {
|
||||||
file string
|
file string
|
||||||
base string
|
base string
|
||||||
}{
|
}{
|
||||||
{file: "Dockerfile", base: fmt.Sprintf("%s:", *upload)},
|
{file: "Dockerfile", base: fmt.Sprintf("%s:", *hubImage)},
|
||||||
{file: "Dockerfile.alltools", base: fmt.Sprintf("%s:alltools-", *upload)},
|
{file: "Dockerfile.alltools", base: fmt.Sprintf("%s:alltools-", *hubImage)},
|
||||||
} {
|
} {
|
||||||
for _, tag := range tags { // latest, stable etc
|
for _, tag := range tags { // latest, stable etc
|
||||||
gethImage := fmt.Sprintf("%s%s", spec.base, tag)
|
gethImage := fmt.Sprintf("%s%s", spec.base, tag)
|
||||||
build.MustRunCommand("docker", "buildx", "build",
|
cmd := exec.Command("docker", "buildx", "build",
|
||||||
"--build-arg", "COMMIT="+env.Commit,
|
"--build-arg", "COMMIT="+env.Commit,
|
||||||
"--build-arg", "VERSION="+version.WithMeta,
|
"--build-arg", "VERSION="+version.WithMeta,
|
||||||
"--build-arg", "BUILDNUM="+env.Buildnum,
|
"--build-arg", "BUILDNUM="+env.Buildnum,
|
||||||
"--tag", gethImage,
|
"--tag", gethImage,
|
||||||
"--platform", *platform,
|
"--platform", *platform,
|
||||||
"--push",
|
"--file", spec.file,
|
||||||
"--file", spec.file, ".")
|
)
|
||||||
|
if *upload {
|
||||||
|
cmd.Args = append(cmd.Args, "--push")
|
||||||
|
}
|
||||||
|
cmd.Args = append(cmd.Args, ".")
|
||||||
|
build.MustRun(cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -847,7 +837,7 @@ func downloadGoBootstrapSources(cachedir string) []string {
|
||||||
csdb := build.MustLoadChecksums("build/checksums.txt")
|
csdb := build.MustLoadChecksums("build/checksums.txt")
|
||||||
|
|
||||||
var bundles []string
|
var bundles []string
|
||||||
for _, booter := range []string{"ppa-builder-1", "ppa-builder-2"} {
|
for _, booter := range []string{"ppa-builder-1.19", "ppa-builder-1.21", "ppa-builder-1.23"} {
|
||||||
gobootVersion, err := build.Version(csdb, booter)
|
gobootVersion, err := build.Version(csdb, booter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue