@@ -2,12 +2,10 @@ package service
22
33import (
44 "context"
5- "errors"
65 "math/big"
76 "strings"
87
98 "github.com/ava-labs/avalanchego/ids"
10- "github.com/ava-labs/avalanchego/vms/evm/emulate"
119 "github.com/ava-labs/coreth/core"
1210 "github.com/ava-labs/libevm/common"
1311 "github.com/coinbase/rosetta-sdk-go/server"
@@ -86,8 +84,10 @@ func (s *BlockService) Block(
8684 }
8785
8886 var (
89- block * ethtypes.Block
90- err error
87+ blockIdentifier * types.BlockIdentifier
88+ parentBlockIdentifier * types.BlockIdentifier
89+ block * ethtypes.Block
90+ err error
9191 )
9292
9393 if hash := request .BlockIdentifier .Hash ; hash != nil {
@@ -101,69 +101,45 @@ func (s *BlockService) Block(
101101 }
102102 return nil , WrapError (ErrClientError , err )
103103 }
104- return s .parseBlock (ctx , request , block )
105- }
106104
107- func (s * BlockService ) parseBlock (ctx context.Context , request * types.BlockRequest , block * ethtypes.Block ) (* types.BlockResponse , * types.Error ) {
108- var (
109- blockIdentifier * types.BlockIdentifier
110- parentBlockIdentifier * types.BlockIdentifier
111- blockResponse * types.BlockResponse
112- rosettaErr * types.Error
113- )
114-
115- // emulate.CChain is used to simulate "block" function calls in a Coreth node.
116- // Otherwise, methods like block.Hash() will not include Avalanche-specific
117- // headers while calculating the block hash, and give incorrect data.
118- err := emulate .CChain (func () error {
119- blockIdentifier = & types.BlockIdentifier {
120- Index : block .Number ().Int64 (),
121- Hash : block .Hash ().String (), // block.Hash() is cached, so it must be used within emulate.CChain
122- }
105+ blockIdentifier = & types.BlockIdentifier {
106+ Index : block .Number ().Int64 (),
107+ Hash : block .Hash ().String (),
108+ }
123109
124- if block .ParentHash ().String () != s .config .GenesisBlockHash {
125- parentBlock , err := s .client .HeaderByHash (ctx , block .ParentHash ())
126- if err != nil {
127- return err
128- }
129-
130- parentBlockIdentifier = & types.BlockIdentifier {
131- Index : parentBlock .Number .Int64 (),
132- Hash : parentBlock .Hash ().String (),
133- }
134- } else {
135- parentBlockIdentifier = s .genesisBlock .BlockIdentifier
110+ if block .ParentHash ().String () != s .config .GenesisBlockHash {
111+ parentBlock , err := s .client .HeaderByHash (ctx , block .ParentHash ())
112+ if err != nil {
113+ return nil , WrapError (ErrClientError , err )
136114 }
137115
138- transactions , rosettaErr := s . fetchTransactions ( ctx , block )
139- if rosettaErr != nil {
140- return errors . New ( "failed to fetch transactions" )
116+ parentBlockIdentifier = & types. BlockIdentifier {
117+ Index : parentBlock . Number . Int64 (),
118+ Hash : parentBlock . Hash (). String (),
141119 }
120+ } else {
121+ parentBlockIdentifier = s .genesisBlock .BlockIdentifier
122+ }
142123
143- crosstx , rosettaErr := s .parseCrossChainTransactions ( request . NetworkIdentifier , block )
144- if rosettaErr != nil {
145- return errors . New ( "failed to parse cross chain transactions" )
146- }
124+ transactions , terr := s .fetchTransactions ( ctx , block )
125+ if terr != nil {
126+ return nil , terr
127+ }
147128
148- blockResponse = & types.BlockResponse {
149- Block : & types.Block {
150- BlockIdentifier : blockIdentifier ,
151- ParentBlockIdentifier : parentBlockIdentifier ,
152- Timestamp : int64 (block .Time () * utils .MillisecondsInSecond ),
153- Transactions : append (transactions , crosstx ... ),
154- Metadata : mapper .BlockMetadata (block ),
155- },
156- }
157- return nil
158- })
159- if err != nil {
160- if rosettaErr != nil {
161- return nil , rosettaErr
162- }
163- return nil , WrapError (ErrClientError , err )
129+ crosstx , terr := s .parseCrossChainTransactions (request .NetworkIdentifier , block )
130+ if terr != nil {
131+ return nil , terr
164132 }
165133
166- return blockResponse , nil
134+ return & types.BlockResponse {
135+ Block : & types.Block {
136+ BlockIdentifier : blockIdentifier ,
137+ ParentBlockIdentifier : parentBlockIdentifier ,
138+ Timestamp : int64 (block .Time () * utils .MillisecondsInSecond ),
139+ Transactions : append (transactions , crosstx ... ),
140+ Metadata : mapper .BlockMetadata (block ),
141+ },
142+ }, nil
167143}
168144
169145// BlockTransaction implements the /block/transaction endpoint.
0 commit comments