UNPKG

thor-devkit

Version:

Typescript library to aid DApp development on VeChain Thor

74 lines 6.78 kB
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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