Class HDPath

All Implemented Interfaces:
Iterable<ChildNumber>, Collection<ChildNumber>, List<ChildNumber>

public class HDPath extends AbstractList<ChildNumber>
HD Key derivation path. HDPath can be used to represent a full path or a relative path. The hasPrivateKey boolean is used for rendering to String but (at present) not much else. It defaults to false which is the preferred setting for a relative path.

HDPath is immutable and uses the Collections.UnmodifiableList type internally.

It implements java.util.List<ChildNumber> to ease migration from the previous implementation. When an HDPath is returned you can treat it as a List<ChildNumber> where necessary in your code. Although it is recommended to use the HDPath type for clarity and for access to HDPath-specific functionality.

Note that it is possible for HDPath to be an empty list.

Take note of the overloaded factory methods M() and m(). These can be used to very concisely create HDPath objects (especially when statically imported.)

  • Field Details

    • hasPrivateKey

      protected final boolean hasPrivateKey
    • unmodifiableList

      protected final List<ChildNumber> unmodifiableList
    • BIP44_PARENT

      public static final HDPath BIP44_PARENT
      Partial path with BIP44 purpose
    • BIP84_PARENT

      public static final HDPath BIP84_PARENT
      Partial path with BIP84 purpose
    • BIP86_PARENT

      public static final HDPath BIP86_PARENT
      Partial path with BIP86 purpose
  • Constructor Details

    • HDPath

      public HDPath(boolean hasPrivateKey, List<ChildNumber> list)
      Constructs a path for a public or private key. Should probably be a private constructor.
      Parameters:
      hasPrivateKey - Whether it is a path to a private key or not
      list - List of children in the path
    • HDPath

      @Deprecated public HDPath(List<ChildNumber> list)
      Deprecated.
      Use M(List) or m(List) instead
      Constructs a path for a public key.
      Parameters:
      list - List of children in the path
  • Method Details

    • deserialize

      public static HDPath deserialize(List<Integer> integerList)
      Deserialize a list of integers into an HDPath (internal use only)
      Parameters:
      integerList - A list of integers (what we use in ProtoBuf for an HDPath)
      Returns:
      a deserialized HDPath (hasPrivateKey is false/unknown)
    • M

      public static HDPath M(List<ChildNumber> list)
      Returns a path for a public key.
      Parameters:
      list - List of children in the path
    • M

      public static HDPath M()
      Returns an empty path for a public key.
    • M

      public static HDPath M(ChildNumber childNumber)
      Returns a path for a public key.
      Parameters:
      childNumber - Single child in path
    • M

      public static HDPath M(ChildNumber... children)
      Returns a path for a public key.
      Parameters:
      children - Children in the path
    • m

      public static HDPath m(List<ChildNumber> list)
      Returns a path for a private key.
      Parameters:
      list - List of children in the path
    • m

      public static HDPath m()
      Returns an empty path for a private key.
    • m

      public static HDPath m(ChildNumber childNumber)
      Returns a path for a private key.
      Parameters:
      childNumber - Single child in path
    • m

      public static HDPath m(ChildNumber... children)
      Returns a path for a private key.
      Parameters:
      children - Children in the path
    • parsePath

      public static HDPath parsePath(@Nonnull String path)
      Create an HDPath from a path string. The path string is a human-friendly representation of the deterministic path. For example: "44H / 0H / 0H / 1 / 1" Where a letter "H" means hardened key. Spaces are ignored.
    • hasPrivateKey

      public boolean hasPrivateKey()
      Is this a path to a private key?
      Returns:
      true if yes, false if no or a partial path
    • extend

      public HDPath extend(ChildNumber child1, ChildNumber... children)
      Extend the path by appending additional ChildNumber objects.
      Parameters:
      child1 - the first child to append
      children - zero or more additional children to append
      Returns:
      A new immutable path
    • extend

      public HDPath extend(HDPath path2)
      Extend the path by appending a relative path.
      Parameters:
      path2 - the relative path to append
      Returns:
      A new immutable path
    • extend

      public HDPath extend(List<ChildNumber> path2)
      Extend the path by appending a relative path.
      Parameters:
      path2 - the relative path to append
      Returns:
      A new immutable path
    • list

      public List<ChildNumber> list()
      Return a simple list of ChildNumber
      Returns:
      an unmodifiable list of ChildNumber
    • parent

      public HDPath parent()
      Return the parent path.

      Note that this method defines the parent of a root path as the empty path and the parent of the empty path as the empty path. This behavior is what one would expect of an unmodifiable, copy-on-modify list. If you need to check for edge cases, you can use AbstractCollection.isEmpty() before or after using HDPath#parent()

      Returns:
      parent path (which can be empty -- see above)
    • ancestors

      public List<HDPath> ancestors()
      Return a list of all ancestors of this path
      Returns:
      unmodifiable list of ancestors
    • ancestors

      public List<HDPath> ancestors(boolean includeSelf)
      Return a list of all ancestors of this path
      Parameters:
      includeSelf - true if include path for self
      Returns:
      unmodifiable list of ancestors
    • get

      public ChildNumber get(int index)
      Specified by:
      get in interface List<ChildNumber>
      Specified by:
      get in class AbstractList<ChildNumber>
    • size

      public int size()
      Specified by:
      size in interface Collection<ChildNumber>
      Specified by:
      size in interface List<ChildNumber>
      Specified by:
      size in class AbstractCollection<ChildNumber>
    • toString

      public String toString()
      Overrides:
      toString in class AbstractCollection<ChildNumber>