(ctx context.Context, blockNum uint64, header *evm.BlockHeader)
| 370 | } |
| 371 | |
| 372 | func (qe *EvmQueryExecutor) fetchTracesViaForward(ctx context.Context, blockNum uint64, header *evm.BlockHeader) ([]*evm.Trace, error) { |
| 373 | result, err := qe.forwardSubrequest(ctx, "trace_block", []interface{}{fmt.Sprintf("0x%x", blockNum)}) |
| 374 | if err == nil { |
| 375 | var rawItems []map[string]interface{} |
| 376 | if err := sonic.Unmarshal(result, &rawItems); err != nil { |
| 377 | return nil, err |
| 378 | } |
| 379 | out := make([]*evm.Trace, 0, len(rawItems)) |
| 380 | for _, rawItem := range rawItems { |
| 381 | trace, err := evm.TraceFromParity(rawItem, blockNum, headerHash(header), headerTimestamp(header)) |
| 382 | if err != nil { |
| 383 | return nil, err |
| 384 | } |
| 385 | out = append(out, trace) |
| 386 | } |
| 387 | return out, nil |
| 388 | } |
| 389 | if !common.HasErrorCode(err, common.ErrCodeEndpointUnsupported) { |
| 390 | return nil, err |
| 391 | } |
| 392 | |
| 393 | debugResult, err := qe.forwardSubrequest(ctx, "debug_traceBlockByNumber", []interface{}{ |
| 394 | fmt.Sprintf("0x%x", blockNum), |
| 395 | map[string]interface{}{"tracer": "callTracer"}, |
| 396 | }) |
| 397 | if err != nil { |
| 398 | if common.HasErrorCode(err, common.ErrCodeEndpointUnsupported) { |
| 399 | return nil, status.Error(codes.Unimplemented, "eth_queryTraces requires trace_block or debug_traceBlockByNumber support") |
| 400 | } |
| 401 | return nil, err |
| 402 | } |
| 403 | var nested []map[string]interface{} |
| 404 | if err := sonic.Unmarshal(debugResult, &nested); err == nil { |
| 405 | out := make([]*evm.Trace, 0, len(nested)) |
| 406 | for _, item := range nested { |
| 407 | traces, err := evm.TraceFromGethDebug(item, blockNum, headerHash(header), headerTimestamp(header)) |
| 408 | if err != nil { |
| 409 | return nil, err |
| 410 | } |
| 411 | out = append(out, traces...) |
| 412 | } |
| 413 | return out, nil |
| 414 | } |
| 415 | var single map[string]interface{} |
| 416 | if err := sonic.Unmarshal(debugResult, &single); err != nil { |
| 417 | return nil, err |
| 418 | } |
| 419 | return evm.TraceFromGethDebug(single, blockNum, headerHash(header), headerTimestamp(header)) |
| 420 | } |
| 421 | |
| 422 | func (qe *EvmQueryExecutor) forwardSubrequest(ctx context.Context, method string, params []interface{}) ([]byte, error) { |
| 423 | if qe.forwardSubrequestFn != nil { |
no test coverage detected