diff --git a/arbitrum/apibackend.go b/arbitrum/apibackend.go index 50ad7802ad..6c1c765b29 100644 --- a/arbitrum/apibackend.go +++ b/arbitrum/apibackend.go @@ -132,16 +132,16 @@ type SyncProgressBackend interface { BlockMetadataByNumber(ctx context.Context, blockNum uint64) (common.BlockMetadata, error) } -func createRegisterAPIBackend(backend *Backend, filterConfig filters.Config, fallbackClientUrl string, fallbackClientTimeout time.Duration, archiveRedirects []BlockRedirectConfig) (*filters.FilterSystem, error) { +func createRegisterAPIBackend(backend *Backend, filterConfig filters.Config, fallbackClientUrl string, fallbackClientTimeout time.Duration, archiveRedirects []BlockRedirectConfig) (*filters.FilterSystem, ReceiptFetcher, error) { fallbackClient, err := CreateFallbackClient(fallbackClientUrl, fallbackClientTimeout, false) if err != nil { - return nil, err + return nil, nil, err } var archiveClientsManager *archiveFallbackClientsManager if len(archiveRedirects) != 0 { archiveClientsManager, err = newArchiveFallbackClientsManager(archiveRedirects) if err != nil { - return nil, err + return nil, nil, err } } backend.apiBackend = &APIBackend{ @@ -150,8 +150,20 @@ func createRegisterAPIBackend(backend *Backend, filterConfig filters.Config, fal archiveClientsManager: archiveClientsManager, } filterSystem := filters.NewFilterSystem(backend.apiBackend, filterConfig) - backend.stack.RegisterAPIs(backend.apiBackend.GetAPIs(filterSystem)) - return filterSystem, nil + apis := backend.apiBackend.GetAPIs(filterSystem) + var receiptFetcher ReceiptFetcher + for _, api := range apis { + var ok bool + receiptFetcher, ok = api.Service.(ReceiptFetcher) + if ok { + break + } + } + if receiptFetcher == nil { + return nil, nil, errors.New("no receipt fetcher found in APIs") + } + backend.stack.RegisterAPIs(apis) + return filterSystem, receiptFetcher, nil } func (a *APIBackend) SetSyncBackend(sync SyncProgressBackend) error { diff --git a/arbitrum/backend.go b/arbitrum/backend.go index 06df137739..1107d6ae74 100644 --- a/arbitrum/backend.go +++ b/arbitrum/backend.go @@ -17,7 +17,6 @@ import ( "github.com/ethereum/go-ethereum/internal/shutdowncheck" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" ) type Backend struct { @@ -30,7 +29,8 @@ type Backend struct { txFeed event.Feed scope event.SubscriptionScope - filterMaps *filtermaps.FilterMaps + filterMaps *filtermaps.FilterMaps + receiptFetcher ReceiptFetcher shutdownTracker *shutdowncheck.ShutdownTracker @@ -84,13 +84,15 @@ func NewBackend(stack *node.Node, config *Config, chainDb ethdb.Database, publis backend.stack.ApplyAPIFilter(rpcFilter) } - filterSystem, err := createRegisterAPIBackend(backend, filterConfig, config.ClassicRedirect, config.ClassicRedirectTimeout, config.BlockRedirects) + filterSystem, receiptFetcher, err := createRegisterAPIBackend(backend, filterConfig, config.ClassicRedirect, config.ClassicRedirectTimeout, config.BlockRedirects) if err != nil { return nil, nil, err } backend.filterSystem = filterSystem + backend.receiptFetcher = receiptFetcher return backend, filterSystem, nil } + func (b *Backend) newChainView(head *types.Header) *filtermaps.ChainView { if head == nil { return nil @@ -100,11 +102,12 @@ func (b *Backend) newChainView(head *types.Header) *filtermaps.ChainView { func (b *Backend) AccountManager() *accounts.Manager { return b.stack.AccountManager() } func (b *Backend) APIBackend() *APIBackend { return b.apiBackend } -func (b *Backend) APIs() []rpc.API { return b.apiBackend.GetAPIs(b.filterSystem) } func (b *Backend) ArbInterface() ArbInterface { return b.arb } func (b *Backend) BlockChain() *core.BlockChain { return b.arb.BlockChain() } func (b *Backend) ChainDb() ethdb.Database { return b.chainDb } +func (b *Backend) Config() *Config { return b.config } func (b *Backend) Engine() consensus.Engine { return b.arb.BlockChain().Engine() } +func (b *Backend) ReceiptFetcher() ReceiptFetcher { return b.receiptFetcher } func (b *Backend) Stack() *node.Node { return b.stack } func (b *Backend) ResetWithGenesisBlock(gb *types.Block) { diff --git a/arbitrum/receipt.go b/arbitrum/receipt.go new file mode 100644 index 0000000000..80f3c9c2a8 --- /dev/null +++ b/arbitrum/receipt.go @@ -0,0 +1,11 @@ +package arbitrum + +import ( + "context" + + "github.com/ethereum/go-ethereum/common" +) + +type ReceiptFetcher interface { + GetTransactionReceipt(ctx context.Context, hash common.Hash) (map[string]interface{}, error) +}