@abcpros/bitcore-wallet-service
Version:
A service for Mutisig HD Bitcoin Wallets
187 lines • 7.94 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Wallet = void 0;
var lodash_1 = __importDefault(require("lodash"));
var index_1 = require("../chain/index");
var logger_1 = __importDefault(require("../logger"));
var address_1 = require("./address");
var addressmanager_1 = require("./addressmanager");
var copayer_1 = require("./copayer");
var $ = require('preconditions').singleton();
var Uuid = require('uuid');
var config = require('../../config');
var Common = require('../common');
var Constants = Common.Constants, Defaults = Common.Defaults, Utils = Common.Utils;
var Bitcore = {
btc: require('@abcpros/bitcore-lib'),
bch: require('@abcpros/bitcore-lib-cash'),
xec: require('@abcpros/bitcore-lib-xec'),
eth: require('@abcpros/bitcore-lib'),
xrp: require('@abcpros/bitcore-lib'),
doge: require('@abcpros/bitcore-lib-doge'),
xpi: require('@abcpros/bitcore-lib-xpi'),
ltc: require('@abcpros/bitcore-lib-ltc')
};
var Wallet = (function () {
function Wallet() {
}
Wallet.create = function (opts) {
opts = opts || {};
var x = new Wallet();
$.shouldBeNumber(opts.m);
$.shouldBeNumber(opts.n);
$.checkArgument(Utils.checkValueInCollection(opts.coin, Constants.COINS));
$.checkArgument(Utils.checkValueInCollection(opts.network, Constants.NETWORKS));
x.version = '1.0.0';
x.createdOn = Math.floor(Date.now() / 1000);
x.id = opts.id || Uuid.v4();
x.name = opts.name;
x.m = opts.m;
x.n = opts.n;
x.singleAddress = !!opts.singleAddress;
x.status = 'pending';
x.publicKeyRing = [];
x.addressIndex = 0;
x.copayers = [];
x.pubKey = opts.pubKey;
x.coin = opts.coin;
x.network = opts.network;
x.derivationStrategy = opts.derivationStrategy || Constants.DERIVATION_STRATEGIES.BIP45;
x.addressType = opts.addressType || Constants.SCRIPT_TYPES.P2SH;
x.addressManager = addressmanager_1.AddressManager.create({
derivationStrategy: x.derivationStrategy
});
x.usePurpose48 = opts.usePurpose48;
x.scanStatus = null;
x.isSlpToken = !!opts.isSlpToken;
x.isFromRaipay = !!opts.isFromRaipay;
x.beRegistered = false;
x.beAuthPrivateKey2 = null;
x.beAuthPublicKey2 = null;
x.nativeCashAddr = lodash_1.default.isUndefined(opts.nativeCashAddr) ? (x.coin == 'bch' ? true : null) : opts.nativeCashAddr;
return x;
};
Wallet.fromObj = function (obj) {
var x = new Wallet();
$.shouldBeNumber(obj.m);
$.shouldBeNumber(obj.n);
x.version = obj.version;
x.createdOn = obj.createdOn;
x.id = obj.id;
x.name = obj.name;
x.m = obj.m;
x.n = obj.n;
x.singleAddress = !!obj.singleAddress;
x.status = obj.status;
x.publicKeyRing = obj.publicKeyRing;
x.copayers = lodash_1.default.map(obj.copayers, function (copayer) {
return copayer_1.Copayer.fromObj(copayer);
});
x.pubKey = obj.pubKey;
x.coin = obj.coin || Defaults.COIN;
x.network = obj.network;
if (!x.network) {
x.network = obj.isTestnet ? 'testnet' : 'livenet';
}
x.derivationStrategy = obj.derivationStrategy || Constants.DERIVATION_STRATEGIES.BIP45;
x.addressType = obj.addressType || Constants.SCRIPT_TYPES.P2SH;
x.addressManager = addressmanager_1.AddressManager.fromObj(obj.addressManager);
x.scanStatus = obj.scanStatus;
x.beRegistered = obj.beRegistered;
x.beAuthPrivateKey2 = obj.beAuthPrivateKey2;
x.beAuthPublicKey2 = obj.beAuthPublicKey2;
x.nativeCashAddr = obj.nativeCashAddr;
x.usePurpose48 = obj.usePurpose48;
x.isSlpToken = !!obj.isSlpToken;
x.isFromRaipay = !!obj.isFromRaipay;
return x;
};
Wallet.prototype.toObject = function () {
var x = lodash_1.default.cloneDeep(this);
x.isShared = this.isShared();
return x;
};
Wallet.getMaxRequiredCopayers = function (totalCopayers) {
return Wallet.COPAYER_PAIR_LIMITS[totalCopayers];
};
Wallet.verifyCopayerLimits = function (m, n) {
return n >= 1 && n <= 15 && m >= 1 && m <= n;
};
Wallet.prototype.isShared = function () {
return this.n > 1;
};
Wallet.prototype.isUTXOCoin = function () {
return !!Constants.UTXO_COINS[this.coin.toUpperCase()];
};
Wallet.prototype.updateBEKeys = function () {
$.checkState(this.isComplete(), 'Failed state: wallet incomplete at <updateBEKeys()>');
var chain = index_1.ChainService.getChain(this.coin).toLowerCase();
var bitcore = Bitcore[chain];
var salt = config.BE_KEY_SALT || Defaults.BE_KEY_SALT;
var seed = lodash_1.default.map(this.copayers, 'xPubKey')
.sort()
.join('') +
this.network +
this.coin +
salt;
seed = bitcore.crypto.Hash.sha256(Buffer.from(seed));
var priv = bitcore.PrivateKey(seed, this.network);
this.beAuthPrivateKey2 = priv.toString();
this.beAuthPublicKey2 = priv.toPublicKey().toString();
};
Wallet.prototype._updatePublicKeyRing = function () {
this.publicKeyRing = lodash_1.default.map(this.copayers, function (copayer) {
return lodash_1.default.pick(copayer, ['xPubKey', 'requestPubKey']);
});
};
Wallet.prototype.addCopayer = function (copayer) {
$.checkState(copayer.coin == this.coin, 'Failed state: copayer.coin not equal to this.coin at <addCopayer()>');
this.copayers.push(copayer);
if (this.copayers.length < this.n)
return;
this.status = 'complete';
this._updatePublicKeyRing();
};
Wallet.prototype.addCopayerRequestKey = function (copayerId, requestPubKey, signature, restrictions, name) {
$.checkState(this.copayers.length == this.n, 'Failed state: this.copayers.length == this.n at addCopayerRequestKey()');
var c = this.getCopayer(copayerId);
c.requestPubKeys.unshift({
key: requestPubKey.toString(),
signature: signature,
selfSigned: true,
restrictions: restrictions || {},
name: name || null
});
};
Wallet.prototype.getCopayer = function (copayerId) {
return this.copayers.find(function (c) { return c.id == copayerId; });
};
Wallet.prototype.isComplete = function () {
return this.status == 'complete';
};
Wallet.prototype.isScanning = function () {
return this.scanning;
};
Wallet.prototype.createAddress = function (isChange, step) {
$.checkState(this.isComplete(), 'Failed state: this.isComplete() at <createAddress()>');
var path = this.addressManager.getNewAddressPath(isChange, step);
logger_1.default.debug('Deriving addr:' + path);
var address = address_1.Address.derive(this.id, this.addressType, this.publicKeyRing, path, this.m, this.coin, this.network, isChange, !this.nativeCashAddr);
return address;
};
Wallet.prototype.getSkippedAddress = function () {
$.checkState(this.isComplete(), 'Failed state: this.isComplete() at <getSkipeedAddress()>');
var next = this.addressManager.getNextSkippedPath();
if (!next)
return;
var address = address_1.Address.derive(this.id, this.addressType, this.publicKeyRing, next.path, this.m, this.coin, this.network, next.isChange);
return address;
};
Wallet.COPAYER_PAIR_LIMITS = {};
return Wallet;
}());
exports.Wallet = Wallet;
//# sourceMappingURL=wallet.js.map