js_types.go 6.69 KB
Newer Older
1
package xeth
2 3

import (
obscuren's avatar
obscuren committed
4
	"fmt"
5 6 7
	"strconv"
	"strings"

obscuren's avatar
obscuren committed
8
	"github.com/ethereum/go-ethereum/chain"
obscuren's avatar
obscuren committed
9
	"github.com/ethereum/go-ethereum/crypto"
10
	"github.com/ethereum/go-ethereum/ethutil"
obscuren's avatar
obscuren committed
11
	"github.com/ethereum/go-ethereum/state"
12 13 14 15
)

// Block interface exposed to QML
type JSBlock struct {
16
	//Transactions string `json:"transactions"`
obscuren's avatar
obscuren committed
17
	ref          *chain.Block
18 19 20 21
	Size         string        `json:"size"`
	Number       int           `json:"number"`
	Hash         string        `json:"hash"`
	Transactions *ethutil.List `json:"transactions"`
obscuren's avatar
obscuren committed
22
	Uncles       *ethutil.List `json:"uncles"`
23 24 25 26 27
	Time         int64         `json:"time"`
	Coinbase     string        `json:"coinbase"`
	Name         string        `json:"name"`
	GasLimit     string        `json:"gasLimit"`
	GasUsed      string        `json:"gasUsed"`
28
	PrevHash     string        `json:"prevHash"`
29 30
	Bloom        string        `json:"bloom"`
	Raw          string        `json:"raw"`
31 32 33
}

// Creates a new QML Block from a chain block
obscuren's avatar
obscuren committed
34
func NewJSBlock(block *chain.Block) *JSBlock {
35
	if block == nil {
36
		return &JSBlock{}
37 38
	}

obscuren's avatar
obscuren committed
39 40 41
	ptxs := make([]*JSTransaction, len(block.Transactions()))
	for i, tx := range block.Transactions() {
		ptxs[i] = NewJSTx(tx, block.State())
42
	}
obscuren's avatar
obscuren committed
43
	txlist := ethutil.NewList(ptxs)
44

obscuren's avatar
obscuren committed
45 46 47 48 49
	puncles := make([]*JSBlock, len(block.Uncles))
	for i, uncle := range block.Uncles {
		puncles[i] = NewJSBlock(uncle)
	}
	ulist := ethutil.NewList(puncles)
50

51 52 53 54
	return &JSBlock{
		ref: block, Size: block.Size().String(),
		Number: int(block.Number.Uint64()), GasUsed: block.GasUsed.String(),
		GasLimit: block.GasLimit.String(), Hash: ethutil.Bytes2Hex(block.Hash()),
obscuren's avatar
obscuren committed
55 56
		Transactions: txlist, Uncles: ulist,
		Time:     block.Time,
57 58
		Coinbase: ethutil.Bytes2Hex(block.Coinbase),
		PrevHash: ethutil.Bytes2Hex(block.PrevHash),
59 60
		Bloom:    ethutil.Bytes2Hex(block.LogsBloom),
		Raw:      block.String(),
61
	}
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
}

func (self *JSBlock) ToString() string {
	if self.ref != nil {
		return self.ref.String()
	}

	return ""
}

func (self *JSBlock) GetTransaction(hash string) *JSTransaction {
	tx := self.ref.GetTransaction(ethutil.Hex2Bytes(hash))
	if tx == nil {
		return nil
	}

obscuren's avatar
obscuren committed
78
	return NewJSTx(tx, self.ref.State())
79 80 81
}

type JSTransaction struct {
obscuren's avatar
obscuren committed
82
	ref *chain.Transaction
83 84 85 86 87 88 89 90 91 92 93 94 95 96

	Value           string `json:"value"`
	Gas             string `json:"gas"`
	GasPrice        string `json:"gasPrice"`
	Hash            string `json:"hash"`
	Address         string `json:"address"`
	Sender          string `json:"sender"`
	RawData         string `json:"rawData"`
	Data            string `json:"data"`
	Contract        bool   `json:"isContract"`
	CreatesContract bool   `json:"createsContract"`
	Confirmations   int    `json:"confirmations"`
}

obscuren's avatar
obscuren committed
97
func NewJSTx(tx *chain.Transaction, state *state.State) *JSTransaction {
98 99 100
	hash := ethutil.Bytes2Hex(tx.Hash())
	receiver := ethutil.Bytes2Hex(tx.Recipient)
	if receiver == "0000000000000000000000000000000000000000" {
obscuren's avatar
obscuren committed
101
		receiver = ethutil.Bytes2Hex(tx.CreationAddress(state))
102 103 104 105 106 107
	}
	sender := ethutil.Bytes2Hex(tx.Sender())
	createsContract := tx.CreatesContract()

	var data string
	if tx.CreatesContract() {
obscuren's avatar
obscuren committed
108
		data = strings.Join(chain.Disassemble(tx.Data), "\n")
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
	} else {
		data = ethutil.Bytes2Hex(tx.Data)
	}

	return &JSTransaction{ref: tx, Hash: hash, Value: ethutil.CurrencyToString(tx.Value), Address: receiver, Contract: tx.CreatesContract(), Gas: tx.Gas.String(), GasPrice: tx.GasPrice.String(), Data: data, Sender: sender, CreatesContract: createsContract, RawData: ethutil.Bytes2Hex(tx.Data)}
}

func (self *JSTransaction) ToString() string {
	return self.ref.String()
}

type JSKey struct {
	Address    string `json:"address"`
	PrivateKey string `json:"privateKey"`
	PublicKey  string `json:"publicKey"`
}

obscuren's avatar
obscuren committed
126
func NewJSKey(key *crypto.KeyPair) *JSKey {
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
	return &JSKey{ethutil.Bytes2Hex(key.Address()), ethutil.Bytes2Hex(key.PrivateKey), ethutil.Bytes2Hex(key.PublicKey)}
}

type JSObject struct {
	*Object
}

func NewJSObject(object *Object) *JSObject {
	return &JSObject{object}
}

type PReceipt struct {
	CreatedContract bool   `json:"createdContract"`
	Address         string `json:"address"`
	Hash            string `json:"hash"`
	Sender          string `json:"sender"`
}

func NewPReciept(contractCreation bool, creationAddress, hash, address []byte) *PReceipt {
	return &PReceipt{
		contractCreation,
		ethutil.Bytes2Hex(creationAddress),
		ethutil.Bytes2Hex(hash),
		ethutil.Bytes2Hex(address),
	}
}

// Peer interface exposed to QML

type JSPeer struct {
obscuren's avatar
obscuren committed
157
	ref          *chain.Peer
158 159 160 161 162 163 164 165
	Inbound      bool   `json:"isInbound"`
	LastSend     int64  `json:"lastSend"`
	LastPong     int64  `json:"lastPong"`
	Ip           string `json:"ip"`
	Port         int    `json:"port"`
	Version      string `json:"version"`
	LastResponse string `json:"lastResponse"`
	Latency      string `json:"latency"`
obscuren's avatar
obscuren committed
166
	Caps         string `json:"caps"`
167 168
}

obscuren's avatar
obscuren committed
169
func NewJSPeer(peer chain.Peer) *JSPeer {
170 171 172 173 174 175 176 177 178 179
	if peer == nil {
		return nil
	}

	var ip []string
	for _, i := range peer.Host() {
		ip = append(ip, strconv.Itoa(int(i)))
	}
	ipAddress := strings.Join(ip, ".")

obscuren's avatar
obscuren committed
180 181 182
	var caps []string
	capsIt := peer.Caps().NewIterator()
	for capsIt.Next() {
obscuren's avatar
obscuren committed
183 184 185
		cap := capsIt.Value().Get(0).Str()
		ver := capsIt.Value().Get(1).Uint()
		caps = append(caps, fmt.Sprintf("%s/%d", cap, ver))
obscuren's avatar
obscuren committed
186 187
	}

obscuren's avatar
obscuren committed
188
	return &JSPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port()), Latency: peer.PingTime(), Caps: "[" + strings.Join(caps, ", ") + "]"}
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
}

type JSReceipt struct {
	CreatedContract bool   `json:"createdContract"`
	Address         string `json:"address"`
	Hash            string `json:"hash"`
	Sender          string `json:"sender"`
}

func NewJSReciept(contractCreation bool, creationAddress, hash, address []byte) *JSReceipt {
	return &JSReceipt{
		contractCreation,
		ethutil.Bytes2Hex(creationAddress),
		ethutil.Bytes2Hex(hash),
		ethutil.Bytes2Hex(address),
	}
}
obscuren's avatar
obscuren committed
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220

type JSMessage struct {
	To        string `json:"to"`
	From      string `json:"from"`
	Input     string `json:"input"`
	Output    string `json:"output"`
	Path      int32  `json:"path"`
	Origin    string `json:"origin"`
	Timestamp int32  `json:"timestamp"`
	Coinbase  string `json:"coinbase"`
	Block     string `json:"block"`
	Number    int32  `json:"number"`
	Value     string `json:"value"`
}

obscuren's avatar
obscuren committed
221
func NewJSMessage(message *state.Message) JSMessage {
obscuren's avatar
obscuren committed
222 223 224 225 226 227 228 229 230 231 232 233 234 235
	return JSMessage{
		To:        ethutil.Bytes2Hex(message.To),
		From:      ethutil.Bytes2Hex(message.From),
		Input:     ethutil.Bytes2Hex(message.Input),
		Output:    ethutil.Bytes2Hex(message.Output),
		Path:      int32(message.Path),
		Origin:    ethutil.Bytes2Hex(message.Origin),
		Timestamp: int32(message.Timestamp),
		Coinbase:  ethutil.Bytes2Hex(message.Origin),
		Block:     ethutil.Bytes2Hex(message.Block),
		Number:    int32(message.Number.Int64()),
		Value:     message.Value.String(),
	}
}