forked from Colored-Coins/Issuance-Encoder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathissueFlagsEncoder.js
39 lines (36 loc) · 1.36 KB
/
issueFlagsEncoder.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var aggregationPolicies = [
'aggregatable',
'hybrid',
'dispersed'
]
var padLeadingZeros = function (hex, byteSize) {
return (hex.length === byteSize * 2) && hex || padLeadingZeros('0' + hex, byteSize)
}
module.exports = {
encode: function (flags) {
var divisibility = flags.divisibility || 0
var lockStatus = flags.lockStatus || false
var aggregationPolicy = flags.aggregationPolicy || aggregationPolicies[0]
if (divisibility < 0 || divisibility > 7) throw new Error('Divisibility not in range')
if ((aggregationPolicy = aggregationPolicies.indexOf(aggregationPolicy)) < 0) throw new Error('Invalid aggregation policy')
var result = divisibility << 1
var lockStatusFlag = 0
lockStatus && (lockStatusFlag = 1)
result = result | lockStatusFlag
result = result << 2
result = result | aggregationPolicy
result = result << 2
result = padLeadingZeros(result.toString(16), 1)
return new Buffer(result, 'hex')
},
decode: function (consume) {
var number = consume(1)[0]
number = number >> 2 // least significant 2 bits unused
var aggregationPolicy = aggregationPolicies[number & 0x3]
number = number >> 2
var lockStatus = !!(number & 1)
number = number >> 1
var divisibility = (number & 0x7)
return {divisibility: divisibility, lockStatus: lockStatus, aggregationPolicy: aggregationPolicy}
}
}