thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
74 lines • 6.78 kB
JavaScript
import { encodeBase58, HDNodeWallet } from 'ethers';
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 wallet = 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.concat([xpubPrefix, chainCode, Buffer.from(compressed)]);
const checksum = sha256(sha256(key)).slice(0, 4);
const node = HDNodeWallet.fromExtendedKey(encodeBase58(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 = HDNodeWallet.fromExtendedKey(encodeBase58(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 rawPriv = ethersNode.privateKey;
const priv = rawPriv ? Buffer.from(rawPriv.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.deriveChild(index));
}
};
}
function sha256(data) {
return createHash('sha256').update(data).digest();
}
})(HDNode || (HDNode = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGRub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hkbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBb0IsTUFBTSxRQUFRLENBQUE7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFL0Isb0VBQW9FO0FBQ3BFLE1BQU0sbUJBQW1CLEdBQUcsb0JBQW9CLENBQUE7QUFDaEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUNuRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ3BFLE1BQU0sS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0FBV2pDLE1BQU0sS0FBVyxNQUFNLENBaUV0QjtBQWpFRCxXQUFpQixNQUFNO0lBQ25CLHNDQUFzQztJQUN0QyxTQUFnQixZQUFZLENBQUMsS0FBZSxFQUFFLElBQUksR0FBRyxtQkFBbUI7UUFDcEUsK0JBQStCO1FBQy9CLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDakQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3BFLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFMZSxtQkFBWSxlQUszQixDQUFBO0lB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