@leocuvee/turtlecoin-utils 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/.github/workflows/ci.yml +27 -0
  2. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  3. package/.idea/inspectionProfiles/Project_Default.xml +7 -0
  4. package/.idea/misc.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/turtlecoin-utils.iml +12 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/.travis.yml +11 -0
  9. package/CONTRIBUTING.md +3 -0
  10. package/LICENSE +674 -0
  11. package/README.md +203 -0
  12. package/config.json +7 -0
  13. package/docs/.nojekyll +0 -0
  14. package/docs/CNAME +1 -0
  15. package/docs/assets/css/main.css +2321 -0
  16. package/docs/assets/images/icons.png +0 -0
  17. package/docs/assets/images/icons@2x.png +0 -0
  18. package/docs/assets/images/widgets.png +0 -0
  19. package/docs/assets/images/widgets@2x.png +0 -0
  20. package/docs/assets/js/main.js +1 -0
  21. package/docs/assets/js/search.js +3 -0
  22. package/docs/classes/address.html +964 -0
  23. package/docs/classes/addressprefix.html +431 -0
  24. package/docs/classes/block.html +965 -0
  25. package/docs/classes/blocktemplate.html +695 -0
  26. package/docs/classes/cryptonote.html +1137 -0
  27. package/docs/classes/ed25519.keypair.html +400 -0
  28. package/docs/classes/ed25519.keys.html +373 -0
  29. package/docs/classes/extranoncetag.extranoncedata.html +454 -0
  30. package/docs/classes/extranoncetag.extranoncepaymentid.html +453 -0
  31. package/docs/classes/extranoncetag.iextranonce.html +347 -0
  32. package/docs/classes/extratag.extramergedmining.html +494 -0
  33. package/docs/classes/extratag.extranonce.html +530 -0
  34. package/docs/classes/extratag.extrapadding.html +456 -0
  35. package/docs/classes/extratag.extrapublickey.html +460 -0
  36. package/docs/classes/extratag.iextratag.html +355 -0
  37. package/docs/classes/levinpacket.html +674 -0
  38. package/docs/classes/levinpayloads.handshake.html +731 -0
  39. package/docs/classes/levinpayloads.ilevinpayload.html +318 -0
  40. package/docs/classes/levinpayloads.liteblock.html +494 -0
  41. package/docs/classes/levinpayloads.missingtransactions.html +494 -0
  42. package/docs/classes/levinpayloads.newblock.html +540 -0
  43. package/docs/classes/levinpayloads.newtransactions.html +402 -0
  44. package/docs/classes/levinpayloads.peerentry.html +610 -0
  45. package/docs/classes/levinpayloads.ping.html +450 -0
  46. package/docs/classes/levinpayloads.rawblock.html +344 -0
  47. package/docs/classes/levinpayloads.requestchain.html +402 -0
  48. package/docs/classes/levinpayloads.requestgetobjects.html +448 -0
  49. package/docs/classes/levinpayloads.requesttxpool.html +402 -0
  50. package/docs/classes/levinpayloads.responsechain.html +494 -0
  51. package/docs/classes/levinpayloads.responsegetobjects.html +540 -0
  52. package/docs/classes/levinpayloads.timedsync.html +540 -0
  53. package/docs/classes/multisig.html +930 -0
  54. package/docs/classes/multisigmessage.html +694 -0
  55. package/docs/classes/parentblock.html +347 -0
  56. package/docs/classes/transaction.html +925 -0
  57. package/docs/classes/transactioninputs.coinbaseinput.html +390 -0
  58. package/docs/classes/transactioninputs.itransactioninput.html +321 -0
  59. package/docs/classes/transactioninputs.keyinput.html +459 -0
  60. package/docs/classes/transactionoutputs.itransactionoutput.html +317 -0
  61. package/docs/classes/transactionoutputs.keyoutput.html +422 -0
  62. package/docs/enums/extranoncetag.noncetagtype.html +246 -0
  63. package/docs/enums/extratag.extratagtype.html +280 -0
  64. package/docs/enums/levinprotocol.commandtype.html +391 -0
  65. package/docs/enums/transactioninputs.inputtype.html +246 -0
  66. package/docs/enums/transactionoutputs.outputtype.html +229 -0
  67. package/docs/globals.html +238 -0
  68. package/docs/index.html +271 -0
  69. package/docs/interfaces/interfaces.config.html +590 -0
  70. package/docs/interfaces/interfaces.daemonblocktemplateresponse.html +323 -0
  71. package/docs/interfaces/interfaces.generatedinput.html +304 -0
  72. package/docs/interfaces/interfaces.generatedoutput.html +285 -0
  73. package/docs/interfaces/interfaces.inputkeys.html +304 -0
  74. package/docs/interfaces/interfaces.ipreparedtransaction.html +268 -0
  75. package/docs/interfaces/interfaces.output.html +399 -0
  76. package/docs/interfaces/interfaces.preparedringsignature.html +377 -0
  77. package/docs/interfaces/interfaces.preparedtransaction.html +329 -0
  78. package/docs/interfaces/interfaces.randomoutput.html +285 -0
  79. package/docs/interfaces/interfaces.transactionrecipient.html +285 -0
  80. package/docs/interfaces/multisiginterfaces.partialkeyimage.html +277 -0
  81. package/docs/interfaces/multisiginterfaces.partialsigningkey.html +277 -0
  82. package/docs/modules/ed25519.html +195 -0
  83. package/docs/modules/extranoncetag.html +208 -0
  84. package/docs/modules/extratag.html +216 -0
  85. package/docs/modules/interfaces.html +231 -0
  86. package/docs/modules/levinpayloads.html +247 -0
  87. package/docs/modules/levinprotocol.html +191 -0
  88. package/docs/modules/multisiginterfaces.html +195 -0
  89. package/docs/modules/transactioninputs.html +208 -0
  90. package/docs/modules/transactionoutputs.html +204 -0
  91. package/index.d.ts +417 -0
  92. package/index.js +1508 -0
  93. package/lib/base58.js +220 -0
  94. package/lib/biginteger.js +1591 -0
  95. package/lib/blocktemplate.js +408 -0
  96. package/lib/crypto.js +19698 -0
  97. package/lib/mnemonic.js +1204 -0
  98. package/lib/nacl-fast-cn.js +608 -0
  99. package/lib/ringsigs.js +24262 -0
  100. package/lib/sha3.js +477 -0
  101. package/package.json +58 -0
  102. package/src/Address.ts +433 -0
  103. package/src/AddressPrefix.ts +117 -0
  104. package/src/Block.ts +556 -0
  105. package/src/BlockTemplate.ts +289 -0
  106. package/src/Common.ts +105 -0
  107. package/src/Config.ts +66 -0
  108. package/src/CryptoNote.ts +1072 -0
  109. package/src/LevinPacket.ts +366 -0
  110. package/src/Multisig.ts +600 -0
  111. package/src/MultisigMessage.ts +374 -0
  112. package/src/ParentBlock.ts +39 -0
  113. package/src/Transaction.ts +628 -0
  114. package/src/Types/ED25519.ts +187 -0
  115. package/src/Types/IExtraNonce.ts +225 -0
  116. package/src/Types/IExtraTag.ts +507 -0
  117. package/src/Types/ITransaction.ts +230 -0
  118. package/src/Types/ITransactionInput.ts +190 -0
  119. package/src/Types/ITransactionOutput.ts +108 -0
  120. package/src/Types/LevinPayloads.ts +1576 -0
  121. package/src/Types/MultisigInterfaces.ts +65 -0
  122. package/src/Types/PortableStorage.ts +289 -0
  123. package/src/Types.ts +36 -0
  124. package/src/index.ts +36 -0
  125. package/test/template.json +6 -0
  126. package/test/test.js +1457 -0
  127. package/tests/blocktemplate.json +6 -0
  128. package/tests/tests.js +215 -0
  129. package/tsconfig.json +15 -0
  130. package/tslint.json +36 -0
  131. package/typedoc.json +10 -0
  132. package/webpack.config.js +15 -0
@@ -0,0 +1,65 @@
1
+ // Copyright (c) 2020, The TurtleCoin Developers
2
+ //
3
+ // Please see the included LICENSE file for more information.
4
+
5
+ import {Interfaces} from './ITransaction';
6
+
7
+ export namespace MultisigInterfaces {
8
+ /**
9
+ * Represents a partial key image
10
+ */
11
+ export interface PartialKeyImage {
12
+ /**
13
+ * The partial key image
14
+ */
15
+ partialKeyImage: string;
16
+ /**
17
+ * The transaction hash for which the partial key image belongs
18
+ */
19
+ transactionHash: string;
20
+ /**
21
+ * The index in the transaction outputs for which the partial key image belongs
22
+ */
23
+ outputIndex: number;
24
+ }
25
+
26
+ /**
27
+ * Represents a partial signing key for a particular prepared transaction
28
+ */
29
+ export interface PartialSigningKey {
30
+ /**
31
+ * The transaction prefix hash for which this partial signing key is valid
32
+ */
33
+ transactionPrefixHash: string;
34
+ /**
35
+ * The transaction signature index (which signature set this applies to)
36
+ */
37
+ index: number;
38
+ /**
39
+ * The partial signing key
40
+ */
41
+ partialSigningKey: string;
42
+ }
43
+
44
+ /** @ignore */
45
+ export interface Payload {
46
+ publicSpendKeys: PublicSpendKey[];
47
+ privateViewKey: string;
48
+ partialKeyImages?: PartialKeyImage[];
49
+ partialSigningKeys?: PartialSigningKey[];
50
+ preparedTransactions?: Interfaces.PreparedTransaction[];
51
+ }
52
+
53
+ /** @ignore */
54
+ export interface PublicSpendKey {
55
+ key: string;
56
+ signature: string;
57
+ }
58
+
59
+ /** @ignore */
60
+ export interface Transfer {
61
+ address: string;
62
+ messageId: number;
63
+ payload: string;
64
+ }
65
+ }
@@ -0,0 +1,289 @@
1
+ // Copyright (c) 2019-2020, The TurtleCoin Developers
2
+ //
3
+ // Please see the included LICENSE file for more information.
4
+
5
+ import {Reader, Writer} from 'bytestream-helper';
6
+ import {BigInteger, PortableStorageConstants} from '../Types';
7
+
8
+ /** @ignore */
9
+ type PortableStoreValue =
10
+ BigInteger.BigInteger |
11
+ Buffer |
12
+ PortableStorage |
13
+ PortableStorage[] |
14
+ string |
15
+ string[] |
16
+ boolean;
17
+
18
+ /** @ignore */
19
+ export enum StorageType {
20
+ NULL = 0x00,
21
+ INT64 = 0x01,
22
+ INT = 0x02,
23
+ INT16 = 0x03,
24
+ SBYTE = 0x04,
25
+ UINT64 = 0x05,
26
+ UINT32 = 0x06,
27
+ UINT16 = 0x07,
28
+ UINT8 = 0x08,
29
+ DOUBLE = 0x09,
30
+ STRING = 0x0a,
31
+ BOOL = 0x0b,
32
+ OBJECT = 0x0c,
33
+ OBJECT_ARRAY_BAD = 0x0d,
34
+ BUFFER = 0x0e,
35
+ STRING_ARRAY = 0x8a,
36
+ OBJECT_ARRAY = 0x8c,
37
+ }
38
+
39
+ /** @ignore */
40
+ interface PortableStorageEntry {
41
+ name: string;
42
+ type: StorageType;
43
+ value: any;
44
+ }
45
+
46
+ /** @ignore */
47
+ export class PortableStorage {
48
+
49
+ public get version(): number {
50
+ return this.m_version;
51
+ }
52
+
53
+ public set version(value: number) {
54
+ this.m_version = value;
55
+ }
56
+
57
+ public static from(data: Reader | Buffer | string, skipHeader: boolean = false): PortableStorage {
58
+ const reader = new Reader(data);
59
+
60
+ const result = new PortableStorage();
61
+
62
+ if (reader.unreadBytes === 0) {
63
+ return result;
64
+ }
65
+
66
+ if (!skipHeader) {
67
+ result.m_signatureA = reader.uint32_t().toJSNumber();
68
+ result.m_signatureB = reader.uint32_t().toJSNumber();
69
+
70
+ if (result.m_signatureA !== PortableStorageConstants.SIGNATURE_A
71
+ || result.m_signatureB !== PortableStorageConstants.SIGNATURE_B) {
72
+ throw new Error('Portable storage signature failure');
73
+ }
74
+
75
+ result.m_version = reader.uint8_t().toJSNumber();
76
+ }
77
+
78
+ result.m_entries = blobToEntries(reader);
79
+
80
+ if (!skipHeader && reader.unreadBytes !== 0) {
81
+ throw new RangeError('Unstructured data found in stream');
82
+ }
83
+
84
+ return result;
85
+ }
86
+
87
+ protected m_version: number = PortableStorageConstants.VERSION;
88
+ protected m_signatureA: number = PortableStorageConstants.SIGNATURE_A;
89
+ protected m_signatureB: number = PortableStorageConstants.SIGNATURE_B;
90
+ protected m_entries: PortableStorageEntry[] = [];
91
+
92
+ public get(name: string): PortableStoreValue {
93
+ for (const entry of this.m_entries) {
94
+ if (entry.name === name) {
95
+ return entry.value;
96
+ }
97
+ }
98
+
99
+ throw new Error('Entry not found');
100
+ }
101
+
102
+ public set(name: string, value: PortableStoreValue, type: StorageType) {
103
+ // tslint:disable-next-line:prefer-for-of
104
+ for (let i = 0; i < this.m_entries.length; i++) {
105
+ if (this.m_entries[i].name === name && this.m_entries[i].type === type) {
106
+ this.m_entries[i].value = value;
107
+ return;
108
+ }
109
+ }
110
+
111
+ this.m_entries.push({name, type, value});
112
+ }
113
+
114
+ public exists(name: string): boolean {
115
+ for (const entry of this.m_entries) {
116
+ if (entry.name === name) {
117
+ return true;
118
+ }
119
+ }
120
+
121
+ return false;
122
+ }
123
+
124
+ public toBuffer(skipHeader: boolean = false): Buffer {
125
+ const writer = new Writer();
126
+
127
+ if (!skipHeader) {
128
+ writer.uint32_t(this.m_signatureA);
129
+ writer.uint32_t(this.m_signatureB);
130
+ writer.uint8_t(this.m_version);
131
+ }
132
+
133
+ writer.write(entriesToBuffer(this.m_entries));
134
+
135
+ return writer.buffer;
136
+ }
137
+
138
+ public toString(skipHeader: boolean = false): string {
139
+ return this.toBuffer(skipHeader).toString('hex');
140
+ }
141
+ }
142
+
143
+ /** @ignore */
144
+ function blobToEntries(reader: Reader): PortableStorageEntry[] {
145
+ const entryCount = reader.varint(false, true).toJSNumber();
146
+ const entries: PortableStorageEntry[] = [];
147
+
148
+ for (let i = 0; i < entryCount; i++) {
149
+ const keyLength = reader.uint8_t().toJSNumber();
150
+ const name = reader.bytes(keyLength).toString();
151
+ const type = reader.uint8_t().toJSNumber();
152
+
153
+ let arrCount;
154
+ let j;
155
+ let value;
156
+ let valueLength;
157
+
158
+ switch (type) {
159
+ case StorageType.NULL:
160
+ entries.push({name, type, value: null});
161
+ break;
162
+
163
+ case StorageType.UINT64:
164
+ entries.push({name, type, value: reader.uint64_t(true)});
165
+ break;
166
+
167
+ case StorageType.UINT32:
168
+ entries.push({name, type, value: reader.uint32_t()});
169
+ break;
170
+
171
+ case StorageType.UINT16:
172
+ entries.push({name, type, value: reader.uint16_t()});
173
+ break;
174
+
175
+ case StorageType.UINT8:
176
+ entries.push({name, type, value: reader.uint8_t()});
177
+ break;
178
+
179
+ case StorageType.STRING:
180
+ valueLength = reader.varint(false, true).toJSNumber();
181
+ entries.push({name, type, value: reader.bytes(valueLength).toString('hex')});
182
+ break;
183
+
184
+ case StorageType.BOOL:
185
+ value = reader.uint8_t().toJSNumber();
186
+ entries.push({name, type, value: (value === 1)});
187
+ break;
188
+
189
+ case StorageType.OBJECT:
190
+ entries.push({name, type, value: PortableStorage.from(reader, true)});
191
+ break;
192
+
193
+ case StorageType.BUFFER:
194
+ valueLength = reader.varint(false, true).toJSNumber();
195
+ entries.push({name, type, value: reader.bytes(valueLength)});
196
+ break;
197
+
198
+ case StorageType.STRING_ARRAY:
199
+ arrCount = reader.varint(false, true).toJSNumber();
200
+ const sa_arr: string[] = [];
201
+
202
+ for (j = 0; j < arrCount; j++) {
203
+ const stringLength = reader.varint(false, true).toJSNumber();
204
+
205
+ sa_arr.push(reader.bytes(stringLength).toString('hex'));
206
+ }
207
+
208
+ entries.push({name, type, value: sa_arr});
209
+ break;
210
+
211
+ case StorageType.OBJECT_ARRAY:
212
+ arrCount = reader.varint(false, true).toJSNumber();
213
+ const oa_arr: PortableStorage[] = [];
214
+
215
+ for (j = 0; j < arrCount; j++) {
216
+ oa_arr.push(PortableStorage.from(reader, true));
217
+ }
218
+
219
+ entries.push({name, type, value: oa_arr});
220
+ break;
221
+ default:
222
+ throw new Error(type + ' not implemented');
223
+ }
224
+ }
225
+
226
+ return entries;
227
+ }
228
+
229
+ /** @ignore */
230
+ function entriesToBuffer(entries: PortableStorageEntry[]): Buffer {
231
+ const writer = new Writer();
232
+
233
+ writer.varint(entries.length, true);
234
+
235
+ for (const entry of entries) {
236
+ const keyName = Buffer.from(entry.name);
237
+ writer.uint8_t(keyName.length);
238
+ writer.write(keyName);
239
+ writer.uint8_t(entry.type);
240
+
241
+ switch (entry.type) {
242
+ case StorageType.UINT64:
243
+ writer.uint64_t(entry.value, true);
244
+ break;
245
+ case StorageType.UINT32:
246
+ writer.uint32_t(entry.value);
247
+ break;
248
+ case StorageType.UINT16:
249
+ writer.uint16_t(entry.value);
250
+ break;
251
+ case StorageType.UINT8:
252
+ writer.uint8_t(entry.value);
253
+ break;
254
+ case StorageType.STRING:
255
+ const s_buf = Buffer.from(entry.value, 'hex');
256
+ writer.varint(s_buf.length, true);
257
+ writer.write(s_buf);
258
+ break;
259
+ case StorageType.BOOL:
260
+ writer.uint8_t((entry.value) ? 1 : 0);
261
+ break;
262
+ case StorageType.OBJECT:
263
+ writer.write(entry.value.toBuffer(true));
264
+ break;
265
+ case StorageType.BUFFER:
266
+ writer.varint(entry.value.length, true);
267
+ writer.write(entry.value);
268
+ break;
269
+ case StorageType.STRING_ARRAY:
270
+ writer.varint(entry.value.length, true);
271
+ entry.value.forEach((v: string) => {
272
+ const vb = Buffer.from(v, 'hex');
273
+ writer.varint(vb.length, true);
274
+ writer.write(vb);
275
+ });
276
+ break;
277
+ case StorageType.OBJECT_ARRAY:
278
+ writer.varint(entry.value.length, true);
279
+ entry.value.forEach((v: PortableStorage) => {
280
+ writer.write(v.toBuffer(true));
281
+ });
282
+ break;
283
+ default:
284
+ throw new Error('Unknown type: ' + entry.type);
285
+ }
286
+ }
287
+
288
+ return writer.buffer;
289
+ }
package/src/Types.ts ADDED
@@ -0,0 +1,36 @@
1
+ // Copyright (c) 2018-2020, The TurtleCoin Developers
2
+ //
3
+ // Please see the included LICENSE file for more information.
4
+
5
+ import {Crypto} from 'turtlecoin-crypto';
6
+ import * as BigInteger from 'big-integer';
7
+
8
+ /** @ignore */
9
+ const TurtleCoinCrypto = new Crypto();
10
+
11
+ export {TurtleCoinCrypto};
12
+
13
+ /** @ignore */
14
+ export enum PortableStorageConstants {
15
+ SIGNATURE_A = 0x01011101,
16
+ SIGNATURE_B = 0x01020101,
17
+ VERSION = 1,
18
+ }
19
+
20
+ export * from './Types/IExtraNonce';
21
+
22
+ export * from './Types/IExtraTag';
23
+
24
+ export * from './Types/ITransactionInput';
25
+
26
+ export * from './Types/ITransactionOutput';
27
+
28
+ export * from './Types/ED25519';
29
+
30
+ export * from './Types/ITransaction';
31
+
32
+ export * from './Types/MultisigInterfaces';
33
+
34
+ export {PortableStorage, StorageType} from './Types/PortableStorage';
35
+
36
+ export {BigInteger};
package/src/index.ts ADDED
@@ -0,0 +1,36 @@
1
+ // Copyright (c) 2018-2020, The TurtleCoin Developers
2
+ //
3
+ // Please see the included LICENSE file for more information.
4
+
5
+ export {Address} from './Address';
6
+ export {AddressPrefix} from './AddressPrefix';
7
+ export {Block} from './Block';
8
+ export {BlockTemplate} from './BlockTemplate';
9
+ export {Crypto} from 'turtlecoin-crypto';
10
+ export {CryptoNote} from './CryptoNote';
11
+ export {LevinPacket, LevinProtocol} from './LevinPacket';
12
+ export {LevinPayloads} from './Types/LevinPayloads';
13
+ export {Multisig} from './Multisig';
14
+ export {MultisigMessage} from './MultisigMessage';
15
+ export {ParentBlock} from './ParentBlock';
16
+ export {Transaction} from './Transaction';
17
+
18
+ /** @ignore */
19
+ import * as Types from './Types';
20
+
21
+ /** @ignore */
22
+ import KeyInput = Types.TransactionInputs.KeyInput;
23
+ /** @ignore */
24
+ import KeyOutput = Types.TransactionOutputs.KeyOutput;
25
+ /** @ignore */
26
+ import KeyPair = Types.ED25519.KeyPair;
27
+ /** @ignore */
28
+ import Keys = Types.ED25519.Keys;
29
+
30
+ /** @ignore */
31
+ export {
32
+ KeyInput,
33
+ KeyOutput,
34
+ KeyPair,
35
+ Keys,
36
+ };
@@ -0,0 +1,6 @@
1
+ {
2
+ "blocktemplate": "0500b4318c1249164393f7b9d691e60aba81ca9bbffb9e0b23e6b01c93d9c621ab800000b5f9abe605000000000000000000000000000000000000000000000000000000000000000000000000010000000023032100000000000000000000000000000000000000000000000000000000000000000001b9fe5801ff91fe58070802959f9d01c4cbd664e7c937687e7ae847f75745614ba4a11a6f5c0b25a5ca42c314026840ba5dc6c84a533d005f0a6f9758c4eb4d19bffa3b4a73547596dac17b7d169003022f88b7b85f42c789721e7ee44bded4b6e1e48f7fb9bb73dc87cda264adf06a54f02e02175cea7cf09b914749c650b9321678d3f0e4390cad20ac6896be7ac14ba4f31ab0ea01021192fdc86fd815642850c0f50bc11df8ba1d39581d2c0642aa83f72f1c3fb22580ea3002c28a03fb9b3b7f6e4f9cdf2e74e93c8282580d8134722302b9978cdc3a35f39980897a02a4978ee1742da6f77791f065326922ff8c713687d2b52215ce7911b08922a7602901296929051bf0b258b717ffdca80c8b0822063c9d3f70f0dbed9b3f2e0aca2fa1020600000000000012f6b48f1800c368e046252e50165620fbb155176d17ddfdb98fd3227237760cf579af90593ec64a4a5549bd219969dc9aa1aac2dc3eab529c90b2f8c20221f99f02bdfb9a7efb5e5e85b710ef442b3cc82431173db142947a4f755a22f45915e5f2d53027a4aee505305c7cde822f960578417779ef71c1c8b611e95f1643fd125a39df66f40ce82794c9debc342381f26763c80968f8bf8e5378b433c583a6078348457ebe6ad61e5487ac3bebe22e03c46d9c894a511561ffbe9612809c17207493941d607b152f4ce193f828085ee8afcc0a351a9cecac0f01b2729df67af831637f76a8430848d86beb643df918af6cc554a8d0b42899671ee02cfbe64905b4458647a90a50aa307be48f3db57ff7f5446926ee70cee0c0cf7ad9021de727b2f97b5e2f0fd0103b24725d0c11ddd876de27a7b837bdd43eb4d9ca479883ad2dcd853ece92e6a7544b24e44051411e6b913760b9d997ca986985b92d51ccbc5708f0cd93c0ce2d1aea46a6744cc81a3df394cd099518cb3c3a5fa43e187c9d72bc3a245256fa60b450411b56d2258d4001b6133f58a5d48af0cc12af652c202b3c9de3f426026500c493c075340ca713a49843db16bda542fd76fb597914e1c975a70d12971baf70b8f7f6f452fd669f3cc00d0a0f36a3312f7c51cadf24cac9c24841eeaa742b5d1e74a750e5763afbd2a75e341edb4439801ac665dd0a3b16cc648a651546c7a3633f0a0274bb3815d6bda05e12fb7cbb908ceb582590a84a30ba6043178279343f5107713390b8e2ca2a8723ee7e5855c6af674bbd9b5a",
3
+ "difficulty": 9796275295,
4
+ "height": 1457937,
5
+ "reservedOffset": 411
6
+ }