github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/client/wallet/onoff.go (about)

     1  package wallet
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/gob"
     6  	"io/ioutil"
     7  
     8  	"github.com/piotrnar/gocoin/client/common"
     9  	"github.com/piotrnar/gocoin/lib/utxo"
    10  )
    11  
    12  var (
    13  	FetchingBalanceTick func() bool
    14  	OnOff               chan bool = make(chan bool, 1)
    15  )
    16  
    17  func InitMaps(empty bool) {
    18  	var szs [5]int
    19  	var ok bool
    20  
    21  	if empty {
    22  		goto init
    23  	}
    24  
    25  	LoadMapSizes()
    26  	szs, ok = WalletAddrsCount[common.AllBalMinVal()]
    27  	if ok {
    28  		//fmt.Println("Have map sizes for MinBal", common.AllBalMinVal(), ":", szs[0], szs[1], szs[2], szs[3])
    29  	} else {
    30  		//fmt.Println("No map sizes for MinBal", common.AllBalMinVal())
    31  		szs = [5]int{25e6, 8e6, 4e6, 300e3, 1e3} // defaults
    32  	}
    33  
    34  init:
    35  	AllBalancesP2KH = make(map[[20]byte]*OneAllAddrBal, szs[0])
    36  	AllBalancesP2SH = make(map[[20]byte]*OneAllAddrBal, szs[1])
    37  	AllBalancesP2WKH = make(map[[20]byte]*OneAllAddrBal, szs[2])
    38  	AllBalancesP2WSH = make(map[[32]byte]*OneAllAddrBal, szs[3])
    39  	AllBalancesP2TAP = make(map[[32]byte]*OneAllAddrBal, szs[4])
    40  }
    41  
    42  func LoadBalance() {
    43  	if common.GetBool(&common.WalletON) {
    44  		//fmt.Println("wallet.LoadBalance() ignore: ", common.GetBool(&common.WalletON))
    45  		return
    46  	}
    47  
    48  	var aborted bool
    49  
    50  	common.SetUint32(&common.WalletProgress, 1)
    51  	common.ApplyBalMinVal()
    52  
    53  	InitMaps(false)
    54  
    55  	for _i := range common.BlockChain.Unspent.HashMap {
    56  		common.BlockChain.Unspent.MapMutex[_i].RLock()
    57  		for k, v := range common.BlockChain.Unspent.HashMap[_i] {
    58  			NewUTXO(utxo.NewUtxoRecStatic(k, v))
    59  			if FetchingBalanceTick != nil && FetchingBalanceTick() {
    60  				aborted = true
    61  				break
    62  			}
    63  		}
    64  		common.BlockChain.Unspent.MapMutex[_i].RUnlock()
    65  		if aborted {
    66  			break
    67  		}
    68  		common.SetUint32(&common.WalletProgress, 1000*(uint32(_i)+1)/256)
    69  	}
    70  	if aborted {
    71  		InitMaps(true)
    72  	} else {
    73  		common.BlockChain.Unspent.CB.NotifyTxAdd = TxNotifyAdd
    74  		common.BlockChain.Unspent.CB.NotifyTxDel = TxNotifyDel
    75  		common.SetBool(&common.WalletON, true)
    76  	}
    77  	common.SetUint32(&common.WalletProgress, 0)
    78  }
    79  
    80  func Disable() {
    81  	if !common.GetBool(&common.WalletON) {
    82  		//fmt.Println("wallet.Disable() ignore: ", common.GetBool(&common.WalletON))
    83  		return
    84  	}
    85  	UpdateMapSizes()
    86  	common.BlockChain.Unspent.CB.NotifyTxAdd = nil
    87  	common.BlockChain.Unspent.CB.NotifyTxDel = nil
    88  	common.SetBool(&common.WalletON, false)
    89  	InitMaps(true)
    90  }
    91  
    92  const (
    93  	MAPSIZ_FILE_NAME = "mapsize.gob"
    94  )
    95  
    96  var (
    97  	WalletAddrsCount map[uint64][5]int = make(map[uint64][5]int) //index:MinValue, [0]-P2KH, [1]-P2SH, [2]-P2WSH, [3]-P2WKH, [4]-P2TAP
    98  )
    99  
   100  func UpdateMapSizes() {
   101  	WalletAddrsCount[common.AllBalMinVal()] = [5]int{len(AllBalancesP2KH),
   102  		len(AllBalancesP2SH), len(AllBalancesP2WKH), len(AllBalancesP2WSH),
   103  		len(AllBalancesP2TAP)}
   104  
   105  	buf := new(bytes.Buffer)
   106  	gob.NewEncoder(buf).Encode(WalletAddrsCount)
   107  	ioutil.WriteFile(common.GocoinHomeDir+MAPSIZ_FILE_NAME, buf.Bytes(), 0600)
   108  }
   109  
   110  func LoadMapSizes() {
   111  	d, er := ioutil.ReadFile(common.GocoinHomeDir + MAPSIZ_FILE_NAME)
   112  	if er != nil {
   113  		println("LoadMapSizes:", er.Error())
   114  		return
   115  	}
   116  
   117  	buf := bytes.NewBuffer(d)
   118  
   119  	er = gob.NewDecoder(buf).Decode(&WalletAddrsCount)
   120  	if er != nil {
   121  		println("LoadMapSizes:", er.Error())
   122  	}
   123  }