UNPKG

@aeternity/aepp-sdk

Version:
148 lines (125 loc) 6.73 kB
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context4; _forEachInstanceProperty(_context4 = ownKeys(Object(source), true)).call(_context4, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context5; _forEachInstanceProperty(_context5 = ownKeys(Object(source))).call(_context5, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; } import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each"; import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce"; import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes"; import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice"; import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat"; import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map"; import _fillInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/fill"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"; import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"; import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties"; import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property"; import nacl from 'tweetnacl'; import { full as hmac } from 'tweetnacl-auth'; import { fromString } from 'bip32-path'; import { validateMnemonic, mnemonicToSeed, generateMnemonic as genMnemonic } from '@aeternity/bip39'; import { decryptKey, encodeBase58Check, encryptKey } from './crypto'; var ED25519_CURVE = Buffer.from('ed25519 seed'); var HARDENED_OFFSET = 0x80000000; var toHex = function toHex(buffer) { return Buffer.from(buffer).toString('hex'); }; export function derivePathFromKey(path, key) { var segments = path === '' ? [] : fromString(path).toPathArray(); _forEachInstanceProperty(segments).call(segments, function (segment, i) { if (segment < HARDENED_OFFSET) { throw new Error("Segment #".concat(i + 1, " is not hardened")); } }); return _reduceInstanceProperty(segments).call(segments, function (parentKey, segment) { return deriveChild(parentKey, segment); }, key); } export function derivePathFromSeed(path, seed) { var _context; if (!_includesInstanceProperty(_context = ['m', 'm/']).call(_context, _sliceInstanceProperty(path).call(path, 0, 2))) { throw new Error('Invalid path'); } var masterKey = getMasterKeyFromSeed(seed); return derivePathFromKey(_sliceInstanceProperty(path).call(path, 2), masterKey); } function formatAccount(keys) { var secretKey = keys.secretKey, publicKey = keys.publicKey; return { secretKey: toHex(secretKey), publicKey: "ak_".concat(encodeBase58Check(publicKey)) }; } export function getKeyPair(secretKey) { return nacl.sign.keyPair.fromSeed(secretKey); } export function generateMnemonic() { return genMnemonic(); } export function getMasterKeyFromSeed(seed) { var I = hmac(seed, ED25519_CURVE); var IL = _sliceInstanceProperty(I).call(I, 0, 32); var IR = _sliceInstanceProperty(I).call(I, 32); return { secretKey: IL, chainCode: IR }; } export function deriveChild(_ref, index) { var secretKey = _ref.secretKey, chainCode = _ref.chainCode; if (index < HARDENED_OFFSET) { throw new Error("Child index #".concat(index, " is not supported")); } var indexBuffer = Buffer.allocUnsafe(4); indexBuffer.writeUInt32BE(index, 0); var data = _concatInstanceProperty(Buffer).call(Buffer, [Buffer.alloc(1, 0), Buffer.from(secretKey), Buffer.from(indexBuffer)]); var I = hmac(data, chainCode); var IL = _sliceInstanceProperty(I).call(I, 0, 32); var IR = _sliceInstanceProperty(I).call(I, 32); return { secretKey: IL, chainCode: IR }; } export function generateSaveHDWallet(mnemonic, password) { if (!validateMnemonic(mnemonic)) { throw new Error('Invalid mnemonic'); } var seed = mnemonicToSeed(mnemonic); var walletKey = derivePathFromSeed('m/44h/457h', seed); return { secretKey: toHex(encryptKey(password, walletKey.secretKey)), chainCode: toHex(encryptKey(password, walletKey.chainCode)) }; } export function getSaveHDWalletAccounts(saveHDWallet, password, accountCount) { var _context2, _context3; var walletKey = { secretKey: decryptKey(password, Buffer.from(saveHDWallet.secretKey, 'hex')), chainCode: decryptKey(password, Buffer.from(saveHDWallet.chainCode, 'hex')) }; return _mapInstanceProperty(_context2 = _fillInstanceProperty(_context3 = new Array(accountCount)).call(_context3)).call(_context2, function (_, idx) { return formatAccount(getKeyPair(derivePathFromKey("".concat(idx, "h/0h/0h"), walletKey).secretKey)); }); } export var getHdWalletAccountFromMnemonic = function getHdWalletAccountFromMnemonic(mnemonic, accountIdx) { var seed = mnemonicToSeed(mnemonic); var walletKey = derivePathFromSeed('m/44h/457h', seed); var derived = derivePathFromKey("".concat(accountIdx, "h/0h/0h"), walletKey); var keyPair = getKeyPair(derived.secretKey); return _objectSpread(_objectSpread({}, formatAccount(keyPair)), {}, { idx: accountIdx }); }; export default { getHdWalletAccountFromMnemonic: getHdWalletAccountFromMnemonic, getSaveHDWalletAccounts: getSaveHDWalletAccounts, generateSaveHDWallet: generateSaveHDWallet, generateMnemonic: generateMnemonic, deriveChild: deriveChild, getMasterKeyFromSeed: getMasterKeyFromSeed }; //# sourceMappingURL=hd-wallet.js.map