diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index a1101859..9b61ec44 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -58,10 +58,17 @@ jobs: - name: Download blockchain data run: | + # Download Deneb state curl -o data/deneb_holesky_beacon_state_2227472.ssz.zip https://dviu8zszosyat.cloudfront.net/deneb_holesky_beacon_state_2227472.ssz.zip - (cd data && unzip deneb_holesky_beacon_state_2227472.ssz.zip) + unzip -j data/deneb_holesky_beacon_state_2227472.ssz.zip -d data/ + + # Download Electra state + curl -o data/electra_mekong_beacon_state_654719.ssz.zip https://d1w8rcimizlk6a.cloudfront.net/electra_mekong_beacon_state_654719.ssz.zip + unzip -j data/electra_mekong_beacon_state_654719.ssz.zip -d data/ - name: Run tests + env: + RPC_URL: ${{ secrets.RPC_URL }} run: | go test -v ./... goreleaser: diff --git a/.gitignore b/.gitignore index ac417b10..31960bed 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,6 @@ test **/.DS_Store -*.ssz \ No newline at end of file +*.ssz + +.env \ No newline at end of file diff --git a/beacon/beacon_state_top_level_roots.go b/beacon/beacon_state_top_level_roots.go index e4603244..b7529f07 100644 --- a/beacon/beacon_state_top_level_roots.go +++ b/beacon/beacon_state_top_level_roots.go @@ -1,13 +1,32 @@ package beacon import ( + "errors" "reflect" "github.com/Layr-Labs/eigenpod-proofs-generation/common" + "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/phase0" ) -type BeaconStateTopLevelRoots struct { +type VersionedBeaconStateTopLevelRoots struct { + Version spec.DataVersion + Deneb *BeaconStateTopLevelRootsDeneb + Electra *BeaconStateTopLevelRootsElectra +} + +func (v *VersionedBeaconStateTopLevelRoots) GetBalancesRoot() (*phase0.Root, error) { + switch v.Version { + case spec.DataVersionDeneb: + return v.Deneb.BalancesRoot, nil + case spec.DataVersionElectra: + return v.Electra.BalancesRoot, nil + default: + return nil, errors.New("unsupported beacon state version") + } +} + +type BeaconStateTopLevelRootsDeneb struct { GenesisTimeRoot *phase0.Root GenesisValidatorsRoot *phase0.Root SlotRoot *phase0.Root @@ -38,18 +57,71 @@ type BeaconStateTopLevelRoots struct { HistoricalSummariesRoot *phase0.Root } -func ProveBeaconTopLevelRootAgainstBeaconState(beaconTopLevelRoots *BeaconStateTopLevelRoots, index uint64) (common.Proof, error) { - v := reflect.ValueOf(*beaconTopLevelRoots) +type BeaconStateTopLevelRootsElectra struct { + GenesisTimeRoot *phase0.Root + GenesisValidatorsRoot *phase0.Root + SlotRoot *phase0.Root + ForkRoot *phase0.Root + LatestBlockHeaderRoot *phase0.Root + BlockRootsRoot *phase0.Root + StateRootsRoot *phase0.Root + HistoricalRootsRoot *phase0.Root + ETH1DataRoot *phase0.Root + ETH1DataVotesRoot *phase0.Root + ETH1DepositIndexRoot *phase0.Root + ValidatorsRoot *phase0.Root + BalancesRoot *phase0.Root + RANDAOMixesRoot *phase0.Root + SlashingsRoot *phase0.Root + PreviousEpochParticipationRoot *phase0.Root + CurrentEpochParticipationRoot *phase0.Root + JustificationBitsRoot *phase0.Root + PreviousJustifiedCheckpointRoot *phase0.Root + CurrentJustifiedCheckpointRoot *phase0.Root + FinalizedCheckpointRoot *phase0.Root + InactivityScoresRoot *phase0.Root + CurrentSyncCommitteeRoot *phase0.Root + NextSyncCommitteeRoot *phase0.Root + LatestExecutionPayloadHeaderRoot *phase0.Root + NextWithdrawalIndexRoot *phase0.Root + NextWithdrawalValidatorIndexRoot *phase0.Root + HistoricalSummariesRoot *phase0.Root + DepositRequestsStartIndexRoot *phase0.Root + DepositBalanceToConsumeRoot *phase0.Root + ExitBalanceToConsumeRoot *phase0.Root + EarliestExitEpochRoot *phase0.Root + ConsolidationBalanceToConsumeRoot *phase0.Root + EarliestConsolidationEpochRoot *phase0.Root + PendingDepositsRoot *phase0.Root + PendingPartialWithdrawalsRoot *phase0.Root + PendingConsolidationsRoot *phase0.Root +} + +func ProveBeaconTopLevelRootAgainstBeaconState(beaconTopLevelRoots *VersionedBeaconStateTopLevelRoots, index uint64) (common.Proof, error) { + var v reflect.Value + var treeHeight uint64 + switch beaconTopLevelRoots.Version { + case spec.DataVersionDeneb: + v = reflect.ValueOf(*beaconTopLevelRoots.Deneb) + treeHeight = BEACON_STATE_TREE_HEIGHT_DENEB + case spec.DataVersionElectra: + v = reflect.ValueOf(*beaconTopLevelRoots.Electra) + treeHeight = BEACON_STATE_TREE_HEIGHT_ELECTRA + default: + return nil, errors.New("unsupported beacon state version") + } + beaconTopLevelRootsList := make([]interface{}, v.NumField()) for i := 0; i < v.NumField(); i++ { r := v.Field(i).Interface() typedR := r.(*phase0.Root) beaconTopLevelRootsList[i] = *typedR } + roots := make([]phase0.Root, len(beaconTopLevelRootsList)) for i, v := range beaconTopLevelRootsList { roots[i] = v.(phase0.Root) } - return common.GetProof(roots, index, BEACON_STATE_TREE_HEIGHT) + return common.GetProof(roots, index, treeHeight) } diff --git a/beacon/constants.go b/beacon/constants.go index 31dc11d1..f932ce23 100644 --- a/beacon/constants.go +++ b/beacon/constants.go @@ -3,10 +3,11 @@ package beacon const ( BEACON_BLOCK_HEADER_NUM_FIELDS = uint64(5) - BEACON_BLOCK_HEADER_TREE_HEIGHT = uint64(3) - BEACON_STATE_TREE_HEIGHT = uint64(5) - BALANCE_TREE_HEIGHT = uint64(38) - VALIDATOR_TREE_HEIGHT = uint64(40) + BEACON_BLOCK_HEADER_TREE_HEIGHT = uint64(3) + BEACON_STATE_TREE_HEIGHT_DENEB = uint64(5) + BEACON_STATE_TREE_HEIGHT_ELECTRA = uint64(6) + BALANCE_TREE_HEIGHT = uint64(38) + VALIDATOR_TREE_HEIGHT = uint64(40) STATE_ROOT_INDEX = uint64(3) diff --git a/beacon/deneb.go b/beacon/deneb.go index a2c06167..95cbac25 100644 --- a/beacon/deneb.go +++ b/beacon/deneb.go @@ -2,6 +2,7 @@ package beacon import ( "github.com/Layr-Labs/eigenpod-proofs-generation/common" + "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/altair" "github.com/attestantio/go-eth2-client/spec/deneb" "github.com/attestantio/go-eth2-client/spec/phase0" @@ -9,9 +10,9 @@ import ( ) // taken from https://github.com/attestantio/go-eth2-client/blob/21f7dd480fed933d8e0b1c88cee67da721c80eb2/spec/deneb/beaconstate_ssz.go#L640 -func ComputeBeaconStateTopLevelRootsDeneb(b *deneb.BeaconState) (*BeaconStateTopLevelRoots, error) { +func ComputeBeaconStateTopLevelRootsDeneb(b *deneb.BeaconState) (*VersionedBeaconStateTopLevelRoots, error) { var err error - beaconStateTopLevelRoots := &BeaconStateTopLevelRoots{} + beaconStateTopLevelRoots := &BeaconStateTopLevelRootsDeneb{} hh := ssz.NewHasher() @@ -409,5 +410,8 @@ func ComputeBeaconStateTopLevelRootsDeneb(b *deneb.BeaconState) (*BeaconStateTop hh.Reset() } - return beaconStateTopLevelRoots, nil + return &VersionedBeaconStateTopLevelRoots{ + Version: spec.DataVersionDeneb, + Deneb: beaconStateTopLevelRoots, + }, nil } diff --git a/beacon/electra.go b/beacon/electra.go new file mode 100644 index 00000000..aaef1155 --- /dev/null +++ b/beacon/electra.go @@ -0,0 +1,510 @@ +package beacon + +import ( + "github.com/Layr-Labs/eigenpod-proofs-generation/common" + "github.com/attestantio/go-eth2-client/spec" + "github.com/attestantio/go-eth2-client/spec/altair" + "github.com/attestantio/go-eth2-client/spec/electra" + "github.com/attestantio/go-eth2-client/spec/phase0" + ssz "github.com/ferranbt/fastssz" +) + +// taken from https://github.com/attestantio/go-eth2-client/blob/4ee14baa752e16d5868d83fa559f1f7c7ffc198f/spec/electra/beaconstate_ssz.go#L780 +func ComputeBeaconStateTopLevelRootsElectra(b *electra.BeaconState) (*VersionedBeaconStateTopLevelRoots, error) { + var err error + beaconStateTopLevelRoots := &BeaconStateTopLevelRootsElectra{} + + hh := ssz.NewHasher() + + // Field (0) 'GenesisTime' + hh.PutUint64(b.GenesisTime) + tmp0 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.GenesisTimeRoot = &tmp0 + hh.Reset() + + // Field (1) 'GenesisValidatorsRoot' + if size := len(b.GenesisValidatorsRoot); size != 32 { + err = ssz.ErrBytesLengthFn("BeaconState.GenesisValidatorsRoot", size, 32) + return nil, err + } + hh.PutBytes(b.GenesisValidatorsRoot[:]) + tmp1 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.GenesisValidatorsRoot = &tmp1 + hh.Reset() + + // Field (2) 'Slot' + hh.PutUint64(uint64(b.Slot)) + tmp2 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.SlotRoot = &tmp2 + hh.Reset() + + // Field (3) 'Fork' + if b.Fork == nil { + b.Fork = new(phase0.Fork) + } + if err = b.Fork.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp3 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.ForkRoot = &tmp3 + // copy(beaconStateTopLevelRoots.ForkRoot[:], hh.Hash()) + hh.Reset() + + // Field (4) 'LatestBlockHeader' + if b.LatestBlockHeader == nil { + b.LatestBlockHeader = new(phase0.BeaconBlockHeader) + } + if err = b.LatestBlockHeader.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp4 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.LatestBlockHeaderRoot = &tmp4 + // copy(beaconStateTopLevelRoots.LatestBlockHeaderRoot[:], hh.Hash()) + hh.Reset() + + // Field (5) 'BlockRoots' + { + if size := len(b.BlockRoots); size != 8192 { + err = ssz.ErrVectorLengthFn("BeaconState.BlockRoots", size, 8192) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.BlockRoots { + if len(i) != 32 { + err = ssz.ErrBytesLength + return nil, err + } + hh.Append(i[:]) + } + hh.Merkleize(subIndx) + tmp5 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.BlockRootsRoot = &tmp5 + // copy(beaconStateTopLevelRoots.BlockRootsRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (6) 'StateRoots' + { + if size := len(b.StateRoots); size != 8192 { + err = ssz.ErrVectorLengthFn("BeaconState.StateRoots", size, 8192) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.StateRoots { + if len(i) != 32 { + err = ssz.ErrBytesLength + return nil, err + } + hh.Append(i[:]) + } + hh.Merkleize(subIndx) + tmp6 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.StateRootsRoot = &tmp6 + // copy(beaconStateTopLevelRoots.StateRootsRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (7) 'HistoricalRoots' + { + if size := len(b.HistoricalRoots); size > 16777216 { + err = ssz.ErrListTooBigFn("BeaconState.HistoricalRoots", size, 16777216) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.HistoricalRoots { + if len(i) != 32 { + err = ssz.ErrBytesLength + return nil, err + } + hh.Append(i[:]) + } + numItems := uint64(len(b.HistoricalRoots)) + hh.MerkleizeWithMixin(subIndx, numItems, ssz.CalculateLimit(16777216, numItems, 32)) + tmp7 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.HistoricalRootsRoot = &tmp7 + // copy(beaconStateTopLevelRoots.HistoricalRootsRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (8) 'ETH1Data' + if b.ETH1Data == nil { + b.ETH1Data = new(phase0.ETH1Data) + } + if err = b.ETH1Data.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp8 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.ETH1DataRoot = &tmp8 + // copy(beaconStateTopLevelRoots.ETH1DataRoot[:], hh.Hash()) + hh.Reset() + + // Field (9) 'ETH1DataVotes' + { + subIndx := hh.Index() + num := uint64(len(b.ETH1DataVotes)) + if num > 2048 { + err = ssz.ErrIncorrectListSize + return nil, err + } + for _, elem := range b.ETH1DataVotes { + if err = elem.HashTreeRootWith(hh); err != nil { + return nil, err + } + } + hh.MerkleizeWithMixin(subIndx, num, 2048) + tmp9 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.ETH1DataVotesRoot = &tmp9 + // copy(beaconStateTopLevelRoots.ETH1DataVotesRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (10) 'ETH1DepositIndex' + hh.PutUint64(b.ETH1DepositIndex) + tmp10 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.ETH1DepositIndexRoot = &tmp10 + // copy(beaconStateTopLevelRoots.ETH1DepositIndexRoot[:], hh.Hash()) + hh.Reset() + + // Field (11) 'Validators' + { + subIndx := hh.Index() + num := uint64(len(b.Validators)) + if num > 1099511627776 { + err = ssz.ErrIncorrectListSize + return nil, err + } + for _, elem := range b.Validators { + if err = elem.HashTreeRootWith(hh); err != nil { + return nil, err + } + } + hh.MerkleizeWithMixin(subIndx, num, 1099511627776) + tmp11 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.ValidatorsRoot = &tmp11 + // copy(beaconStateTopLevelRoots.ValidatorsRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (12) 'Balances' + { + if size := len(b.Balances); size > 1099511627776 { + err = ssz.ErrListTooBigFn("BeaconState.Balances", size, 1099511627776) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.Balances { + hh.AppendUint64(uint64(i)) + } + hh.FillUpTo32() + numItems := uint64(len(b.Balances)) + + hh.MerkleizeWithMixin(subIndx, numItems, ssz.CalculateLimit(1099511627776, numItems, 8)) + tmp12 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.BalancesRoot = &tmp12 + // copy(beaconStateTopLevelRoots.BalancesRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (13) 'RANDAOMixes' + { + if size := len(b.RANDAOMixes); size != 65536 { + err = ssz.ErrVectorLengthFn("BeaconState.RANDAOMixes", size, 65536) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.RANDAOMixes { + if len(i) != 32 { + err = ssz.ErrBytesLength + return nil, err + } + hh.Append(i[:]) + } + hh.Merkleize(subIndx) + tmp13 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.RANDAOMixesRoot = &tmp13 + // copy(beaconStateTopLevelRoots.RANDAOMixesRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (14) 'Slashings' + { + if size := len(b.Slashings); size != 8192 { + err = ssz.ErrVectorLengthFn("BeaconState.Slashings", size, 8192) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.Slashings { + hh.AppendUint64(uint64(i)) + } + hh.Merkleize(subIndx) + tmp14 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.SlashingsRoot = &tmp14 + // copy(beaconStateTopLevelRoots.SlashingsRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (15) 'PreviousEpochParticipation' + { + if size := len(b.PreviousEpochParticipation); size > 1099511627776 { + err = ssz.ErrListTooBigFn("BeaconState.PreviousEpochParticipation", size, 1099511627776) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.PreviousEpochParticipation { + hh.AppendUint8(uint8(i)) + } + hh.FillUpTo32() + numItems := uint64(len(b.PreviousEpochParticipation)) + hh.MerkleizeWithMixin(subIndx, numItems, ssz.CalculateLimit(1099511627776, numItems, 1)) + tmp15 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.PreviousEpochParticipationRoot = &tmp15 + // copy(beaconStateTopLevelRoots.PreviousEpochParticipationRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (16) 'CurrentEpochParticipation' + { + if size := len(b.CurrentEpochParticipation); size > 1099511627776 { + err = ssz.ErrListTooBigFn("BeaconState.CurrentEpochParticipation", size, 1099511627776) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.CurrentEpochParticipation { + hh.AppendUint8(uint8(i)) + } + hh.FillUpTo32() + numItems := uint64(len(b.CurrentEpochParticipation)) + hh.MerkleizeWithMixin(subIndx, numItems, ssz.CalculateLimit(1099511627776, numItems, 1)) + tmp16 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.CurrentEpochParticipationRoot = &tmp16 + // copy(beaconStateTopLevelRoots.CurrentEpochParticipationRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (17) 'JustificationBits' + if size := len(b.JustificationBits); size != 1 { + err = ssz.ErrBytesLengthFn("BeaconState.JustificationBits", size, 1) + return nil, err + } + hh.PutBytes(b.JustificationBits) + tmp17 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.JustificationBitsRoot = &tmp17 + hh.Reset() + + // Field (18) 'PreviousJustifiedCheckpoint' + if b.PreviousJustifiedCheckpoint == nil { + b.PreviousJustifiedCheckpoint = new(phase0.Checkpoint) + } + if err = b.PreviousJustifiedCheckpoint.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp18 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.PreviousJustifiedCheckpointRoot = &tmp18 + // copy(beaconStateTopLevelRoots.PreviousJustifiedCheckpointRoot[:], hh.Hash()) + hh.Reset() + + // Field (19) 'CurrentJustifiedCheckpoint' + if b.CurrentJustifiedCheckpoint == nil { + b.CurrentJustifiedCheckpoint = new(phase0.Checkpoint) + } + if err = b.CurrentJustifiedCheckpoint.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp19 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.CurrentJustifiedCheckpointRoot = &tmp19 + // copy(beaconStateTopLevelRoots.CurrentJustifiedCheckpointRoot[:], hh.Hash()) + hh.Reset() + + // Field (20) 'FinalizedCheckpoint' + if b.FinalizedCheckpoint == nil { + b.FinalizedCheckpoint = new(phase0.Checkpoint) + } + if err = b.FinalizedCheckpoint.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp20 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.FinalizedCheckpointRoot = &tmp20 + // copy(beaconStateTopLevelRoots.FinalizedCheckpointRoot[:], hh.Hash()) + hh.Reset() + + // Field (21) 'InactivityScores' + { + if size := len(b.InactivityScores); size > 1099511627776 { + err = ssz.ErrListTooBigFn("BeaconState.InactivityScores", size, 1099511627776) + return nil, err + } + subIndx := hh.Index() + for _, i := range b.InactivityScores { + hh.AppendUint64(i) + } + hh.FillUpTo32() + numItems := uint64(len(b.InactivityScores)) + hh.MerkleizeWithMixin(subIndx, numItems, ssz.CalculateLimit(1099511627776, numItems, 8)) + tmp21 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.InactivityScoresRoot = &tmp21 + // copy(beaconStateTopLevelRoots.InactivityScoresRoot[:], hh.Hash()) + hh.Reset() + } + + // Field (22) 'CurrentSyncCommittee' + if b.CurrentSyncCommittee == nil { + b.CurrentSyncCommittee = new(altair.SyncCommittee) + } + if err = b.CurrentSyncCommittee.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp22 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.CurrentSyncCommitteeRoot = &tmp22 + // copy(beaconStateTopLevelRoots.CurrentSyncCommitteeRoot[:], hh.Hash()) + hh.Reset() + + // Field (23) 'NextSyncCommittee' + if b.NextSyncCommittee == nil { + b.NextSyncCommittee = new(altair.SyncCommittee) + } + if err = b.NextSyncCommittee.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp23 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.NextSyncCommitteeRoot = &tmp23 + // copy(beaconStateTopLevelRoots.NextSyncCommitteeRoot[:], hh.Hash()) + hh.Reset() + + // Field (24) 'LatestExecutionPayloadHeader' + if err = b.LatestExecutionPayloadHeader.HashTreeRootWith(hh); err != nil { + return nil, err + } + tmp24 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.LatestExecutionPayloadHeaderRoot = &tmp24 + // copy(beaconStateTopLevelRoots.LatestExecutionPayloadHeaderRoot[:], hh.Hash()) + hh.Reset() + + // Field (25) 'NextWithdrawalIndex' + hh.PutUint64(uint64(b.NextWithdrawalIndex)) + tmp25 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.NextWithdrawalIndexRoot = &tmp25 + hh.Reset() + + // Field (26) 'NextWithdrawalValidatorIndex' + hh.PutUint64(uint64(b.NextWithdrawalValidatorIndex)) + tmp26 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.NextWithdrawalValidatorIndexRoot = &tmp26 + hh.Reset() + + // Field (27) 'HistoricalSummaries' + { + subIndx := hh.Index() + num := uint64(len(b.HistoricalSummaries)) + if num > 16777216 { + err = ssz.ErrIncorrectListSize + return nil, err + } + for _, elem := range b.HistoricalSummaries { + if err = elem.HashTreeRootWith(hh); err != nil { + return nil, err + } + } + hh.MerkleizeWithMixin(subIndx, num, 16777216) + tmp27 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.HistoricalSummariesRoot = &tmp27 + hh.Reset() + } + + // Field (28) 'DepositRequestsStartIndex' + hh.PutUint64(uint64(b.DepositRequestsStartIndex)) + tmp28 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.DepositRequestsStartIndexRoot = &tmp28 + hh.Reset() + + // Field (29) 'DepositBalanceToConsume' + hh.PutUint64(uint64(b.DepositBalanceToConsume)) + tmp29 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.DepositBalanceToConsumeRoot = &tmp29 + hh.Reset() + + // Field (30) 'ExitBalanceToConsume' + hh.PutUint64(uint64(b.ExitBalanceToConsume)) + tmp30 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.ExitBalanceToConsumeRoot = &tmp30 + hh.Reset() + + // Field (31) 'EarliestExitEpoch' + hh.PutUint64(uint64(b.EarliestExitEpoch)) + tmp31 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.EarliestExitEpochRoot = &tmp31 + hh.Reset() + + // Field (32) 'ConsolidationBalanceToConsume' + hh.PutUint64(uint64(b.ConsolidationBalanceToConsume)) + tmp32 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.ConsolidationBalanceToConsumeRoot = &tmp32 + hh.Reset() + + // Field (33) 'EarliestConsolidationEpoch' + hh.PutUint64(uint64(b.EarliestConsolidationEpoch)) + tmp33 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.EarliestConsolidationEpochRoot = &tmp33 + hh.Reset() + + // Field (34) 'PendingDeposits' + { + subIndx := hh.Index() + num := uint64(len(b.PendingDeposits)) + if num > 134217728 { + err = ssz.ErrIncorrectListSize + return nil, err + } + for _, elem := range b.PendingDeposits { + if err = elem.HashTreeRootWith(hh); err != nil { + return nil, err + } + } + hh.MerkleizeWithMixin(subIndx, num, 134217728) + tmp34 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.PendingDepositsRoot = &tmp34 + hh.Reset() + } + + // Field (35) 'PendingPartialWithdrawals' + { + subIndx := hh.Index() + num := uint64(len(b.PendingPartialWithdrawals)) + if num > 134217728 { + err = ssz.ErrIncorrectListSize + return nil, err + } + for _, elem := range b.PendingPartialWithdrawals { + if err = elem.HashTreeRootWith(hh); err != nil { + return nil, err + } + } + hh.MerkleizeWithMixin(subIndx, num, 134217728) + tmp35 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.PendingPartialWithdrawalsRoot = &tmp35 + hh.Reset() + } + + // Field (36) 'PendingConsolidations' + { + subIndx := hh.Index() + num := uint64(len(b.PendingConsolidations)) + if num > 262144 { + err = ssz.ErrIncorrectListSize + return nil, err + } + for _, elem := range b.PendingConsolidations { + if err = elem.HashTreeRootWith(hh); err != nil { + return nil, err + } + } + hh.MerkleizeWithMixin(subIndx, num, 262144) + tmp36 := phase0.Root(common.ConvertTo32ByteArray(hh.Hash())) + beaconStateTopLevelRoots.PendingConsolidationsRoot = &tmp36 + hh.Reset() + } + + return &VersionedBeaconStateTopLevelRoots{ + Version: spec.DataVersionElectra, + Electra: beaconStateTopLevelRoots, + }, nil +} diff --git a/beacon/versioned_beacon_state.go b/beacon/versioned_beacon_state.go index ec60d13c..6bea1d8b 100644 --- a/beacon/versioned_beacon_state.go +++ b/beacon/versioned_beacon_state.go @@ -4,14 +4,14 @@ import ( "errors" "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/capella" "github.com/attestantio/go-eth2-client/spec/deneb" + "github.com/attestantio/go-eth2-client/spec/electra" ) func GetGenesisTime(state *spec.VersionedBeaconState) (uint64, error) { switch state.Version { - case spec.DataVersionCapella: - return state.Capella.GenesisTime, nil + case spec.DataVersionElectra: + return state.Electra.GenesisTime, nil case spec.DataVersionDeneb: return state.Deneb.GenesisTime, nil default: @@ -23,16 +23,16 @@ func CreateVersionedSignedBlock(block interface{}) (spec.VersionedSignedBeaconBl var versionedBlock spec.VersionedSignedBeaconBlock switch s := block.(type) { + case electra.BeaconBlock: + var signedBlock electra.SignedBeaconBlock + signedBlock.Message = &s + versionedBlock.Electra = &signedBlock + versionedBlock.Version = spec.DataVersionElectra case deneb.BeaconBlock: var signedBlock deneb.SignedBeaconBlock signedBlock.Message = &s versionedBlock.Deneb = &signedBlock versionedBlock.Version = spec.DataVersionDeneb - case capella.BeaconBlock: - var signedBlock capella.SignedBeaconBlock - signedBlock.Message = &s - versionedBlock.Capella = &signedBlock - versionedBlock.Version = spec.DataVersionCapella default: return versionedBlock, errors.New("unsupported beacon block version") } @@ -43,12 +43,12 @@ func CreateVersionedState(state interface{}) (spec.VersionedBeaconState, error) var versionedState spec.VersionedBeaconState switch s := state.(type) { + case *electra.BeaconState: + versionedState.Electra = s + versionedState.Version = spec.DataVersionElectra case *deneb.BeaconState: versionedState.Deneb = s versionedState.Version = spec.DataVersionDeneb - case *capella.BeaconState: - versionedState.Capella = s - versionedState.Version = spec.DataVersionCapella default: return versionedState, errors.New("unsupported beacon state version") } @@ -57,22 +57,21 @@ func CreateVersionedState(state interface{}) (spec.VersionedBeaconState, error) func UnmarshalSSZVersionedBeaconState(data []byte) (*spec.VersionedBeaconState, error) { beaconState := &spec.VersionedBeaconState{} - denebBeaconState := &deneb.BeaconState{} - // Try to unmarshal using Deneb - err := denebBeaconState.UnmarshalSSZ(data) + electraBeaconState := &electra.BeaconState{} + err := electraBeaconState.UnmarshalSSZ(data) if err != nil { - // If Deneb fails, try Capella - capellaBeaconState := &capella.BeaconState{} - err = capellaBeaconState.UnmarshalSSZ(data) + // If Electra fails, try Deneb + denebBeaconState := &deneb.BeaconState{} + err = denebBeaconState.UnmarshalSSZ(data) if err != nil { return nil, err } else { - beaconState.Capella = capellaBeaconState - beaconState.Version = spec.DataVersionCapella + beaconState.Deneb = denebBeaconState + beaconState.Version = spec.DataVersionDeneb } } else { - beaconState.Deneb = denebBeaconState - beaconState.Version = spec.DataVersionDeneb + beaconState.Electra = electraBeaconState + beaconState.Version = spec.DataVersionElectra } return beaconState, nil @@ -81,14 +80,14 @@ func UnmarshalSSZVersionedBeaconState(data []byte) (*spec.VersionedBeaconState, func MarshalSSZVersionedBeaconState(beaconState spec.VersionedBeaconState) ([]byte, error) { var data []byte var err error - // Try to marshal using Deneb - if beaconState.Version == spec.DataVersionDeneb { - data, err = beaconState.Deneb.MarshalSSZ() + // Try to marshal using Electra + if beaconState.Version == spec.DataVersionElectra { + data, err = beaconState.Electra.MarshalSSZ() if err != nil { return nil, err } } else { - data, err = beaconState.Capella.MarshalSSZ() + data, err = beaconState.Deneb.MarshalSSZ() if err != nil { return nil, err } diff --git a/benchmark_test.go b/benchmark_test.go index d939e2e7..8e46f27e 100644 --- a/benchmark_test.go +++ b/benchmark_test.go @@ -4,19 +4,20 @@ import ( "testing" "github.com/Layr-Labs/eigenpod-proofs-generation/beacon" + "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/stretchr/testify/assert" ) func BenchmarkComputeBeaconStateRoot(b *testing.B) { - computed, err := epp.ComputeBeaconStateRoot(beaconState.Deneb) + computed, err := epp.ComputeBeaconStateRoot(beaconState) if err != nil { b.Fatal(err) } var cached phase0.Root for i := 0; i < b.N; i++ { - cached, err = epp.ComputeBeaconStateRoot(beaconState.Deneb) + cached, err = epp.ComputeBeaconStateRoot(beaconState) if err != nil { b.Fatal(err) } @@ -31,7 +32,7 @@ func BenchmarkComputeBeaconStateTopLevelRoots(b *testing.B) { b.Fatal(err) } - var cached *beacon.BeaconStateTopLevelRoots + var cached *beacon.VersionedBeaconStateTopLevelRoots for i := 0; i < b.N; i++ { cached, err = epp.ComputeBeaconStateTopLevelRoots(beaconState) if err != nil { @@ -42,6 +43,11 @@ func BenchmarkComputeBeaconStateTopLevelRoots(b *testing.B) { } func BenchmarkComputeValidatorTree(b *testing.B) { + // If beacon state is not Deneb, then skip this test + if beaconState.Version != spec.DataVersionDeneb { + b.Skip("skipping test for non-Deneb beacon state") + } + computed, err := epp.ComputeValidatorTree(beaconState.Deneb.Slot, beaconState.Deneb.Validators) if err != nil { b.Fatal(err) @@ -59,6 +65,11 @@ func BenchmarkComputeValidatorTree(b *testing.B) { } func BenchmarkComputeValidatorBalancesTree(b *testing.B) { + // If beacon state is not Deneb, then skip this test + if beaconState.Version != spec.DataVersionDeneb { + b.Skip("skipping test for non-Deneb beacon state") + } + computed, err := epp.ComputeValidatorBalancesTree(beaconState.Deneb.Slot, beaconState.Deneb.Balances) if err != nil { b.Fatal(err) diff --git a/bindings/BeaconChainProofsWrapper/binding.go b/bindings/BeaconChainProofsWrapper/binding.go index 86642471..471a5bd7 100644 --- a/bindings/BeaconChainProofsWrapper/binding.go +++ b/bindings/BeaconChainProofsWrapper/binding.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package contractBeaconChainProofsWrapper +package BeaconChainProofsWrapper import ( "errors" @@ -48,23 +48,23 @@ type BeaconChainProofsStateRootProof struct { Proof []byte } -// ContractBeaconChainProofsWrapperMetaData contains all meta data concerning the ContractBeaconChainProofsWrapper contract. -var ContractBeaconChainProofsWrapperMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"verifyBalanceContainer\",\"inputs\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyStateRoot\",\"inputs\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyValidatorBalance\",\"inputs\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"internalType\":\"uint40\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceProof\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyValidatorFields\",\"inputs\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"validatorFieldsProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"internalType\":\"uint40\"}],\"outputs\":[],\"stateMutability\":\"view\"}]", - Bin: "0x608060405234801561001057600080fd5b50611006806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630d361f3a14610051578063256f222b1461006657806331f60d4c146100795780639030a9bb1461008c575b600080fd5b61006461005f366004610c0c565b61009f565b005b610064610074366004610cb6565b6100ad565b610064610087366004610d70565b6100c3565b61006461009a366004610c0c565b6100d4565b6100a982826100de565b5050565b6100bb868686868686610264565b505050505050565b6100ce83838361047b565b50505050565b6100a982826105f0565b6100ea60056003610de4565b6100f5906020610dfc565b6101026020830183610e1b565b90501461018a5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a4015b60405180910390fd5b606c6101db61019c6020840184610e1b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525087925050853590508461074b565b61025f5760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610181565b505050565b600884146102df5760405162461bcd60e51b815260206004820152604e6024820152600080516020610fb183398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610181565b60056102ed60286001610de4565b6102f79190610de4565b610302906020610dfc565b82146103705760405162461bcd60e51b81526020600482015260436024820152600080516020610fb183398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610181565b60006103ae86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061076392505050565b9050600064ffffffffff83166103c660286001610de4565b600b901b17905061041185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925086915085905061074b565b6104715760405162461bcd60e51b815260206004820152603d6024820152600080516020610fb183398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610181565b5050505050505050565b600061048960266001610de4565b610494906020610dfc565b6104a16040840184610e1b565b9050146105125760405162461bcd60e51b815260206004820152604460248201819052600080516020610fb1833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610181565b600061051f600485610e78565b64ffffffffff1690506105796105386040850185610e1b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505060208601358461074b565b6105d95760405162461bcd60e51b815260206004820152603e6024820152600080516020610fb183398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610181565b6105e7836020013585610a11565b95945050505050565b6105fc60036020610dfc565b6106096020830183610e1b565b90501461067e5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610181565b6106ce61068e6020830183610e1b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692505084359050600361074b565b6100a95760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610181565b600083610759868585610aa8565b1495945050505050565b600080600283516107749190610e9c565b905060008167ffffffffffffffff81111561079157610791610eb0565b6040519080825280602002602001820160405280156107ba578160200160208202803683370190505b50905060005b828110156108c1576002856107d58383610dfc565b815181106107e5576107e5610ec6565b6020026020010151868360026107fb9190610dfc565b610806906001610de4565b8151811061081657610816610ec6565b6020026020010151604051602001610838929190918252602082015260400190565b60408051601f198184030181529082905261085291610edc565b602060405180830381855afa15801561086f573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906108929190610f17565b8282815181106108a4576108a4610ec6565b6020908102919091010152806108b981610f30565b9150506107c0565b506108cd600283610e9c565b91505b81156109ed5760005b828110156109da576002826108ee8383610dfc565b815181106108fe576108fe610ec6565b6020026020010151838360026109149190610dfc565b61091f906001610de4565b8151811061092f5761092f610ec6565b6020026020010151604051602001610951929190918252602082015260400190565b60408051601f198184030181529082905261096b91610edc565b602060405180830381855afa158015610988573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906109ab9190610f17565b8282815181106109bd576109bd610ec6565b6020908102919091010152806109d281610f30565b9150506108d9565b506109e6600283610e9c565b91506108d0565b80600081518110610a0057610a00610ec6565b602002602001015192505050919050565b600080610a1f600484610f4b565b610a2a906040610f6f565b64ffffffffff169050610aa084821b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b949350505050565b60008351600014158015610ac7575060208451610ac59190610f9c565b155b610b565760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610181565b604080516020808201909252848152905b85518111610bea57610b7a600285610f9c565b610bad578151600052808601516020526020826040600060026107d05a03fa610ba257600080fd5b600284049350610bd8565b8086015160005281516020526020826040600060026107d05a03fa610bd157600080fd5b6002840493505b610be3602082610de4565b9050610b67565b5051949350505050565b600060408284031215610c0657600080fd5b50919050565b60008060408385031215610c1f57600080fd5b82359150602083013567ffffffffffffffff811115610c3d57600080fd5b610c4985828601610bf4565b9150509250929050565b60008083601f840112610c6557600080fd5b50813567ffffffffffffffff811115610c7d57600080fd5b602083019150836020828501011115610c9557600080fd5b9250929050565b803564ffffffffff81168114610cb157600080fd5b919050565b60008060008060008060808789031215610ccf57600080fd5b86359550602087013567ffffffffffffffff80821115610cee57600080fd5b818901915089601f830112610d0257600080fd5b813581811115610d1157600080fd5b8a60208260051b8501011115610d2657600080fd5b602083019750809650506040890135915080821115610d4457600080fd5b50610d5189828a01610c53565b9094509250610d64905060608801610c9c565b90509295509295509295565b600080600060608486031215610d8557600080fd5b83359250610d9560208501610c9c565b9150604084013567ffffffffffffffff811115610db157600080fd5b840160608187031215610dc357600080fd5b809150509250925092565b634e487b7160e01b600052601160045260246000fd5b60008219821115610df757610df7610dce565b500190565b6000816000190483118215151615610e1657610e16610dce565b500290565b6000808335601e19843603018112610e3257600080fd5b83018035915067ffffffffffffffff821115610e4d57600080fd5b602001915036819003821315610c9557600080fd5b634e487b7160e01b600052601260045260246000fd5b600064ffffffffff80841680610e9057610e90610e62565b92169190910492915050565b600082610eab57610eab610e62565b500490565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000825160005b81811015610efd5760208186018101518583015201610ee3565b81811115610f0c576000828501525b509190910192915050565b600060208284031215610f2957600080fd5b5051919050565b6000600019821415610f4457610f44610dce565b5060010190565b600064ffffffffff80841680610f6357610f63610e62565b92169190910692915050565b600064ffffffffff80831681851681830481118215151615610f9357610f93610dce565b02949350505050565b600082610fab57610fab610e62565b50069056fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa26469706673582212205da3570ae5f836192d8a7d9f6b33b02a0c8db469459648fccff73b9b51138a3164736f6c634300080c0033", +// BeaconChainProofsWrapperMetaData contains all meta data concerning the BeaconChainProofsWrapper contract. +var BeaconChainProofsWrapperMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"BALANCE_CONTAINER_INDEX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"BALANCE_TREE_HEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"BEACON_BLOCK_HEADER_TREE_HEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DENEB_BEACON_STATE_TREE_HEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"FAR_FUTURE_EPOCH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"PECTRA_BEACON_STATE_TREE_HEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"PECTRA_FORK_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"SECONDS_PER_EPOCH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"SECONDS_PER_SLOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"SLOTS_PER_EPOCH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"STATE_ROOT_INDEX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"VALIDATOR_CONTAINER_INDEX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"VALIDATOR_FIELDS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"VALIDATOR_TREE_HEIGHT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getActivationEpoch\",\"inputs\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBalanceAtIndex\",\"inputs\":[{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"internalType\":\"uint40\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBeaconStateTreeHeight\",\"inputs\":[{\"name\":\"proofTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getEffectiveBalanceGwei\",\"inputs\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getExitEpoch\",\"inputs\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getPubkeyHash\",\"inputs\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getWithdrawalCredentials\",\"inputs\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"isValidatorSlashed\",\"inputs\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"verifyBalanceContainer\",\"inputs\":[{\"name\":\"proofTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyStateRoot\",\"inputs\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyValidatorBalance\",\"inputs\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"internalType\":\"uint40\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceProof\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyValidatorFields\",\"inputs\":[{\"name\":\"proofTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"validatorFieldsProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"internalType\":\"uint40\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]", + Bin: "0x6080604052348015600e575f5ffd5b5061114b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c806366efbf4e116100d9578063a9ccd48711610093578063bf7836461161006e578063bf783646146102e7578063da30e279146102ee578063ec158777146102f5578063f17e9b4014610302575f5ffd5b8063a9ccd487146102c1578063aaa645a6146102d4578063b100b899146101e0575f5ffd5b806366efbf4e1461027e5780638ad5b4ff146102855780639030a9bb1461028c57806399ca22101461029f578063a38f2e7e146102b2578063a4cc5882146102b9575f5ffd5b8063304b9071116101445780634027da191161011f5780634027da191461023b578063423fe16f146102455780634534711b1461025857806360249fda1461026b575f5ffd5b8063304b9071146101fa57806331f60d4c146102155780633d6c9e1814610228575f5ffd5b8063043c35d31461018b5780630b9448ce146101a157806310c6e4c3146101c457806319312e29146101cb5780631d5c7b1c146101e05780632e808427146101e7575b5f5ffd5b60265b6040519081526020015b60405180910390f35b6101b46101af366004610c39565b610309565b6040519015158152602001610198565b602861018e565b6101de6101d9366004610d2f565b610319565b005b600361018e565b61018e6101f5366004610c39565b610329565b600c5b6040516001600160401b039091168152602001610198565b6101fd610223366004610d95565b610333565b61018e610236366004610ded565b610347565b63672a41006101fd565b6101fd610253366004610c39565b610351565b6101fd610266366004610c39565b61035b565b6101fd610279366004610e06565b610365565b600561018e565b600b61018e565b6101de61029a366004610e30565b610377565b61018e6102ad366004610c39565b610385565b600861018e565b6101fd61038f565b6101fd6102cf366004610c39565b6103a1565b6101de6102e2366004610eb7565b6103ab565b600661018e565b60206101fd565b6001600160401b036101fd565b600c61018e565b5f610313826103c3565b92915050565b6103248383836103eb565b505050565b5f610313826104b3565b5f61033f8484846104d5565b949350505050565b5f610313826105b3565b5f610313826105d8565b5f610313826105fc565b5f6103708383610613565b9392505050565b610381828261063f565b5050565b5f610313826106e4565b5f61039c600c6020610f93565b905090565b5f610313826106f8565b6103ba8787878787878761070f565b50505050505050565b5f816003815181106103d7576103d7610fbc565b60200260200101515f5f1b14159050919050565b5f6103f5846105b3565b9050610402816003610fd0565b61040d906020610fe3565b61041a6020840184610ffa565b90501461043a576040516313717da960e21b815260040160405180910390fd5b6003811b600c1761048f6104516020850185610ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250508635905084610843565b6104ac576040516309bde33960e01b815260040160405180910390fd5b5050505050565b5f815f815181106104c6576104c6610fbc565b60200260200101519050919050565b5f6104e260266001610fd0565b6104ed906020610fe3565b6104fa6040840184610ffa565b90501461051a576040516313717da960e21b815260040160405180910390fd5b5f610526600485611050565b64ffffffffff16905061057f61053f6040850185610ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508992505050602086013584610843565b61059c576040516309bde33960e01b815260040160405180910390fd5b6105aa836020013585610613565b95945050505050565b5f63672a41006001600160401b03831611156105d0576006610313565b600592915050565b5f610313826006815181106105ef576105ef610fbc565b602002602001015161085a565b5f610313826002815181106105ef576105ef610fbc565b5f80610620600484611079565b61062b9060406110a2565b64ffffffffff16905061033f84821b61085a565b61064b60036020610fe3565b6106586020830183610ffa565b905014610678576040516313717da960e21b815260040160405180910390fd5b6106c76106886020830183610ffa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525086925050843590506003610843565b610381576040516309bde33960e01b815260040160405180910390fd5b5f816001815181106104c6576104c6610fbc565b5f610313826005815181106105ef576105ef610fbc565b600884146107305760405163200591bd60e01b815260040160405180910390fd5b5f61073a886105b3565b90508061074960286001610fd0565b6107539190610fd0565b61075e906020610fe3565b831461077d576040516313717da960e21b815260040160405180910390fd5b5f6107b98787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506108c192505050565b90505f64ffffffffff84166107d060286001610fd0565b600b901b17905061081a86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d9250869150859050610843565b610837576040516309bde33960e01b815260040160405180910390fd5b50505050505050505050565b5f83610850868585610b51565b1495945050505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b5f5f600283516108d191906110c2565b90505f816001600160401b038111156108ec576108ec610c25565b604051908082528060200260200182016040528015610915578160200160208202803683370190505b5090505f5b82811015610a0f5760028561092f8383610fe3565b8151811061093f5761093f610fbc565b6020026020010151868360026109559190610fe3565b610960906001610fd0565b8151811061097057610970610fbc565b6020026020010151604051602001610992929190918252602082015260400190565b60408051601f19818403018152908290526109ac916110d5565b602060405180830381855afa1580156109c7573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109ea91906110eb565b8282815181106109fc576109fc610fbc565b602090810291909101015260010161091a565b50610a1b6002836110c2565b91505b8115610b2e575f5b82811015610b1b57600282610a3b8383610fe3565b81518110610a4b57610a4b610fbc565b602002602001015183836002610a619190610fe3565b610a6c906001610fd0565b81518110610a7c57610a7c610fbc565b6020026020010151604051602001610a9e929190918252602082015260400190565b60408051601f1981840301815290829052610ab8916110d5565b602060405180830381855afa158015610ad3573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610af691906110eb565b828281518110610b0857610b08610fbc565b6020908102919091010152600101610a26565b50610b276002836110c2565b9150610a1e565b805f81518110610b4057610b40610fbc565b602002602001015192505050919050565b5f83515f14158015610b6e575060208451610b6c9190611102565b155b610b8b576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111610c1b57610baf600285611102565b5f03610be15781515f528086015160205260208260405f60026107d05a03fa610bd6575f5ffd5b600284049350610c09565b808601515f52815160205260208260405f60026107d05a03fa610c02575f5ffd5b6002840493505b610c14602082610fd0565b9050610b9c565b5051949350505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610c49575f5ffd5b81356001600160401b03811115610c5e575f5ffd5b8201601f81018413610c6e575f5ffd5b80356001600160401b03811115610c8757610c87610c25565b8060051b604051601f19603f83011681018181106001600160401b0382111715610cb357610cb3610c25565b604052918252602081840181019290810187841115610cd0575f5ffd5b6020850194505b83851015610cf357843580825260209586019590935001610cd7565b509695505050505050565b80356001600160401b0381168114610d14575f5ffd5b919050565b5f60408284031215610d29575f5ffd5b50919050565b5f5f5f60608486031215610d41575f5ffd5b610d4a84610cfe565b92506020840135915060408401356001600160401b03811115610d6b575f5ffd5b610d7786828701610d19565b9150509250925092565b803564ffffffffff81168114610d14575f5ffd5b5f5f5f60608486031215610da7575f5ffd5b83359250610db760208501610d81565b915060408401356001600160401b03811115610dd1575f5ffd5b840160608187031215610de2575f5ffd5b809150509250925092565b5f60208284031215610dfd575f5ffd5b61037082610cfe565b5f5f60408385031215610e17575f5ffd5b82359150610e2760208401610d81565b90509250929050565b5f5f60408385031215610e41575f5ffd5b8235915060208301356001600160401b03811115610e5d575f5ffd5b610e6985828601610d19565b9150509250929050565b5f5f83601f840112610e83575f5ffd5b5081356001600160401b03811115610e99575f5ffd5b602083019150836020828501011115610eb0575f5ffd5b9250929050565b5f5f5f5f5f5f5f60a0888a031215610ecd575f5ffd5b610ed688610cfe565b96506020880135955060408801356001600160401b03811115610ef7575f5ffd5b8801601f81018a13610f07575f5ffd5b80356001600160401b03811115610f1c575f5ffd5b8a60208260051b8401011115610f30575f5ffd5b6020919091019550935060608801356001600160401b03811115610f52575f5ffd5b610f5e8a828b01610e73565b9094509250610f71905060808901610d81565b905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160290811690818114610fb557610fb5610f7f565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561031357610313610f7f565b808202811582820484141761031357610313610f7f565b5f5f8335601e1984360301811261100f575f5ffd5b8301803591506001600160401b03821115611028575f5ffd5b602001915036819003821315610eb0575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f64ffffffffff8316806110665761106661103c565b8064ffffffffff84160491505092915050565b5f64ffffffffff83168061108f5761108f61103c565b8064ffffffffff84160691505092915050565b64ffffffffff8181168382160290811690818114610fb557610fb5610f7f565b5f826110d0576110d061103c565b500490565b5f82518060208501845e5f920191825250919050565b5f602082840312156110fb575f5ffd5b5051919050565b5f826111105761111061103c565b50069056fea264697066735822122066cd9d3d9ad06b6e337f65402707ca8e4f78ad100191893801f4ab77cca969a064736f6c634300081b0033", } -// ContractBeaconChainProofsWrapperABI is the input ABI used to generate the binding from. -// Deprecated: Use ContractBeaconChainProofsWrapperMetaData.ABI instead. -var ContractBeaconChainProofsWrapperABI = ContractBeaconChainProofsWrapperMetaData.ABI +// BeaconChainProofsWrapperABI is the input ABI used to generate the binding from. +// Deprecated: Use BeaconChainProofsWrapperMetaData.ABI instead. +var BeaconChainProofsWrapperABI = BeaconChainProofsWrapperMetaData.ABI -// ContractBeaconChainProofsWrapperBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use ContractBeaconChainProofsWrapperMetaData.Bin instead. -var ContractBeaconChainProofsWrapperBin = ContractBeaconChainProofsWrapperMetaData.Bin +// BeaconChainProofsWrapperBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use BeaconChainProofsWrapperMetaData.Bin instead. +var BeaconChainProofsWrapperBin = BeaconChainProofsWrapperMetaData.Bin -// DeployContractBeaconChainProofsWrapper deploys a new Ethereum contract, binding an instance of ContractBeaconChainProofsWrapper to it. -func DeployContractBeaconChainProofsWrapper(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ContractBeaconChainProofsWrapper, error) { - parsed, err := ContractBeaconChainProofsWrapperMetaData.GetAbi() +// DeployBeaconChainProofsWrapper deploys a new Ethereum contract, binding an instance of BeaconChainProofsWrapper to it. +func DeployBeaconChainProofsWrapper(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *BeaconChainProofsWrapper, error) { + parsed, err := BeaconChainProofsWrapperMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err } @@ -72,111 +72,111 @@ func DeployContractBeaconChainProofsWrapper(auth *bind.TransactOpts, backend bin return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ContractBeaconChainProofsWrapperBin), backend) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BeaconChainProofsWrapperBin), backend) if err != nil { return common.Address{}, nil, nil, err } - return address, tx, &ContractBeaconChainProofsWrapper{ContractBeaconChainProofsWrapperCaller: ContractBeaconChainProofsWrapperCaller{contract: contract}, ContractBeaconChainProofsWrapperTransactor: ContractBeaconChainProofsWrapperTransactor{contract: contract}, ContractBeaconChainProofsWrapperFilterer: ContractBeaconChainProofsWrapperFilterer{contract: contract}}, nil + return address, tx, &BeaconChainProofsWrapper{BeaconChainProofsWrapperCaller: BeaconChainProofsWrapperCaller{contract: contract}, BeaconChainProofsWrapperTransactor: BeaconChainProofsWrapperTransactor{contract: contract}, BeaconChainProofsWrapperFilterer: BeaconChainProofsWrapperFilterer{contract: contract}}, nil } -// ContractBeaconChainProofsWrapper is an auto generated Go binding around an Ethereum contract. -type ContractBeaconChainProofsWrapper struct { - ContractBeaconChainProofsWrapperCaller // Read-only binding to the contract - ContractBeaconChainProofsWrapperTransactor // Write-only binding to the contract - ContractBeaconChainProofsWrapperFilterer // Log filterer for contract events +// BeaconChainProofsWrapper is an auto generated Go binding around an Ethereum contract. +type BeaconChainProofsWrapper struct { + BeaconChainProofsWrapperCaller // Read-only binding to the contract + BeaconChainProofsWrapperTransactor // Write-only binding to the contract + BeaconChainProofsWrapperFilterer // Log filterer for contract events } -// ContractBeaconChainProofsWrapperCaller is an auto generated read-only Go binding around an Ethereum contract. -type ContractBeaconChainProofsWrapperCaller struct { +// BeaconChainProofsWrapperCaller is an auto generated read-only Go binding around an Ethereum contract. +type BeaconChainProofsWrapperCaller struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// ContractBeaconChainProofsWrapperTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ContractBeaconChainProofsWrapperTransactor struct { +// BeaconChainProofsWrapperTransactor is an auto generated write-only Go binding around an Ethereum contract. +type BeaconChainProofsWrapperTransactor struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// ContractBeaconChainProofsWrapperFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ContractBeaconChainProofsWrapperFilterer struct { +// BeaconChainProofsWrapperFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type BeaconChainProofsWrapperFilterer struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// ContractBeaconChainProofsWrapperSession is an auto generated Go binding around an Ethereum contract, +// BeaconChainProofsWrapperSession is an auto generated Go binding around an Ethereum contract, // with pre-set call and transact options. -type ContractBeaconChainProofsWrapperSession struct { - Contract *ContractBeaconChainProofsWrapper // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +type BeaconChainProofsWrapperSession struct { + Contract *BeaconChainProofsWrapper // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } -// ContractBeaconChainProofsWrapperCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// BeaconChainProofsWrapperCallerSession is an auto generated read-only Go binding around an Ethereum contract, // with pre-set call options. -type ContractBeaconChainProofsWrapperCallerSession struct { - Contract *ContractBeaconChainProofsWrapperCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session +type BeaconChainProofsWrapperCallerSession struct { + Contract *BeaconChainProofsWrapperCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session } -// ContractBeaconChainProofsWrapperTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// BeaconChainProofsWrapperTransactorSession is an auto generated write-only Go binding around an Ethereum contract, // with pre-set transact options. -type ContractBeaconChainProofsWrapperTransactorSession struct { - Contract *ContractBeaconChainProofsWrapperTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +type BeaconChainProofsWrapperTransactorSession struct { + Contract *BeaconChainProofsWrapperTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } -// ContractBeaconChainProofsWrapperRaw is an auto generated low-level Go binding around an Ethereum contract. -type ContractBeaconChainProofsWrapperRaw struct { - Contract *ContractBeaconChainProofsWrapper // Generic contract binding to access the raw methods on +// BeaconChainProofsWrapperRaw is an auto generated low-level Go binding around an Ethereum contract. +type BeaconChainProofsWrapperRaw struct { + Contract *BeaconChainProofsWrapper // Generic contract binding to access the raw methods on } -// ContractBeaconChainProofsWrapperCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ContractBeaconChainProofsWrapperCallerRaw struct { - Contract *ContractBeaconChainProofsWrapperCaller // Generic read-only contract binding to access the raw methods on +// BeaconChainProofsWrapperCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type BeaconChainProofsWrapperCallerRaw struct { + Contract *BeaconChainProofsWrapperCaller // Generic read-only contract binding to access the raw methods on } -// ContractBeaconChainProofsWrapperTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ContractBeaconChainProofsWrapperTransactorRaw struct { - Contract *ContractBeaconChainProofsWrapperTransactor // Generic write-only contract binding to access the raw methods on +// BeaconChainProofsWrapperTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type BeaconChainProofsWrapperTransactorRaw struct { + Contract *BeaconChainProofsWrapperTransactor // Generic write-only contract binding to access the raw methods on } -// NewContractBeaconChainProofsWrapper creates a new instance of ContractBeaconChainProofsWrapper, bound to a specific deployed contract. -func NewContractBeaconChainProofsWrapper(address common.Address, backend bind.ContractBackend) (*ContractBeaconChainProofsWrapper, error) { - contract, err := bindContractBeaconChainProofsWrapper(address, backend, backend, backend) +// NewBeaconChainProofsWrapper creates a new instance of BeaconChainProofsWrapper, bound to a specific deployed contract. +func NewBeaconChainProofsWrapper(address common.Address, backend bind.ContractBackend) (*BeaconChainProofsWrapper, error) { + contract, err := bindBeaconChainProofsWrapper(address, backend, backend, backend) if err != nil { return nil, err } - return &ContractBeaconChainProofsWrapper{ContractBeaconChainProofsWrapperCaller: ContractBeaconChainProofsWrapperCaller{contract: contract}, ContractBeaconChainProofsWrapperTransactor: ContractBeaconChainProofsWrapperTransactor{contract: contract}, ContractBeaconChainProofsWrapperFilterer: ContractBeaconChainProofsWrapperFilterer{contract: contract}}, nil + return &BeaconChainProofsWrapper{BeaconChainProofsWrapperCaller: BeaconChainProofsWrapperCaller{contract: contract}, BeaconChainProofsWrapperTransactor: BeaconChainProofsWrapperTransactor{contract: contract}, BeaconChainProofsWrapperFilterer: BeaconChainProofsWrapperFilterer{contract: contract}}, nil } -// NewContractBeaconChainProofsWrapperCaller creates a new read-only instance of ContractBeaconChainProofsWrapper, bound to a specific deployed contract. -func NewContractBeaconChainProofsWrapperCaller(address common.Address, caller bind.ContractCaller) (*ContractBeaconChainProofsWrapperCaller, error) { - contract, err := bindContractBeaconChainProofsWrapper(address, caller, nil, nil) +// NewBeaconChainProofsWrapperCaller creates a new read-only instance of BeaconChainProofsWrapper, bound to a specific deployed contract. +func NewBeaconChainProofsWrapperCaller(address common.Address, caller bind.ContractCaller) (*BeaconChainProofsWrapperCaller, error) { + contract, err := bindBeaconChainProofsWrapper(address, caller, nil, nil) if err != nil { return nil, err } - return &ContractBeaconChainProofsWrapperCaller{contract: contract}, nil + return &BeaconChainProofsWrapperCaller{contract: contract}, nil } -// NewContractBeaconChainProofsWrapperTransactor creates a new write-only instance of ContractBeaconChainProofsWrapper, bound to a specific deployed contract. -func NewContractBeaconChainProofsWrapperTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractBeaconChainProofsWrapperTransactor, error) { - contract, err := bindContractBeaconChainProofsWrapper(address, nil, transactor, nil) +// NewBeaconChainProofsWrapperTransactor creates a new write-only instance of BeaconChainProofsWrapper, bound to a specific deployed contract. +func NewBeaconChainProofsWrapperTransactor(address common.Address, transactor bind.ContractTransactor) (*BeaconChainProofsWrapperTransactor, error) { + contract, err := bindBeaconChainProofsWrapper(address, nil, transactor, nil) if err != nil { return nil, err } - return &ContractBeaconChainProofsWrapperTransactor{contract: contract}, nil + return &BeaconChainProofsWrapperTransactor{contract: contract}, nil } -// NewContractBeaconChainProofsWrapperFilterer creates a new log filterer instance of ContractBeaconChainProofsWrapper, bound to a specific deployed contract. -func NewContractBeaconChainProofsWrapperFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractBeaconChainProofsWrapperFilterer, error) { - contract, err := bindContractBeaconChainProofsWrapper(address, nil, nil, filterer) +// NewBeaconChainProofsWrapperFilterer creates a new log filterer instance of BeaconChainProofsWrapper, bound to a specific deployed contract. +func NewBeaconChainProofsWrapperFilterer(address common.Address, filterer bind.ContractFilterer) (*BeaconChainProofsWrapperFilterer, error) { + contract, err := bindBeaconChainProofsWrapper(address, nil, nil, filterer) if err != nil { return nil, err } - return &ContractBeaconChainProofsWrapperFilterer{contract: contract}, nil + return &BeaconChainProofsWrapperFilterer{contract: contract}, nil } -// bindContractBeaconChainProofsWrapper binds a generic wrapper to an already deployed contract. -func bindContractBeaconChainProofsWrapper(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := ContractBeaconChainProofsWrapperMetaData.GetAbi() +// bindBeaconChainProofsWrapper binds a generic wrapper to an already deployed contract. +func bindBeaconChainProofsWrapper(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := BeaconChainProofsWrapperMetaData.GetAbi() if err != nil { return nil, err } @@ -187,46 +187,728 @@ func bindContractBeaconChainProofsWrapper(address common.Address, caller bind.Co // sets the output to result. The result type might be a single field for simple // returns, a slice of interfaces for anonymous returns and a struct for named // returns. -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ContractBeaconChainProofsWrapper.Contract.ContractBeaconChainProofsWrapperCaller.contract.Call(opts, result, method, params...) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BeaconChainProofsWrapper.Contract.BeaconChainProofsWrapperCaller.contract.Call(opts, result, method, params...) } // Transfer initiates a plain transaction to move funds to the contract, calling // its default method if one is available. -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ContractBeaconChainProofsWrapper.Contract.ContractBeaconChainProofsWrapperTransactor.contract.Transfer(opts) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BeaconChainProofsWrapper.Contract.BeaconChainProofsWrapperTransactor.contract.Transfer(opts) } // Transact invokes the (paid) contract method with params as input values. -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ContractBeaconChainProofsWrapper.Contract.ContractBeaconChainProofsWrapperTransactor.contract.Transact(opts, method, params...) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BeaconChainProofsWrapper.Contract.BeaconChainProofsWrapperTransactor.contract.Transact(opts, method, params...) } // Call invokes the (constant) contract method with params as input values and // sets the output to result. The result type might be a single field for simple // returns, a slice of interfaces for anonymous returns and a struct for named // returns. -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ContractBeaconChainProofsWrapper.Contract.contract.Call(opts, result, method, params...) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BeaconChainProofsWrapper.Contract.contract.Call(opts, result, method, params...) } // Transfer initiates a plain transaction to move funds to the contract, calling // its default method if one is available. -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ContractBeaconChainProofsWrapper.Contract.contract.Transfer(opts) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BeaconChainProofsWrapper.Contract.contract.Transfer(opts) } // Transact invokes the (paid) contract method with params as input values. -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ContractBeaconChainProofsWrapper.Contract.contract.Transact(opts, method, params...) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BeaconChainProofsWrapper.Contract.contract.Transact(opts, method, params...) } -// VerifyBalanceContainer is a free data retrieval call binding the contract method 0x0d361f3a. +// BALANCECONTAINERINDEX is a free data retrieval call binding the contract method 0xf17e9b40. // -// Solidity: function verifyBalanceContainer(bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCaller) VerifyBalanceContainer(opts *bind.CallOpts, beaconBlockRoot [32]byte, proof BeaconChainProofsBalanceContainerProof) error { +// Solidity: function BALANCE_CONTAINER_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) BALANCECONTAINERINDEX(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _ContractBeaconChainProofsWrapper.contract.Call(opts, &out, "verifyBalanceContainer", beaconBlockRoot, proof) + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "BALANCE_CONTAINER_INDEX") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BALANCECONTAINERINDEX is a free data retrieval call binding the contract method 0xf17e9b40. +// +// Solidity: function BALANCE_CONTAINER_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) BALANCECONTAINERINDEX() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.BALANCECONTAINERINDEX(&_BeaconChainProofsWrapper.CallOpts) +} + +// BALANCECONTAINERINDEX is a free data retrieval call binding the contract method 0xf17e9b40. +// +// Solidity: function BALANCE_CONTAINER_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) BALANCECONTAINERINDEX() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.BALANCECONTAINERINDEX(&_BeaconChainProofsWrapper.CallOpts) +} + +// BALANCETREEHEIGHT is a free data retrieval call binding the contract method 0x043c35d3. +// +// Solidity: function BALANCE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) BALANCETREEHEIGHT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "BALANCE_TREE_HEIGHT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BALANCETREEHEIGHT is a free data retrieval call binding the contract method 0x043c35d3. +// +// Solidity: function BALANCE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) BALANCETREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.BALANCETREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// BALANCETREEHEIGHT is a free data retrieval call binding the contract method 0x043c35d3. +// +// Solidity: function BALANCE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) BALANCETREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.BALANCETREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// BEACONBLOCKHEADERTREEHEIGHT is a free data retrieval call binding the contract method 0x1d5c7b1c. +// +// Solidity: function BEACON_BLOCK_HEADER_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) BEACONBLOCKHEADERTREEHEIGHT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "BEACON_BLOCK_HEADER_TREE_HEIGHT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BEACONBLOCKHEADERTREEHEIGHT is a free data retrieval call binding the contract method 0x1d5c7b1c. +// +// Solidity: function BEACON_BLOCK_HEADER_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) BEACONBLOCKHEADERTREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.BEACONBLOCKHEADERTREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// BEACONBLOCKHEADERTREEHEIGHT is a free data retrieval call binding the contract method 0x1d5c7b1c. +// +// Solidity: function BEACON_BLOCK_HEADER_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) BEACONBLOCKHEADERTREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.BEACONBLOCKHEADERTREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// DENEBBEACONSTATETREEHEIGHT is a free data retrieval call binding the contract method 0x66efbf4e. +// +// Solidity: function DENEB_BEACON_STATE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) DENEBBEACONSTATETREEHEIGHT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "DENEB_BEACON_STATE_TREE_HEIGHT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// DENEBBEACONSTATETREEHEIGHT is a free data retrieval call binding the contract method 0x66efbf4e. +// +// Solidity: function DENEB_BEACON_STATE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) DENEBBEACONSTATETREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.DENEBBEACONSTATETREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// DENEBBEACONSTATETREEHEIGHT is a free data retrieval call binding the contract method 0x66efbf4e. +// +// Solidity: function DENEB_BEACON_STATE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) DENEBBEACONSTATETREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.DENEBBEACONSTATETREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// FARFUTUREEPOCH is a free data retrieval call binding the contract method 0xec158777. +// +// Solidity: function FAR_FUTURE_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) FARFUTUREEPOCH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "FAR_FUTURE_EPOCH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// FARFUTUREEPOCH is a free data retrieval call binding the contract method 0xec158777. +// +// Solidity: function FAR_FUTURE_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) FARFUTUREEPOCH() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.FARFUTUREEPOCH(&_BeaconChainProofsWrapper.CallOpts) +} + +// FARFUTUREEPOCH is a free data retrieval call binding the contract method 0xec158777. +// +// Solidity: function FAR_FUTURE_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) FARFUTUREEPOCH() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.FARFUTUREEPOCH(&_BeaconChainProofsWrapper.CallOpts) +} + +// PECTRABEACONSTATETREEHEIGHT is a free data retrieval call binding the contract method 0xbf783646. +// +// Solidity: function PECTRA_BEACON_STATE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) PECTRABEACONSTATETREEHEIGHT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "PECTRA_BEACON_STATE_TREE_HEIGHT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PECTRABEACONSTATETREEHEIGHT is a free data retrieval call binding the contract method 0xbf783646. +// +// Solidity: function PECTRA_BEACON_STATE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) PECTRABEACONSTATETREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.PECTRABEACONSTATETREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// PECTRABEACONSTATETREEHEIGHT is a free data retrieval call binding the contract method 0xbf783646. +// +// Solidity: function PECTRA_BEACON_STATE_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) PECTRABEACONSTATETREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.PECTRABEACONSTATETREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// PECTRAFORKTIMESTAMP is a free data retrieval call binding the contract method 0x4027da19. +// +// Solidity: function PECTRA_FORK_TIMESTAMP() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) PECTRAFORKTIMESTAMP(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "PECTRA_FORK_TIMESTAMP") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// PECTRAFORKTIMESTAMP is a free data retrieval call binding the contract method 0x4027da19. +// +// Solidity: function PECTRA_FORK_TIMESTAMP() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) PECTRAFORKTIMESTAMP() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.PECTRAFORKTIMESTAMP(&_BeaconChainProofsWrapper.CallOpts) +} + +// PECTRAFORKTIMESTAMP is a free data retrieval call binding the contract method 0x4027da19. +// +// Solidity: function PECTRA_FORK_TIMESTAMP() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) PECTRAFORKTIMESTAMP() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.PECTRAFORKTIMESTAMP(&_BeaconChainProofsWrapper.CallOpts) +} + +// SECONDSPEREPOCH is a free data retrieval call binding the contract method 0xa4cc5882. +// +// Solidity: function SECONDS_PER_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) SECONDSPEREPOCH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "SECONDS_PER_EPOCH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// SECONDSPEREPOCH is a free data retrieval call binding the contract method 0xa4cc5882. +// +// Solidity: function SECONDS_PER_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) SECONDSPEREPOCH() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.SECONDSPEREPOCH(&_BeaconChainProofsWrapper.CallOpts) +} + +// SECONDSPEREPOCH is a free data retrieval call binding the contract method 0xa4cc5882. +// +// Solidity: function SECONDS_PER_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) SECONDSPEREPOCH() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.SECONDSPEREPOCH(&_BeaconChainProofsWrapper.CallOpts) +} + +// SECONDSPERSLOT is a free data retrieval call binding the contract method 0x304b9071. +// +// Solidity: function SECONDS_PER_SLOT() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) SECONDSPERSLOT(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "SECONDS_PER_SLOT") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// SECONDSPERSLOT is a free data retrieval call binding the contract method 0x304b9071. +// +// Solidity: function SECONDS_PER_SLOT() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) SECONDSPERSLOT() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.SECONDSPERSLOT(&_BeaconChainProofsWrapper.CallOpts) +} + +// SECONDSPERSLOT is a free data retrieval call binding the contract method 0x304b9071. +// +// Solidity: function SECONDS_PER_SLOT() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) SECONDSPERSLOT() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.SECONDSPERSLOT(&_BeaconChainProofsWrapper.CallOpts) +} + +// SLOTSPEREPOCH is a free data retrieval call binding the contract method 0xda30e279. +// +// Solidity: function SLOTS_PER_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) SLOTSPEREPOCH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "SLOTS_PER_EPOCH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// SLOTSPEREPOCH is a free data retrieval call binding the contract method 0xda30e279. +// +// Solidity: function SLOTS_PER_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) SLOTSPEREPOCH() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.SLOTSPEREPOCH(&_BeaconChainProofsWrapper.CallOpts) +} + +// SLOTSPEREPOCH is a free data retrieval call binding the contract method 0xda30e279. +// +// Solidity: function SLOTS_PER_EPOCH() pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) SLOTSPEREPOCH() (uint64, error) { + return _BeaconChainProofsWrapper.Contract.SLOTSPEREPOCH(&_BeaconChainProofsWrapper.CallOpts) +} + +// STATEROOTINDEX is a free data retrieval call binding the contract method 0xb100b899. +// +// Solidity: function STATE_ROOT_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) STATEROOTINDEX(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "STATE_ROOT_INDEX") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// STATEROOTINDEX is a free data retrieval call binding the contract method 0xb100b899. +// +// Solidity: function STATE_ROOT_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) STATEROOTINDEX() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.STATEROOTINDEX(&_BeaconChainProofsWrapper.CallOpts) +} + +// STATEROOTINDEX is a free data retrieval call binding the contract method 0xb100b899. +// +// Solidity: function STATE_ROOT_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) STATEROOTINDEX() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.STATEROOTINDEX(&_BeaconChainProofsWrapper.CallOpts) +} + +// VALIDATORCONTAINERINDEX is a free data retrieval call binding the contract method 0x8ad5b4ff. +// +// Solidity: function VALIDATOR_CONTAINER_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) VALIDATORCONTAINERINDEX(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "VALIDATOR_CONTAINER_INDEX") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// VALIDATORCONTAINERINDEX is a free data retrieval call binding the contract method 0x8ad5b4ff. +// +// Solidity: function VALIDATOR_CONTAINER_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) VALIDATORCONTAINERINDEX() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.VALIDATORCONTAINERINDEX(&_BeaconChainProofsWrapper.CallOpts) +} + +// VALIDATORCONTAINERINDEX is a free data retrieval call binding the contract method 0x8ad5b4ff. +// +// Solidity: function VALIDATOR_CONTAINER_INDEX() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) VALIDATORCONTAINERINDEX() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.VALIDATORCONTAINERINDEX(&_BeaconChainProofsWrapper.CallOpts) +} + +// VALIDATORFIELDSLENGTH is a free data retrieval call binding the contract method 0xa38f2e7e. +// +// Solidity: function VALIDATOR_FIELDS_LENGTH() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) VALIDATORFIELDSLENGTH(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "VALIDATOR_FIELDS_LENGTH") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// VALIDATORFIELDSLENGTH is a free data retrieval call binding the contract method 0xa38f2e7e. +// +// Solidity: function VALIDATOR_FIELDS_LENGTH() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) VALIDATORFIELDSLENGTH() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.VALIDATORFIELDSLENGTH(&_BeaconChainProofsWrapper.CallOpts) +} + +// VALIDATORFIELDSLENGTH is a free data retrieval call binding the contract method 0xa38f2e7e. +// +// Solidity: function VALIDATOR_FIELDS_LENGTH() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) VALIDATORFIELDSLENGTH() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.VALIDATORFIELDSLENGTH(&_BeaconChainProofsWrapper.CallOpts) +} + +// VALIDATORTREEHEIGHT is a free data retrieval call binding the contract method 0x10c6e4c3. +// +// Solidity: function VALIDATOR_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) VALIDATORTREEHEIGHT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "VALIDATOR_TREE_HEIGHT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// VALIDATORTREEHEIGHT is a free data retrieval call binding the contract method 0x10c6e4c3. +// +// Solidity: function VALIDATOR_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) VALIDATORTREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.VALIDATORTREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// VALIDATORTREEHEIGHT is a free data retrieval call binding the contract method 0x10c6e4c3. +// +// Solidity: function VALIDATOR_TREE_HEIGHT() pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) VALIDATORTREEHEIGHT() (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.VALIDATORTREEHEIGHT(&_BeaconChainProofsWrapper.CallOpts) +} + +// GetActivationEpoch is a free data retrieval call binding the contract method 0xa9ccd487. +// +// Solidity: function getActivationEpoch(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) GetActivationEpoch(opts *bind.CallOpts, validatorFields [][32]byte) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "getActivationEpoch", validatorFields) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetActivationEpoch is a free data retrieval call binding the contract method 0xa9ccd487. +// +// Solidity: function getActivationEpoch(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) GetActivationEpoch(validatorFields [][32]byte) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetActivationEpoch(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetActivationEpoch is a free data retrieval call binding the contract method 0xa9ccd487. +// +// Solidity: function getActivationEpoch(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) GetActivationEpoch(validatorFields [][32]byte) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetActivationEpoch(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetBalanceAtIndex is a free data retrieval call binding the contract method 0x60249fda. +// +// Solidity: function getBalanceAtIndex(bytes32 balanceRoot, uint40 validatorIndex) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) GetBalanceAtIndex(opts *bind.CallOpts, balanceRoot [32]byte, validatorIndex *big.Int) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "getBalanceAtIndex", balanceRoot, validatorIndex) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetBalanceAtIndex is a free data retrieval call binding the contract method 0x60249fda. +// +// Solidity: function getBalanceAtIndex(bytes32 balanceRoot, uint40 validatorIndex) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) GetBalanceAtIndex(balanceRoot [32]byte, validatorIndex *big.Int) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetBalanceAtIndex(&_BeaconChainProofsWrapper.CallOpts, balanceRoot, validatorIndex) +} + +// GetBalanceAtIndex is a free data retrieval call binding the contract method 0x60249fda. +// +// Solidity: function getBalanceAtIndex(bytes32 balanceRoot, uint40 validatorIndex) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) GetBalanceAtIndex(balanceRoot [32]byte, validatorIndex *big.Int) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetBalanceAtIndex(&_BeaconChainProofsWrapper.CallOpts, balanceRoot, validatorIndex) +} + +// GetBeaconStateTreeHeight is a free data retrieval call binding the contract method 0x3d6c9e18. +// +// Solidity: function getBeaconStateTreeHeight(uint64 proofTimestamp) pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) GetBeaconStateTreeHeight(opts *bind.CallOpts, proofTimestamp uint64) (*big.Int, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "getBeaconStateTreeHeight", proofTimestamp) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBeaconStateTreeHeight is a free data retrieval call binding the contract method 0x3d6c9e18. +// +// Solidity: function getBeaconStateTreeHeight(uint64 proofTimestamp) pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) GetBeaconStateTreeHeight(proofTimestamp uint64) (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.GetBeaconStateTreeHeight(&_BeaconChainProofsWrapper.CallOpts, proofTimestamp) +} + +// GetBeaconStateTreeHeight is a free data retrieval call binding the contract method 0x3d6c9e18. +// +// Solidity: function getBeaconStateTreeHeight(uint64 proofTimestamp) pure returns(uint256) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) GetBeaconStateTreeHeight(proofTimestamp uint64) (*big.Int, error) { + return _BeaconChainProofsWrapper.Contract.GetBeaconStateTreeHeight(&_BeaconChainProofsWrapper.CallOpts, proofTimestamp) +} + +// GetEffectiveBalanceGwei is a free data retrieval call binding the contract method 0x4534711b. +// +// Solidity: function getEffectiveBalanceGwei(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) GetEffectiveBalanceGwei(opts *bind.CallOpts, validatorFields [][32]byte) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "getEffectiveBalanceGwei", validatorFields) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetEffectiveBalanceGwei is a free data retrieval call binding the contract method 0x4534711b. +// +// Solidity: function getEffectiveBalanceGwei(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) GetEffectiveBalanceGwei(validatorFields [][32]byte) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetEffectiveBalanceGwei(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetEffectiveBalanceGwei is a free data retrieval call binding the contract method 0x4534711b. +// +// Solidity: function getEffectiveBalanceGwei(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) GetEffectiveBalanceGwei(validatorFields [][32]byte) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetEffectiveBalanceGwei(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetExitEpoch is a free data retrieval call binding the contract method 0x423fe16f. +// +// Solidity: function getExitEpoch(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) GetExitEpoch(opts *bind.CallOpts, validatorFields [][32]byte) (uint64, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "getExitEpoch", validatorFields) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetExitEpoch is a free data retrieval call binding the contract method 0x423fe16f. +// +// Solidity: function getExitEpoch(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) GetExitEpoch(validatorFields [][32]byte) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetExitEpoch(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetExitEpoch is a free data retrieval call binding the contract method 0x423fe16f. +// +// Solidity: function getExitEpoch(bytes32[] validatorFields) pure returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) GetExitEpoch(validatorFields [][32]byte) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.GetExitEpoch(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetPubkeyHash is a free data retrieval call binding the contract method 0x2e808427. +// +// Solidity: function getPubkeyHash(bytes32[] validatorFields) pure returns(bytes32) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) GetPubkeyHash(opts *bind.CallOpts, validatorFields [][32]byte) ([32]byte, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "getPubkeyHash", validatorFields) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetPubkeyHash is a free data retrieval call binding the contract method 0x2e808427. +// +// Solidity: function getPubkeyHash(bytes32[] validatorFields) pure returns(bytes32) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) GetPubkeyHash(validatorFields [][32]byte) ([32]byte, error) { + return _BeaconChainProofsWrapper.Contract.GetPubkeyHash(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetPubkeyHash is a free data retrieval call binding the contract method 0x2e808427. +// +// Solidity: function getPubkeyHash(bytes32[] validatorFields) pure returns(bytes32) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) GetPubkeyHash(validatorFields [][32]byte) ([32]byte, error) { + return _BeaconChainProofsWrapper.Contract.GetPubkeyHash(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetWithdrawalCredentials is a free data retrieval call binding the contract method 0x99ca2210. +// +// Solidity: function getWithdrawalCredentials(bytes32[] validatorFields) pure returns(bytes32) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) GetWithdrawalCredentials(opts *bind.CallOpts, validatorFields [][32]byte) ([32]byte, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "getWithdrawalCredentials", validatorFields) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetWithdrawalCredentials is a free data retrieval call binding the contract method 0x99ca2210. +// +// Solidity: function getWithdrawalCredentials(bytes32[] validatorFields) pure returns(bytes32) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) GetWithdrawalCredentials(validatorFields [][32]byte) ([32]byte, error) { + return _BeaconChainProofsWrapper.Contract.GetWithdrawalCredentials(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// GetWithdrawalCredentials is a free data retrieval call binding the contract method 0x99ca2210. +// +// Solidity: function getWithdrawalCredentials(bytes32[] validatorFields) pure returns(bytes32) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) GetWithdrawalCredentials(validatorFields [][32]byte) ([32]byte, error) { + return _BeaconChainProofsWrapper.Contract.GetWithdrawalCredentials(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// IsValidatorSlashed is a free data retrieval call binding the contract method 0x0b9448ce. +// +// Solidity: function isValidatorSlashed(bytes32[] validatorFields) pure returns(bool) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) IsValidatorSlashed(opts *bind.CallOpts, validatorFields [][32]byte) (bool, error) { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "isValidatorSlashed", validatorFields) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsValidatorSlashed is a free data retrieval call binding the contract method 0x0b9448ce. +// +// Solidity: function isValidatorSlashed(bytes32[] validatorFields) pure returns(bool) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) IsValidatorSlashed(validatorFields [][32]byte) (bool, error) { + return _BeaconChainProofsWrapper.Contract.IsValidatorSlashed(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// IsValidatorSlashed is a free data retrieval call binding the contract method 0x0b9448ce. +// +// Solidity: function isValidatorSlashed(bytes32[] validatorFields) pure returns(bool) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) IsValidatorSlashed(validatorFields [][32]byte) (bool, error) { + return _BeaconChainProofsWrapper.Contract.IsValidatorSlashed(&_BeaconChainProofsWrapper.CallOpts, validatorFields) +} + +// VerifyBalanceContainer is a free data retrieval call binding the contract method 0x19312e29. +// +// Solidity: function verifyBalanceContainer(uint64 proofTimestamp, bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) VerifyBalanceContainer(opts *bind.CallOpts, proofTimestamp uint64, beaconBlockRoot [32]byte, proof BeaconChainProofsBalanceContainerProof) error { + var out []interface{} + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "verifyBalanceContainer", proofTimestamp, beaconBlockRoot, proof) if err != nil { return err @@ -236,26 +918,26 @@ func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCaller) } -// VerifyBalanceContainer is a free data retrieval call binding the contract method 0x0d361f3a. +// VerifyBalanceContainer is a free data retrieval call binding the contract method 0x19312e29. // -// Solidity: function verifyBalanceContainer(bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperSession) VerifyBalanceContainer(beaconBlockRoot [32]byte, proof BeaconChainProofsBalanceContainerProof) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyBalanceContainer(&_ContractBeaconChainProofsWrapper.CallOpts, beaconBlockRoot, proof) +// Solidity: function verifyBalanceContainer(uint64 proofTimestamp, bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) VerifyBalanceContainer(proofTimestamp uint64, beaconBlockRoot [32]byte, proof BeaconChainProofsBalanceContainerProof) error { + return _BeaconChainProofsWrapper.Contract.VerifyBalanceContainer(&_BeaconChainProofsWrapper.CallOpts, proofTimestamp, beaconBlockRoot, proof) } -// VerifyBalanceContainer is a free data retrieval call binding the contract method 0x0d361f3a. +// VerifyBalanceContainer is a free data retrieval call binding the contract method 0x19312e29. // -// Solidity: function verifyBalanceContainer(bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCallerSession) VerifyBalanceContainer(beaconBlockRoot [32]byte, proof BeaconChainProofsBalanceContainerProof) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyBalanceContainer(&_ContractBeaconChainProofsWrapper.CallOpts, beaconBlockRoot, proof) +// Solidity: function verifyBalanceContainer(uint64 proofTimestamp, bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) VerifyBalanceContainer(proofTimestamp uint64, beaconBlockRoot [32]byte, proof BeaconChainProofsBalanceContainerProof) error { + return _BeaconChainProofsWrapper.Contract.VerifyBalanceContainer(&_BeaconChainProofsWrapper.CallOpts, proofTimestamp, beaconBlockRoot, proof) } // VerifyStateRoot is a free data retrieval call binding the contract method 0x9030a9bb. // // Solidity: function verifyStateRoot(bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCaller) VerifyStateRoot(opts *bind.CallOpts, beaconBlockRoot [32]byte, proof BeaconChainProofsStateRootProof) error { +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) VerifyStateRoot(opts *bind.CallOpts, beaconBlockRoot [32]byte, proof BeaconChainProofsStateRootProof) error { var out []interface{} - err := _ContractBeaconChainProofsWrapper.contract.Call(opts, &out, "verifyStateRoot", beaconBlockRoot, proof) + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "verifyStateRoot", beaconBlockRoot, proof) if err != nil { return err @@ -268,52 +950,54 @@ func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCaller) // VerifyStateRoot is a free data retrieval call binding the contract method 0x9030a9bb. // // Solidity: function verifyStateRoot(bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperSession) VerifyStateRoot(beaconBlockRoot [32]byte, proof BeaconChainProofsStateRootProof) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyStateRoot(&_ContractBeaconChainProofsWrapper.CallOpts, beaconBlockRoot, proof) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) VerifyStateRoot(beaconBlockRoot [32]byte, proof BeaconChainProofsStateRootProof) error { + return _BeaconChainProofsWrapper.Contract.VerifyStateRoot(&_BeaconChainProofsWrapper.CallOpts, beaconBlockRoot, proof) } // VerifyStateRoot is a free data retrieval call binding the contract method 0x9030a9bb. // // Solidity: function verifyStateRoot(bytes32 beaconBlockRoot, (bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCallerSession) VerifyStateRoot(beaconBlockRoot [32]byte, proof BeaconChainProofsStateRootProof) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyStateRoot(&_ContractBeaconChainProofsWrapper.CallOpts, beaconBlockRoot, proof) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) VerifyStateRoot(beaconBlockRoot [32]byte, proof BeaconChainProofsStateRootProof) error { + return _BeaconChainProofsWrapper.Contract.VerifyStateRoot(&_BeaconChainProofsWrapper.CallOpts, beaconBlockRoot, proof) } // VerifyValidatorBalance is a free data retrieval call binding the contract method 0x31f60d4c. // -// Solidity: function verifyValidatorBalance(bytes32 balanceContainerRoot, uint40 validatorIndex, (bytes32,bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCaller) VerifyValidatorBalance(opts *bind.CallOpts, balanceContainerRoot [32]byte, validatorIndex *big.Int, proof BeaconChainProofsBalanceProof) error { +// Solidity: function verifyValidatorBalance(bytes32 balanceContainerRoot, uint40 validatorIndex, (bytes32,bytes32,bytes) proof) view returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) VerifyValidatorBalance(opts *bind.CallOpts, balanceContainerRoot [32]byte, validatorIndex *big.Int, proof BeaconChainProofsBalanceProof) (uint64, error) { var out []interface{} - err := _ContractBeaconChainProofsWrapper.contract.Call(opts, &out, "verifyValidatorBalance", balanceContainerRoot, validatorIndex, proof) + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "verifyValidatorBalance", balanceContainerRoot, validatorIndex, proof) if err != nil { - return err + return *new(uint64), err } - return err + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err } // VerifyValidatorBalance is a free data retrieval call binding the contract method 0x31f60d4c. // -// Solidity: function verifyValidatorBalance(bytes32 balanceContainerRoot, uint40 validatorIndex, (bytes32,bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperSession) VerifyValidatorBalance(balanceContainerRoot [32]byte, validatorIndex *big.Int, proof BeaconChainProofsBalanceProof) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyValidatorBalance(&_ContractBeaconChainProofsWrapper.CallOpts, balanceContainerRoot, validatorIndex, proof) +// Solidity: function verifyValidatorBalance(bytes32 balanceContainerRoot, uint40 validatorIndex, (bytes32,bytes32,bytes) proof) view returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) VerifyValidatorBalance(balanceContainerRoot [32]byte, validatorIndex *big.Int, proof BeaconChainProofsBalanceProof) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.VerifyValidatorBalance(&_BeaconChainProofsWrapper.CallOpts, balanceContainerRoot, validatorIndex, proof) } // VerifyValidatorBalance is a free data retrieval call binding the contract method 0x31f60d4c. // -// Solidity: function verifyValidatorBalance(bytes32 balanceContainerRoot, uint40 validatorIndex, (bytes32,bytes32,bytes) proof) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCallerSession) VerifyValidatorBalance(balanceContainerRoot [32]byte, validatorIndex *big.Int, proof BeaconChainProofsBalanceProof) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyValidatorBalance(&_ContractBeaconChainProofsWrapper.CallOpts, balanceContainerRoot, validatorIndex, proof) +// Solidity: function verifyValidatorBalance(bytes32 balanceContainerRoot, uint40 validatorIndex, (bytes32,bytes32,bytes) proof) view returns(uint64) +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) VerifyValidatorBalance(balanceContainerRoot [32]byte, validatorIndex *big.Int, proof BeaconChainProofsBalanceProof) (uint64, error) { + return _BeaconChainProofsWrapper.Contract.VerifyValidatorBalance(&_BeaconChainProofsWrapper.CallOpts, balanceContainerRoot, validatorIndex, proof) } -// VerifyValidatorFields is a free data retrieval call binding the contract method 0x256f222b. +// VerifyValidatorFields is a free data retrieval call binding the contract method 0xaaa645a6. // -// Solidity: function verifyValidatorFields(bytes32 beaconStateRoot, bytes32[] validatorFields, bytes validatorFieldsProof, uint40 validatorIndex) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCaller) VerifyValidatorFields(opts *bind.CallOpts, beaconStateRoot [32]byte, validatorFields [][32]byte, validatorFieldsProof []byte, validatorIndex *big.Int) error { +// Solidity: function verifyValidatorFields(uint64 proofTimestamp, bytes32 beaconStateRoot, bytes32[] validatorFields, bytes validatorFieldsProof, uint40 validatorIndex) view returns() +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCaller) VerifyValidatorFields(opts *bind.CallOpts, proofTimestamp uint64, beaconStateRoot [32]byte, validatorFields [][32]byte, validatorFieldsProof []byte, validatorIndex *big.Int) error { var out []interface{} - err := _ContractBeaconChainProofsWrapper.contract.Call(opts, &out, "verifyValidatorFields", beaconStateRoot, validatorFields, validatorFieldsProof, validatorIndex) + err := _BeaconChainProofsWrapper.contract.Call(opts, &out, "verifyValidatorFields", proofTimestamp, beaconStateRoot, validatorFields, validatorFieldsProof, validatorIndex) if err != nil { return err @@ -323,16 +1007,16 @@ func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCaller) } -// VerifyValidatorFields is a free data retrieval call binding the contract method 0x256f222b. +// VerifyValidatorFields is a free data retrieval call binding the contract method 0xaaa645a6. // -// Solidity: function verifyValidatorFields(bytes32 beaconStateRoot, bytes32[] validatorFields, bytes validatorFieldsProof, uint40 validatorIndex) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperSession) VerifyValidatorFields(beaconStateRoot [32]byte, validatorFields [][32]byte, validatorFieldsProof []byte, validatorIndex *big.Int) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyValidatorFields(&_ContractBeaconChainProofsWrapper.CallOpts, beaconStateRoot, validatorFields, validatorFieldsProof, validatorIndex) +// Solidity: function verifyValidatorFields(uint64 proofTimestamp, bytes32 beaconStateRoot, bytes32[] validatorFields, bytes validatorFieldsProof, uint40 validatorIndex) view returns() +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperSession) VerifyValidatorFields(proofTimestamp uint64, beaconStateRoot [32]byte, validatorFields [][32]byte, validatorFieldsProof []byte, validatorIndex *big.Int) error { + return _BeaconChainProofsWrapper.Contract.VerifyValidatorFields(&_BeaconChainProofsWrapper.CallOpts, proofTimestamp, beaconStateRoot, validatorFields, validatorFieldsProof, validatorIndex) } -// VerifyValidatorFields is a free data retrieval call binding the contract method 0x256f222b. +// VerifyValidatorFields is a free data retrieval call binding the contract method 0xaaa645a6. // -// Solidity: function verifyValidatorFields(bytes32 beaconStateRoot, bytes32[] validatorFields, bytes validatorFieldsProof, uint40 validatorIndex) view returns() -func (_ContractBeaconChainProofsWrapper *ContractBeaconChainProofsWrapperCallerSession) VerifyValidatorFields(beaconStateRoot [32]byte, validatorFields [][32]byte, validatorFieldsProof []byte, validatorIndex *big.Int) error { - return _ContractBeaconChainProofsWrapper.Contract.VerifyValidatorFields(&_ContractBeaconChainProofsWrapper.CallOpts, beaconStateRoot, validatorFields, validatorFieldsProof, validatorIndex) +// Solidity: function verifyValidatorFields(uint64 proofTimestamp, bytes32 beaconStateRoot, bytes32[] validatorFields, bytes validatorFieldsProof, uint40 validatorIndex) view returns() +func (_BeaconChainProofsWrapper *BeaconChainProofsWrapperCallerSession) VerifyValidatorFields(proofTimestamp uint64, beaconStateRoot [32]byte, validatorFields [][32]byte, validatorFieldsProof []byte, validatorIndex *big.Int) error { + return _BeaconChainProofsWrapper.Contract.VerifyValidatorFields(&_BeaconChainProofsWrapper.CallOpts, proofTimestamp, beaconStateRoot, validatorFields, validatorFieldsProof, validatorIndex) } diff --git a/data/electra_mekong_beacon_headers_654719.json b/data/electra_mekong_beacon_headers_654719.json new file mode 100644 index 00000000..2bd83f72 --- /dev/null +++ b/data/electra_mekong_beacon_headers_654719.json @@ -0,0 +1,7 @@ +{ + "slot": "654719", + "proposer_index": "88253", + "parent_root": "0x0a22809eecc5109a76e40aef633602d80c3b9706962c32830d46053a3d9d8f24", + "state_root": "0x875eabbd4e15c3e5203e79a0ace1190d1339c154c0f6432a5bc9c41b7a78962e", + "body_root": "0xb7d119550f4f56e3d3563c05da56ea05c8fd73abfab58700fb3d083ab048f09c" +} \ No newline at end of file diff --git a/eigen_pod_proofs.go b/eigen_pod_proofs.go index 2ca2e98c..1b2f16c5 100644 --- a/eigen_pod_proofs.go +++ b/eigen_pod_proofs.go @@ -2,10 +2,10 @@ package eigenpodproofs import ( "errors" + "fmt" "time" "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/deneb" "github.com/attestantio/go-eth2-client/spec/phase0" expirable "github.com/hashicorp/golang-lru/v2/expirable" @@ -20,7 +20,7 @@ const ( type EigenPodProofs struct { chainID uint64 oracleStateRootCache *expirable.LRU[uint64, phase0.Root] - oracleStateTopLevelRootsCache *expirable.LRU[uint64, *beacon.BeaconStateTopLevelRoots] + oracleStateTopLevelRootsCache *expirable.LRU[uint64, *beacon.VersionedBeaconStateTopLevelRoots] oracleStateValidatorTreeCache *expirable.LRU[uint64, [][]phase0.Root] oracleStateValidatorBalancesTreeCache *expirable.LRU[uint64, [][]phase0.Root] oracleStateCacheExpirySeconds int @@ -35,7 +35,7 @@ func NewEigenPodProofs(chainID uint64, oracleStateCacheExpirySeconds int) (*Eige } oracleStateRootCache := expirable.NewLRU[uint64, phase0.Root](MAX_ORACLE_STATE_CACHE_SIZE, nil, time.Duration(oracleStateCacheExpirySeconds)*time.Second) - oracleStateTopLevelRootsCache := expirable.NewLRU[uint64, *beacon.BeaconStateTopLevelRoots](MAX_ORACLE_STATE_CACHE_SIZE, nil, time.Duration(oracleStateCacheExpirySeconds)*time.Second) + oracleStateTopLevelRootsCache := expirable.NewLRU[uint64, *beacon.VersionedBeaconStateTopLevelRoots](MAX_ORACLE_STATE_CACHE_SIZE, nil, time.Duration(oracleStateCacheExpirySeconds)*time.Second) oracleStateValidatorTreeCache := expirable.NewLRU[uint64, [][]phase0.Root](MAX_ORACLE_STATE_CACHE_SIZE, nil, time.Duration(oracleStateCacheExpirySeconds)*time.Second) oracleStateValidatorBalancesTreeCache := expirable.NewLRU[uint64, [][]phase0.Root](MAX_ORACLE_STATE_CACHE_SIZE, nil, time.Duration(oracleStateCacheExpirySeconds)*time.Second) @@ -64,7 +64,7 @@ func (epp *EigenPodProofs) PrecomputeCache(state *spec.VersionedBeaconState) err return err } - epp.ComputeBeaconStateRoot(state.Deneb) + epp.ComputeBeaconStateRoot(state) epp.ComputeBeaconStateTopLevelRoots(state) epp.ComputeVersionedBeaconStateTopLevelRoots(state) epp.ComputeValidatorTree(slot, validators) @@ -72,25 +72,47 @@ func (epp *EigenPodProofs) PrecomputeCache(state *spec.VersionedBeaconState) err return nil } -func (epp *EigenPodProofs) ComputeBeaconStateRoot(beaconState *deneb.BeaconState) (phase0.Root, error) { - beaconStateRoot, err := epp.loadOrComputeBeaconStateRoot( - beaconState.Slot, - func() (phase0.Root, error) { - stateRoot, err := beaconState.HashTreeRoot() - if err != nil { - return phase0.Root{}, err - } - return stateRoot, nil - }, - ) +func (epp *EigenPodProofs) ComputeBeaconStateRoot(state *spec.VersionedBeaconState) (phase0.Root, error) { + + var beaconStateRoot phase0.Root + var err error + switch state.Version { + case spec.DataVersionElectra: + beaconState := state.Electra + beaconStateRoot, err = epp.loadOrComputeBeaconStateRoot( + beaconState.Slot, + func() (phase0.Root, error) { + stateRoot, err := beaconState.HashTreeRoot() + if err != nil { + return phase0.Root{}, err + } + return stateRoot, nil + }, + ) + case spec.DataVersionDeneb: + beaconState := state.Deneb + beaconStateRoot, err = epp.loadOrComputeBeaconStateRoot( + beaconState.Slot, + func() (phase0.Root, error) { + stateRoot, err := beaconState.HashTreeRoot() + if err != nil { + return phase0.Root{}, err + } + return stateRoot, nil + }, + ) + default: + return phase0.Root{}, errors.New("unsupported beacon state version") + } + if err != nil { - return phase0.Root{}, err + return phase0.Root{}, fmt.Errorf("failed to compute beacon state root: %w", err) } return beaconStateRoot, nil } -func (epp *EigenPodProofs) ComputeBeaconStateTopLevelRoots(beaconState *spec.VersionedBeaconState) (*beacon.BeaconStateTopLevelRoots, error) { +func (epp *EigenPodProofs) ComputeBeaconStateTopLevelRoots(beaconState *spec.VersionedBeaconState) (*beacon.VersionedBeaconStateTopLevelRoots, error) { // get the versioned beacon state's slot slot, err := beaconState.Slot() if err != nil { @@ -99,7 +121,7 @@ func (epp *EigenPodProofs) ComputeBeaconStateTopLevelRoots(beaconState *spec.Ver beaconStateTopLevelRoots, err := epp.loadOrComputeBeaconStateTopLevelRoots( slot, - func() (*beacon.BeaconStateTopLevelRoots, error) { + func() (*beacon.VersionedBeaconStateTopLevelRoots, error) { beaconStateTopLevelRoots, err := epp.ComputeVersionedBeaconStateTopLevelRoots(beaconState) if err != nil { return nil, err @@ -113,8 +135,10 @@ func (epp *EigenPodProofs) ComputeBeaconStateTopLevelRoots(beaconState *spec.Ver return beaconStateTopLevelRoots, err } -func (epp *EigenPodProofs) ComputeVersionedBeaconStateTopLevelRoots(beaconState *spec.VersionedBeaconState) (*beacon.BeaconStateTopLevelRoots, error) { +func (epp *EigenPodProofs) ComputeVersionedBeaconStateTopLevelRoots(beaconState *spec.VersionedBeaconState) (*beacon.VersionedBeaconStateTopLevelRoots, error) { switch beaconState.Version { + case spec.DataVersionElectra: + return beacon.ComputeBeaconStateTopLevelRootsElectra(beaconState.Electra) case spec.DataVersionDeneb: return beacon.ComputeBeaconStateTopLevelRootsDeneb(beaconState.Deneb) default: @@ -190,7 +214,7 @@ func (epp *EigenPodProofs) loadOrComputeBeaconStateRoot(slot phase0.Slot, getDat return root, nil } -func (epp *EigenPodProofs) loadOrComputeBeaconStateTopLevelRoots(slot phase0.Slot, getData func() (*beacon.BeaconStateTopLevelRoots, error)) (*beacon.BeaconStateTopLevelRoots, error) { +func (epp *EigenPodProofs) loadOrComputeBeaconStateTopLevelRoots(slot phase0.Slot, getData func() (*beacon.VersionedBeaconStateTopLevelRoots, error)) (*beacon.VersionedBeaconStateTopLevelRoots, error) { topLevelRoots, found := epp.oracleStateTopLevelRootsCache.Get(uint64(slot)) if found { return topLevelRoots, nil diff --git a/eigen_pod_proofs_test.go b/eigen_pod_proofs_test.go index 020580c4..e7390dbc 100644 --- a/eigen_pod_proofs_test.go +++ b/eigen_pod_proofs_test.go @@ -6,62 +6,83 @@ import ( eigenpodproofs "github.com/Layr-Labs/eigenpod-proofs-generation" "github.com/Layr-Labs/eigenpod-proofs-generation/beacon" - contractBeaconChainProofsWrapper "github.com/Layr-Labs/eigenpod-proofs-generation/bindings/BeaconChainProofsWrapper" + BeaconChainProofsWrapper "github.com/Layr-Labs/eigenpod-proofs-generation/bindings/BeaconChainProofsWrapper" "github.com/Layr-Labs/eigenpod-proofs-generation/common" "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/phase0" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/joho/godotenv" ) -const RPC_URL = "https://ethereum-holesky-rpc.publicnode.com" +var BEACON_CHAIN_PROOFS_WRAPPER_ADDRESS = gethcommon.HexToAddress("0x874Be4b0CaC8D3F6286Eee6E6196553aabA8Cb85") -var BEACON_CHAIN_PROOFS_WRAPPER_ADDRESS = gethcommon.HexToAddress("0xf0B1Dd8D9476778564A515409c17c96705661e6A") - -var beaconHeader *phase0.BeaconBlockHeader -var beaconState *spec.VersionedBeaconState -var beaconChainProofsWrapper *contractBeaconChainProofsWrapper.ContractBeaconChainProofsWrapper -var epp *eigenpodproofs.EigenPodProofs - -// before all -func TestMain(m *testing.M) { - var err error +var ( + beaconHeader *phase0.BeaconBlockHeader + beaconState *spec.VersionedBeaconState + beaconChainProofsWrapper *BeaconChainProofsWrapper.BeaconChainProofsWrapper + epp *eigenpodproofs.EigenPodProofs +) - beaconHeaderBytes, err := common.ReadFile("data/deneb_holesky_beacon_headers_2227472.json") +func loadBeaconState(headerPath, statePath string, chainID uint64) error { + headerBytes, err := common.ReadFile(headerPath) if err != nil { - panic(err) + return err } - - beaconStateBytes, err := common.ReadFile("data/deneb_holesky_beacon_state_2227472.ssz") + stateBytes, err := common.ReadFile(statePath) if err != nil { - panic(err) + return err } beaconHeader = &phase0.BeaconBlockHeader{} - err = beaconHeader.UnmarshalJSON(beaconHeaderBytes) - if err != nil { - panic(err) + if err := beaconHeader.UnmarshalJSON(headerBytes); err != nil { + return err } - beaconState, err = beacon.UnmarshalSSZVersionedBeaconState(beaconStateBytes) + beaconState, err = beacon.UnmarshalSSZVersionedBeaconState(stateBytes) if err != nil { - panic(err) + return err } - ethClient, err := ethclient.Dial(RPC_URL) + epp, err = eigenpodproofs.NewEigenPodProofs(chainID, 600) + return err +} + +func TestMain(m *testing.M) { + // Load .env file + godotenv.Load() + + rpcURL := os.Getenv("RPC_URL") + if rpcURL == "" { + panic("RPC_URL must be set in .env file") + } + + ethClient, err := ethclient.Dial(rpcURL) if err != nil { panic(err) } - beaconChainProofsWrapper, err = contractBeaconChainProofsWrapper.NewContractBeaconChainProofsWrapper(BEACON_CHAIN_PROOFS_WRAPPER_ADDRESS, ethClient) + beaconChainProofsWrapper, err = BeaconChainProofsWrapper.NewBeaconChainProofsWrapper(BEACON_CHAIN_PROOFS_WRAPPER_ADDRESS, ethClient) if err != nil { panic(err) } - epp, err = eigenpodproofs.NewEigenPodProofs(17000, 600) - if err != nil { + // Run tests for each hard fork type + if err := loadBeaconState( + "data/electra_mekong_beacon_headers_654719.json", + "data/electra_mekong_beacon_state_654719.ssz", + 17000, // Use 17000 for Mekong, this check isn't relevant for Electra + ); err != nil { panic(err) } + m.Run() - os.Exit(m.Run()) + if err := loadBeaconState( + "data/deneb_holesky_beacon_headers_2227472.json", + "data/deneb_holesky_beacon_state_2227472.ssz", + 17000, + ); err != nil { + panic(err) + } + m.Run() } diff --git a/go.mod b/go.mod index 560241c2..066f9c20 100644 --- a/go.mod +++ b/go.mod @@ -6,15 +6,16 @@ toolchain go1.22.4 require ( github.com/Layr-Labs/eigenlayer-contracts v0.4.3-mainnet-rewards-foundation-incentives.0.20241218180135-1856b33e74ac - github.com/attestantio/go-eth2-client v0.19.9 + github.com/attestantio/go-eth2-client v0.23.1-0.20250129191805-4ee14baa752e github.com/ethereum/go-ethereum v1.14.9 github.com/fatih/color v1.16.0 github.com/ferranbt/fastssz v0.1.3 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/jbrower95/multicall-go v0.0.0-20241012224745-7e9c19976cb5 + github.com/joho/godotenv v1.5.1 github.com/minio/sha256-simd v1.0.1 github.com/pkg/errors v0.9.1 - github.com/rs/zerolog v1.29.1 + github.com/rs/zerolog v1.32.0 github.com/samber/lo v1.47.0 github.com/stretchr/testify v1.9.0 github.com/urfave/cli/v2 v2.27.1 @@ -45,17 +46,18 @@ require ( github.com/gorilla/websocket v1.5.3 // indirect github.com/holiman/uint256 v1.3.1 // indirect github.com/huandu/go-clone v1.6.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/pk910/dynamic-ssz v0.0.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.19.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e // indirect github.com/r3labs/sse/v2 v2.10.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect @@ -75,6 +77,7 @@ require ( golang.org/x/text v0.18.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/Knetic/govaluate.v3 v3.0.0 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 5c73e8d2..a5c50832 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/attestantio/go-eth2-client v0.19.9 h1:g5LLX3X7cLC0KS0oai/MtxBOZz3U3QPIX5qryYMxgVE= -github.com/attestantio/go-eth2-client v0.19.9/go.mod h1:TTz7YF6w4z6ahvxKiHuGPn6DbQn7gH6HPuWm/DEQeGE= +github.com/attestantio/go-eth2-client v0.23.1-0.20250129191805-4ee14baa752e h1:3G/ZObqxMYsePLSPkiogDNjjJem4Ab02yFrQgoDFYsw= +github.com/attestantio/go-eth2-client v0.23.1-0.20250129191805-4ee14baa752e/go.mod h1:vy5jU/uDZ2+RcVzq5BfnG+bQ3/6uu9DGwCrGsPtjJ1A= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.14.3 h1:Gd2c8lSNf9pKXom5JtD7AaKO8o7fGQ2LtFj1436qilA= @@ -126,10 +126,12 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbrower95/multicall-go v0.0.0-20241012224745-7e9c19976cb5 h1:MbF9mcEhOK8A1lphvcfh5Tg7Y2p4iUAtw2+yz3jUa94= github.com/jbrower95/multicall-go v0.0.0-20241012224745-7e9c19976cb5/go.mod h1:cl6hJrk69g0EyKPgNySQbJE1nj29t2q7Pu0as27uC04= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -141,12 +143,11 @@ github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= @@ -162,6 +163,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/pk910/dynamic-ssz v0.0.4 h1:DT29+1055tCEPCaR4V/ez+MOKW7BzBsmjyFvBRqx0ME= +github.com/pk910/dynamic-ssz v0.0.4/go.mod h1:b6CrLaB2X7pYA+OSEEbkgXDEcRnjLOZIxZTsMuO/Y9c= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -174,8 +177,8 @@ github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSz github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e h1:ATgOe+abbzfx9kCPeXIW4fiWyDdxlwHw07j8UGhdTd4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0= github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= @@ -184,9 +187,9 @@ github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= -github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= @@ -241,12 +244,11 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -261,6 +263,8 @@ golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSm golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc= +gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/onchain_test.go b/onchain_test.go index eca5c349..b0913795 100644 --- a/onchain_test.go +++ b/onchain_test.go @@ -4,7 +4,8 @@ import ( "math/big" "testing" - contractBeaconChainProofsWrapper "github.com/Layr-Labs/eigenpod-proofs-generation/bindings/BeaconChainProofsWrapper" + BeaconChainProofsWrapper "github.com/Layr-Labs/eigenpod-proofs-generation/bindings/BeaconChainProofsWrapper" + "github.com/attestantio/go-eth2-client/spec" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/stretchr/testify/assert" ) @@ -33,13 +34,21 @@ func TestValidatorContainersProofOnChain(t *testing.T) { err = beaconChainProofsWrapper.VerifyStateRoot( &bind.CallOpts{}, blockRoot, - contractBeaconChainProofsWrapper.BeaconChainProofsStateRootProof{ + BeaconChainProofsWrapper.BeaconChainProofsStateRootProof{ BeaconStateRoot: verifyValidatorFieldsCallParams.StateRootProof.BeaconStateRoot, Proof: verifyValidatorFieldsCallParams.StateRootProof.Proof.ToByteSlice(), }, ) assert.Nil(t, err) + // Update the proof timestamp depending on the beacon state version + var proofTimestamp uint64 + if beaconState.Version == spec.DataVersionElectra { + proofTimestamp = uint64(1730822401) // 1 second after mekong genesis + } else { + proofTimestamp = uint64(0) + } + for i := 0; i < len(verifyValidatorFieldsCallParams.ValidatorFields); i++ { validatorFields := [][32]byte{} for _, field := range verifyValidatorFieldsCallParams.ValidatorFields[i] { @@ -48,6 +57,7 @@ func TestValidatorContainersProofOnChain(t *testing.T) { err = beaconChainProofsWrapper.VerifyValidatorFields( &bind.CallOpts{}, + proofTimestamp, verifyValidatorFieldsCallParams.StateRootProof.BeaconStateRoot, validatorFields, verifyValidatorFieldsCallParams.ValidatorFieldsProofs[i].ToByteSlice(), @@ -78,10 +88,19 @@ func TestValidatorBalancesProofOnChain(t *testing.T) { t.Fatal(err) } + // Update the proof timestamp depending on the beacon state version + var proofTimestamp uint64 + if beaconState.Version == spec.DataVersionElectra { + proofTimestamp = uint64(1730822401) // 1 second after mekong genesis + } else { + proofTimestamp = uint64(0) + } + err = beaconChainProofsWrapper.VerifyBalanceContainer( &bind.CallOpts{}, + proofTimestamp, blockRoot, - contractBeaconChainProofsWrapper.BeaconChainProofsBalanceContainerProof{ + BeaconChainProofsWrapper.BeaconChainProofsBalanceContainerProof{ BalanceContainerRoot: verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot, Proof: verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.Proof.ToByteSlice(), }, @@ -89,11 +108,11 @@ func TestValidatorBalancesProofOnChain(t *testing.T) { assert.Nil(t, err) for i := 0; i < len(verifyCheckpointProofsCallParams.BalanceProofs); i++ { - err = beaconChainProofsWrapper.VerifyValidatorBalance( + _, err = beaconChainProofsWrapper.VerifyValidatorBalance( &bind.CallOpts{}, verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot, new(big.Int).SetUint64(validatorIndices[i]), - contractBeaconChainProofsWrapper.BeaconChainProofsBalanceProof{ + BeaconChainProofsWrapper.BeaconChainProofsBalanceProof{ PubkeyHash: verifyCheckpointProofsCallParams.BalanceProofs[i].PubkeyHash, BalanceRoot: verifyCheckpointProofsCallParams.BalanceProofs[i].BalanceRoot, Proof: verifyCheckpointProofsCallParams.BalanceProofs[i].Proof.ToByteSlice(), diff --git a/prove_validator.go b/prove_validator.go index 9cb6a20d..3d27d8c4 100644 --- a/prove_validator.go +++ b/prove_validator.go @@ -123,7 +123,11 @@ func (epp *EigenPodProofs) ProveCheckpointProofs(oracleBlockHeader *phase0.Beaco return nil, err } - verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot = *beaconStateTopLevelRoots.BalancesRoot + root, err := beaconStateTopLevelRoots.GetBalancesRoot() + if err != nil { + return nil, err + } + verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot = *root verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.Proof = append(balancesRootProof, stateRootProof...) verifyCheckpointProofsCallParams.BalanceProofs = make([]*BalanceProof, len(validatorIndices)) @@ -159,7 +163,7 @@ func computePubkeyHash(publicKey []byte) [32]byte { ) } -func (epp *EigenPodProofs) proveValidatorAgainstBeaconState(beaconStateTopLevelRoots *beacon.BeaconStateTopLevelRoots, oracleBeaconStateSlot phase0.Slot, oracleBeaconStateValidators []*phase0.Validator, validatorIndex uint64) (common.Proof, error) { +func (epp *EigenPodProofs) proveValidatorAgainstBeaconState(beaconStateTopLevelRoots *beacon.VersionedBeaconStateTopLevelRoots, oracleBeaconStateSlot phase0.Slot, oracleBeaconStateValidators []*phase0.Validator, validatorIndex uint64) (common.Proof, error) { // prove the validator list against the beacon state validatorListProof, err := beacon.ProveBeaconTopLevelRootAgainstBeaconState(beaconStateTopLevelRoots, beacon.VALIDATORS_INDEX) if err != nil { @@ -195,7 +199,7 @@ func (epp *EigenPodProofs) proveValidatorAgainstValidatorList(slot phase0.Slot, return proof, nil } -func (epp *EigenPodProofs) proveValidatorBalanceAgainstBeaconState(beaconStateTopLevelRoots *beacon.BeaconStateTopLevelRoots, oracleBeaconStateSlot phase0.Slot, oracleBeaconStateValidatorBalances []phase0.Gwei, validatorIndex uint64) (phase0.Root, common.Proof, error) { +func (epp *EigenPodProofs) proveValidatorBalanceAgainstBeaconState(beaconStateTopLevelRoots *beacon.VersionedBeaconStateTopLevelRoots, oracleBeaconStateSlot phase0.Slot, oracleBeaconStateValidatorBalances []phase0.Gwei, validatorIndex uint64) (phase0.Root, common.Proof, error) { // prove the validator root against the validator list root balanceRoot, balanceProof, err := epp.proveValidatorBalanceAgainstValidatorBalancesList(oracleBeaconStateSlot, oracleBeaconStateValidatorBalances, validatorIndex) if err != nil { diff --git a/prove_validator_test.go b/prove_validator_test.go index 535036c3..780ba549 100644 --- a/prove_validator_test.go +++ b/prove_validator_test.go @@ -6,7 +6,7 @@ import ( eigenpodproofs "github.com/Layr-Labs/eigenpod-proofs-generation" "github.com/Layr-Labs/eigenpod-proofs-generation/beacon" "github.com/Layr-Labs/eigenpod-proofs-generation/common" - "github.com/attestantio/go-eth2-client/spec/deneb" + "github.com/attestantio/go-eth2-client/spec" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/stretchr/testify/assert" ) @@ -27,10 +27,10 @@ func TestProveValidatorContainers(t *testing.T) { t.Fatal(err) } - assert.True(t, verifyStateRootAgainstBlockHeader(t, epp, beaconHeader, beaconState.Deneb, verifyValidatorFieldsCallParams.StateRootProof.Proof)) + assert.True(t, verifyStateRootAgainstBlockHeader(t, epp, beaconHeader, beaconState, verifyValidatorFieldsCallParams.StateRootProof.Proof)) for i := 0; i < len(verifyValidatorFieldsCallParams.ValidatorFields); i++ { - assert.True(t, verifyValidatorAgainstBeaconState(t, epp, beaconState.Deneb, verifyValidatorFieldsCallParams.ValidatorFieldsProofs[i], validatorIndices[i])) + assert.True(t, verifyValidatorAgainstBeaconState(t, epp, beaconState, verifyValidatorFieldsCallParams.ValidatorFieldsProofs[i], validatorIndices[i])) } } @@ -53,11 +53,11 @@ func TestProveValidatorBalances(t *testing.T) { assert.True(t, verifyValidatorBalancesRootAgainstBlockHeader(t, epp, beaconHeader, verifyCheckpointProofsCallParams.ValidatorBalancesRootProof)) for i := 0; i < len(verifyCheckpointProofsCallParams.BalanceProofs); i++ { - assert.True(t, verifyValidatorBalanceAgainstValidatorBalancesRoot(t, epp, beaconState.Deneb, verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot, verifyCheckpointProofsCallParams.BalanceProofs[i], validatorIndices[i])) + assert.True(t, verifyValidatorBalanceAgainstValidatorBalancesRoot(t, epp, beaconState, verifyCheckpointProofsCallParams.ValidatorBalancesRootProof.ValidatorBalancesRoot, verifyCheckpointProofsCallParams.BalanceProofs[i], validatorIndices[i])) } } -func verifyStateRootAgainstBlockHeader(t *testing.T, epp *eigenpodproofs.EigenPodProofs, oracleBlockHeader *phase0.BeaconBlockHeader, oracleState *deneb.BeaconState, proof common.Proof) bool { +func verifyStateRootAgainstBlockHeader(t *testing.T, epp *eigenpodproofs.EigenPodProofs, oracleBlockHeader *phase0.BeaconBlockHeader, oracleState *spec.VersionedBeaconState, proof common.Proof) bool { root, err := oracleBlockHeader.HashTreeRoot() if err != nil { t.Fatal(err) @@ -71,8 +71,18 @@ func verifyStateRootAgainstBlockHeader(t *testing.T, epp *eigenpodproofs.EigenPo return common.ValidateProof(root, proof, leaf, beacon.STATE_ROOT_INDEX) } -func verifyValidatorAgainstBeaconState(t *testing.T, epp *eigenpodproofs.EigenPodProofs, oracleState *deneb.BeaconState, proof common.Proof, validatorIndex uint64) bool { - leaf, err := oracleState.Validators[validatorIndex].HashTreeRoot() +func verifyValidatorAgainstBeaconState(t *testing.T, epp *eigenpodproofs.EigenPodProofs, oracleState *spec.VersionedBeaconState, proof common.Proof, validatorIndex uint64) bool { + var leaf phase0.Root + var err error + switch oracleState.Version { + case spec.DataVersionElectra: + leaf, err = oracleState.Electra.Validators[validatorIndex].HashTreeRoot() + case spec.DataVersionDeneb: + leaf, err = oracleState.Deneb.Validators[validatorIndex].HashTreeRoot() + default: + t.Fatal("unsupported beacon state version") + } + if err != nil { t.Fatal(err) } @@ -92,11 +102,29 @@ func verifyValidatorBalancesRootAgainstBlockHeader(t *testing.T, epp *eigenpodpr t.Fatal(err) } - return common.ValidateProof(root, proof.Proof, proof.ValidatorBalancesRoot, beacon.STATE_ROOT_INDEX<