diff --git a/lib/primitives/address.js b/lib/primitives/address.js index 0bedf746..20ad7a84 100644 --- a/lib/primitives/address.js +++ b/lib/primitives/address.js @@ -246,18 +246,21 @@ Address.prototype.toBech32 = function toBech32(network) { */ Address.prototype.fromString = function fromString(addr, network) { - let hrp; - assert(typeof addr === 'string'); + assert(addr.length > 0); + assert(addr.length <= 100); + // If the address is mixed case, + // it can only ever be base58. + if (isMixedCase(addr)) + return this.fromBase58(addr, network); + + // Otherwise, it's most likely bech32. try { - hrp = addr.substring(0, 2).toLowerCase(); - network = Network.fromBech32(hrp, network); + return this.fromBech32(addr, network); } catch (e) { return this.fromBase58(addr, network); } - - return this.fromBech32(addr, network); }; /** @@ -873,6 +876,29 @@ Address.getType = function getType(prefix, network) { } }; +/* + * Helpers + */ + +function isMixedCase(str) { + let upper = false; + let lower = false; + + for (let i = 0; i < str.length; i++) { + let ch = str.charCodeAt(i); + + if (ch & 32) + upper = true; + else + lower = true; + + if (upper && lower) + return true; + } + + return false; +} + /* * Expose */ diff --git a/lib/protocol/networks.js b/lib/protocol/networks.js index ab6109fa..f08b89b2 100644 --- a/lib/protocol/networks.js +++ b/lib/protocol/networks.js @@ -14,7 +14,7 @@ const BN = require('../crypto/bn'); const network = exports; -let main, testnet, regtest, segnet4, simnet; +let main, testnet, regtest, simnet; /** * Network type list. @@ -23,7 +23,7 @@ let main, testnet, regtest, segnet4, simnet; * @default */ -network.types = ['main', 'testnet', 'regtest', 'segnet4', 'simnet']; +network.types = ['main', 'testnet', 'regtest', 'simnet']; /** * Mainnet @@ -815,168 +815,6 @@ regtest.selfConnect = true; regtest.requestMempool = true; -/* - * segnet4 - */ - -segnet4 = network.segnet4 = {}; - -segnet4.type = 'segnet4'; - -segnet4.seeds = [ - '104.243.38.34', - '37.34.48.17' -]; - -segnet4.magic = 0xc4a1abdc; - -segnet4.port = 28901; - -segnet4.checkpointMap = {}; -segnet4.lastCheckpoint = 0; - -segnet4.halvingInterval = 210000; - -segnet4.genesis = { - version: 1, - hash: 'b291211d4bb2b7e1b7a4758225e69e50104091a637213d033295c010f55ffb18', - prevBlock: '0000000000000000000000000000000000000000000000000000000000000000', - merkleRoot: '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', - time: 1452831101, - bits: 503447551, - nonce: 0, - height: 0 -}; - -segnet4.genesisBlock = - '0100000000000000000000000000000000000000000000000000000000000000000000' - + '003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a7d71' - + '9856ffff011e0000000001010000000100000000000000000000000000000000000000' - + '00000000000000000000000000ffffffff4d04ffff001d0104455468652054696d6573' - + '2030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66' - + '207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01' - + '000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f' - + '61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f' - + 'ac00000000'; - -segnet4.pow = { - // 512x lower min difficulty than mainnet - limit: new BN( - '000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', - 'hex' - ), - bits: 503447551, - chainwork: new BN( - '0000000000000000000000000000000000000000000000000000000000800040', - 'hex' - ), - targetTimespan: 14 * 24 * 60 * 60, - targetSpacing: 10 * 60, - retargetInterval: 2016, - targetReset: true, - noRetargeting: false -}; - -segnet4.block = { - bip34height: 8, - bip34hash: '6c48386dc7c460defabb5640e28b6510a5f238cdbe6756c2976a7e0913000000', - bip65height: 8, - bip65hash: '6c48386dc7c460defabb5640e28b6510a5f238cdbe6756c2976a7e0913000000', - bip66height: 8, - bip66hash: '6c48386dc7c460defabb5640e28b6510a5f238cdbe6756c2976a7e0913000000', - pruneAfterHeight: 1000, - keepBlocks: 10000, - maxTipAge: 7 * 24 * 60 * 60, - slowHeight: 50000 -}; - -segnet4.bip30 = {}; - -segnet4.activationThreshold = 108; - -segnet4.minerWindow = 144; - -segnet4.deployments = { - csv: { - name: 'csv', - bit: 0, - startTime: 1456790400, // March 1st, 2016 - timeout: 1493596800, // May 1st, 2017 - threshold: -1, - window: -1, - required: false, - force: true - }, - segwit: { - name: 'segwit', - bit: 1, - startTime: 0, - timeout: 0xffffffff, - threshold: -1, - window: -1, - required: true, - force: false - }, - segsignal: { - name: 'segsignal', - bit: 4, - startTime: 0xffffffff, - timeout: 0xffffffff, - threshold: 269, - window: 336, - required: false, - force: false - }, - testdummy: { - name: 'testdummy', - bit: 28, - startTime: 1199145601, // January 1, 2008 - timeout: 1230767999, // December 31, 2008 - threshold: -1, - window: -1, - required: false, - force: true - } -}; - -segnet4.deploys = [ - segnet4.deployments.csv, - segnet4.deployments.segwit, - segnet4.deployments.segsignal, - segnet4.deployments.testdummy -]; - -segnet4.keyPrefix = { - privkey: 0x9e, - xpubkey: 0x053587cf, - xprivkey: 0x05358394, - xpubkey58: '2793', - xprivkey58: '2791', - coinType: 1 -}; - -segnet4.addressPrefix = { - pubkeyhash: 0x1e, - scripthash: 0x32, - witnesspubkeyhash: 0x04, - witnessscripthash: 0x29, - bech32: 'sg' -}; - -segnet4.requireStandard = false; - -segnet4.rpcPort = 28902; - -segnet4.minRelay = 1000; - -segnet4.feeRate = 20000; - -segnet4.maxFeeRate = 60000; - -segnet4.selfConnect = false; - -segnet4.requestMempool = true; - /* * Simnet (btcd) */