diff --git a/packages/ripple-binary-codec/HISTORY.md b/packages/ripple-binary-codec/HISTORY.md index 501d57fd..ef553f12 100644 --- a/packages/ripple-binary-codec/HISTORY.md +++ b/packages/ripple-binary-codec/HISTORY.md @@ -1,5 +1,8 @@ # ripple-binary-codec Release History +## 1.0.1 (2020-09-08) +- Filter out fields with undefined values + ## 1.0.0 (2020-08-17) - Migrate to TypeScript diff --git a/packages/ripple-binary-codec/README.md b/packages/ripple-binary-codec/README.md index e151433b..95d23efc 100644 --- a/packages/ripple-binary-codec/README.md +++ b/packages/ripple-binary-codec/README.md @@ -27,7 +27,7 @@ Decode a hex-string into a transaction object. ``` ### encode(json: object): string -Encode a transaction object into a hex-string. +Encode a transaction object into a hex-string. Note that encode filters out fields with undefined values. ```js > api.encode({ LedgerEntryType: 'AccountRoot', diff --git a/packages/ripple-binary-codec/package.json b/packages/ripple-binary-codec/package.json index 322f035d..52e415e2 100644 --- a/packages/ripple-binary-codec/package.json +++ b/packages/ripple-binary-codec/package.json @@ -1,6 +1,6 @@ { "name": "ripple-binary-codec", - "version": "1.0.0", + "version": "1.0.1", "description": "XRP Ledger binary codec", "files": [ "dist/*", diff --git a/packages/ripple-binary-codec/src/enums/README.md b/packages/ripple-binary-codec/src/enums/README.md index 524daac4..5f432260 100644 --- a/packages/ripple-binary-codec/src/enums/README.md +++ b/packages/ripple-binary-codec/src/enums/README.md @@ -10,7 +10,7 @@ Each ledger's state tree contain [ledger objects](https://xrpl.org/ledger-object ## Fields -These are Serialization Fields (`sf`) [defined in rippled's SField.cpp](https://github.com/ripple/rippled/blob/develop/src/ripple/protocol/impl/SField.cpp). +These are Serialization Fields (`sf`) [defined in rippled's SField.cpp](https://github.com/ripple/rippled/blob/develop/src/ripple/protocol/impl/SField.cpp). Fields with undefined values are omitted before encoding. ### Key diff --git a/packages/ripple-binary-codec/src/types/st-object.ts b/packages/ripple-binary-codec/src/types/st-object.ts index 791346fd..7ad575e0 100644 --- a/packages/ripple-binary-codec/src/types/st-object.ts +++ b/packages/ripple-binary-codec/src/types/st-object.ts @@ -109,7 +109,12 @@ class STObject extends SerializedType { let sorted = Object.keys(xAddressDecoded) .map((f: string): FieldInstance => Field[f] as FieldInstance) - .filter((f: FieldInstance): boolean => f !== undefined && f.isSerialized) + .filter( + (f: FieldInstance): boolean => + f !== undefined && + xAddressDecoded[f.name] !== undefined && + f.isSerialized + ) .sort((a, b) => { return a.ordinal - b.ordinal; }); diff --git a/packages/ripple-binary-codec/test/binary-serializer.test.js b/packages/ripple-binary-codec/test/binary-serializer.test.js index 0ab061f4..bbb63a7e 100644 --- a/packages/ripple-binary-codec/test/binary-serializer.test.js +++ b/packages/ripple-binary-codec/test/binary-serializer.test.js @@ -50,6 +50,53 @@ const PaymentChannel = { }, }; +let json_undefined = { + TakerPays: "223174650", + Account: "rPk2dXr27rMw9G5Ej9ad2Tt7RJzGy8ycBp", + TransactionType: "OfferCreate", + Memos: [ + { + Memo: { + MemoType: "584D4D2076616C7565", + MemoData: "322E3230393635", + MemoFormat: undefined, + }, + }, + ], + Fee: "15", + OfferSequence: undefined, + TakerGets: { + currency: "XMM", + value: "100", + issuer: "rExAPEZvbkZqYPuNcZ7XEBLENEshsWDQc8", + }, + Flags: 524288, + Sequence: undefined, + LastLedgerSequence: 6220135, +}; + +let json_omitted = { + TakerPays: "223174650", + Account: "rPk2dXr27rMw9G5Ej9ad2Tt7RJzGy8ycBp", + TransactionType: "OfferCreate", + Memos: [ + { + Memo: { + MemoType: "584D4D2076616C7565", + MemoData: "322E3230393635", + }, + }, + ], + Fee: "15", + TakerGets: { + currency: "XMM", + value: "100", + issuer: "rExAPEZvbkZqYPuNcZ7XEBLENEshsWDQc8", + }, + Flags: 524288, + LastLedgerSequence: 6220135, +}; + const NegativeUNL = require("./fixtures/negative-unl.json"); function bytesListTest() { @@ -179,6 +226,15 @@ function NegativeUNLTest() { }); } +function omitUndefinedTest() { + test("omits fields with undefined value", () => { + let encodedOmitted = encode(json_omitted); + let encodedUndefined = encode(json_undefined); + expect(encodedOmitted).toEqual(encodedUndefined); + expect(decode(encodedOmitted)).toEqual(decode(encodedUndefined)); + }); +} + describe("Binary Serialization", function () { describe("nestedObjectTests", () => nestedObjectTests()); describe("BytesList", () => bytesListTest()); @@ -188,4 +244,5 @@ describe("Binary Serialization", function () { describe("Escrow", () => EscrowTest()); describe("PaymentChannel", () => PaymentChannelTest()); describe("NegativeUNLTest", () => NegativeUNLTest()); + describe("OmitUndefined", () => omitUndefinedTest()); });