UNPKG

2.07 kBJavaScriptView Raw
1var crypto = require('crypto')
2var assert = require('assert')
3var base58 = require('bs58')
4
5function encode(payload, version) {
6 if (Array.isArray(payload) || payload instanceof Uint8Array)
7 payload = new Buffer(payload)
8
9 var buf
10 if (version != null) {
11 if (typeof version == 'number')
12 version = new Buffer([version])
13 buf = Buffer.concat([version, payload])
14 } else {
15 buf = payload
16 }
17
18 var checksum = sha256x2(buf).slice(0, 4)
19 var result = Buffer.concat([buf, checksum])
20 return base58.encode(result)
21}
22
23function decode(base58str, version) {
24 var arr = base58.decode(base58str)
25 var buf = new Buffer(arr)
26 var versionLength
27
28 if (version == null)
29 versionLength = 0
30 else {
31 if (typeof version == 'number')
32 version = new Buffer([version])
33
34 versionLength = version.length
35 var versionCompare = buf.slice(0, versionLength)
36 if (versionCompare.toString('hex') !== version.toString('hex'))
37 throw new Error('Invalid version')
38 }
39
40 var checksum = buf.slice(-4)
41 var endPos = buf.length - 4
42 var bytes = buf.slice(0, endPos)
43
44 var newChecksum = sha256x2(bytes).slice(0, 4)
45 if (checksum.toString('hex') !== newChecksum.toString('hex'))
46 throw new Error('Invalid checksum')
47
48 return bytes.slice(versionLength)
49}
50
51function isValid(base58str, version) {
52 try {
53 decode(base58str, version)
54 } catch (e) {
55 return false
56 }
57
58 return true
59}
60
61function createEncoder(version) {
62 return function(payload) {
63 return encode(payload, version)
64 }
65}
66
67function createDecoder(version) {
68 return function(base58str) {
69 return decode(base58str, version)
70 }
71}
72
73function createValidator(version) {
74 return function(base58str) {
75 return isValid(base58str, version)
76 }
77}
78
79function sha256x2(buffer) {
80 var sha = crypto.createHash('sha256').update(buffer).digest()
81 return crypto.createHash('sha256').update(sha).digest()
82}
83
84module.exports = {
85 encode: encode,
86 decode: decode,
87 isValid: isValid,
88 createEncoder: createEncoder,
89 createDecoder: createDecoder,
90 createValidator: createValidator
91}