1
- var sjcl = require ( './utils' ) . sjcl ;
2
- var utils = require ( './utils' ) ;
3
- var extend = require ( 'extend' ) ;
1
+ 'use strict' ;
2
+ var _ = require ( 'lodash' ) ;
3
+ var sjcl = require ( './utils' ) . sjcl ;
4
+ var utils = require ( './utils' ) ;
5
+ var extend = require ( 'extend' ) ;
6
+ var convertBase = require ( './baseconverter' ) ;
4
7
5
8
var Base = { } ;
6
9
7
10
var alphabets = Base . alphabets = {
8
- ripple : 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz' ,
9
- tipple : 'RPShNAF39wBUDnEGHJKLM4pQrsT7VWXYZ2bcdeCg65jkm8ofqi1tuvaxyz' ,
10
- bitcoin : '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
11
+ ripple : 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz' ,
12
+ tipple : 'RPShNAF39wBUDnEGHJKLM4pQrsT7VWXYZ2bcdeCg65jkm8ofqi1tuvaxyz' ,
13
+ bitcoin : '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
11
14
} ;
12
15
13
16
extend ( Base , {
14
- VER_NONE : 1 ,
15
- VER_NODE_PUBLIC : 28 ,
16
- VER_NODE_PRIVATE : 32 ,
17
- VER_ACCOUNT_ID : 0 ,
18
- VER_ACCOUNT_PUBLIC : 35 ,
19
- VER_ACCOUNT_PRIVATE : 34 ,
20
- VER_FAMILY_GENERATOR : 41 ,
21
- VER_FAMILY_SEED : 33
17
+ VER_NONE : 1 ,
18
+ VER_NODE_PUBLIC : 28 ,
19
+ VER_NODE_PRIVATE : 32 ,
20
+ VER_ACCOUNT_ID : 0 ,
21
+ VER_ACCOUNT_PUBLIC : 35 ,
22
+ VER_ACCOUNT_PRIVATE : 34 ,
23
+ VER_FAMILY_GENERATOR : 41 ,
24
+ VER_FAMILY_SEED : 33
22
25
} ) ;
23
26
24
27
function sha256 ( bytes ) {
25
- return sjcl . codec . bytes . fromBits ( sjcl . hash . sha256 . hash ( sjcl . codec . bytes . toBits ( bytes ) ) ) ;
28
+ return sjcl . codec . bytes . fromBits (
29
+ sjcl . hash . sha256 . hash ( sjcl . codec . bytes . toBits ( bytes ) ) ) ;
26
30
}
27
31
28
- function sha256hash ( bytes ) {
29
- return sha256 ( sha256 ( bytes ) ) ;
30
- }
31
-
32
- function divmod58 ( number , startAt ) {
33
- var remainder = 0 ;
34
- for ( var i = startAt ; i < number . length ; i ++ ) {
35
- var digit256 = number [ i ] & 0xFF ;
36
- var temp = remainder * 256 + digit256 ;
37
- number [ i ] = ( temp / 58 ) ;
38
- remainder = temp % 58 ;
39
- }
40
- return remainder ;
41
- }
42
-
43
- function divmod256 ( number58 , startAt ) {
44
- var remainder = 0 ;
45
- for ( var i = startAt ; i < number58 . length ; i ++ ) {
46
- var digit58 = number58 [ i ] & 0xFF ;
47
- var temp = remainder * 58 + digit58 ;
48
- number58 [ i ] = ( temp / 256 ) ;
49
- remainder = temp % 256 ;
50
- }
51
- return remainder ;
52
- }
53
-
54
- function encodeString ( alphabet , input ) {
55
- if ( input . length == 0 ) {
32
+ function encodeString ( alphabet , input ) {
33
+ if ( input . length === 0 ) {
56
34
return [ ] ;
57
35
}
58
36
59
- // we need to copy the buffer for calc
60
- scratch = input . slice ( ) ;
61
-
62
- // Count leading zeroes.
63
- var zeroCount = 0 ;
64
- while ( zeroCount < scratch . length &&
65
- scratch [ zeroCount ] == 0 )
66
- ++ zeroCount ;
67
-
68
- // The actual encoding.
69
- var out = new Array ( scratch . length * 2 ) ;
70
- var j = out . length ;
71
- var startAt = zeroCount ;
72
-
73
- while ( startAt < scratch . length ) {
74
- var mod = divmod58 ( scratch , startAt ) ;
75
- if ( scratch [ startAt ] == 0 ) {
76
- ++ startAt ;
77
- }
78
- out [ -- j ] = alphabet [ mod ] ;
79
- }
80
-
81
- // Strip extra 'r' if there are some after decoding.
82
- while ( j < out . length && out [ j ] == alphabet [ 0 ] ) ++ j ;
83
- // Add as many leading 'r' as there were leading zeros.
84
- while ( -- zeroCount >= 0 ) out [ -- j ] = alphabet [ 0 ] ;
85
- while ( j -- ) out . shift ( ) ;
86
-
87
- return out . join ( '' ) ;
37
+ var leadingZeros = _ . takeWhile ( input , function ( d ) {
38
+ return d === 0 ;
39
+ } ) ;
40
+ var out = convertBase ( input , 256 , 58 ) . map ( function ( digit ) {
41
+ return alphabet [ digit ] ;
42
+ } ) ;
43
+ var prefix = leadingZeros . map ( function ( ) {
44
+ return alphabet [ 0 ] ;
45
+ } ) ;
46
+ return prefix . concat ( out ) . join ( '' ) ;
88
47
}
89
48
90
- function decodeString ( indexes , input ) {
91
- var isString = typeof input === 'string' ;
92
-
93
- if ( input . length == 0 ) {
49
+ function decodeString ( indexes , input ) {
50
+ if ( input . length === 0 ) {
94
51
return [ ] ;
95
52
}
96
53
97
- input58 = new Array ( input . length ) ;
98
-
99
- // Transform the String to a base58 byte sequence
100
- for ( var i = 0 ; i < input . length ; ++ i ) {
101
- if ( isString ) {
102
- var c = input . charCodeAt ( i ) ;
103
- }
104
-
105
- var digit58 = - 1 ;
106
- if ( c >= 0 && c < 128 ) {
107
- digit58 = indexes [ c ] ;
108
- }
109
- if ( digit58 < 0 ) {
110
- throw new Error ( "Illegal character " + c + " at " + i ) ;
111
- }
112
-
113
- input58 [ i ] = digit58 ;
114
- }
115
- // Count leading zeroes
116
- var zeroCount = 0 ;
117
- while ( zeroCount < input58 . length && input58 [ zeroCount ] == 0 ) {
118
- ++ zeroCount ;
119
- }
120
- // The encoding
121
- out = utils . arraySet ( input . length , 0 ) ;
122
- var j = out . length ;
123
-
124
- var startAt = zeroCount ;
125
- while ( startAt < input58 . length ) {
126
- var mod = divmod256 ( input58 , startAt ) ;
127
- if ( input58 [ startAt ] == 0 ) {
128
- ++ startAt ;
129
- }
130
- out [ -- j ] = mod ;
131
- }
132
-
133
- // Do no add extra leading zeroes, move j to first non null byte.
134
- while ( j < out . length && ( out [ j ] == 0 ) ) ++ j ;
135
-
136
- j -= zeroCount ;
137
- while ( j -- ) out . shift ( ) ;
138
-
139
- return out ;
54
+ var input58 = input . split ( '' ) . map ( function ( c ) {
55
+ return indexes [ c . charCodeAt ( 0 ) ] ;
56
+ } ) ;
57
+ var leadingZeros = _ . takeWhile ( input58 , function ( d ) {
58
+ return d === 0 ;
59
+ } ) ;
60
+ var out = convertBase ( input58 , 58 , 256 ) ;
61
+ var prefix = leadingZeros . map ( function ( ) {
62
+ return 0 ;
63
+ } ) ;
64
+ return prefix . concat ( out ) ;
140
65
}
141
66
142
67
function Base58 ( alphabet ) {
@@ -151,8 +76,8 @@ function Base58(alphabet) {
151
76
}
152
77
153
78
Base . encoders = { } ;
154
- Object . keys ( alphabets ) . forEach ( function ( alphabet ) {
155
- Base . encoders [ alphabet ] = Base58 ( alphabets [ alphabet ] ) ;
79
+ Object . keys ( alphabets ) . forEach ( function ( alphabet ) {
80
+ Base . encoders [ alphabet ] = new Base58 ( alphabets [ alphabet ] ) ;
156
81
} ) ;
157
82
158
83
// --> input: big-endian array of bytes.
@@ -165,22 +90,21 @@ Base.encode = function(input, alpha) {
165
90
// <-- array of bytes or undefined.
166
91
Base . decode = function ( input , alpha ) {
167
92
if ( typeof input !== 'string' ) {
168
- return void ( 0 ) ;
93
+ return undefined ;
169
94
}
170
95
try {
171
96
return this . encoders [ alpha || 'ripple' ] . decode ( input ) ;
172
- }
173
- catch ( e ) {
174
- return ( void 0 ) ;
97
+ } catch ( e ) {
98
+ return undefined ;
175
99
}
176
100
} ;
177
101
178
102
Base . verify_checksum = function ( bytes ) {
179
- var computed = sha256hash ( bytes . slice ( 0 , - 4 ) ) . slice ( 0 , 4 ) ;
103
+ var computed = sha256 ( sha256 ( bytes . slice ( 0 , - 4 ) ) ) . slice ( 0 , 4 ) ;
180
104
var checksum = bytes . slice ( - 4 ) ;
181
105
var result = true ;
182
106
183
- for ( var i = 0 ; i < 4 ; i ++ ) {
107
+ for ( var i = 0 ; i < 4 ; i ++ ) {
184
108
if ( computed [ i ] !== checksum [ i ] ) {
185
109
result = false ;
186
110
break ;
@@ -194,7 +118,7 @@ Base.verify_checksum = function(bytes) {
194
118
// <-- String
195
119
Base . encode_check = function ( version , input , alphabet ) {
196
120
var buffer = [ ] . concat ( version , input ) ;
197
- var check = sha256 ( sha256 ( buffer ) ) . slice ( 0 , 4 ) ;
121
+ var check = sha256 ( sha256 ( buffer ) ) . slice ( 0 , 4 ) ;
198
122
199
123
return Base . encode ( [ ] . concat ( buffer , check ) , alphabet ) ;
200
124
} ;
@@ -217,7 +141,7 @@ Base.decode_check = function(version, input, alphabet) {
217
141
if ( Array . isArray ( version ) ) {
218
142
var match = false ;
219
143
220
- for ( var i = 0 , l = version . length ; i < l ; i ++ ) {
144
+ for ( var i = 0 , l = version . length ; i < l ; i ++ ) {
221
145
match |= version [ i ] === buffer [ 0 ] ;
222
146
}
223
147
@@ -234,7 +158,7 @@ Base.decode_check = function(version, input, alphabet) {
234
158
// intrepret the value as a negative number
235
159
buffer [ 0 ] = 0 ;
236
160
237
- return sjcl . bn . fromBits (
161
+ return sjcl . bn . fromBits (
238
162
sjcl . codec . bytes . toBits ( buffer . slice ( 0 , - 4 ) ) ) ;
239
163
} ;
240
164
0 commit comments