UNPKG

alterdot-lib

Version:

A pure and powerful JavaScript Alterdot library.

292 lines (259 loc) 6.73 kB
/* eslint-disable */ // TODO: Remove previous line and work through linting issues at next edit 'use strict'; var _ = require('lodash'); var BufferUtil = require('./util/buffer'); var JSUtil = require('./util/js'); var networks = []; var networkMaps = {}; /** * A network is merely a map containing values that correspond to version * numbers for each bitcoin network. Currently only supporting "livenet" * (a.k.a. "mainnet") and "testnet". * @constructor */ function Network() {} Network.prototype.toString = function toString() { return this.name; }; /** * @function * @member Networks#get * Retrieves the network associated with a magic number or string. * @param {string|number|Network} arg * @param {string|Array} keys - if set, only check if the magic number associated with this name matches * @returns {Network} */ function get(arg, keys) { if (~networks.indexOf(arg)) { return arg; } if (keys) { if (!_.isArray(keys)) { keys = [keys]; } var containsArg = function (key) { return networks[index][key] === arg; }; for (var index in networks) { if (_.some(keys, containsArg)) { return networks[index]; } } return undefined; } var network = networkMaps[arg]; if ( network && network === testnet && (arg === 'local' || arg === 'regtest') ) { enableRegtest(); } return network; } /** * @function * @member Networks#add * Will add a custom Network * @param {Object} data * @param {string} data.name - The name of the network * @param {string|string[]} data.alias - The aliased name of the network * @param {Number} data.pubkeyhash - The publickey hash prefix * @param {Number} data.privatekey - The privatekey prefix * @param {Number} data.scripthash - The scripthash prefix * @param {Number} data.xpubkey - The extended public key magic for BIP32 * @param {Number} data.xprivkey - The extended private key magic for BIP32 * @param {Number} data.xpubkey256bit - The extended public key magic for DIP14 * @param {Number} data.xprivkey256bit - The extended private key magic for DIP14 * @param {Number} data.networkMagic - The network magic number * @param {Number} data.port - The network port * @param {Array} data.dnsSeeds - An array of dns seeds * @return {Network} */ function addNetwork(data) { var network = new Network(); JSUtil.defineImmutable(network, { name: data.name, alias: data.alias, pubkeyhash: data.pubkeyhash, privatekey: data.privatekey, scripthash: data.scripthash, xpubkey: data.xpubkey, xprivkey: data.xprivkey, xpubkey256bit: data.xpubkey256bit, xprivkey256bit: data.xprivkey256bit }); if (data.networkMagic) { JSUtil.defineImmutable(network, { networkMagic: BufferUtil.integerAsBuffer(data.networkMagic), }); } if (data.port) { JSUtil.defineImmutable(network, { port: data.port, }); } if (data.dnsSeeds) { JSUtil.defineImmutable(network, { dnsSeeds: data.dnsSeeds, }); } _.each(network, function (value) { if (!_.isUndefined(value) && !_.isObject(value)) { networkMaps[value] = network; } if (Array.isArray(value)) { value.forEach(function (v) { networkMaps[v] = network; }); } }); networks.push(network); return network; } /** * @function * @member Networks#remove * Will remove a custom network * @param {Network} network */ function removeNetwork(network) { for (var i = 0; i < networks.length; i++) { if (networks[i] === network) { networks.splice(i, 1); } } for (var key in networkMaps) { if (networkMaps[key] === network) { delete networkMaps[key]; } } } addNetwork({ name: 'livenet', alias: 'mainnet', pubkeyhash: 0x1c, privatekey: 0x8c, scripthash: 0x0a, xpubkey: 0x488b21e, // 'xpub' (Bitcoin Default) xprivkey: 0x488ade4, // 'xprv' (Bitcoin Default) //xpubkey256bit: 0x0eecefc5, // 'dpmp' (dashpay mainnet public) TODO_ADOT_HIGH not implemented in Alterdot //xprivkey256bit: 0x0eecf02e, // 'dpms' (dashpay mainnet secret) networkMagic: 0x2f324551, port: 31000, dnsSeeds: [ 'dnsseed1.alterdot.org', 'dnsseed2.alterdot.org', ], }); /** * @instance * @member Networks#livenet */ var livenet = get('livenet'); // TODO_ADOT_FUTURE left unchanged, not started in Alterdot addNetwork({ name: 'testnet', alias: ['regtest', 'devnet', 'evonet', 'local'], pubkeyhash: 0x8c, privatekey: 0xef, scripthash: 0x13, xpubkey: 0x43587cf, // 'tpub' (Bitcoin Default) xprivkey: 0x04358394, // 'tprv' (Bitcoin Default) xpubkey256bit: 0x0eed270b, // 'dptp' (dashpay testnet public) xprivkey256bit: 0x0eed2774// 'dpts' (dashpay testnet secret) }); /** * @instance * @member Networks#testnet */ var testnet = get('testnet'); // Add configurable values for testnet/regtest var TESTNET = { PORT: 19999, NETWORK_MAGIC: BufferUtil.integerAsBuffer(0xcee2caff), DNS_SEEDS: [ 'testnet-seed.darkcoin.io', 'testnet-seed.dashdot.io', 'test.dnsseed.masternode.io', ], }; for (var key in TESTNET) { if (!_.isObject(TESTNET[key])) { networkMaps[TESTNET[key]] = testnet; } } var REGTEST = { PORT: 19994, NETWORK_MAGIC: BufferUtil.integerAsBuffer(0xfcc1b7dc), DNS_SEEDS: [], }; for (var key in REGTEST) { if (!_.isObject(REGTEST[key])) { networkMaps[REGTEST[key]] = testnet; } } Object.defineProperty(testnet, 'port', { enumerable: true, configurable: false, get: function () { if (this.regtestEnabled) { return REGTEST.PORT; } else { return TESTNET.PORT; } }, }); Object.defineProperty(testnet, 'networkMagic', { enumerable: true, configurable: false, get: function () { if (this.regtestEnabled) { return REGTEST.NETWORK_MAGIC; } else { return TESTNET.NETWORK_MAGIC; } }, }); Object.defineProperty(testnet, 'dnsSeeds', { enumerable: true, configurable: false, get: function () { if (this.regtestEnabled) { return REGTEST.DNS_SEEDS; } else { return TESTNET.DNS_SEEDS; } }, }); /** * @function * @member Networks#enableRegtest * Will enable regtest features for testnet */ function enableRegtest() { testnet.regtestEnabled = true; } /** * @function * @member Networks#disableRegtest * Will disable regtest features for testnet */ function disableRegtest() { testnet.regtestEnabled = false; } /** * @namespace Networks */ module.exports = { add: addNetwork, remove: removeNetwork, defaultNetwork: livenet, livenet: livenet, mainnet: livenet, testnet: testnet, get: get, enableRegtest: enableRegtest, disableRegtest: disableRegtest, };