bitcore-wallet-service
Version:
A service for Mutisig HD Bitcoin Wallets
138 lines • 6.63 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Address = void 0;
const crypto_wallet_core_1 = require("crypto-wallet-core");
const lodash_1 = __importDefault(require("lodash"));
const index_1 = require("../chain/index");
const common_1 = require("../common");
const addressmanager_1 = require("./addressmanager");
const $ = require('preconditions').singleton();
const Constants = common_1.Common.Constants, Defaults = common_1.Common.Defaults, Utils = common_1.Common.Utils;
class Address {
static create(opts) {
opts = opts || {};
const x = new Address();
opts.chain = opts.chain || index_1.ChainService.getChain(opts.coin);
$.checkArgument(Utils.checkValueInCollection(opts.chain, Constants.CHAINS));
x.version = '1.0.0';
x.createdOn = Math.floor(Date.now() / 1000);
x.address = opts.address;
x.walletId = opts.walletId;
x.isChange = opts.isChange;
x.isEscrow = opts.isEscrow;
x.path = opts.path;
x.publicKeys = opts.publicKeys;
x.coin = opts.chain;
x.chain = opts.chain;
x.network = Address.Bitcore[opts.chain]
? Address.Bitcore[opts.chain].Address(x.address).toObject().network
: opts.network;
x.type = opts.type || Constants.SCRIPT_TYPES.P2SH;
x.hasActivity = undefined;
x.beRegistered = null;
return x;
}
static fromObj(obj) {
const x = new Address();
x.version = obj.version;
x.createdOn = obj.createdOn;
x.address = obj.address;
x.walletId = obj.walletId;
x.coin = obj.chain || index_1.ChainService.getChain(obj.coin);
x.chain = x.coin;
x.network = Utils.getNetworkName(x.chain, obj.network) || obj.network;
x.isChange = obj.isChange;
x.isEscrow = obj.isEscrow;
x.path = obj.path;
x.publicKeys = obj.publicKeys;
x.type = obj.type || Constants.SCRIPT_TYPES.P2SH;
x.hasActivity = obj.hasActivity;
x.beRegistered = obj.beRegistered;
return x;
}
static _deriveAddress(scriptType, publicKeyRing, path, m, chain, network, noNativeCashAddr, escrowInputs, hardwareSourcePublicKey, clientDerivedPublicKey) {
$.checkArgument(Utils.checkValueInCollection(scriptType, Constants.SCRIPT_TYPES));
const externSourcePublicKey = hardwareSourcePublicKey || clientDerivedPublicKey;
if (externSourcePublicKey) {
const bitcoreAddress = crypto_wallet_core_1.Deriver.getAddress(chain.toUpperCase(), network, externSourcePublicKey, scriptType);
return {
address: bitcoreAddress.toString(),
path,
publicKeys: [externSourcePublicKey]
};
}
let publicKeys = lodash_1.default.map(publicKeyRing, item => {
const xpub = Address.Bitcore[chain]
? new Address.Bitcore[chain].HDPublicKey(item.xPubKey)
: new Address.Bitcore.btc.HDPublicKey(item.xPubKey);
return xpub.deriveChild(path).publicKey;
});
let bitcoreAddress;
switch (scriptType) {
case Constants.SCRIPT_TYPES.P2WSH:
const nestedWitness = false;
bitcoreAddress = Address.Bitcore[chain].Address.createMultisig(publicKeys, m, network, nestedWitness, 'witnessscripthash');
break;
case Constants.SCRIPT_TYPES.P2SH:
if (escrowInputs) {
var xpub = new Address.Bitcore[chain].HDPublicKey(publicKeyRing[0].xPubKey);
const inputPublicKeys = escrowInputs.map(input => xpub.deriveChild(input.path).publicKey);
bitcoreAddress = Address.Bitcore[chain].Address.createEscrow(inputPublicKeys, publicKeys[0], network);
publicKeys = [publicKeys[0], ...inputPublicKeys];
}
else {
bitcoreAddress = Address.Bitcore[chain].Address.createMultisig(publicKeys, m, network);
}
break;
case Constants.SCRIPT_TYPES.P2WPKH:
bitcoreAddress = Address.Bitcore[chain].Address.fromPublicKey(publicKeys[0], network, 'witnesspubkeyhash');
break;
case Constants.SCRIPT_TYPES.P2PKH:
$.checkState(lodash_1.default.isArray(publicKeys) && publicKeys.length == 1, 'Failed state: publicKeys length < 1 or publicKeys not an array at <_deriveAddress()>');
if (Address.Bitcore[chain]) {
bitcoreAddress = Address.Bitcore[chain].Address.fromPublicKey(publicKeys[0], network);
}
else {
const { addressIndex, isChange } = new addressmanager_1.AddressManager().parseDerivationPath(path);
const [{ xPubKey }] = publicKeyRing;
bitcoreAddress = crypto_wallet_core_1.Deriver.deriveAddress(chain.toUpperCase(), network, xPubKey, addressIndex, isChange);
}
break;
case Constants.SCRIPT_TYPES.P2TR:
bitcoreAddress = Address.Bitcore[chain].Address.fromPublicKey(publicKeys[0], network, 'taproot');
break;
}
let addrStr = bitcoreAddress.toString(true);
if (noNativeCashAddr && chain == 'bch') {
addrStr = bitcoreAddress.toLegacyAddress();
}
return {
address: addrStr,
path,
publicKeys: lodash_1.default.invokeMap(publicKeys, 'toString')
};
}
static derive(walletId, scriptType, publicKeyRing, path, m, coin, network, isChange, chain, noNativeCashAddr = false, escrowInputs, hardwareSourcePublicKey, clientDerivedPublicKey) {
const raw = Address._deriveAddress(scriptType, publicKeyRing, path, m, chain || index_1.ChainService.getChain(coin), network, noNativeCashAddr, escrowInputs, hardwareSourcePublicKey, clientDerivedPublicKey);
return Address.create(lodash_1.default.extend(raw, {
coin,
chain,
network,
walletId,
type: scriptType,
isChange,
isEscrow: !!escrowInputs
}));
}
}
exports.Address = Address;
Address.Bitcore = {
btc: require('bitcore-lib'),
bch: require('bitcore-lib-cash'),
doge: require('bitcore-lib-doge'),
ltc: require('bitcore-lib-ltc')
};
//# sourceMappingURL=address.js.map