@@ -229,6 +229,8 @@ func (svr *web3Handler) handleWeb3Req(ctx context.Context, web3Req *gjson.Result
229229 res , err = svr .getBlockTransactionCountByNumber (web3Req )
230230 case "eth_getTransactionReceipt" :
231231 res , err = svr .getTransactionReceipt (web3Req )
232+ case "eth_getBlockReceipts" :
233+ res , err = svr .getBlockReceipts (web3Req )
232234 case "eth_getStorageAt" :
233235 res , err = svr .getStorageAt (web3Req )
234236 case "eth_getFilterLogs" :
@@ -418,11 +420,11 @@ func (svr *web3Handler) getBalance(in *gjson.Result) (interface{}, error) {
418420 return nil , err
419421 }
420422 bnParam := in .Get ("params.1" )
421- bn , err := parseBlockNumber (& bnParam )
423+ bn , err := parseBlockNumberOrHash (& bnParam )
422424 if err != nil {
423425 return nil , err
424426 }
425- height , _ , err := svr .blockNumberOrHashToHeight (rpc . BlockNumberOrHashWithNumber ( bn ) )
427+ height , _ , err := svr .blockNumberOrHashToHeight (bn )
426428 if err != nil {
427429 return nil , err
428430 }
@@ -651,11 +653,11 @@ func (svr *web3Handler) getCode(in *gjson.Result) (interface{}, error) {
651653 return nil , err
652654 }
653655 bnParam := in .Get ("params.1" )
654- bn , err := parseBlockNumber (& bnParam )
656+ bn , err := parseBlockNumberOrHash (& bnParam )
655657 if err != nil {
656658 return nil , err
657659 }
658- height , _ , err := svr .blockNumberOrHashToHeight (rpc . BlockNumberOrHashWithNumber ( bn ) )
660+ height , _ , err := svr .blockNumberOrHashToHeight (bn )
659661 if err != nil {
660662 return nil , err
661663 }
@@ -868,6 +870,80 @@ func (svr *web3Handler) getTransactionReceipt(in *gjson.Result) (interface{}, er
868870
869871}
870872
873+ func (svr * web3Handler ) getBlockReceipts (in * gjson.Result ) (interface {}, error ) {
874+ // parse block parameter from request
875+ blkParam := in .Get ("params.0" )
876+ if ! blkParam .Exists () {
877+ return nil , errInvalidFormat
878+ }
879+ bn , err := parseBlockNumberOrHash (& blkParam )
880+ if err != nil {
881+ return nil , err
882+ }
883+ height , _ , err := svr .blockNumberOrHashToHeight (bn )
884+ if err != nil {
885+ return nil , err
886+ }
887+
888+ blk , err := svr .coreService .BlockByHeight (height )
889+ if err != nil {
890+ if errors .Cause (err ) == ErrNotFound {
891+ return nil , nil
892+ }
893+ return nil , err
894+ }
895+
896+ // Build receipt array for all transactions in the block
897+ receipts := make ([]* getReceiptResult , 0 , len (blk .Block .Actions ))
898+ blockHash := blk .Block .HashBlock ()
899+
900+ // Get logs bloom filter
901+ var logsBloomStr string
902+ if logsBloom := blk .Block .LogsBloomfilter (); logsBloom != nil {
903+ logsBloomStr = hex .EncodeToString (logsBloom .Bytes ())
904+ }
905+
906+ // Process each transaction in the block
907+ for i , selp := range blk .Block .Actions {
908+ receipt := blk .Receipts [i ]
909+
910+ // Convert action to ethereum transaction to get type
911+ tx , err := selp .ToEthTx ()
912+ if err != nil {
913+ if errors .Is (err , errUnsupportedAction ) || errors .Is (err , action .ErrInvalidAct ) {
914+ txHash , _ := selp .Hash ()
915+ log .Logger ("api" ).Debug ("getBlockReceipts: unsupported action type" ,
916+ zap .String ("action" , fmt .Sprintf ("%T" , selp .Action ())),
917+ log .Hex ("actionHash" , txHash [:]),
918+ zap .Int ("index" , i ))
919+ continue // Skip unsupported actions
920+ }
921+ return nil , err
922+ }
923+
924+ // Get recipient and contract address
925+ to , contractAddr , err := getRecipientAndContractAddrFromAction (selp , receipt )
926+ if err != nil {
927+ return nil , err
928+ }
929+
930+ // Create receipt result
931+ receiptResult := & getReceiptResult {
932+ blockHash : blockHash ,
933+ from : selp .SenderAddress (),
934+ to : to ,
935+ contractAddress : contractAddr ,
936+ logsBloom : logsBloomStr ,
937+ receipt : receipt ,
938+ txType : uint (tx .Type ()),
939+ }
940+
941+ receipts = append (receipts , receiptResult )
942+ }
943+
944+ return receipts , nil
945+ }
946+
871947func (svr * web3Handler ) getBlockTransactionCountByNumber (in * gjson.Result ) (interface {}, error ) {
872948 blkNum := in .Get ("params.0" )
873949 if ! blkNum .Exists () {
@@ -940,11 +1016,11 @@ func (svr *web3Handler) getStorageAt(in *gjson.Result) (interface{}, error) {
9401016 return nil , errInvalidFormat
9411017 }
9421018 bnParam := in .Get ("params.2" )
943- bn , err := parseBlockNumber (& bnParam )
1019+ bn , err := parseBlockNumberOrHash (& bnParam )
9441020 if err != nil {
9451021 return nil , err
9461022 }
947- height , _ , err := svr .blockNumberOrHashToHeight (rpc . BlockNumberOrHashWithNumber ( bn ) )
1023+ height , _ , err := svr .blockNumberOrHashToHeight (bn )
9481024 if err != nil {
9491025 return nil , err
9501026 }
@@ -1238,11 +1314,11 @@ func (svr *web3Handler) traceCall(ctx context.Context, in *gjson.Result) (interf
12381314
12391315func (svr * web3Handler ) traceBlockByNumber (ctx context.Context , in * gjson.Result ) (any , error ) {
12401316 blkParam , tracerParam := in .Get ("params.0" ), in .Get ("params.1" )
1241- blkNum , err := parseBlockNumber (& blkParam )
1317+ blkNum , err := parseBlockNumberOrHash (& blkParam )
12421318 if err != nil {
12431319 return nil , errors .Wrap (err , "failed to parse block number" )
12441320 }
1245- height , _ , err := svr .blockNumberOrHashToHeight (rpc . BlockNumberOrHashWithNumber ( blkNum ) )
1321+ height , _ , err := svr .blockNumberOrHashToHeight (blkNum )
12461322 if err != nil {
12471323 return nil , err
12481324 }
0 commit comments