@@ -4,12 +4,25 @@ var DashJoin = ('object' === typeof module && exports) || {};
4
4
5
5
let DashP2P = window . DashP2P || require ( 'dashp2p' ) ;
6
6
7
+ const DV_LITTLE_ENDIAN = true ;
8
+
7
9
const DENOM_LOWEST = 100001 ;
8
10
const PREDENOM_MIN = DENOM_LOWEST + 193 ;
9
11
const COLLATERAL = 10000 ; // DENOM_LOWEST / 10
10
12
const PAYLOAD_SIZE_MAX = 4 * 1024 * 1024 ;
11
13
12
- const DSQ_SIZE = 1 ; // 1-byte bool
14
+ let STANDARD_DENOMINATIONS_MAP = {
15
+ // 0.00100001
16
+ 0b00010000 : 100001 ,
17
+ // 0.01000010
18
+ 0b00001000 : 1000010 ,
19
+ // 0.10000100
20
+ 0b00000100 : 10000100 ,
21
+ // 1.00001000
22
+ 0b00000010 : 100001000 ,
23
+ // 10.00010000
24
+ 0b00000001 : 1000010000 ,
25
+ } ;
13
26
14
27
// https://github.com/dashpay/dash/blob/v19.x/src/coinjoin/coinjoin.h#L39
15
28
// const COINJOIN_ENTRY_MAX_SIZE = 9; // real
@@ -31,6 +44,7 @@ var DashJoin = ('object' === typeof module && exports) || {};
31
44
32
45
let Packers = { } ;
33
46
let Parsers = { } ;
47
+ let Sizes = { } ;
34
48
let Utils = { } ;
35
49
36
50
// Ask Niles if there's an layman-ish obvious way to do this
@@ -52,29 +66,98 @@ var DashJoin = ('object' === typeof module && exports) || {};
52
66
* @param {Uint8Array? } [opts.message]
53
67
* @param {Boolean? } [opts.send]
54
68
*/
55
- Packers . senddsq = function ( { network, message = null , send = true } ) {
56
- // const command = 'senddsq';
57
- // if (!message) {
58
- // let dsqSize = DashP2P.sizes.HEADER_SIZE + DSQ_SIZE;
59
- // message = new Uint8Array(dsqSize);
60
- // }
61
-
62
- let payload = new Uint8Array ( 1 ) ;
69
+ Packers . senddsq = function ( {
70
+ network = 'mainnet' ,
71
+ message = null ,
72
+ send = true ,
73
+ } ) {
74
+ const command = 'senddsq' ;
75
+ const SENDDSQ_SIZE = 1 ; // 1-byte bool
76
+
77
+ if ( ! message ) {
78
+ let dsqSize = DashP2P . sizes . HEADER_SIZE + SENDDSQ_SIZE ;
79
+ message = new Uint8Array ( dsqSize ) ;
80
+ }
81
+
82
+ let payload = message . subarray ( DashP2P . sizes . HEADER_SIZE ) ;
63
83
if ( send ) {
64
84
payload . set ( [ 0x01 ] , 0 ) ;
65
85
} else {
66
86
payload . set ( [ 0x00 ] , 0 ) ;
67
87
}
68
88
69
- // let payload = message.subarray(DashP2P.sizes.HEADER_SIZE);
70
- // payload.set(sendByte, 0);
71
- // void DashP2P.packers.message({ network, command, bytes: message });
72
- // return {
73
- // message,
74
- // payload,
75
- // };
89
+ void DashP2P . packers . message ( { network, command, bytes : message } ) ;
90
+ return message ;
91
+ // return { message, payload };
92
+ } ;
93
+
94
+ Sizes . DSQ_SIZE = 142 ;
95
+ // DSQ stuff??
96
+ Sizes . DENOM = 4 ;
97
+ Sizes . PROTX = 32 ;
98
+ Sizes . TIME = 8 ;
99
+ Sizes . READY = 1 ;
100
+ Sizes . SIG = 97 ;
101
+ //
102
+
103
+ // Sizes.DSSU_SIZE = 16;
104
+ // Sizes.SESSION_ID_SIZE = 4;
76
105
77
- return payload ;
106
+ /**
107
+ * @param {Uint8Array } bytes
108
+ */
109
+ Parsers . dsq = function ( bytes ) {
110
+ if ( bytes . length !== Sizes . DSQ_SIZE ) {
111
+ let msg = `developer error: 'dsq' must be ${ Sizes . DSQ_SIZE } bytes, but received ${ bytes . length } ` ;
112
+ throw new Error ( msg ) ;
113
+ }
114
+ let dv = new DataView ( bytes . buffer ) ;
115
+
116
+ let offset = 0 ;
117
+
118
+ let denomination_id = dv . getUint32 ( offset , DV_LITTLE_ENDIAN ) ;
119
+ offset += Sizes . DENOM ;
120
+
121
+ //@ts -ignore - correctness of denomination must be checked higher up
122
+ let denomination = STANDARD_DENOMINATIONS_MAP [ denomination_id ] ;
123
+
124
+ /**
125
+ * Grab the protxhash
126
+ */
127
+ let protxhash_bytes = bytes . subarray ( offset , offset + Sizes . PROTX ) ;
128
+ offset += Sizes . PROTX ;
129
+
130
+ /**
131
+ * Grab the time
132
+ */
133
+ let timestamp64n = dv . getBigInt64 ( offset , DV_LITTLE_ENDIAN ) ;
134
+ offset += Sizes . TIME ;
135
+ let timestamp_unix = Number ( timestamp64n ) ;
136
+ let timestampMs = timestamp_unix * 1000 ;
137
+ let timestampDate = new Date ( timestampMs ) ;
138
+ let timestamp = timestampDate . toISOString ( ) ;
139
+
140
+ /**
141
+ * Grab the fReady
142
+ */
143
+ let ready = bytes [ offset ] > 0x00 ;
144
+ offset += Sizes . READY ;
145
+
146
+ let signature_bytes = bytes . subarray ( offset , offset + Sizes . SIG ) ;
147
+
148
+ let dsqMessage = {
149
+ denomination_id,
150
+ denomination,
151
+ protxhash_bytes,
152
+ // protxhash: '',
153
+ timestamp_unix,
154
+ timestamp,
155
+ ready,
156
+ signature_bytes,
157
+ // signature: '',
158
+ } ;
159
+
160
+ return dsqMessage ;
78
161
} ;
79
162
80
163
Utils . hexToBytes = function ( hex ) {
0 commit comments