@aioha/tx-digest 1.0.0

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.
@@ -0,0 +1,29 @@
1
+ import { hexToUint8Array, uint8ArrayToHex } from './uint8Array.js'
2
+
3
+ /** Buffer wrapper that serializes to a hex-encoded string. */
4
+ export class HexBuffer {
5
+ /** Convenience to create a new HexBuffer, does not copy data if value passed is already a buffer. */
6
+ static from(value) {
7
+ if (value instanceof HexBuffer) {
8
+ return value
9
+ } else if (value instanceof Uint8Array) {
10
+ return new HexBuffer(value)
11
+ } else if (typeof value === 'string') {
12
+ return new HexBuffer(hexToUint8Array(value))
13
+ } else {
14
+ return new HexBuffer(new Uint8Array(value))
15
+ }
16
+ }
17
+
18
+ constructor(buffer) {
19
+ this.buffer = buffer
20
+ }
21
+
22
+ toString(encoding = 'hex') {
23
+ return uint8ArrayToHex(this.buffer)
24
+ }
25
+
26
+ toJSON() {
27
+ return this.toString()
28
+ }
29
+ }
@@ -0,0 +1,36 @@
1
+ import bs58 from 'bs58'
2
+
3
+ const DEFAULT_ADDRESS_PREFIX = 'STM'
4
+
5
+ /** ECDSA (secp256k1) public key. */
6
+ export class PublicKey {
7
+ constructor(key, prefix = DEFAULT_ADDRESS_PREFIX) {
8
+ this.key = key
9
+ this.prefix = prefix
10
+ // assert(secp256k1.publicKeyVerify(key), 'invalid public key')
11
+ }
12
+
13
+ /** Create a new instance from a WIF-encoded key. */
14
+ static fromString(wif) {
15
+ const { key, prefix } = decodePublic(wif)
16
+ return new PublicKey(key, prefix)
17
+ }
18
+
19
+ /** Create a new instance. */
20
+ static from(value) {
21
+ if (value instanceof PublicKey) {
22
+ return value
23
+ } else {
24
+ return PublicKey.fromString(value)
25
+ }
26
+ }
27
+ }
28
+
29
+ /** Decode bs58+ripemd160-checksum encoded public key. */
30
+ const decodePublic = (encodedKey) => {
31
+ const prefix = encodedKey.slice(0, 3)
32
+ encodedKey = encodedKey.slice(3)
33
+ const buffer = bs58.decode(encodedKey)
34
+ const key = buffer.subarray(0, buffer.length - 4)
35
+ return { key, prefix }
36
+ }
@@ -0,0 +1,634 @@
1
+ import { PublicKey } from './PublicKey.js'
2
+ import { Asset } from './Asset.js'
3
+ import { HexBuffer } from './HexBuffer.js'
4
+
5
+ const VoidSerializer = () => {
6
+ throw new Error('Void can not be serialized')
7
+ }
8
+ const StringSerializer = (buffer, data) => {
9
+ buffer.writeVString(data)
10
+ }
11
+
12
+ const Int8Serializer = (buffer, data) => {
13
+ buffer.writeInt8(data)
14
+ }
15
+
16
+ const Int16Serializer = (buffer, data) => {
17
+ buffer.writeInt16(data)
18
+ }
19
+
20
+ const Int32Serializer = (buffer, data) => {
21
+ buffer.writeInt32(data)
22
+ }
23
+
24
+ const Int64Serializer = (buffer, data) => {
25
+ buffer.writeInt64(data)
26
+ }
27
+
28
+ const UInt8Serializer = (buffer, data) => {
29
+ buffer.writeUint8(data)
30
+ }
31
+
32
+ const UInt16Serializer = (buffer, data) => {
33
+ buffer.writeUint16(data)
34
+ }
35
+
36
+ const UInt32Serializer = (buffer, data) => {
37
+ buffer.writeUint32(data)
38
+ }
39
+
40
+ const UInt64Serializer = (buffer, data) => {
41
+ buffer.writeUint64(data)
42
+ }
43
+
44
+ const BooleanSerializer = (buffer, data) => {
45
+ buffer.writeByte(data ? 1 : 0)
46
+ }
47
+
48
+ const StaticVariantSerializer = (itemSerializers) => {
49
+ return (buffer, data) => {
50
+ let id = data[0]
51
+ const item = data[1]
52
+ // id was/is supposed to be 0 or integer here but seems to have been changed in e.g. comment_options
53
+ // extensions: [
54
+ // [
55
+ // "comment_payout_beneficiaries",
56
+ // {
57
+ // "beneficiaries": [
58
+ // {
59
+ // "account": "vimm",
60
+ // "weight": 1000
61
+ // }
62
+ // ]
63
+ // }
64
+ // ]
65
+ // ]
66
+ // "comment_payout_beneficiaries" was 0 and at some point it got changed
67
+ // It should still be serialized as a 0 or an integer
68
+ // Now the question is, always 0? will need an example transaction to prove otherwise
69
+ if (typeof id === 'string') {
70
+ if (id === 'update_proposal_end_date') {
71
+ id = 1
72
+ } else {
73
+ id = 0
74
+ }
75
+ }
76
+ buffer.writeVarint32(id)
77
+ itemSerializers[id](buffer, item)
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Serialize asset.
83
+ * @note This looses precision for amounts larger than 2^53-1/10^precision.
84
+ * Should not be a problem in real-word usage.
85
+ */
86
+ const AssetSerializer = (buffer, data) => {
87
+ const asset = Asset.from(data)
88
+ const precision = asset.getPrecision()
89
+ buffer.writeInt64(Math.round(asset.amount * Math.pow(10, precision)))
90
+ buffer.writeUint8(precision)
91
+ for (let i = 0; i < 7; i++) {
92
+ buffer.writeUint8(asset.symbol.charCodeAt(i) || 0)
93
+ }
94
+ }
95
+
96
+ const DateSerializer = (buffer, data) => {
97
+ buffer.writeUint32(Math.floor(new Date(data + 'Z').getTime() / 1000))
98
+ }
99
+
100
+ const PublicKeySerializer = (buffer, data) => {
101
+ if (data === null || (typeof data === 'string' && data.slice(-39) === '1111111111111111111111111111111114T1Anm')) {
102
+ buffer.append(new Uint8Array(33).fill(0))
103
+ } else {
104
+ buffer.append(PublicKey.from(data).key)
105
+ }
106
+ }
107
+
108
+ const BinarySerializer = (size = null) => {
109
+ return (buffer, data) => {
110
+ data = HexBuffer.from(data)
111
+ const len = data.buffer.length
112
+ if (size) {
113
+ if (len !== size) {
114
+ throw new Error(`Unable to serialize binary. Expected ${size} bytes, got ${len}`)
115
+ }
116
+ } else {
117
+ buffer.writeVarint32(len)
118
+ }
119
+ buffer.append(data.buffer)
120
+ }
121
+ }
122
+
123
+ const VariableBinarySerializer = BinarySerializer()
124
+
125
+ const FlatMapSerializer = (keySerializer, valueSerializer) => {
126
+ return (buffer, data) => {
127
+ buffer.writeVarint32(data.length)
128
+ for (const [key, value] of data) {
129
+ keySerializer(buffer, key)
130
+ valueSerializer(buffer, value)
131
+ }
132
+ }
133
+ }
134
+
135
+ const ArraySerializer = (itemSerializer) => {
136
+ return (buffer, data) => {
137
+ buffer.writeVarint32(data.length)
138
+ for (const item of data) {
139
+ itemSerializer(buffer, item)
140
+ }
141
+ }
142
+ }
143
+
144
+ const ObjectSerializer = (keySerializers) => {
145
+ return (buffer, data) => {
146
+ for (const [key, serializer] of keySerializers) {
147
+ try {
148
+ serializer(buffer, data[key])
149
+ } catch (error) {
150
+ error.message = `${key}: ${error.message}`
151
+ throw error
152
+ }
153
+ }
154
+ }
155
+ }
156
+
157
+ const OptionalSerializer = (valueSerializer) => {
158
+ return (buffer, data) => {
159
+ if (data !== undefined) {
160
+ buffer.writeByte(1)
161
+ valueSerializer(buffer, data)
162
+ } else {
163
+ buffer.writeByte(0)
164
+ }
165
+ }
166
+ }
167
+
168
+ const AuthoritySerializer = ObjectSerializer([
169
+ ['weight_threshold', UInt32Serializer],
170
+ ['account_auths', FlatMapSerializer(StringSerializer, UInt16Serializer)],
171
+ ['key_auths', FlatMapSerializer(PublicKeySerializer, UInt16Serializer)]
172
+ ])
173
+
174
+ const BeneficiarySerializer = ObjectSerializer([
175
+ ['account', StringSerializer],
176
+ ['weight', UInt16Serializer]
177
+ ])
178
+
179
+ const PriceSerializer = ObjectSerializer([
180
+ ['base', AssetSerializer],
181
+ ['quote', AssetSerializer]
182
+ ])
183
+
184
+ const SignedBlockHeaderSerializer = ObjectSerializer([
185
+ ['previous', BinarySerializer(20)],
186
+ ['timestamp', DateSerializer],
187
+ ['witness', StringSerializer],
188
+ ['transaction_merkle_root', BinarySerializer(20)],
189
+ ['extensions', ArraySerializer(VoidSerializer)],
190
+ ['witness_signature', BinarySerializer(65)]
191
+ ])
192
+
193
+ const ChainPropertiesSerializer = ObjectSerializer([
194
+ ['account_creation_fee', AssetSerializer],
195
+ ['maximum_block_size', UInt32Serializer],
196
+ ['hbd_interest_rate', UInt16Serializer]
197
+ ])
198
+
199
+ const OperationDataSerializer = (operationId, definitions) => {
200
+ const objectSerializer = ObjectSerializer(definitions)
201
+ return (buffer, data) => {
202
+ buffer.writeVarint32(operationId)
203
+ objectSerializer(buffer, data)
204
+ }
205
+ }
206
+
207
+ const OperationSerializers = {}
208
+
209
+ OperationSerializers.account_create = OperationDataSerializer(9, [
210
+ ['fee', AssetSerializer],
211
+ ['creator', StringSerializer],
212
+ ['new_account_name', StringSerializer],
213
+ ['owner', AuthoritySerializer],
214
+ ['active', AuthoritySerializer],
215
+ ['posting', AuthoritySerializer],
216
+ ['memo_key', PublicKeySerializer],
217
+ ['json_metadata', StringSerializer]
218
+ ])
219
+
220
+ OperationSerializers.account_create_with_delegation = OperationDataSerializer(41, [
221
+ ['fee', AssetSerializer],
222
+ ['delegation', AssetSerializer],
223
+ ['creator', StringSerializer],
224
+ ['new_account_name', StringSerializer],
225
+ ['owner', AuthoritySerializer],
226
+ ['active', AuthoritySerializer],
227
+ ['posting', AuthoritySerializer],
228
+ ['memo_key', PublicKeySerializer],
229
+ ['json_metadata', StringSerializer],
230
+ ['extensions', ArraySerializer(VoidSerializer)]
231
+ ])
232
+
233
+ OperationSerializers.account_update = OperationDataSerializer(10, [
234
+ ['account', StringSerializer],
235
+ ['owner', OptionalSerializer(AuthoritySerializer)],
236
+ ['active', OptionalSerializer(AuthoritySerializer)],
237
+ ['posting', OptionalSerializer(AuthoritySerializer)],
238
+ ['memo_key', PublicKeySerializer],
239
+ ['json_metadata', StringSerializer]
240
+ ])
241
+
242
+ OperationSerializers.account_witness_proxy = OperationDataSerializer(13, [
243
+ ['account', StringSerializer],
244
+ ['proxy', StringSerializer]
245
+ ])
246
+
247
+ OperationSerializers.account_witness_vote = OperationDataSerializer(12, [
248
+ ['account', StringSerializer],
249
+ ['witness', StringSerializer],
250
+ ['approve', BooleanSerializer]
251
+ ])
252
+
253
+ OperationSerializers.cancel_transfer_from_savings = OperationDataSerializer(34, [
254
+ ['from', StringSerializer],
255
+ ['request_id', UInt32Serializer]
256
+ ])
257
+
258
+ OperationSerializers.change_recovery_account = OperationDataSerializer(26, [
259
+ ['account_to_recover', StringSerializer],
260
+ ['new_recovery_account', StringSerializer],
261
+ ['extensions', ArraySerializer(VoidSerializer)]
262
+ ])
263
+
264
+ OperationSerializers.claim_account = OperationDataSerializer(22, [
265
+ ['creator', StringSerializer],
266
+ ['fee', AssetSerializer],
267
+ ['extensions', ArraySerializer(VoidSerializer)]
268
+ ])
269
+
270
+ OperationSerializers.claim_reward_balance = OperationDataSerializer(39, [
271
+ ['account', StringSerializer],
272
+ ['reward_hive', AssetSerializer],
273
+ ['reward_hbd', AssetSerializer],
274
+ ['reward_vests', AssetSerializer]
275
+ ])
276
+
277
+ OperationSerializers.comment = OperationDataSerializer(1, [
278
+ ['parent_author', StringSerializer],
279
+ ['parent_permlink', StringSerializer],
280
+ ['author', StringSerializer],
281
+ ['permlink', StringSerializer],
282
+ ['title', StringSerializer],
283
+ ['body', StringSerializer],
284
+ ['json_metadata', StringSerializer]
285
+ ])
286
+
287
+ OperationSerializers.comment_options = OperationDataSerializer(19, [
288
+ ['author', StringSerializer],
289
+ ['permlink', StringSerializer],
290
+ ['max_accepted_payout', AssetSerializer],
291
+ ['percent_hbd', UInt16Serializer],
292
+ ['allow_votes', BooleanSerializer],
293
+ ['allow_curation_rewards', BooleanSerializer],
294
+ [
295
+ 'extensions',
296
+ ArraySerializer(StaticVariantSerializer([ObjectSerializer([['beneficiaries', ArraySerializer(BeneficiarySerializer)]])]))
297
+ ]
298
+ ])
299
+
300
+ OperationSerializers.convert = OperationDataSerializer(8, [
301
+ ['owner', StringSerializer],
302
+ ['requestid', UInt32Serializer],
303
+ ['amount', AssetSerializer]
304
+ ])
305
+
306
+ OperationSerializers.create_claimed_account = OperationDataSerializer(23, [
307
+ ['creator', StringSerializer],
308
+ ['new_account_name', StringSerializer],
309
+ ['owner', AuthoritySerializer],
310
+ ['active', AuthoritySerializer],
311
+ ['posting', AuthoritySerializer],
312
+ ['memo_key', PublicKeySerializer],
313
+ ['json_metadata', StringSerializer],
314
+ ['extensions', ArraySerializer(VoidSerializer)]
315
+ ])
316
+
317
+ OperationSerializers.custom = OperationDataSerializer(15, [
318
+ ['required_auths', ArraySerializer(StringSerializer)],
319
+ ['id', UInt16Serializer],
320
+ ['data', VariableBinarySerializer]
321
+ ])
322
+
323
+ OperationSerializers.custom_binary = OperationDataSerializer(35, [
324
+ ['required_owner_auths', ArraySerializer(StringSerializer)],
325
+ ['required_active_auths', ArraySerializer(StringSerializer)],
326
+ ['required_posting_auths', ArraySerializer(StringSerializer)],
327
+ ['required_auths', ArraySerializer(AuthoritySerializer)],
328
+ ['id', StringSerializer],
329
+ ['data', VariableBinarySerializer]
330
+ ])
331
+
332
+ OperationSerializers.custom_json = OperationDataSerializer(18, [
333
+ ['required_auths', ArraySerializer(StringSerializer)],
334
+ ['required_posting_auths', ArraySerializer(StringSerializer)],
335
+ ['id', StringSerializer],
336
+ ['json', StringSerializer]
337
+ ])
338
+
339
+ OperationSerializers.decline_voting_rights = OperationDataSerializer(36, [
340
+ ['account', StringSerializer],
341
+ ['decline', BooleanSerializer]
342
+ ])
343
+
344
+ OperationSerializers.delegate_vesting_shares = OperationDataSerializer(40, [
345
+ ['delegator', StringSerializer],
346
+ ['delegatee', StringSerializer],
347
+ ['vesting_shares', AssetSerializer]
348
+ ])
349
+
350
+ OperationSerializers.delete_comment = OperationDataSerializer(17, [
351
+ ['author', StringSerializer],
352
+ ['permlink', StringSerializer]
353
+ ])
354
+
355
+ OperationSerializers.escrow_approve = OperationDataSerializer(31, [
356
+ ['from', StringSerializer],
357
+ ['to', StringSerializer],
358
+ ['agent', StringSerializer],
359
+ ['who', StringSerializer],
360
+ ['escrow_id', UInt32Serializer],
361
+ ['approve', BooleanSerializer]
362
+ ])
363
+
364
+ OperationSerializers.escrow_dispute = OperationDataSerializer(28, [
365
+ ['from', StringSerializer],
366
+ ['to', StringSerializer],
367
+ ['agent', StringSerializer],
368
+ ['who', StringSerializer],
369
+ ['escrow_id', UInt32Serializer]
370
+ ])
371
+
372
+ OperationSerializers.escrow_release = OperationDataSerializer(29, [
373
+ ['from', StringSerializer],
374
+ ['to', StringSerializer],
375
+ ['agent', StringSerializer],
376
+ ['who', StringSerializer],
377
+ ['receiver', StringSerializer],
378
+ ['escrow_id', UInt32Serializer],
379
+ ['hbd_amount', AssetSerializer],
380
+ ['hive_amount', AssetSerializer]
381
+ ])
382
+
383
+ OperationSerializers.escrow_transfer = OperationDataSerializer(27, [
384
+ ['from', StringSerializer],
385
+ ['to', StringSerializer],
386
+ ['agent', StringSerializer],
387
+ ['escrow_id', UInt32Serializer],
388
+ ['hbd_amount', AssetSerializer],
389
+ ['hive_amount', AssetSerializer],
390
+ ['fee', AssetSerializer],
391
+ ['ratification_deadline', DateSerializer],
392
+ ['escrow_expiration', DateSerializer],
393
+ ['json_meta', StringSerializer]
394
+ ])
395
+
396
+ OperationSerializers.feed_publish = OperationDataSerializer(7, [
397
+ ['publisher', StringSerializer],
398
+ ['exchange_rate', PriceSerializer]
399
+ ])
400
+
401
+ OperationSerializers.limit_order_cancel = OperationDataSerializer(6, [
402
+ ['owner', StringSerializer],
403
+ ['orderid', UInt32Serializer]
404
+ ])
405
+
406
+ OperationSerializers.limit_order_create = OperationDataSerializer(5, [
407
+ ['owner', StringSerializer],
408
+ ['orderid', UInt32Serializer],
409
+ ['amount_to_sell', AssetSerializer],
410
+ ['min_to_receive', AssetSerializer],
411
+ ['fill_or_kill', BooleanSerializer],
412
+ ['expiration', DateSerializer]
413
+ ])
414
+
415
+ OperationSerializers.limit_order_create2 = OperationDataSerializer(21, [
416
+ ['owner', StringSerializer],
417
+ ['orderid', UInt32Serializer],
418
+ ['amount_to_sell', AssetSerializer],
419
+ ['fill_or_kill', BooleanSerializer],
420
+ ['exchange_rate', PriceSerializer],
421
+ ['expiration', DateSerializer]
422
+ ])
423
+
424
+ OperationSerializers.recover_account = OperationDataSerializer(25, [
425
+ ['account_to_recover', StringSerializer],
426
+ ['new_owner_authority', AuthoritySerializer],
427
+ ['recent_owner_authority', AuthoritySerializer],
428
+ ['extensions', ArraySerializer(VoidSerializer)]
429
+ ])
430
+
431
+ OperationSerializers.report_over_production = OperationDataSerializer(16, [
432
+ ['reporter', StringSerializer],
433
+ ['first_block', SignedBlockHeaderSerializer],
434
+ ['second_block', SignedBlockHeaderSerializer]
435
+ ])
436
+
437
+ OperationSerializers.request_account_recovery = OperationDataSerializer(24, [
438
+ ['recovery_account', StringSerializer],
439
+ ['account_to_recover', StringSerializer],
440
+ ['new_owner_authority', AuthoritySerializer],
441
+ ['extensions', ArraySerializer(VoidSerializer)]
442
+ ])
443
+
444
+ OperationSerializers.reset_account = OperationDataSerializer(37, [
445
+ ['reset_account', StringSerializer],
446
+ ['account_to_reset', StringSerializer],
447
+ ['new_owner_authority', AuthoritySerializer]
448
+ ])
449
+
450
+ OperationSerializers.set_reset_account = OperationDataSerializer(38, [
451
+ ['account', StringSerializer],
452
+ ['current_reset_account', StringSerializer],
453
+ ['reset_account', StringSerializer]
454
+ ])
455
+
456
+ OperationSerializers.set_withdraw_vesting_route = OperationDataSerializer(20, [
457
+ ['from_account', StringSerializer],
458
+ ['to_account', StringSerializer],
459
+ ['percent', UInt16Serializer],
460
+ ['auto_vest', BooleanSerializer]
461
+ ])
462
+
463
+ OperationSerializers.transfer = OperationDataSerializer(2, [
464
+ ['from', StringSerializer],
465
+ ['to', StringSerializer],
466
+ ['amount', AssetSerializer],
467
+ ['memo', StringSerializer]
468
+ ])
469
+
470
+ OperationSerializers.transfer_from_savings = OperationDataSerializer(33, [
471
+ ['from', StringSerializer],
472
+ ['request_id', UInt32Serializer],
473
+ ['to', StringSerializer],
474
+ ['amount', AssetSerializer],
475
+ ['memo', StringSerializer]
476
+ ])
477
+
478
+ OperationSerializers.transfer_to_savings = OperationDataSerializer(32, [
479
+ ['from', StringSerializer],
480
+ ['to', StringSerializer],
481
+ ['amount', AssetSerializer],
482
+ ['memo', StringSerializer]
483
+ ])
484
+
485
+ OperationSerializers.transfer_to_vesting = OperationDataSerializer(3, [
486
+ ['from', StringSerializer],
487
+ ['to', StringSerializer],
488
+ ['amount', AssetSerializer]
489
+ ])
490
+
491
+ OperationSerializers.vote = OperationDataSerializer(0, [
492
+ ['voter', StringSerializer],
493
+ ['author', StringSerializer],
494
+ ['permlink', StringSerializer],
495
+ ['weight', Int16Serializer]
496
+ ])
497
+
498
+ OperationSerializers.withdraw_vesting = OperationDataSerializer(4, [
499
+ ['account', StringSerializer],
500
+ ['vesting_shares', AssetSerializer]
501
+ ])
502
+
503
+ OperationSerializers.witness_update = OperationDataSerializer(11, [
504
+ ['owner', StringSerializer],
505
+ ['url', StringSerializer],
506
+ ['block_signing_key', PublicKeySerializer],
507
+ ['props', ChainPropertiesSerializer],
508
+ ['fee', AssetSerializer]
509
+ ])
510
+
511
+ OperationSerializers.witness_set_properties = OperationDataSerializer(42, [
512
+ ['owner', StringSerializer],
513
+ ['props', FlatMapSerializer(StringSerializer, VariableBinarySerializer)],
514
+ ['extensions', ArraySerializer(VoidSerializer)]
515
+ ])
516
+
517
+ OperationSerializers.account_update2 = OperationDataSerializer(43, [
518
+ ['account', StringSerializer],
519
+ ['owner', OptionalSerializer(AuthoritySerializer)],
520
+ ['active', OptionalSerializer(AuthoritySerializer)],
521
+ ['posting', OptionalSerializer(AuthoritySerializer)],
522
+ ['memo_key', OptionalSerializer(PublicKeySerializer)],
523
+ ['json_metadata', StringSerializer],
524
+ ['posting_json_metadata', StringSerializer],
525
+ ['extensions', ArraySerializer(VoidSerializer)]
526
+ ])
527
+
528
+ OperationSerializers.create_proposal = OperationDataSerializer(44, [
529
+ ['creator', StringSerializer],
530
+ ['receiver', StringSerializer],
531
+ ['start_date', DateSerializer],
532
+ ['end_date', DateSerializer],
533
+ ['daily_pay', AssetSerializer],
534
+ ['subject', StringSerializer],
535
+ ['permlink', StringSerializer],
536
+ ['extensions', ArraySerializer(VoidSerializer)]
537
+ ])
538
+
539
+ OperationSerializers.update_proposal_votes = OperationDataSerializer(45, [
540
+ ['voter', StringSerializer],
541
+ ['proposal_ids', ArraySerializer(Int64Serializer)],
542
+ ['approve', BooleanSerializer],
543
+ ['extensions', ArraySerializer(VoidSerializer)]
544
+ ])
545
+
546
+ OperationSerializers.remove_proposal = OperationDataSerializer(46, [
547
+ ['proposal_owner', StringSerializer],
548
+ ['proposal_ids', ArraySerializer(Int64Serializer)],
549
+ ['extensions', ArraySerializer(VoidSerializer)]
550
+ ])
551
+
552
+ const ProposalUpdateSerializer = ObjectSerializer([['end_date', DateSerializer]])
553
+
554
+ OperationSerializers.update_proposal = OperationDataSerializer(47, [
555
+ ['proposal_id', UInt64Serializer],
556
+ ['creator', StringSerializer],
557
+ ['daily_pay', AssetSerializer],
558
+ ['subject', StringSerializer],
559
+ ['permlink', StringSerializer],
560
+ ['extensions', ArraySerializer(StaticVariantSerializer([VoidSerializer, ProposalUpdateSerializer]))]
561
+ ])
562
+
563
+ OperationSerializers.collateralized_convert = OperationDataSerializer(48, [
564
+ ['owner', StringSerializer],
565
+ ['requestid', UInt32Serializer],
566
+ ['amount', AssetSerializer]
567
+ ])
568
+
569
+ OperationSerializers.recurrent_transfer = OperationDataSerializer(49, [
570
+ ['from', StringSerializer],
571
+ ['to', StringSerializer],
572
+ ['amount', AssetSerializer],
573
+ ['memo', StringSerializer],
574
+ ['recurrence', UInt16Serializer],
575
+ ['executions', UInt16Serializer],
576
+ ['extensions', ArraySerializer(VoidSerializer)]
577
+ ])
578
+
579
+ const OperationSerializer = (buffer, operation) => {
580
+ const serializer = OperationSerializers[operation[0]]
581
+ if (!serializer) {
582
+ throw new Error(`No serializer for operation: ${operation[0]}`)
583
+ }
584
+ try {
585
+ serializer(buffer, operation[1])
586
+ } catch (error) {
587
+ error.message = `${operation[0]}: ${error.message}`
588
+ throw error
589
+ }
590
+ }
591
+
592
+ const TransactionSerializer = ObjectSerializer([
593
+ ['ref_block_num', UInt16Serializer],
594
+ ['ref_block_prefix', UInt32Serializer],
595
+ ['expiration', DateSerializer],
596
+ ['operations', ArraySerializer(OperationSerializer)],
597
+ ['extensions', ArraySerializer(StringSerializer)]
598
+ ])
599
+
600
+ const EncryptedMemoSerializer = ObjectSerializer([
601
+ ['from', PublicKeySerializer],
602
+ ['to', PublicKeySerializer],
603
+ ['nonce', UInt64Serializer],
604
+ ['check', UInt32Serializer],
605
+ ['encrypted', BinarySerializer()]
606
+ ])
607
+
608
+ export const Serializer = {
609
+ Array: ArraySerializer,
610
+ Asset: AssetSerializer,
611
+ Authority: AuthoritySerializer,
612
+ Binary: BinarySerializer,
613
+ Boolean: BooleanSerializer,
614
+ Date: DateSerializer,
615
+ FlatMap: FlatMapSerializer,
616
+ Int16: Int16Serializer,
617
+ Int32: Int32Serializer,
618
+ Int64: Int64Serializer,
619
+ Int8: Int8Serializer,
620
+ Memo: EncryptedMemoSerializer,
621
+ Object: ObjectSerializer,
622
+ Operation: OperationSerializer,
623
+ Optional: OptionalSerializer,
624
+ Price: PriceSerializer,
625
+ PublicKey: PublicKeySerializer,
626
+ StaticVariant: StaticVariantSerializer,
627
+ String: StringSerializer,
628
+ Transaction: TransactionSerializer,
629
+ UInt16: UInt16Serializer,
630
+ UInt32: UInt32Serializer,
631
+ UInt64: UInt64Serializer,
632
+ UInt8: UInt8Serializer,
633
+ Void: VoidSerializer
634
+ }
@@ -0,0 +1,13 @@
1
+ export const hexToUint8Array = (hexString) => {
2
+ const bytes = []
3
+ for (let i = 0; i < hexString.length; i += 2) {
4
+ bytes.push(parseInt(hexString.substr(i, 2), 16))
5
+ }
6
+ return new Uint8Array(bytes)
7
+ }
8
+
9
+ export const uint8ArrayToHex = (uint8Array) => {
10
+ return Array.from(uint8Array)
11
+ .map((byte) => byte.toString(16).padStart(2, '0'))
12
+ .join('')
13
+ }