thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
77 lines • 6.88 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.HDNode = void 0;
const ethers_1 = require("ethers");
const crypto_1 = require("crypto");
const elliptic_1 = require("elliptic");
const address_1 = require("./address");
const buffer_1 = require("buffer");
// see https://github.com/satoshilabs/slips/blob/master/slip-0044.md
const VET_DERIVATION_PATH = 'm/44\'/818\'/0\'/0';
const xpubPrefix = buffer_1.Buffer.from('0488b21e000000000000000000', 'hex');
const xprivPrefix = buffer_1.Buffer.from('0488ade4000000000000000000', 'hex');
const curve = new elliptic_1.ec('secp256k1');
var HDNode;
(function (HDNode) {
/** create node from mnemonic words */
function fromMnemonic(words, path = VET_DERIVATION_PATH) {
// normalize words to lowercase
const joinedWords = words.join(' ').toLowerCase();
const wallet = ethers_1.HDNodeWallet.fromPhrase(joinedWords, undefined, path);
return createHDNode(wallet);
}
HDNode.fromMnemonic = fromMnemonic;
/**
* create node from xpub
* @param pub public key
* @param chainCode chain code
*/
function fromPublicKey(pub, chainCode) {
const compressed = curve.keyFromPublic(pub).getPublic(true, 'array');
const key = buffer_1.Buffer.concat([xpubPrefix, chainCode, buffer_1.Buffer.from(compressed)]);
const checksum = sha256(sha256(key)).slice(0, 4);
const node = ethers_1.HDNodeWallet.fromExtendedKey((0, ethers_1.encodeBase58)(buffer_1.Buffer.concat([key, checksum])));
return createHDNode(node);
}
HDNode.fromPublicKey = fromPublicKey;
/**
* create node from xpriv
* @param priv private key
* @param chainCode chain code
*/
function fromPrivateKey(priv, chainCode) {
const key = buffer_1.Buffer.concat([xprivPrefix, chainCode, buffer_1.Buffer.from([0]), priv]);
const checksum = sha256(sha256(key)).slice(0, 4);
const node = ethers_1.HDNodeWallet.fromExtendedKey((0, ethers_1.encodeBase58)(buffer_1.Buffer.concat([key, checksum])));
return createHDNode(node);
}
HDNode.fromPrivateKey = fromPrivateKey;
function createHDNode(ethersNode) {
const pub = buffer_1.Buffer.from(curve.keyFromPublic(ethersNode.publicKey.slice(2), 'hex').getPublic(false, 'array'));
const rawPriv = ethersNode.privateKey;
const priv = rawPriv ? buffer_1.Buffer.from(rawPriv.slice(2), 'hex') : null;
const cc = buffer_1.Buffer.from(ethersNode.chainCode.slice(2), 'hex');
const addr = address_1.address.fromPublicKey(pub);
return {
get publicKey() {
return pub;
},
get privateKey() {
return priv;
},
get chainCode() {
return cc;
},
get address() {
return addr;
},
derive(index) {
return createHDNode(ethersNode.deriveChild(index));
}
};
}
function sha256(data) {
return (0, crypto_1.createHash)('sha256').update(data).digest();
}
})(HDNode || (exports.HDNode = HDNode = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGRub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hkbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBcUU7QUFDckUsbUNBQW1DO0FBQ25DLHVDQUFtQztBQUNuQyx1Q0FBbUM7QUFDbkMsbUNBQStCO0FBRS9CLG9FQUFvRTtBQUNwRSxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFBO0FBQ2hELE1BQU0sVUFBVSxHQUFHLGVBQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDbkUsTUFBTSxXQUFXLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUNwRSxNQUFNLEtBQUssR0FBRyxJQUFJLGFBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQVdqQyxJQUFpQixNQUFNLENBaUV0QjtBQWpFRCxXQUFpQixNQUFNO0lBQ25CLHNDQUFzQztJQUN0QyxTQUFnQixZQUFZLENBQUMsS0FBZSxFQUFFLElBQUksR0FBRyxtQkFBbUI7UUFDcEUsK0JBQStCO1FBQy9CLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDakQsTUFBTSxNQUFNLEdBQUcscUJBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNwRSxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBTGUsbUJBQVksZUFLM0IsQ0FBQTtJQUVEOzs7O09BSUc7SUFDSCxTQUFnQixhQUFhLENBQUMsR0FBVyxFQUFFLFNBQWlCO1FBQ3hELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNwRSxNQUFNLEdBQUcsR0FBRyxl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