@bithomp/xrpl-api 3.6.11 → 3.6.15

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.
@@ -13,7 +13,10 @@ export interface AddressBalanceChangeQuantity {
13
13
  export interface BalanceChanges {
14
14
  [key: string]: BalanceChangeQuantity[];
15
15
  }
16
- declare function parseBalanceChanges(metadata: TransactionMetadata, nativeCurrency?: string, tx?: any): BalanceChanges;
16
+ interface ParseBalanceChangesOptions {
17
+ adjustBalancesForNativeEscrow?: boolean;
18
+ }
19
+ declare function parseBalanceChanges(metadata: TransactionMetadata, nativeCurrency?: string, tx?: any, options?: ParseBalanceChangesOptions): BalanceChanges;
17
20
  declare function parseFinalBalances(metadata: TransactionMetadata, nativeCurrency?: string): {
18
21
  [x: string]: BalanceChangeQuantity[];
19
22
  };
@@ -12,6 +12,8 @@ const client_1 = require("../../client");
12
12
  const utils_1 = require("../utils");
13
13
  const mptoken_1 = require("../../models/mptoken");
14
14
  const mptoken_normalize_1 = require("../mptoken_normalize");
15
+ const amount_1 = __importDefault(require("../ledger/amount"));
16
+ const ESCROW_TYPES = ["EscrowFinish", "EscrowCreate", "EscrowCancel"];
15
17
  function groupByAddress(balanceChanges) {
16
18
  const grouped = lodash_1.default.groupBy(balanceChanges, function (node) {
17
19
  return node.address;
@@ -34,16 +36,18 @@ function computeBalanceChange(node) {
34
36
  value = parseValue(node.newFields.Balance);
35
37
  }
36
38
  else if (node.newFields.MPTAmount) {
37
- value = parseValue(node.newFields);
39
+ value = parseValue(node.newFields.MPTAmount);
38
40
  }
39
41
  else if (node.previousFields.Balance && node.finalFields.Balance) {
40
42
  value = parseValue(node.finalFields.Balance).minus(parseValue(node.previousFields.Balance));
41
43
  }
42
44
  else if (node.entryType === "MPToken" && (node.previousFields.MPTAmount || node.previousFields.LockedAmount)) {
43
- value = parseValue(node.finalFields.MPTAmount ?? 0)
44
- .minus(parseValue(node.previousFields.MPTAmount ?? 0))
45
- .plus(parseValue(node.finalFields.LockedAmount ?? 0))
46
- .minus(parseValue(node.previousFields.LockedAmount ?? 0));
45
+ value = parseValue(node.finalFields.MPTAmount ?? 0).minus(parseValue(node.previousFields.MPTAmount ?? 0));
46
+ if (node.previousFields.LockedAmount) {
47
+ value = value
48
+ .plus(parseValue(node.finalFields.LockedAmount ?? 0))
49
+ .minus(parseValue(node.previousFields.LockedAmount ?? 0));
50
+ }
47
51
  }
48
52
  else if (node.entryType === "MPTokenIssuance") {
49
53
  if (node.newFields.MaximumAmount) {
@@ -186,11 +190,64 @@ function parseQuantities(metadata, valueParser, nativeCurrency) {
186
190
  });
187
191
  return groupByAddress(lodash_1.default.compact(lodash_1.default.flatten(values)));
188
192
  }
189
- function parseBalanceChanges(metadata, nativeCurrency, tx) {
193
+ function adjustBalancesForNativeEscrow(balanceChanges, metadata, nativeCurrency, tx) {
194
+ let escrow;
195
+ if (tx.TransactionType === "EscrowCreate") {
196
+ escrow = metadata.AffectedNodes.find((node) => node.CreatedNode?.LedgerEntryType === "Escrow");
197
+ }
198
+ else {
199
+ escrow = metadata.AffectedNodes.find((node) => node.DeletedNode?.LedgerEntryType === "Escrow");
200
+ }
201
+ if (!escrow) {
202
+ return;
203
+ }
204
+ const fields = escrow.CreatedNode?.NewFields || escrow.DeletedNode?.FinalFields;
205
+ if (!fields || !fields.Amount) {
206
+ return;
207
+ }
208
+ const amount = (0, amount_1.default)(fields.Amount);
209
+ if (!amount || amount.currency !== (nativeCurrency || common_1.MAINNET_NATIVE_CURRENCY) || !amount.value) {
210
+ return;
211
+ }
212
+ const source = fields.Account;
213
+ if (tx.TransactionType === "EscrowCreate") {
214
+ adjustBalancesChanges(balanceChanges, source, [{ currency: amount.currency, value: amount.value }]);
215
+ }
216
+ else if (tx.TransactionType === "EscrowFinish" || tx.TransactionType === "EscrowCancel") {
217
+ adjustBalancesChanges(balanceChanges, source, [{ currency: amount.currency, value: `-${amount.value}` }]);
218
+ }
219
+ }
220
+ function adjustBalancesChanges(balanceChanges, address, changes) {
221
+ const existingChanges = balanceChanges[address] || [];
222
+ const change = existingChanges.find((c) => c.currency === changes[0].currency && c.issuer === changes[0].issuer);
223
+ if (change) {
224
+ const newValue = new bignumber_js_1.default(change.value).plus(new bignumber_js_1.default(changes[0].value));
225
+ if (newValue.isZero()) {
226
+ balanceChanges[address] = existingChanges.filter((c) => c !== change);
227
+ if (balanceChanges[address].length === 0) {
228
+ delete balanceChanges[address];
229
+ }
230
+ }
231
+ else {
232
+ change.value = newValue.toString();
233
+ }
234
+ }
235
+ else {
236
+ existingChanges.push(changes[0]);
237
+ balanceChanges[address] = existingChanges;
238
+ }
239
+ }
240
+ function parseBalanceChanges(metadata, nativeCurrency, tx, options) {
190
241
  if (tx && nativeCurrency === common_1.MAINNET_NATIVE_CURRENCY && metadata.TransactionResult === "tesSUCCESS") {
191
242
  (0, mptoken_normalize_1.normalizeMPTokensPreviousFields)(metadata, tx);
192
243
  }
193
- return parseQuantities(metadata, computeBalanceChange, nativeCurrency);
244
+ const balanceChanges = parseQuantities(metadata, computeBalanceChange, nativeCurrency);
245
+ if (tx && options && options.adjustBalancesForNativeEscrow) {
246
+ if (tx.TransactionType && ESCROW_TYPES.includes(tx.TransactionType)) {
247
+ adjustBalancesForNativeEscrow(balanceChanges, metadata, nativeCurrency, tx);
248
+ }
249
+ }
250
+ return balanceChanges;
194
251
  }
195
252
  function parseFinalBalances(metadata, nativeCurrency) {
196
253
  return parseQuantities(metadata, parseFinalBalance, nativeCurrency);
@@ -50,6 +50,7 @@ class MPTokenChanges {
50
50
  mptIssuanceID,
51
51
  account,
52
52
  amount: node.NewFields.MPTAmount,
53
+ lockedAmount: node.NewFields.LockedAmount,
53
54
  });
54
55
  }
55
56
  if (affectedNode.ModifiedNode) {
@@ -61,6 +62,15 @@ class MPTokenChanges {
61
62
  if (amountChange === "0") {
62
63
  amountChange = undefined;
63
64
  }
65
+ let lockedAmountChange = undefined;
66
+ if (node.PreviousFields.LockedAmount !== undefined) {
67
+ lockedAmountChange = new bignumber_js_1.default(node.FinalFields.LockedAmount ?? 0)
68
+ .minus(node.PreviousFields.LockedAmount ?? 0)
69
+ .toString();
70
+ if (lockedAmountChange === "0") {
71
+ lockedAmountChange = undefined;
72
+ }
73
+ }
64
74
  let flagsChange;
65
75
  if (node.PreviousFields?.Flags !== undefined) {
66
76
  flagsChange = (0, mptoken_flags_1.default)(node.PreviousFields.Flags);
@@ -71,7 +81,9 @@ class MPTokenChanges {
71
81
  mptIssuanceID,
72
82
  account,
73
83
  amount: node.FinalFields.MPTAmount,
84
+ lockedAmount: node.FinalFields.LockedAmount,
74
85
  amountChange,
86
+ lockedAmountChange,
75
87
  flagsChange,
76
88
  });
77
89
  }
@@ -84,6 +96,7 @@ class MPTokenChanges {
84
96
  mptIssuanceID,
85
97
  account,
86
98
  amount: node.FinalFields.MPTAmount,
99
+ lockedAmount: node.FinalFields.LockedAmount,
87
100
  });
88
101
  }
89
102
  }
@@ -50,6 +50,7 @@ class MPTokenIssuanceChanges {
50
50
  transferFee: node.NewFields.TransferFee,
51
51
  maximumAmount: node.NewFields.MaximumAmount,
52
52
  outstandingAmount: node.NewFields.OutstandingAmount,
53
+ lockedAmount: node.NewFields.LockedAmount,
53
54
  metadata: node.NewFields.Metadata,
54
55
  scale: node.NewFields.AssetScale,
55
56
  });
@@ -62,6 +63,23 @@ class MPTokenIssuanceChanges {
62
63
  if (outstandingAmountChange === "0") {
63
64
  outstandingAmountChange = undefined;
64
65
  }
66
+ let lockedAmountChange = undefined;
67
+ if (node.PreviousFields.LockedAmount !== undefined) {
68
+ lockedAmountChange = new bignumber_js_1.default(node.FinalFields.LockedAmount ?? 0)
69
+ .minus(new bignumber_js_1.default(node.PreviousFields.LockedAmount ?? 0))
70
+ .toString();
71
+ if (lockedAmountChange === "0") {
72
+ lockedAmountChange = undefined;
73
+ }
74
+ }
75
+ let lockedAmount = node.FinalFields.LockedAmount;
76
+ if (lockedAmount === undefined && lockedAmountChange !== undefined) {
77
+ lockedAmount = "0";
78
+ }
79
+ let flagsChange;
80
+ if (node.PreviousFields?.Flags !== undefined) {
81
+ flagsChange = (0, mptoken_issuance_flags_1.default)(node.PreviousFields.Flags);
82
+ }
65
83
  this.addChange(mptIssuanceID, {
66
84
  status: "modified",
67
85
  flags: (0, mptoken_issuance_flags_1.default)(node.FinalFields.Flags),
@@ -71,10 +89,12 @@ class MPTokenIssuanceChanges {
71
89
  transferFee: node.FinalFields.TransferFee,
72
90
  maximumAmount: node.FinalFields.MaximumAmount,
73
91
  outstandingAmount: node.FinalFields.OutstandingAmount,
92
+ lockedAmount,
74
93
  metadata: node.FinalFields.Metadata,
75
94
  scale: node.FinalFields.AssetScale,
76
95
  outstandingAmountChange,
77
- flagsChange: node.PreviousFields.hasOwnProperty("Flags") ? (0, mptoken_issuance_flags_1.default)(node.PreviousFields.Flags) : undefined,
96
+ lockedAmountChange,
97
+ flagsChange,
78
98
  });
79
99
  }
80
100
  if (affectedNode.DeletedNode) {
@@ -88,6 +108,7 @@ class MPTokenIssuanceChanges {
88
108
  transferFee: node.FinalFields.TransferFee,
89
109
  maximumAmount: node.FinalFields.MaximumAmount,
90
110
  outstandingAmount: node.FinalFields.OutstandingAmount,
111
+ lockedAmount: node.FinalFields.LockedAmount,
91
112
  metadata: node.FinalFields.Metadata,
92
113
  scale: node.FinalFields.AssetScale,
93
114
  });
@@ -35,6 +35,9 @@ const MPTOKEN_TYPES = [
35
35
  "MPTokenIssuanceDestroy",
36
36
  "Payment",
37
37
  "Clawback",
38
+ "EscrowFinish",
39
+ "EscrowCreate",
40
+ "EscrowCancel",
38
41
  ];
39
42
  const CREDENTIAL_TYPES = ["CredentialCreate", "CredentialAccept", "CredentialDelete"];
40
43
  const DELEGATE_TYPES = ["DelegateSet"];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bithomp/xrpl-api",
3
- "version": "3.6.11",
3
+ "version": "3.6.15",
4
4
  "description": "A Bithomp JavaScript/TypeScript library for interacting with the XRP Ledger",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -43,7 +43,7 @@
43
43
  "format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\"",
44
44
  "lint": "eslint",
45
45
  "prepare": "npm run build",
46
- "prepublishOnly": "npm test && npm run lint",
46
+ "-prepublishOnly": "npm test && npm run lint",
47
47
  "preversion": "npm run lint",
48
48
  "version": "npm run format && git add -A src",
49
49
  "postversion": "git push && git push --tags"
@@ -70,8 +70,8 @@
70
70
  "@types/mocha": "^10.0.10",
71
71
  "@types/nconf": "^0.10.7",
72
72
  "@types/node": "^22.15.21",
73
- "@typescript-eslint/eslint-plugin": "^8.45.0",
74
- "@typescript-eslint/parser": "^8.45.0",
73
+ "@typescript-eslint/eslint-plugin": "^8.46.1",
74
+ "@typescript-eslint/parser": "^8.46.1",
75
75
  "chai": "^6.2.0",
76
76
  "chai-as-promised": "^8.0.2",
77
77
  "eslint": "^9.37.0",
@@ -82,7 +82,7 @@
82
82
  "eslint-plugin-promise": "^7.2.1",
83
83
  "mocha": "^11.7.4",
84
84
  "nconf": "^0.13.0",
85
- "ts-jest": "^29.4.4",
85
+ "ts-jest": "^29.4.5",
86
86
  "ts-node": "^10.9.2",
87
87
  "typescript": "^5.9.3"
88
88
  }