UNPKG

1.93 kBJavaScriptView Raw
1// Base58 encoding/decoding
2// Originally written by Mike Hearn for BitcoinJ
3// Copyright (c) 2011 Google Inc
4// Ported to JavaScript by Stefan Thomas
5// Merged Buffer refactorings from base58-native by Stephen Pair
6// Copyright (c) 2013 BitPay Inc
7
8var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
9var ALPHABET_MAP = {}
10for(var i = 0; i < ALPHABET.length; i++) {
11 ALPHABET_MAP[ALPHABET.charAt(i)] = i
12}
13var BASE = 58
14
15function encode(buffer) {
16 if (buffer.length === 0) return ''
17
18 var i, j, digits = [0]
19 for (i = 0; i < buffer.length; i++) {
20 for (j = 0; j < digits.length; j++) digits[j] <<= 8
21
22 digits[0] += buffer[i]
23
24 var carry = 0
25 for (j = 0; j < digits.length; ++j) {
26 digits[j] += carry
27
28 carry = (digits[j] / BASE) | 0
29 digits[j] %= BASE
30 }
31
32 while (carry) {
33 digits.push(carry % BASE)
34
35 carry = (carry / BASE) | 0
36 }
37 }
38
39 // deal with leading zeros
40 for (i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) digits.push(0)
41
42 // convert digits to a string
43 var stringOutput = ""
44 for (var i = digits.length - 1; i >= 0; i--) {
45 stringOutput = stringOutput + ALPHABET[digits[i]]
46 }
47 return stringOutput
48}
49
50function decode(string) {
51 if (string.length === 0) return []
52
53 var i, j, bytes = [0]
54 for (i = 0; i < string.length; i++) {
55 var c = string[i]
56 if (!(c in ALPHABET_MAP)) throw new Error('Non-base58 character')
57
58 for (j = 0; j < bytes.length; j++) bytes[j] *= BASE
59 bytes[0] += ALPHABET_MAP[c]
60
61 var carry = 0
62 for (j = 0; j < bytes.length; ++j) {
63 bytes[j] += carry
64
65 carry = bytes[j] >> 8
66 bytes[j] &= 0xff
67 }
68
69 while (carry) {
70 bytes.push(carry & 0xff)
71
72 carry >>= 8
73 }
74 }
75
76 // deal with leading zeros
77 for (i = 0; string[i] === '1' && i < string.length - 1; i++) bytes.push(0)
78
79 return bytes.reverse()
80}
81
82module.exports = {
83 encode: encode,
84 decode: decode
85}