code: func (w *wallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) {
  	w.stateLock.Lock()
  	defer w.stateLock.Unlock()
  
  	w.deriveNextPaths = make([]accounts.DerivationPath, len(bases))
  	for i, base := range bases {
  		w.deriveNextPaths[i] = make(accounts.DerivationPath, len(base))
  		copy(w.deriveNextPaths[i][:], base[:])
  	}
  	w.deriveNextAddrs = make([]common.Address, len(bases))
  	w.deriveChain = chain
  }
docs: // SelfDerive sets a base account derivation path from which the wallet attempts
  // to discover non zero accounts and automatically add them to list of tracked
  // accounts.
  //
  // Note, self derivaton will increment the last component of the specified path
  // opposed to decending into a child path to allow discovering accounts starting
  // from non zero components.
  //
  // Some hardware wallets switched derivation paths through their evolution, so
  // this method supports providing multiple bases to discover old user accounts
  // too. Only the last base will be used to derive the next empty account.
  //
  // You can disable automatic account discovery by calling SelfDerive with a nil
  // chain state reader.