var utils = exports; var assert = require('assert'); var bn = require('bn.js'); var hash = require('hash.js'); var base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZ' + 'abcdefghijkmnopqrstuvwxyz'; utils.toBase58 = function toBase58(arr) { var n = new bn(arr, 16); // 58 ^ 4 var mod = new bn(0xacad10); var res = ''; do { var r = n.mod(mod); n = n.div(mod); var end = n.cmp(0) === 0; assert.equal(r.length, 1); r = r.words[0]; for (var i = 0; i < 4; i++) { var c = r % 58; r = (r - c) / 58; if (c === 0 && r === 0 && end) break; res = base58[c] + res; } assert.equal(r, 0); } while (!end); // Add leading "zeroes" for (var i = 0; i < arr.length; i++) { if (arr[i] !== 0) break; res = '1' + res; } return res; }; utils.fromBase58 = function fromBase58(str) { // Count leading "zeroes" for (var i = 0; i < str.length; i++) if (str[i] !== '1') break; zeroes = i; // Read 4-char words and add them to bignum var q = 1; var w = 0; var res = new bn(0); for (var i = zeroes; i < str.length; i++) { var c = base58.indexOf(str[i]); assert(c >= 0 && c < 58); q *= 58; w *= 58; w += c; if (i === str.length - 1 || q === 0xacad10) { res = res.mul(q).add(w); q = 1; w = 0; } } // Add leading "zeroes" var z = []; for (var i = 0; i < zeroes; i++) z.push(0); return z.concat(res.toArray()); }; utils.sha256 = function sha256(data, enc) { return hash.sha256().update(data, enc).digest(); }; utils.readU32 = function readU32(arr) { return arr[0] | (arr[1] << 8) | (arr[2] << 16) | (arr[3] << 24); }; utils.ripesha = function ripesha(data, enc) { return hash.ripemd160().update(utils.sha256(data, enc)).digest(); }; utils.checksum = function checksum(data, enc) { return utils.sha256(utils.sha256(data, enc)).slice(0, 4); };