11package chainio
22
33import (
4+ "context"
5+
46 "github.com/ethereum/go-ethereum/accounts/abi/bind"
5- gethcommon "github.com/ethereum/go-ethereum/common"
7+ ethcommon "github.com/ethereum/go-ethereum/common"
8+ "github.com/ethereum/go-ethereum/crypto"
9+ servicemanager "github.com/yetanotherco/aligned_layer/contracts/bindings/AlignedLayerServiceManager"
610 contractERC20Mock "github.com/yetanotherco/aligned_layer/contracts/bindings/ERC20Mock"
711 "github.com/yetanotherco/aligned_layer/core/config"
812
@@ -13,8 +17,9 @@ import (
1317
1418type AvsReader struct {
1519 * sdkavsregistry.ChainReader
16- AvsContractBindings * AvsServiceBindings
17- logger logging.Logger
20+ AvsContractBindings * AvsServiceBindings
21+ AlignedLayerServiceManagerAddr ethcommon.Address
22+ logger logging.Logger
1823}
1924
2025func NewAvsReaderFromConfig (baseConfig * config.BaseConfig , ecdsaConfig * config.EcdsaConfig ) (* AvsReader , error ) {
@@ -41,13 +46,14 @@ func NewAvsReaderFromConfig(baseConfig *config.BaseConfig, ecdsaConfig *config.E
4146 }
4247
4348 return & AvsReader {
44- ChainReader : chainReader ,
45- AvsContractBindings : avsServiceBindings ,
46- logger : baseConfig .Logger ,
49+ ChainReader : chainReader ,
50+ AvsContractBindings : avsServiceBindings ,
51+ AlignedLayerServiceManagerAddr : baseConfig .AlignedLayerDeploymentConfig .AlignedLayerServiceManagerAddr ,
52+ logger : baseConfig .Logger ,
4753 }, nil
4854}
4955
50- func (r * AvsReader ) GetErc20Mock (tokenAddr gethcommon .Address ) (* contractERC20Mock.ContractERC20Mock , error ) {
56+ func (r * AvsReader ) GetErc20Mock (tokenAddr ethcommon .Address ) (* contractERC20Mock.ContractERC20Mock , error ) {
5157 erc20Mock , err := contractERC20Mock .NewContractERC20Mock (tokenAddr , & r .AvsContractBindings .ethClient )
5258 if err != nil {
5359 // Retry with fallback client
@@ -59,6 +65,40 @@ func (r *AvsReader) GetErc20Mock(tokenAddr gethcommon.Address) (*contractERC20Mo
5965 return erc20Mock , nil
6066}
6167
62- func (r * AvsReader ) IsOperatorRegistered (address gethcommon .Address ) (bool , error ) {
68+ func (r * AvsReader ) IsOperatorRegistered (address ethcommon .Address ) (bool , error ) {
6369 return r .ChainReader .IsOperatorRegistered (& bind.CallOpts {}, address )
6470}
71+
72+ // Returns all the "NewBatchV3" logs that have not been responded starting from the given block number
73+ func (r * AvsReader ) GetNotRespondedTasksFrom (fromBlock uint64 ) ([]servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 , error ) {
74+ logs , err := r .AvsContractBindings .ServiceManager .FilterNewBatchV3 (& bind.FilterOpts {Start : fromBlock , End : nil , Context : context .Background ()}, nil )
75+
76+ if err != nil {
77+ return nil , err
78+ }
79+
80+ var tasks []servicemanager.ContractAlignedLayerServiceManagerNewBatchV3
81+
82+ for logs .Next () {
83+ task , err := r .AvsContractBindings .ServiceManager .ParseNewBatchV3 (logs .Event .Raw )
84+ if err != nil {
85+ return nil , err
86+ }
87+
88+ // now check if its finalized or not before appending
89+ batchIdentifier := append (task .BatchMerkleRoot [:], task .SenderAddress [:]... )
90+ batchIdentifierHash := * (* [32 ]byte )(crypto .Keccak256 (batchIdentifier ))
91+ state , err := r .AvsContractBindings .ServiceManager .ContractAlignedLayerServiceManagerCaller .BatchesState (nil , batchIdentifierHash )
92+
93+ if err != nil {
94+ return nil , err
95+ }
96+
97+ // append the task if not responded yet
98+ if ! state .Responded {
99+ tasks = append (tasks , * task )
100+ }
101+ }
102+
103+ return tasks , nil
104+ }
0 commit comments