func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) { nameReg := ethpipe.New(gui.eth).World().Config().Get("NameReg") addr := gui.address() var inout string if bytes.Compare(tx.Sender(), addr) == 0 { inout = "send" } else { inout = "recv" } var ( ptx = ethpipe.NewJSTx(tx) send = nameReg.Storage(tx.Sender()) rec = nameReg.Storage(tx.Recipient) s, r string ) if tx.CreatesContract() { rec = nameReg.Storage(tx.CreationAddress()) } if send.Len() != 0 { s = strings.Trim(send.Str(), "\x00") } else { s = ethutil.Bytes2Hex(tx.Sender()) } if rec.Len() != 0 { r = strings.Trim(rec.Str(), "\x00") } else { if tx.CreatesContract() { r = ethutil.Bytes2Hex(tx.CreationAddress()) } else { r = ethutil.Bytes2Hex(tx.Recipient) } } ptx.Sender = s ptx.Address = r if window == "post" { gui.getObjectByName("transactionView").Call("addTx", ptx, inout) } else { gui.getObjectByName("pendingTxView").Call("addTx", ptx, inout) } }
// Simple go routine function that updates the list of peers in the GUI func (gui *Gui) update() { // We have to wait for qml to be done loading all the windows. for !gui.qmlDone { time.Sleep(500 * time.Millisecond) } go func() { go gui.setInitialBlockChain() gui.loadAddressBook() gui.setPeerInfo() gui.readPreviousTransactions() }() for _, plugin := range gui.plugins { gui.win.Root().Call("addPlugin", plugin.Path, "") } var ( blockChan = make(chan ethreact.Event, 100) txChan = make(chan ethreact.Event, 100) objectChan = make(chan ethreact.Event, 100) peerChan = make(chan ethreact.Event, 100) chainSyncChan = make(chan ethreact.Event, 100) miningChan = make(chan ethreact.Event, 100) ) peerUpdateTicker := time.NewTicker(5 * time.Second) generalUpdateTicker := time.NewTicker(1 * time.Second) state := gui.eth.StateManager().TransState() unconfirmedFunds := new(big.Int) gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance))) gui.getObjectByName("syncProgressIndicator").Set("visible", !gui.eth.IsUpToDate()) lastBlockLabel := gui.getObjectByName("lastBlockLabel") miningLabel := gui.getObjectByName("miningLabel") go func() { for { select { case b := <-blockChan: block := b.Resource.(*ethchain.Block) gui.processBlock(block, false) if bytes.Compare(block.Coinbase, gui.address()) == 0 { gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Balance, nil) } case txMsg := <-txChan: tx := txMsg.Resource.(*ethchain.Transaction) if txMsg.Name == "newTx:pre" { object := state.GetAccount(gui.address()) if bytes.Compare(tx.Sender(), gui.address()) == 0 { unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) } else if bytes.Compare(tx.Recipient, gui.address()) == 0 { unconfirmedFunds.Add(unconfirmedFunds, tx.Value) } gui.setWalletValue(object.Balance, unconfirmedFunds) gui.insertTransaction("pre", tx) } else { object := state.GetAccount(gui.address()) if bytes.Compare(tx.Sender(), gui.address()) == 0 { object.SubAmount(tx.Value) gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "send") gui.txDb.Put(tx.Hash(), tx.RlpEncode()) } else if bytes.Compare(tx.Recipient, gui.address()) == 0 { object.AddAmount(tx.Value) gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "recv") gui.txDb.Put(tx.Hash(), tx.RlpEncode()) } gui.setWalletValue(object.Balance, nil) state.UpdateStateObject(object) } case msg := <-chainSyncChan: sync := msg.Resource.(bool) gui.win.Root().ObjectByName("syncProgressIndicator").Set("visible", sync) case <-objectChan: gui.loadAddressBook() case <-peerChan: gui.setPeerInfo() case <-peerUpdateTicker.C: gui.setPeerInfo() case msg := <-miningChan: if msg.Name == "miner:start" { gui.miner = msg.Resource.(*ethminer.Miner) } else { gui.miner = nil } case <-generalUpdateTicker.C: statusText := "#" + gui.eth.BlockChain().CurrentBlock.Number.String() lastBlockLabel.Set("text", statusText) if gui.miner != nil { pow := gui.miner.GetPow() miningLabel.Set("text", "Mining @ "+strconv.FormatInt(pow.GetHashrate(), 10)+"Khash") } } } }() reactor := gui.eth.Reactor() reactor.Subscribe("newBlock", blockChan) reactor.Subscribe("newTx:pre", txChan) reactor.Subscribe("newTx:post", txChan) reactor.Subscribe("chainSync", chainSyncChan) reactor.Subscribe("miner:start", miningChan) reactor.Subscribe("miner:stop", miningChan) nameReg := gui.pipe.World().Config().Get("NameReg") reactor.Subscribe("object:"+string(nameReg.Address()), objectChan) reactor.Subscribe("peerList", peerChan) }