aboutsummaryrefslogblamecommitdiffstats
path: root/rpc/responses.go
blob: a3613f3809d3d72eb318705d789fe7b584d91b06 (plain) (tree)
1
2
3
4
5
6
7
8
9



                       
                

                  
                                                
                                                    
                                               

















































                                                                      
















                                                                                 






                                                                   
                                                                   



                                                  
                                               





                                                



                                  










                                                   


                                                      

















































                                                                             










                                                                         






































                                                               
























                                                           
package rpc

import (
    "encoding/json"
    // "fmt"
    "math/big"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/state"
)

type BlockRes struct {
    fullTx bool

    BlockNumber     int64             `json:"number"`
    BlockHash       []byte            `json:"hash"`
    ParentHash      []byte            `json:"parentHash"`
    Nonce           []byte            `json:"nonce"`
    Sha3Uncles      []byte            `json:"sha3Uncles"`
    LogsBloom       []byte            `json:"logsBloom"`
    TransactionRoot []byte            `json:"transactionRoot"`
    StateRoot       []byte            `json:"stateRoot"`
    Miner           []byte            `json:"miner"`
    Difficulty      int64             `json:"difficulty"`
    TotalDifficulty int64             `json:"totalDifficulty"`
    Size            int64             `json:"size"`
    ExtraData       []byte            `json:"extraData"`
    GasLimit        int64             `json:"gasLimit"`
    MinGasPrice     int64             `json:"minGasPrice"`
    GasUsed         int64             `json:"gasUsed"`
    UnixTimestamp   int64             `json:"timestamp"`
    Transactions    []*TransactionRes `json:"transactions"`
    Uncles          [][]byte          `json:"uncles"`
}

func (b *BlockRes) MarshalJSON() ([]byte, error) {
    var ext struct {
        BlockNumber     string        `json:"number"`
        BlockHash       string        `json:"hash"`
        ParentHash      string        `json:"parentHash"`
        Nonce           string        `json:"nonce"`
        Sha3Uncles      string        `json:"sha3Uncles"`
        LogsBloom       string        `json:"logsBloom"`
        TransactionRoot string        `json:"transactionRoot"`
        StateRoot       string        `json:"stateRoot"`
        Miner           string        `json:"miner"`
        Difficulty      string        `json:"difficulty"`
        TotalDifficulty string        `json:"totalDifficulty"`
        Size            string        `json:"size"`
        ExtraData       string        `json:"extraData"`
        GasLimit        string        `json:"gasLimit"`
        MinGasPrice     string        `json:"minGasPrice"`
        GasUsed         string        `json:"gasUsed"`
        UnixTimestamp   string        `json:"timestamp"`
        Transactions    []interface{} `json:"transactions"`
        Uncles          []string      `json:"uncles"`
    }

    // convert strict types to hexified strings
    ext.BlockNumber = common.ToHex(big.NewInt(b.BlockNumber).Bytes())
    ext.BlockHash = common.ToHex(b.BlockHash)
    ext.ParentHash = common.ToHex(b.ParentHash)
    ext.Nonce = common.ToHex(b.Nonce)
    ext.Sha3Uncles = common.ToHex(b.Sha3Uncles)
    ext.LogsBloom = common.ToHex(b.LogsBloom)
    ext.TransactionRoot = common.ToHex(b.TransactionRoot)
    ext.StateRoot = common.ToHex(b.StateRoot)
    ext.Miner = common.ToHex(b.Miner)
    ext.Difficulty = common.ToHex(big.NewInt(b.Difficulty).Bytes())
    ext.TotalDifficulty = common.ToHex(big.NewInt(b.TotalDifficulty).Bytes())
    ext.Size = common.ToHex(big.NewInt(b.Size).Bytes())
    // ext.ExtraData = common.ToHex(b.ExtraData)
    ext.GasLimit = common.ToHex(big.NewInt(b.GasLimit).Bytes())
    // ext.MinGasPrice = common.ToHex(big.NewInt(b.MinGasPrice).Bytes())
    ext.GasUsed = common.ToHex(big.NewInt(b.GasUsed).Bytes())
    ext.UnixTimestamp = common.ToHex(big.NewInt(b.UnixTimestamp).Bytes())
    ext.Transactions = make([]interface{}, len(b.Transactions))
    if b.fullTx {
        for i, tx := range b.Transactions {
            ext.Transactions[i] = tx
        }
    } else {
        for i, tx := range b.Transactions {
            ext.Transactions[i] = common.ToHex(tx.Hash)
        }
    }
    ext.Uncles = make([]string, len(b.Uncles))
    for i, v := range b.Uncles {
        ext.Uncles[i] = common.ToHex(v)
    }

    return json.Marshal(ext)
}

func NewBlockRes(block *types.Block) *BlockRes {
    if block == nil {
        return &BlockRes{}
    }

    res := new(BlockRes)
    res.BlockNumber = block.Number().Int64()
    res.BlockHash = block.Hash()
    res.ParentHash = block.ParentHash()
    res.Nonce = block.Header().Nonce
    res.Sha3Uncles = block.Header().UncleHash
    res.LogsBloom = block.Bloom()
    res.TransactionRoot = block.Header().TxHash
    res.StateRoot = block.Root()
    res.Miner = block.Header().Coinbase
    res.Difficulty = block.Difficulty().Int64()
    if block.Td != nil {
        res.TotalDifficulty = block.Td.Int64()
    }
    res.Size = int64(block.Size())
    // res.ExtraData =
    res.GasLimit = block.GasLimit().Int64()
    // res.MinGasPrice =
    res.GasUsed = block.GasUsed().Int64()
    res.UnixTimestamp = block.Time()
    res.Transactions = make([]*TransactionRes, len(block.Transactions()))
    for i, tx := range block.Transactions() {
        v := NewTransactionRes(tx)
        v.BlockHash = block.Hash()
        v.BlockNumber = block.Number().Int64()
        v.TxIndex = int64(i)
        res.Transactions[i] = v
    }
    res.Uncles = make([][]byte, len(block.Uncles()))
    for i, uncle := range block.Uncles() {
        res.Uncles[i] = uncle.Hash()
    }
    return res
}

type TransactionRes struct {
    Hash        []byte `json:"hash"`
    Nonce       int64  `json:"nonce"`
    BlockHash   []byte `json:"blockHash,omitempty"`
    BlockNumber int64  `json:"blockNumber,omitempty"`
    TxIndex     int64  `json:"transactionIndex,omitempty"`
    From        []byte `json:"from"`
    To          []byte `json:"to"`
    Value       int64  `json:"value"`
    Gas         int64  `json:"gas"`
    GasPrice    int64  `json:"gasPrice"`
    Input       []byte `json:"input"`
}

func (t *TransactionRes) MarshalJSON() ([]byte, error) {
    var ext struct {
        Hash        string `json:"hash"`
        Nonce       string `json:"nonce"`
        BlockHash   string `json:"blockHash,omitempty"`
        BlockNumber string `json:"blockNumber,omitempty"`
        TxIndex     string `json:"transactionIndex,omitempty"`
        From        string `json:"from"`
        To          string `json:"to"`
        Value       string `json:"value"`
        Gas         string `json:"gas"`
        GasPrice    string `json:"gasPrice"`
        Input       string `json:"input"`
    }

    ext.Hash = common.ToHex(t.Hash)
    ext.Nonce = common.ToHex(big.NewInt(t.Nonce).Bytes())
    ext.BlockHash = common.ToHex(t.BlockHash)
    ext.BlockNumber = common.ToHex(big.NewInt(t.BlockNumber).Bytes())
    ext.TxIndex = common.ToHex(big.NewInt(t.TxIndex).Bytes())
    ext.From = common.ToHex(t.From)
    ext.To = common.ToHex(t.To)
    ext.Value = common.ToHex(big.NewInt(t.Value).Bytes())
    ext.Gas = common.ToHex(big.NewInt(t.Gas).Bytes())
    ext.GasPrice = common.ToHex(big.NewInt(t.GasPrice).Bytes())
    ext.Input = common.ToHex(t.Input)

    return json.Marshal(ext)
}

func NewTransactionRes(tx *types.Transaction) *TransactionRes {
    var v = new(TransactionRes)
    v.Hash = tx.Hash()
    v.Nonce = int64(tx.Nonce())
    v.From = tx.From()
    v.To = tx.To()
    v.Value = tx.Value().Int64()
    v.Gas = tx.Gas().Int64()
    v.GasPrice = tx.GasPrice().Int64()
    v.Input = tx.Data()
    return v
}

type FilterLogRes struct {
    Hash             string `json:"hash"`
    Address          string `json:"address"`
    Data             string `json:"data"`
    BlockNumber      string `json:"blockNumber"`
    TransactionHash  string `json:"transactionHash"`
    BlockHash        string `json:"blockHash"`
    TransactionIndex string `json:"transactionIndex"`
    LogIndex         string `json:"logIndex"`
}

type FilterWhisperRes struct {
    Hash       string `json:"hash"`
    From       string `json:"from"`
    To         string `json:"to"`
    Expiry     string `json:"expiry"`
    Sent       string `json:"sent"`
    Ttl        string `json:"ttl"`
    Topics     string `json:"topics"`
    Payload    string `json:"payload"`
    WorkProved string `json:"workProved"`
}

type LogRes struct {
    Address string   `json:"address"`
    Topic   []string `json:"topic"`
    Data    string   `json:"data"`
    Number  uint64   `json:"number"`
}

func NewLogsRes(logs state.Logs) (ls []LogRes) {
    ls = make([]LogRes, len(logs))

    for i, log := range logs {
        var l LogRes
        l.Topic = make([]string, len(log.Topics()))
        l.Address = common.ToHex(log.Address())
        l.Data = common.ToHex(log.Data())
        l.Number = log.Number()
        for j, topic := range log.Topics() {
            l.Topic[j] = common.ToHex(topic)
        }
        ls[i] = l
    }

    return
}