Resolve "WIP: UTXO Selection and Storage"
This commit is contained in:
@@ -5,6 +5,7 @@ import {
|
||||
encodeHdPrivateKey,
|
||||
decodeHdPrivateKey,
|
||||
deriveHdPath,
|
||||
deriveHdPathRelative,
|
||||
deriveHdPublicNode,
|
||||
deriveHdPrivateNodeFromSeed,
|
||||
deriveSeedFromBip39Mnemonic,
|
||||
@@ -40,7 +41,21 @@ export class HDPrivateNode {
|
||||
*
|
||||
* @throws {Error} If HD Private Node cannot be created.
|
||||
*
|
||||
* @returns {HDPrivateNode} The created HD Private Node.
|
||||
* @returns The created HD Private Node.
|
||||
*/
|
||||
public static fromBytes(seed: Uint8Array): HDPrivateNode {
|
||||
// Return a new HD Private Node from the given seed.
|
||||
return this.fromSeed(seed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a HD Private Node from a raw seed.
|
||||
*
|
||||
* @param seed The raw seed bytes.
|
||||
*
|
||||
* @throws {Error} If HD Private Node cannot be created.
|
||||
*
|
||||
* @returns The created HD Private Node.
|
||||
*/
|
||||
public static fromSeed(seed: Uint8Array): HDPrivateNode {
|
||||
// If the seed is not 32 bytes, throw an error.
|
||||
@@ -59,7 +74,7 @@ export class HDPrivateNode {
|
||||
}
|
||||
|
||||
// Return a new HD Private Node from the given seed.
|
||||
return new HDPrivateNode(deriveResult);
|
||||
return new this(deriveResult);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,14 +84,14 @@ export class HDPrivateNode {
|
||||
*
|
||||
* @throws {Error} If HD Private Node cannot be created.
|
||||
*
|
||||
* @returns {HDPrivateNode} The created HD Private Node.
|
||||
* @returns The created HD Private Node.
|
||||
*/
|
||||
public static fromMnemonic(mnemonic: string): HDPrivateNode {
|
||||
// Derive the seed from the mnemonic.
|
||||
const seed = deriveSeedFromBip39Mnemonic(mnemonic);
|
||||
|
||||
// Return a new HDPrivateNode from the given seed.
|
||||
return HDPrivateNode.fromSeed(seed);
|
||||
return this.fromSeed(seed);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -86,7 +101,7 @@ export class HDPrivateNode {
|
||||
*
|
||||
* @throws {Error} If HD Private Node cannot be created.
|
||||
*
|
||||
* @returns {HDPrivateNode} The created HD Private Node.
|
||||
* @returns The created HD Private Node.
|
||||
*/
|
||||
public static fromXPriv(xpriv: string): HDPrivateNode {
|
||||
// Attempt to decode the XPriv Key.
|
||||
@@ -98,7 +113,18 @@ export class HDPrivateNode {
|
||||
}
|
||||
|
||||
// Return a new HD Private Node from the given XPriv.
|
||||
return new HDPrivateNode(decodeResult.node);
|
||||
return new this(decodeResult.node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a HD Private Node from raw node data.
|
||||
*
|
||||
* @param node The raw node data.
|
||||
*
|
||||
* @returns The created HD Private Node.
|
||||
*/
|
||||
public static fromRaw(node: HdPrivateNodeValid) {
|
||||
return new this(node);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -106,7 +132,7 @@ export class HDPrivateNode {
|
||||
*
|
||||
* @throws {Error} If HD Private Node cannot be created.
|
||||
*
|
||||
* @returns {HDPrivateNode} The created HD Private Node.
|
||||
* @returns The created HD Private Node.
|
||||
*/
|
||||
public static generateRandom(): HDPrivateNode {
|
||||
// Attempt to derive HD Private Node from randomly generated bytes.
|
||||
@@ -118,23 +144,29 @@ export class HDPrivateNode {
|
||||
}
|
||||
|
||||
// Return the new HD Private Node from the random bytes.
|
||||
return new HDPrivateNode(deriveResult);
|
||||
return new this(deriveResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the XPriv string for this node.
|
||||
* Checks if the given XPriv string is a valid HD Private Key.
|
||||
*
|
||||
* @returns {string} The XPriv string for this node.
|
||||
* @param xpriv The XPriv string to check.
|
||||
*
|
||||
* @returns True if the XPriv string is valid, false otherwise.
|
||||
*/
|
||||
public toString(): string {
|
||||
// Return the Mainnet XPriv.
|
||||
return this.toXPriv();
|
||||
public static isXPriv(xpriv: string): boolean {
|
||||
try {
|
||||
this.fromXPriv(xpriv);
|
||||
return true;
|
||||
} catch (_error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Private Key entity for this node.
|
||||
*
|
||||
* @returns {PrivateKey} The Private Key Entity for this node.
|
||||
* @returns The Private Key Entity for this node.
|
||||
*/
|
||||
public privateKey(): PrivateKey {
|
||||
// Return a Private Key Entity from the private key of our node.
|
||||
@@ -148,7 +180,7 @@ export class HDPrivateNode {
|
||||
*
|
||||
* @throws {Error} If HD Private Node cannot be derived.
|
||||
*
|
||||
* @returns {HDPrivateNode} The derived HD Private Node
|
||||
* @returns The derived HD Private Node
|
||||
*/
|
||||
public derivePath(path: string): HDPrivateNode {
|
||||
// Attempt to derive the given path.
|
||||
@@ -163,10 +195,32 @@ export class HDPrivateNode {
|
||||
return new HDPrivateNode(derivePathResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derives a HD Private Node from the given relative BIP32 path.
|
||||
*
|
||||
* @param path {string} The BIP32 Path (e.g. 0/0).
|
||||
*
|
||||
* @throws {Error} If HD Private Node cannot be derived.
|
||||
*
|
||||
* @returns The derived HD Private Node
|
||||
*/
|
||||
public deriveRelativePath(path: string): HDPrivateNode {
|
||||
// Attempt to derive the given path.
|
||||
const derivePathResult = deriveHdPathRelative(this.node, path);
|
||||
|
||||
// If a string is returned, this indicates an error...
|
||||
if (typeof derivePathResult === 'string') {
|
||||
throw new Error(derivePathResult);
|
||||
}
|
||||
|
||||
// Return a new HD Private Node Entity derived from the given path.
|
||||
return new HDPrivateNode(derivePathResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derives a HD Public Node from this Private Node.
|
||||
*
|
||||
* @returns {HDPublicNode} The derived HD Public Node
|
||||
* @returns The derived HD Public Node
|
||||
*/
|
||||
public deriveHDPublicNode(): HDPublicNode {
|
||||
// Derive a HD Public Node from this HD Private Node.
|
||||
@@ -176,12 +230,22 @@ export class HDPrivateNode {
|
||||
return new HDPublicNode(publicNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Private Key of this node (as a Uint8Array).
|
||||
*
|
||||
* @returns The Node's Private Key (as a Uint8Array).
|
||||
*/
|
||||
public toBytes(): Uint8Array {
|
||||
// Encode the XPriv from our node info.
|
||||
return this.node.privateKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts this node to an XPriv Key for export.
|
||||
*
|
||||
* @param network {HdKeyNetwork} The network to encode for.
|
||||
*
|
||||
* @returns {string} The XPriv Key.
|
||||
* @returns The XPriv Key.
|
||||
*/
|
||||
public toXPriv(network: HdKeyNetwork = 'mainnet'): string {
|
||||
// Create our node info structure.
|
||||
@@ -193,4 +257,23 @@ export class HDPrivateNode {
|
||||
// Encode the XPriv from our node info.
|
||||
return encodeHdPrivateKey(nodeInfo).hdPrivateKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the XPriv string for this node.
|
||||
*
|
||||
* @returns The XPriv string for this node.
|
||||
*/
|
||||
public toString(): string {
|
||||
// Return the Mainnet XPriv.
|
||||
return this.toXPriv();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the raw node data.
|
||||
*
|
||||
* @returns The raw node data.
|
||||
*/
|
||||
public toRaw(): HdPrivateNodeValid {
|
||||
return this.node;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user