UNPKG

bitcore-wallet-service

Version:
138 lines 6.63 kB
"use strict"; 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