// This is called while accepting the block (from the chain's thread) func TxNotify(idx *btc.TxPrevOut, valpk *btc.TxOut) { var update_wallet bool BalanceMutex.Lock() if valpk != nil { // Extract hash160 from pkscript adr := btc.NewAddrFromPkScript(valpk.Pk_script, common.Testnet) if adr != nil { if rec, ok := CachedAddrs[adr.Hash160]; ok { rec.Value += valpk.Value utxo := new(chain.OneUnspentTx) utxo.TxPrevOut = *idx utxo.Value = valpk.Value utxo.MinedAt = valpk.BlockHeight utxo.BtcAddr = CacheUnspent[rec.CacheIndex].BtcAddr CacheUnspent[rec.CacheIndex].AllUnspentTx = append(CacheUnspent[rec.CacheIndex].AllUnspentTx, utxo) CacheUnspentIdx[idx.UIdx()] = &OneCachedUnspentIdx{Index: rec.CacheIndex, Record: utxo} if rec.InWallet { update_wallet = true } } } } else { ii := idx.UIdx() if ab, present := CacheUnspentIdx[ii]; present { adrec := CacheUnspent[ab.Index] //println("removing", idx.String()) rec := CachedAddrs[adrec.BtcAddr.Hash160] if rec == nil { panic("rec not found for " + adrec.BtcAddr.String()) } rec.Value -= ab.Record.Value if rec.InWallet { update_wallet = true } for j := range adrec.AllUnspentTx { if adrec.AllUnspentTx[j] == ab.Record { //println("found it at index", j) adrec.AllUnspentTx = append(adrec.AllUnspentTx[:j], adrec.AllUnspentTx[j+1:]...) break } } delete(CacheUnspentIdx, ii) } } if update_wallet { sync_wallet() } BalanceMutex.Unlock() }
// This function is only used when loading UTXO database func NewUTXO(db *qdb.DB, k qdb.KeyType, rec *chain.OneWalkRecord) uint32 { if rec.IsP2KH() || rec.IsP2SH() { if adr := btc.NewAddrFromPkScript(rec.Script(), common.Testnet); adr != nil { if crec, ok := CachedAddrs[adr.Hash160]; ok { value := rec.Value() idx := rec.TxPrevOut() crec.Value += value utxo := new(chain.OneUnspentTx) utxo.TxPrevOut = *idx utxo.Value = value utxo.MinedAt = rec.BlockHeight() utxo.BtcAddr = CacheUnspent[crec.CacheIndex].BtcAddr CacheUnspent[crec.CacheIndex].AllUnspentTx = append(CacheUnspent[crec.CacheIndex].AllUnspentTx, utxo) CacheUnspentIdx[idx.UIdx()] = &OneCachedUnspentIdx{Index: crec.CacheIndex, Record: utxo} } } } else if len(StealthAdCache) > 0 && rec.IsStealthIdx() { StealthNotify(db, k, rec) } return 0 }