thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
74 lines • 6.83 kB
JavaScript
import { Base58 } from '@vechain/ethers/utils/basex';
import * as HD from '@vechain/ethers/utils/hdnode';
import { createHash } from 'crypto';
import { ec as EC } from 'elliptic';
import { address } from './address';
import { Buffer } from 'buffer';
// see https://github.com/satoshilabs/slips/blob/master/slip-0044.md
const VET_DERIVATION_PATH = `m/44'/818'/0'/0`;
const xpubPrefix = Buffer.from('0488b21e000000000000000000', 'hex');
const xprivPrefix = Buffer.from('0488ade4000000000000000000', 'hex');
const curve = new EC('secp256k1');
export 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 node = HD.fromMnemonic(joinedWords).derivePath(path);
return createHDNode(node);
}
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.concat([xpubPrefix, chainCode, Buffer.from(compressed)]);
const checksum = sha256(sha256(key)).slice(0, 4);
const node = HD.fromExtendedKey(Base58.encode(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.concat([xprivPrefix, chainCode, Buffer.from([0]), priv]);
const checksum = sha256(sha256(key)).slice(0, 4);
const node = HD.fromExtendedKey(Base58.encode(Buffer.concat([key, checksum])));
return createHDNode(node);
}
HDNode.fromPrivateKey = fromPrivateKey;
function createHDNode(ethersNode) {
const pub = Buffer.from(curve.keyFromPublic(ethersNode.publicKey.slice(2), 'hex').getPublic(false, 'array'));
const priv = ethersNode.privateKey ? Buffer.from(ethersNode.privateKey.slice(2), 'hex') : null;
const cc = Buffer.from(ethersNode.chainCode.slice(2), 'hex');
const addr = 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.derivePath('' + index));
}
};
}
function sha256(data) {
return createHash('sha256').update(data).digest();
}
})(HDNode || (HDNode = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGRub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hkbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDcEQsT0FBTyxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUUvQixvRUFBb0U7QUFDcEUsTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FBQTtBQUM3QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ25FLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUE7QUFXakMsTUFBTSxLQUFXLE1BQU0sQ0FnRXRCO0FBaEVELFdBQWlCLE1BQU07SUFDbkIsc0NBQXNDO0lBQ3RDLFNBQWdCLFlBQVksQ0FBQyxLQUFlLEVBQUUsSUFBSSxHQUFHLG1CQUFtQjtRQUNwRSwrQkFBK0I7UUFDL0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNqRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJ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