Skip to content

Commit 72cb916

Browse files
committed
add stable stringify
1 parent 8c17489 commit 72cb916

File tree

4 files changed

+16
-10
lines changed

4 files changed

+16
-10
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/xrpl/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
"eventemitter3": "^5.0.1",
3131
"ripple-address-codec": "^5.0.0",
3232
"ripple-binary-codec": "^2.5.0",
33-
"ripple-keypairs": "^2.0.0"
33+
"ripple-keypairs": "^2.0.0",
34+
"fast-json-stable-stringify": "^2.1.0"
3435
},
3536
"devDependencies": {
3637
"@types/node": "^18.18.38",

packages/xrpl/src/models/transactions/common.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable max-lines -- common utility file */
22
/* eslint-disable no-continue -- makes logic easier to write and read in this case */
33
import { HEX_REGEX, hexToString, stringToHex } from '@xrplf/isomorphic/utils'
4+
import stableStringify from 'fast-json-stable-stringify'
45
import { isValidClassicAddress, isValidXAddress } from 'ripple-address-codec'
56
import { TRANSACTION_TYPES } from 'ripple-binary-codec'
67

@@ -1040,7 +1041,11 @@ function shortenKeys(
10401041

10411042
/**
10421043
* Encodes MPTokenMetadata object to a hex string.
1043-
* Shortens long field names to their compact form along the way.
1044+
* Steps:
1045+
* 1. Shorten long field names to their compact form equivalents.
1046+
* 2. Sort the fields alphabetically for deterministic encoding.
1047+
* 3. Stringify the object.
1048+
* 4. Convert to hex.
10441049
*
10451050
* @param mptokenMetadata - MPTokenMetadata to encode.
10461051
* @returns Hex encoded MPTokenMetadata.
@@ -1081,7 +1086,7 @@ export function encodeMPTokenMetadata(
10811086
)
10821087
}
10831088

1084-
return stringToHex(JSON.stringify(input)).toUpperCase()
1089+
return stringToHex(stableStringify(input)).toUpperCase()
10851090
}
10861091

10871092
/**

packages/xrpl/test/fixtures/transactions/mptokenMetadataEncodeDecodeData.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
"cusip": "912796RX0"
5858
}
5959
},
60-
"hex": "7B2274223A225442494C4C222C226E223A22542D42696C6C205969656C6420546F6B656E222C2264223A2241207969656C642D62656172696E6720737461626C65636F696E206261636B65642062792073686F72742D7465726D20552E532E205472656173757269657320616E64206D6F6E6579206D61726B657420696E737472756D656E74732E222C2269223A2268747470733A2F2F6578616D706C652E6F72672F7462696C6C2D69636F6E2E706E67222C226163223A22727761222C226173223A227472656173757279222C22696E223A224578616D706C65205969656C6420436F2E222C227573223A5B7B2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F7462696C6C222C2263223A2277656273697465222C2274223A2250726F647563742050616765227D2C7B2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F646F6373222C2263223A22646F6373222C2274223A225969656C6420546F6B656E20446F6373227D5D2C226169223A7B22696E7465726573745F72617465223A22352E303025222C22696E7465726573745F74797065223A227661726961626C65222C227969656C645F736F75726365223A22552E532E2054726561737572792042696C6C73222C226D617475726974795F64617465223A22323034352D30362D3330222C226375736970223A22393132373936525830227D7D"
60+
"hex": "7B226163223A22727761222C226169223A7B226375736970223A22393132373936525830222C22696E7465726573745F72617465223A22352E303025222C22696E7465726573745F74797065223A227661726961626C65222C226D617475726974795F64617465223A22323034352D30362D3330222C227969656C645F736F75726365223A22552E532E2054726561737572792042696C6C73227D2C226173223A227472656173757279222C2264223A2241207969656C642D62656172696E6720737461626C65636F696E206261636B65642062792073686F72742D7465726D20552E532E205472656173757269657320616E64206D6F6E6579206D61726B657420696E737472756D656E74732E222C2269223A2268747470733A2F2F6578616D706C652E6F72672F7462696C6C2D69636F6E2E706E67222C22696E223A224578616D706C65205969656C6420436F2E222C226E223A22542D42696C6C205969656C6420546F6B656E222C2274223A225442494C4C222C227573223A5B7B2263223A2277656273697465222C2274223A2250726F647563742050616765222C2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F7462696C6C227D2C7B2263223A22646F6373222C2274223A225969656C6420546F6B656E20446F6373222C2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F646F6373227D5D7D"
6161
},
6262
{
6363
"testName": "valid MPTokenMetadata with all short field names",
@@ -117,7 +117,7 @@
117117
"cusip": "912796RX0"
118118
}
119119
},
120-
"hex": "7B2274223A225442494C4C222C226E223A22542D42696C6C205969656C6420546F6B656E222C2264223A2241207969656C642D62656172696E6720737461626C65636F696E206261636B65642062792073686F72742D7465726D20552E532E205472656173757269657320616E64206D6F6E6579206D61726B657420696E737472756D656E74732E222C2269223A2268747470733A2F2F6578616D706C652E6F72672F7462696C6C2D69636F6E2E706E67222C226163223A22727761222C226173223A227472656173757279222C22696E223A224578616D706C65205969656C6420436F2E222C227573223A5B7B2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F7462696C6C222C2263223A2277656273697465222C2274223A2250726F647563742050616765227D2C7B2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F646F6373222C2263223A22646F6373222C2274223A225969656C6420546F6B656E20446F6373227D5D2C226169223A7B22696E7465726573745F72617465223A22352E303025222C22696E7465726573745F74797065223A227661726961626C65222C227969656C645F736F75726365223A22552E532E2054726561737572792042696C6C73222C226D617475726974795F64617465223A22323034352D30362D3330222C226375736970223A22393132373936525830227D7D"
120+
"hex": "7B226163223A22727761222C226169223A7B226375736970223A22393132373936525830222C22696E7465726573745F72617465223A22352E303025222C22696E7465726573745F74797065223A227661726961626C65222C226D617475726974795F64617465223A22323034352D30362D3330222C227969656C645F736F75726365223A22552E532E2054726561737572792042696C6C73227D2C226173223A227472656173757279222C2264223A2241207969656C642D62656172696E6720737461626C65636F696E206261636B65642062792073686F72742D7465726D20552E532E205472656173757269657320616E64206D6F6E6579206D61726B657420696E737472756D656E74732E222C2269223A2268747470733A2F2F6578616D706C652E6F72672F7462696C6C2D69636F6E2E706E67222C22696E223A224578616D706C65205969656C6420436F2E222C226E223A22542D42696C6C205969656C6420546F6B656E222C2274223A225442494C4C222C227573223A5B7B2263223A2277656273697465222C2274223A2250726F647563742050616765222C2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F7462696C6C227D2C7B2263223A22646F6373222C2274223A225969656C6420546F6B656E20446F6373222C2275223A2268747470733A2F2F6578616D706C657969656C642E636F2F646F6373227D5D7D"
121121
},
122122
{
123123
"testName": "valid MPTokenMetadata with mixed short and long field names",
@@ -165,7 +165,7 @@
165165
],
166166
"additional_info": "Gaming ecosystem token"
167167
},
168-
"hex": "7B2274223A2243525950544F222C226E223A2243727970746F20546F6B656E222C2269223A2268747470733A2F2F6578616D706C652E6F72672F63727970746F2D69636F6E2E706E67222C226163223A2267616D696E67222C2264223A22412067616D696E6720746F6B656E20666F72207669727475616C20776F726C64732E222C22696E223A2247616D696E672053747564696F7320496E632E222C226173223A22657175697479222C227573223A5B7B2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D222C2263223A2277656273697465222C2274223A224D61696E2057656273697465227D2C7B2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D222C2263223A2277656273697465222C2274223A224D61696E2057656273697465227D5D2C226169223A2247616D696E672065636F73797374656D20746F6B656E227D"
168+
"hex": "7B226163223A2267616D696E67222C226169223A2247616D696E672065636F73797374656D20746F6B656E222C226173223A22657175697479222C2264223A22412067616D696E6720746F6B656E20666F72207669727475616C20776F726C64732E222C2269223A2268747470733A2F2F6578616D706C652E6F72672F63727970746F2D69636F6E2E706E67222C22696E223A2247616D696E672053747564696F7320496E632E222C226E223A2243727970746F20546F6B656E222C2274223A2243525950544F222C227573223A5B7B2263223A2277656273697465222C2274223A224D61696E2057656273697465222C2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D227D2C7B2263223A2277656273697465222C2274223A224D61696E2057656273697465222C2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D227D5D7D"
169169
},
170170
{
171171
"testName": "with extra fields",
@@ -219,7 +219,7 @@
219219
"extra": "extra"
220220
}
221221
},
222-
"hex": "7B2274223A2243525950544F222C226E223A2243727970746F20546F6B656E222C2269223A2268747470733A2F2F6578616D706C652E6F72672F63727970746F2D69636F6E2E706E67222C226163223A2267616D696E67222C2264223A22412067616D696E6720746F6B656E20666F72207669727475616C20776F726C64732E222C22696E223A2247616D696E672053747564696F7320496E632E222C226173223A22657175697479222C227573223A5B7B2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D222C2263223A2277656273697465222C2274223A224D61696E2057656273697465227D2C7B2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D222C2263223A2277656273697465222C2274223A224D61696E2057656273697465227D5D2C226169223A2247616D696E672065636F73797374656D20746F6B656E222C226578747261223A7B226578747261223A226578747261227D7D"
222+
"hex": "7B226163223A2267616D696E67222C226169223A2247616D696E672065636F73797374656D20746F6B656E222C226173223A22657175697479222C2264223A22412067616D696E6720746F6B656E20666F72207669727475616C20776F726C64732E222C226578747261223A7B226578747261223A226578747261227D2C2269223A2268747470733A2F2F6578616D706C652E6F72672F63727970746F2D69636F6E2E706E67222C22696E223A2247616D696E672053747564696F7320496E632E222C226E223A2243727970746F20546F6B656E222C2274223A2243525950544F222C227573223A5B7B2263223A2277656273697465222C2274223A224D61696E2057656273697465222C2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D227D2C7B2263223A2277656273697465222C2274223A224D61696E2057656273697465222C2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D227D5D7D"
223223
},
224224
{
225225
"testName": "with unkown null fields",
@@ -231,7 +231,7 @@
231231
"ticker": "CRYPTO",
232232
"extra": null
233233
},
234-
"hex": "7B2274223A2243525950544F222C226578747261223A6E756C6C7D"
234+
"hex": "7B226578747261223A6E756C6C2C2274223A2243525950544F227D"
235235
},
236236
{
237237
"testName": "multiple uris and us",
@@ -269,6 +269,6 @@
269269
}
270270
]
271271
},
272-
"hex": "7B2274223A2243525950544F222C2275726973223A5B7B2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D222C2263223A2277656273697465222C2274223A224D61696E2057656273697465227D5D2C227573223A5B7B2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D222C2263223A2277656273697465222C2274223A224D61696E2057656273697465227D5D7D"
272+
"hex": "7B2274223A2243525950544F222C2275726973223A5B7B2263223A2277656273697465222C2274223A224D61696E2057656273697465222C2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D227D5D2C227573223A5B7B2263223A2277656273697465222C2274223A224D61696E2057656273697465222C2275223A2268747470733A2F2F67616D696E6773747564696F732E636F6D227D5D7D"
273273
}
274274
]

0 commit comments

Comments
 (0)