@aeternity/aepp-sdk
Version:
SDK for the æternity blockchain
148 lines (125 loc) • 6.73 kB
JavaScript
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