From ce229b99776c15390b15760e425c313f1b145037 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 30 Nov 2021 14:14:16 -0500 Subject: [PATCH] initial patch --- packages/ripple-binary-codec/src/binary.ts | 1 + packages/ripple-binary-codec/src/enums/index.ts | 2 +- .../src/serdes/binary-serializer.ts | 17 +++++++++++++---- .../ripple-binary-codec/src/types/st-object.ts | 15 ++++++++++++--- .../test/fixtures/negative-unl.json | 8 ++++---- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/packages/ripple-binary-codec/src/binary.ts b/packages/ripple-binary-codec/src/binary.ts index 8b9f84ce..0f5d7755 100644 --- a/packages/ripple-binary-codec/src/binary.ts +++ b/packages/ripple-binary-codec/src/binary.ts @@ -66,6 +66,7 @@ function serializeObject(object: JsonObject, opts: OptionObject = {}): Buffer { const filter = signingFieldsOnly ? (f: FieldInstance): boolean => f.isSigningField : undefined + coreTypes.STObject.from(object, filter).toBytesSink(bytesList) if (suffix) { diff --git a/packages/ripple-binary-codec/src/enums/index.ts b/packages/ripple-binary-codec/src/enums/index.ts index 343d7e7b..9f8d7176 100644 --- a/packages/ripple-binary-codec/src/enums/index.ts +++ b/packages/ripple-binary-codec/src/enums/index.ts @@ -29,7 +29,7 @@ function fieldHeader(type: number, nth: number): Buffer { /* * @brief: Bytes, name, and ordinal representing one type, ledger_type, transaction type, or result */ -class Bytes { +export class Bytes { readonly bytes: Uint8Array constructor( diff --git a/packages/ripple-binary-codec/src/serdes/binary-serializer.ts b/packages/ripple-binary-codec/src/serdes/binary-serializer.ts index 1e7dea43..60b6b58b 100644 --- a/packages/ripple-binary-codec/src/serdes/binary-serializer.ts +++ b/packages/ripple-binary-codec/src/serdes/binary-serializer.ts @@ -126,15 +126,21 @@ class BinarySerializer { * @param field field to write to BinarySerializer * @param value value to write to BinarySerializer */ - writeFieldAndValue(field: FieldInstance, value: SerializedType): void { + writeFieldAndValue( + field: FieldInstance, + value: SerializedType, + isUnlModifyWorkaround = false, + ): void { const associatedValue = field.associatedType.from(value) assert.ok(associatedValue.toBytesSink !== undefined) assert.ok(field.name !== undefined) this.sink.put(field.header) + console.log(field.name, field.isVariableLengthEncoded) + if (field.isVariableLengthEncoded) { - this.writeLengthEncoded(associatedValue) + this.writeLengthEncoded(associatedValue, isUnlModifyWorkaround) } else { associatedValue.toBytesSink(this.sink) } @@ -145,9 +151,12 @@ class BinarySerializer { * * @param value length encoded value to write to BytesList */ - public writeLengthEncoded(value: SerializedType): void { + public writeLengthEncoded( + value: SerializedType, + isUnlModifyWorkaround = false, + ): void { const bytes = new BytesList() - value.toBytesSink(bytes) + if (!isUnlModifyWorkaround) value.toBytesSink(bytes) this.put(this.encodeVariableLength(bytes.getLength())) this.writeBytesList(bytes) } diff --git a/packages/ripple-binary-codec/src/types/st-object.ts b/packages/ripple-binary-codec/src/types/st-object.ts index f5fc56c6..9d07fdd7 100644 --- a/packages/ripple-binary-codec/src/types/st-object.ts +++ b/packages/ripple-binary-codec/src/types/st-object.ts @@ -1,4 +1,4 @@ -import { Field, FieldInstance } from '../enums' +import { Field, FieldInstance, Bytes } from '../enums' import { SerializedType, JsonObject } from './serialized-type' import { xAddressToClassicAddress, isValidXAddress } from 'ripple-address-codec' import { BinaryParser } from '../serdes/binary-parser' @@ -92,10 +92,13 @@ class STObject extends SerializedType { if (value instanceof STObject) { return value } + console.log('HIIIIIIIIIIIIIIII') const list: BytesList = new BytesList() const bytes: BinarySerializer = new BinarySerializer(list) + let isUnlModify = false + const xAddressDecoded = Object.entries(value).reduce((acc, [key, val]) => { let handled: JsonObject | undefined = undefined if (val && isValidXAddress(val.toString())) { @@ -120,13 +123,19 @@ class STObject extends SerializedType { if (filter !== undefined) { sorted = sorted.filter(filter) } + // console.log(sorted) sorted.forEach((field) => { const associatedValue = field.associatedType.from( xAddressDecoded[field.name], ) - - bytes.writeFieldAndValue(field, associatedValue) + // console.log(field, associatedValue) + if ((associatedValue as unknown as Bytes).name === 'UNLModify') { + isUnlModify = true + } + const isUnlModifyWorkaround = field.name == 'Account' && isUnlModify + console.log(isUnlModify, field.name, isUnlModifyWorkaround) + bytes.writeFieldAndValue(field, associatedValue, isUnlModifyWorkaround) if (field.type.name === ST_OBJECT) { bytes.put(OBJECT_END_MARKER_BYTE) } diff --git a/packages/ripple-binary-codec/test/fixtures/negative-unl.json b/packages/ripple-binary-codec/test/fixtures/negative-unl.json index 03817cd2..38d1ddbc 100644 --- a/packages/ripple-binary-codec/test/fixtures/negative-unl.json +++ b/packages/ripple-binary-codec/test/fixtures/negative-unl.json @@ -1,12 +1,12 @@ { - "binary": "120066240000000026000003006840000000000000007300701321ED9D593004CC501CACD261BD8E31E863F2B3F6CA69505E7FD54DA8F5690BEFB7AE8114000000000000000000000000000000000000000000101101", + "binary": "120066240000000026040B52006840000000000000007300701321EDB6FC8E803EE8EDC2793F1EC917B2EE41D35255618DEB91D3F9B1FC89B75D4539810000101101", "tx": { "UNLModifyDisabling": 1, - "LedgerSequence": 768, - "UNLModifyValidator": "ED9D593004CC501CACD261BD8E31E863F2B3F6CA69505E7FD54DA8F5690BEFB7AE", + "LedgerSequence": 67850752, + "UNLModifyValidator": "EDB6FC8E803EE8EDC2793F1EC917B2EE41D35255618DEB91D3F9B1FC89B75D4539", "TransactionType": "UNLModify", "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", "Sequence": 0, "Fee": "0", "SigningPubKey": ""} -} \ No newline at end of file +}