ethergo/parser/tracely/request.go
package tracely
import (
"bytes"
"encoding/json"
"fmt"
"log"
"net/http"
"time"
"github.com/DenrianWeiss/tracely/model"
"github.com/bcicen/jstream"
)
func GetTxResult(rpc, txid string) ([]model.TraceStep, error) {
result := make([]model.TraceStep, 0)
req := model.NewRequest(txid)
// enable storage
req.Params = req.Params[:len(req.Params)-1]
// enable memory
req.Params = append(req.Params, map[string]bool{
"enableMemory": true,
"enableReturnData": true,
})
reqJson, _ := json.Marshal(req)
reqStream := bytes.NewReader(reqJson)
client := http.Client{
Timeout: 30 * time.Second,
}
post, err := client.Post(rpc, "application/json", reqStream)
if err != nil {
log.Println("error", err.Error())
return nil, fmt.Errorf("error could not ")
}
if post.StatusCode != http.StatusOK {
log.Println("Failed to fetch")
}
resultStream := post.Body
decoder := jstream.NewDecoder(resultStream, 3)
for mv := range decoder.Stream() {
v := mv.Value.(map[string]interface{})
OpCode := v["op"].(string)
if OpCodeFocus[OpCode] {
r := model.TraceStep{}
if v["depth"] != nil {
r.Depth = int(v["depth"].(float64))
}
r.Op = OpCode
if v["gas"] != nil {
r.Gas = int(v["gas"].(float64))
}
if v["stack"] != nil {
r.Stack = v["stack"].([]interface{})
}
if v["memory"] != nil {
r.Memory = v["memory"].([]interface{})
}
result = append(result, r)
}
}
return result, nil
}