@ledgerhq/coin-xrp 7.23.4 → 7.24.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/lib/api/getBlock.d.ts.map +1 -1
  3. package/lib/api/getBlock.js +17 -5
  4. package/lib/api/getBlock.js.map +1 -1
  5. package/lib/api/listOperations.d.ts.map +1 -1
  6. package/lib/api/listOperations.js +120 -44
  7. package/lib/api/listOperations.js.map +1 -1
  8. package/lib/api/validateIntent.d.ts.map +1 -1
  9. package/lib/api/validateIntent.js +12 -7
  10. package/lib/api/validateIntent.js.map +1 -1
  11. package/lib/network/index.d.ts.map +1 -1
  12. package/lib/network/index.js +2 -0
  13. package/lib/network/index.js.map +1 -1
  14. package/lib/types/model.d.ts +1 -0
  15. package/lib/types/model.d.ts.map +1 -1
  16. package/lib/utils/errors.d.ts +3 -0
  17. package/lib/utils/errors.d.ts.map +1 -1
  18. package/lib/utils/errors.js +2 -1
  19. package/lib/utils/errors.js.map +1 -1
  20. package/lib-es/api/getBlock.d.ts.map +1 -1
  21. package/lib-es/api/getBlock.js +17 -5
  22. package/lib-es/api/getBlock.js.map +1 -1
  23. package/lib-es/api/listOperations.d.ts.map +1 -1
  24. package/lib-es/api/listOperations.js +120 -44
  25. package/lib-es/api/listOperations.js.map +1 -1
  26. package/lib-es/api/validateIntent.d.ts.map +1 -1
  27. package/lib-es/api/validateIntent.js +14 -9
  28. package/lib-es/api/validateIntent.js.map +1 -1
  29. package/lib-es/network/index.d.ts.map +1 -1
  30. package/lib-es/network/index.js +2 -0
  31. package/lib-es/network/index.js.map +1 -1
  32. package/lib-es/types/model.d.ts +1 -0
  33. package/lib-es/types/model.d.ts.map +1 -1
  34. package/lib-es/utils/errors.d.ts +3 -0
  35. package/lib-es/utils/errors.d.ts.map +1 -1
  36. package/lib-es/utils/errors.js +1 -0
  37. package/lib-es/utils/errors.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/api/getBlock.test.ts +102 -1
  40. package/src/api/getBlock.ts +23 -5
  41. package/src/api/index.integ.test.ts +6 -6
  42. package/src/api/index.test.ts +21 -5
  43. package/src/api/listOperations.test.ts +211 -3
  44. package/src/api/listOperations.ts +153 -49
  45. package/src/api/validateIntent.test.ts +105 -11
  46. package/src/api/validateIntent.ts +14 -9
  47. package/src/network/index.test.ts +32 -0
  48. package/src/network/index.ts +2 -0
  49. package/src/types/model.ts +1 -0
  50. package/src/utils/errors.ts +2 -0
@@ -52,7 +52,7 @@ export async function listOperations(address, { limit, minHeight, token, order }
52
52
  /**
53
53
  * Fetches one page of account_tx and splits results into:
54
54
  * - Payment transactions (OUT/IN)
55
- * - Non-Payment transactions sent by this account (fee-only, no XRP transferred)
55
+ * - Non-Payment transactions (balance changes extracted from AffectedNodes metadata)
56
56
  *
57
57
  * tx_type node RPC filter is unreliable (see LIVE-16705), so we filter client-side.
58
58
  */
@@ -61,10 +61,8 @@ export async function listOperations(address, { limit, minHeight, token, order }
61
61
  const txs = response.transactions;
62
62
  const responseMarker = response.marker;
63
63
  const paymentTxs = txs.filter((tx) => tx.tx_json.TransactionType === 'Payment');
64
- // Non-Payment transactions sent by this account: the account paid fees but transferred no XRP.
65
- const feeOnlyTxs = txs.filter((tx) => tx.tx_json.TransactionType !== 'Payment' && tx.tx_json.Account === address);
66
- // Non-Payment transactions received by this account: the account received XRP but did not pay fees.
67
- const receivedTxs = txs.filter((tx) => tx.tx_json.TransactionType !== 'Payment' && tx.tx_json.Destination === address);
64
+ // Non-Payment transactions filtered for balance impact later by convertNonPaymentToCoreOperation
65
+ const nonPaymentTxs = txs.filter((tx) => tx.tx_json.TransactionType !== 'Payment');
68
66
  const shortage = (opts.limit && txs.length < opts.limit) || false;
69
67
  const { marker: _marker, ...restOpts } = opts;
70
68
  const nextOpts = { ...restOpts };
@@ -73,31 +71,30 @@ export async function listOperations(address, { limit, minHeight, token, order }
73
71
  if (nextOpts.limit)
74
72
  nextOpts.limit -= paymentTxs.length;
75
73
  }
76
- return [shortage, nextOpts, paymentTxs, feeOnlyTxs, receivedTxs];
74
+ return [shortage, nextOpts, paymentTxs, nonPaymentTxs];
77
75
  }
78
- let [txShortage, nextOptions, transactions, feeOnlyTxs, receivedTxs] = await getAccountTransactions(address, options);
76
+ let [txShortage, nextOptions, transactions, nonPaymentTxs] = await getAccountTransactions(address, options);
79
77
  const isEnough = () => txShortage || (limit && transactions.length >= limit);
80
78
  // We need to call the node RPC multiple times to get the desired number of transactions by the limiter.
81
79
  while (nextOptions.limit && !isEnough()) {
82
- const [newTxShortage, newNextOptions, newTransactions, newFeeOnlyTxs, newReceivedTxs] = await getAccountTransactions(address, nextOptions);
80
+ const [newTxShortage, newNextOptions, newTransactions, newNonPaymentTxs] = await getAccountTransactions(address, nextOptions);
83
81
  txShortage = newTxShortage;
84
82
  nextOptions = newNextOptions;
85
83
  transactions = transactions.concat(newTransactions);
86
- feeOnlyTxs = feeOnlyTxs.concat(newFeeOnlyTxs);
87
- receivedTxs = receivedTxs.concat(newReceivedTxs);
84
+ nonPaymentTxs = nonPaymentTxs.concat(newNonPaymentTxs);
88
85
  }
89
86
  // the order is reversed so that the results are always sorted by newest tx first element of the list
90
87
  if (order === 'asc') {
91
88
  transactions.reverse();
92
- feeOnlyTxs.reverse();
93
- receivedTxs.reverse();
89
+ nonPaymentTxs.reverse();
94
90
  }
95
91
  // the next index to start the pagination from
96
92
  const next = nextOptions.marker ? JSON.stringify(nextOptions.marker) : '';
97
93
  const paymentOps = transactions.map(convertToCoreOperation(address));
98
- const feeOps = feeOnlyTxs.map(convertFeeToCoreOperation);
99
- const receivedOps = receivedTxs.map(convertToCoreOperation(address));
100
- return [[...paymentOps, ...feeOps, ...receivedOps], next];
94
+ const nonPaymentOps = nonPaymentTxs
95
+ .map(convertNonPaymentToCoreOperation(address))
96
+ .filter((op) => op !== null);
97
+ return [[...paymentOps, ...nonPaymentOps], next];
101
98
  }
102
99
  const convertToCoreOperation = (address) => (operation) => {
103
100
  const { ledger_hash, hash, close_time_iso, meta: { delivered_amount }, tx_json: { TransactionType, Fee, date, Account, Destination, DestinationTag, Memos, ledger_index, Sequence, SigningPubKey, }, } = operation;
@@ -170,38 +167,117 @@ const convertToCoreOperation = (address) => (operation) => {
170
167
  return op;
171
168
  };
172
169
  /**
173
- * Converts a non-Payment transaction sent by this account into a FEES-type Operation.
174
- * These transactions (OfferCreate, OfferCancel, TrustSet, AccountSet, etc.) do not
175
- * transfer XRP to a recipient — they only consume the network fee paid by the sender.
170
+ * Finds the XRP (native) balance change for a specific address in a transaction's AffectedNodes.
171
+ * Returns the balance diff in drops, or null if the address's AccountRoot was not affected.
172
+ *
173
+ * For ModifiedNode: diff = FinalFields.Balance - PreviousFields.Balance (includes fee deduction).
174
+ * For CreatedNode: diff = NewFields.Balance (initial funding amount).
175
+ * For DeletedNode: diff = -(FinalFields.Balance + fee). FinalFields.Balance is the post-fee balance
176
+ * remaining when the account was deleted. We add the fee back so the caller's fee adjustment
177
+ * (adjustedDiff = diff + fee) yields the correct transfer amount.
176
178
  */
177
- const convertFeeToCoreOperation = (operation) => {
178
- const { ledger_hash, hash, close_time_iso, tx_json: { TransactionType, Fee, date, Account, ledger_index, Sequence, SigningPubKey }, } = operation;
179
+ function findXrpBalanceDiff(address, affectedNodes, fee) {
180
+ for (const node of affectedNodes) {
181
+ if ('ModifiedNode' in node) {
182
+ const data = node.ModifiedNode;
183
+ if (data.LedgerEntryType === 'AccountRoot' &&
184
+ data.FinalFields?.Account === address &&
185
+ typeof data.FinalFields?.Balance === 'string' &&
186
+ typeof data.PreviousFields?.Balance === 'string') {
187
+ return (BigInt(data.FinalFields.Balance) - BigInt(data.PreviousFields.Balance));
188
+ }
189
+ }
190
+ else if ('CreatedNode' in node) {
191
+ const data = node.CreatedNode;
192
+ if (data.LedgerEntryType === 'AccountRoot' &&
193
+ data.NewFields?.Account === address &&
194
+ typeof data.NewFields?.Balance === 'string') {
195
+ return BigInt(data.NewFields.Balance);
196
+ }
197
+ }
198
+ else if ('DeletedNode' in node) {
199
+ const data = node.DeletedNode;
200
+ // AccountDelete: the sender's AccountRoot is deleted. FinalFields.Balance is the post-fee balance
201
+ // (the fee was already deducted before deletion). We return -(Balance + fee) so that the caller's
202
+ // fee adjustment (diff + fee) yields the correct transfer amount (= FinalFields.Balance).
203
+ if (data.LedgerEntryType === 'AccountRoot' &&
204
+ data.FinalFields?.Account === address &&
205
+ typeof data.FinalFields?.Balance === 'string') {
206
+ const balance = BigInt(data.FinalFields.Balance);
207
+ // Include the fee in the diff so the caller's adjustedDiff = (-balance - fee) + fee = -balance
208
+ return -(balance + fee);
209
+ }
210
+ }
211
+ }
212
+ return null;
213
+ }
214
+ /**
215
+ * Converts a non-Payment transaction into an Operation by inspecting AffectedNodes metadata
216
+ * to determine the actual XRP balance change for the queried address.
217
+ *
218
+ * This handles DEX trades (OfferCreate), TrustSet, AccountSet, etc. where the queried address
219
+ * may gain or lose XRP through offer matching — not just pay fees.
220
+ *
221
+ * Returns null if the transaction does not affect the address's XRP balance and the address
222
+ * is not the fee payer.
223
+ */
224
+ const convertNonPaymentToCoreOperation = (address) => (operation) => {
225
+ const { ledger_hash, hash, close_time_iso, meta: { AffectedNodes, TransactionResult }, tx_json: { TransactionType, Fee, date, Account, Destination, ledger_index, Sequence, SigningPubKey, }, } = operation;
226
+ const fee = BigInt(Fee);
179
227
  const toEpochDate = (RIPPLE_EPOCH + date) * 1000;
180
- const failed = operation.meta.TransactionResult !== 'tesSUCCESS';
181
- return {
182
- id: hash,
183
- asset: { type: 'native' },
184
- tx: {
185
- hash,
186
- fees: BigInt(Fee),
187
- feesPayer: Account,
188
- date: new Date(toEpochDate),
189
- block: {
190
- time: new Date(close_time_iso),
191
- hash: ledger_hash,
192
- height: ledger_index,
193
- },
194
- failed,
195
- },
196
- type: 'FEES',
197
- value: BigInt(0),
198
- senders: [Account],
199
- recipients: [],
200
- details: {
201
- xrpTxType: TransactionType,
202
- sequence: Sequence,
203
- signingPubKey: SigningPubKey,
228
+ const failed = TransactionResult !== 'tesSUCCESS';
229
+ const isFeePayer = Account === address;
230
+ // Extract actual XRP balance change from ledger metadata
231
+ const diff = findXrpBalanceDiff(address, AffectedNodes ?? [], fee);
232
+ // The ledger diff already includes the fee deduction, so add the fee back to isolate the transfer amount.
233
+ // Example: sender trades 5 XRP + 12 drops fee → diff = -5000012, adjustedDiff = -5000012 + 12 = -5000000
234
+ const adjustedDiff = diff !== null && isFeePayer ? diff + fee : diff;
235
+ const baseTx = {
236
+ hash,
237
+ fees: fee,
238
+ feesPayer: Account,
239
+ date: new Date(toEpochDate),
240
+ block: {
241
+ time: new Date(close_time_iso),
242
+ hash: ledger_hash,
243
+ height: ledger_index,
204
244
  },
245
+ failed,
205
246
  };
247
+ const details = {
248
+ xrpTxType: TransactionType,
249
+ sequence: Sequence,
250
+ signingPubKey: SigningPubKey,
251
+ };
252
+ // Non-zero transfer amount: emit IN or OUT operation
253
+ if (adjustedDiff !== null && adjustedDiff !== BigInt(0)) {
254
+ const type = adjustedDiff > BigInt(0) ? 'IN' : 'OUT';
255
+ const value = adjustedDiff > BigInt(0) ? adjustedDiff : -adjustedDiff;
256
+ return {
257
+ id: hash,
258
+ asset: { type: 'native' },
259
+ tx: baseTx,
260
+ type,
261
+ value,
262
+ senders: [Account],
263
+ recipients: Destination ? [Destination] : [],
264
+ details,
265
+ };
266
+ }
267
+ // No transfer beyond fees — only emit FEES for the fee payer
268
+ if (isFeePayer) {
269
+ return {
270
+ id: hash,
271
+ asset: { type: 'native' },
272
+ tx: baseTx,
273
+ type: 'FEES',
274
+ value: BigInt(0),
275
+ senders: [Account],
276
+ recipients: [],
277
+ details,
278
+ };
279
+ }
280
+ // Not fee payer, no XRP balance change — skip
281
+ return null;
206
282
  };
207
283
  //# sourceMappingURL=listOperations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validateIntent.d.ts","sourceRoot":"","sources":["../../src/api/validateIntent.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,OAAO,EACR,MAAM,2CAA2C,CAAA;AAclD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAMrC,eAAO,MAAM,cAAc,GACzB,mBAAmB,iBAAiB,CAAC,UAAU,CAAC,EAChD,UAAU,OAAO,EAAE,EACnB,aAAa,aAAa,KACzB,OAAO,CAAC,qBAAqB,CA4E/B,CAAA"}
1
+ {"version":3,"file":"validateIntent.d.ts","sourceRoot":"","sources":["../../src/api/validateIntent.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,OAAO,EACR,MAAM,2CAA2C,CAAA;AAclD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAKrC,eAAO,MAAM,cAAc,GACzB,mBAAmB,iBAAiB,CAAC,UAAU,CAAC,EAChD,UAAU,OAAO,EAAE,EACnB,aAAa,aAAa,KACzB,OAAO,CAAC,qBAAqB,CAkF/B,CAAA"}
@@ -3,10 +3,9 @@
3
3
  import { formatCurrencyUnit } from '@ledgerhq/coin-module-framework/currencies/index';
4
4
  import { AmountRequired, FeeNotLoaded, FeeTooHigh, InvalidAddress, InvalidAddressBecauseDestinationIsAlsoSource, NotEnoughBalanceBecauseDestinationNotCreated, NotEnoughSpendableBalance, RecipientRequired, } from '@ledgerhq/errors';
5
5
  import { isValidClassicAddress } from 'ripple-address-codec';
6
- import { getServerInfos } from '../network';
7
- import { recipientIsNew } from '../utils';
6
+ import { getAccountInfo, getServerInfos } from '../network';
8
7
  import { parseAPIValue } from '../utils/common';
9
- import { XrpInvalidMemoError } from '../utils/errors';
8
+ import { XrpDestinationTagRequired, XrpInvalidMemoError } from '../utils/errors';
10
9
  import { validateMemo } from '../utils/validateMemo';
11
10
  export const validateIntent = async (transactionIntent, balances, customFees) => {
12
11
  const errors = {};
@@ -16,6 +15,9 @@ export const validateIntent = async (transactionIntent, balances, customFees) =>
16
15
  const estimatedFees = customFees?.value || 0n;
17
16
  const totalSpent = transactionIntent.amount + estimatedFees;
18
17
  const amount = transactionIntent.amount;
18
+ const recipientInfo = transactionIntent.recipient && isValidClassicAddress(transactionIntent.recipient)
19
+ ? await getAccountInfo(transactionIntent.recipient)
20
+ : undefined;
19
21
  if (amount > 0 && estimatedFees * 10n > amount) {
20
22
  warnings.feeTooHigh = new FeeTooHigh();
21
23
  }
@@ -37,8 +39,7 @@ export const validateIntent = async (transactionIntent, balances, customFees) =>
37
39
  : 'Unknown unit',
38
40
  });
39
41
  }
40
- else if (transactionIntent.recipient &&
41
- (await recipientIsNew(transactionIntent.recipient)) &&
42
+ else if (recipientInfo?.isNewAccount &&
42
43
  transactionIntent.amount < BigInt(reserveBaseXRP.toString())) {
43
44
  errors.amount = new NotEnoughBalanceBecauseDestinationNotCreated('', {
44
45
  minimalAmount: transactionIntent.asset.unit
@@ -64,12 +65,16 @@ export const validateIntent = async (transactionIntent, balances, customFees) =>
64
65
  if (!errors.amount && amount === 0n) {
65
66
  errors.amount = new AmountRequired();
66
67
  }
67
- const destinationTag = transactionIntent.memo?.memos
68
- ? transactionIntent.memo.memos.get('destinationTag')
69
- : undefined;
70
- if (destinationTag && typeof destinationTag === 'string' && !validateMemo(destinationTag)) {
68
+ const destinationTag = transactionIntent.memo?.memos?.get('destinationTag');
69
+ if (destinationTag !== undefined && typeof destinationTag !== 'string') {
71
70
  errors.transaction = new XrpInvalidMemoError();
72
71
  }
72
+ else if (destinationTag && !validateMemo(destinationTag)) {
73
+ errors.transaction = new XrpInvalidMemoError();
74
+ }
75
+ else if (!errors.recipient && !destinationTag && recipientInfo?.requireDestinationTag) {
76
+ errors.transaction = new XrpDestinationTagRequired();
77
+ }
73
78
  return {
74
79
  errors,
75
80
  warnings,
@@ -1 +1 @@
1
- {"version":3,"file":"validateIntent.js","sourceRoot":"","sources":["../../src/api/validateIntent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validateIntent.js","sourceRoot":"","sources":["../../src/api/validateIntent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAIjD,OAAO,EACL,gBAAgB,EAGhB,MAAM,EAEN,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAA;AAIhB,eAAO,MAAM,yBAAyB,gBAAgB,CAAA;AAGtD,eAAO,MAAM,MAAM,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,aAAa,CAErE,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,WAAW,MAAM,EACjB,UAAU,OAAO,KAChB,OAAO,CAAC,WAAW,CAwCrB,CAAA;AAED,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,kBAAkB,CAEjE,CAAA;AAGD,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IAIf,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,EACf,SAAS,sBAAsB,GAAG,SAAS,KAC1C,OAAO,CAAC,iBAAiB,CAW3B,CAAA;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAEzD;AAYD,eAAO,MAAM,gBAAgB,2FAI5B,CAAA;AAED,eAAO,MAAM,oBAAoB,yFAIhC,CAAA;AAUD,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAIjD,OAAO,EACL,gBAAgB,EAGhB,MAAM,EAEN,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,SAAS,CAAA;AAIhB,eAAO,MAAM,yBAAyB,gBAAgB,CAAA;AAGtD,eAAO,MAAM,MAAM,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,aAAa,CAErE,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,WAAW,MAAM,EACjB,UAAU,OAAO,KAChB,OAAO,CAAC,WAAW,CA0CrB,CAAA;AAED,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,kBAAkB,CAEjE,CAAA;AAGD,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IAIf,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,EACf,SAAS,sBAAsB,GAAG,SAAS,KAC1C,OAAO,CAAC,iBAAiB,CAW3B,CAAA;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAEzD;AAYD,eAAO,MAAM,gBAAgB,2FAI5B,CAAA;AAED,eAAO,MAAM,oBAAoB,yFAIhC,CAAA;AAUD,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD"}
@@ -35,6 +35,7 @@ export const getAccountInfo = async (recipient, current) => {
35
35
  balance: '0',
36
36
  ownerCount: 0,
37
37
  sequence: 0,
38
+ requireDestinationTag: false,
38
39
  };
39
40
  }
40
41
  else {
@@ -43,6 +44,7 @@ export const getAccountInfo = async (recipient, current) => {
43
44
  balance: result.account_data.Balance,
44
45
  ownerCount: result.account_data.OwnerCount,
45
46
  sequence: result.account_data.Sequence,
47
+ requireDestinationTag: result.account_flags?.requireDestinationTag ?? false,
46
48
  };
47
49
  }
48
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export type AccountInfo = {
13
13
  balance: string;
14
14
  ownerCount: number;
15
15
  sequence: number;
16
+ requireDestinationTag: boolean;
16
17
  };
17
18
  export type XrpMemo = {
18
19
  data?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAA;AACxE,OAAO,SAAS,MAAM,cAAc,CAAA;AAEpC,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,KAAK,CAAA;IACb,SAAS,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,KAAK,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAA;AAEnD,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AACD,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,CAAC,CAAA;AAEtD,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;AAElC,MAAM,MAAM,qBAAqB,GAAG;IAElC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;CACF,CAAA"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAA;AACxE,OAAO,SAAS,MAAM,cAAc,CAAA;AAEpC,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,KAAK,CAAA;IACb,SAAS,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,KAAK,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,qBAAqB,EAAE,OAAO,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAA;AAEnD,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AACD,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,CAAC,CAAA;AAEtD,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;AAElC,MAAM,MAAM,qBAAqB,GAAG;IAElC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;CACF,CAAA"}
@@ -1,4 +1,7 @@
1
1
  export declare const XrpInvalidMemoError: import("@ledgerhq/errors/lib-es/helpers").LedgerErrorConstructor<{
2
2
  [key: string]: unknown;
3
3
  }>;
4
+ export declare const XrpDestinationTagRequired: import("@ledgerhq/errors/lib-es/helpers").LedgerErrorConstructor<{
5
+ [key: string]: unknown;
6
+ }>;
4
7
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB;;EAA2C,CAAA"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB;;EAA2C,CAAA;AAE3E,eAAO,MAAM,yBAAyB;;EAAsD,CAAA"}
@@ -2,4 +2,5 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { createCustomErrorClass } from '@ledgerhq/errors';
4
4
  export const XrpInvalidMemoError = createCustomErrorClass('XrpInvalidMemo');
5
+ export const XrpDestinationTagRequired = createCustomErrorClass('XrpDestinationTagRequired');
5
6
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sCAAsC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sCAAsC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;AAE3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC,2BAA2B,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-xrp",
3
- "version": "7.23.4",
3
+ "version": "7.24.0",
4
4
  "description": "Ledger XRP Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -263,7 +263,7 @@ describe('getBlock', () => {
263
263
  expect(result.transactions[0].operations[1].type).toBe('other')
264
264
  })
265
265
 
266
- it('ignores DeletedNode entries for AccountRoot (no transfer created)', async () => {
266
+ it('ignores DeletedNode for AccountRoot with zero balance (non-fee-payer)', async () => {
267
267
  // Given
268
268
  mockGetLedgerByIndex.mockResolvedValue({
269
269
  ledger_index: 12345,
@@ -305,6 +305,107 @@ describe('getBlock', () => {
305
305
  expect(result.transactions[0].operations).toEqual([])
306
306
  })
307
307
 
308
+ it('creates transfer operation for AccountDelete sender (DeletedNode with balance)', async () => {
309
+ // Given — AccountDelete: sender's AccountRoot is deleted, remaining balance sent to destination
310
+ mockGetLedgerByIndex.mockResolvedValue({
311
+ ledger_index: 12345,
312
+ ledger: {
313
+ ledger_hash: 'HASH',
314
+ close_time_iso: '2024-06-01T12:34:56Z',
315
+ transactions: [
316
+ {
317
+ hash: 'TX_ACCT_DELETE',
318
+ tx_json: {
319
+ TransactionType: 'AccountDelete',
320
+ Account: 'rDeletedSender',
321
+ Destination: 'rReceiver',
322
+ Fee: '2000000',
323
+ },
324
+ meta: {
325
+ TransactionResult: 'tesSUCCESS',
326
+ AffectedNodes: [
327
+ {
328
+ DeletedNode: {
329
+ LedgerEntryType: 'AccountRoot',
330
+ FinalFields: {
331
+ Account: 'rDeletedSender',
332
+ Balance: '30000000', // post-fee balance sent to destination
333
+ },
334
+ },
335
+ },
336
+ ],
337
+ },
338
+ validated: true,
339
+ },
340
+ ],
341
+ },
342
+ })
343
+
344
+ // When
345
+ const result = await getBlock(12345)
346
+
347
+ // Then — sender gets a transfer operation for the balance sent to destination
348
+ const tx = result.transactions[0]
349
+ expect(tx.hash).toBe('TX_ACCT_DELETE')
350
+ expect(tx.fees).toBe(BigInt(2000000))
351
+ expect(tx.operations).toHaveLength(1)
352
+ // FinalFields.Balance = 30000000 (post-fee). diff = -(30000000 + 2000000) = -32000000.
353
+ // createBalanceOperation: adjustedDiff = -32000000 + 2000000 = -30000000 (the actual transfer)
354
+ expect(tx.operations[0]).toEqual({
355
+ type: 'transfer',
356
+ address: 'rDeletedSender',
357
+ peer: 'rReceiver',
358
+ asset: { type: 'native', name: 'XRP' },
359
+ amount: BigInt(-30000000),
360
+ })
361
+ })
362
+
363
+ it('ignores fee-only balance changes for the fee payer (adjustedDiff === 0)', async () => {
364
+ // Given — AccountSet where the only balance change is the fee deduction
365
+ mockGetLedgerByIndex.mockResolvedValue({
366
+ ledger_index: 12345,
367
+ ledger: {
368
+ ledger_hash: 'HASH',
369
+ close_time_iso: '2024-06-01T12:34:56Z',
370
+ transactions: [
371
+ {
372
+ hash: 'TX_FEE_ONLY',
373
+ tx_json: {
374
+ TransactionType: 'AccountSet',
375
+ Account: 'rSender123',
376
+ Fee: '12',
377
+ },
378
+ meta: {
379
+ TransactionResult: 'tesSUCCESS',
380
+ AffectedNodes: [
381
+ {
382
+ ModifiedNode: {
383
+ LedgerEntryType: 'AccountRoot',
384
+ FinalFields: {
385
+ Account: 'rSender123',
386
+ Balance: '999999988', // decreased by exactly the fee (12 drops)
387
+ },
388
+ PreviousFields: {
389
+ Balance: '1000000000',
390
+ },
391
+ },
392
+ },
393
+ ],
394
+ },
395
+ validated: true,
396
+ },
397
+ ],
398
+ },
399
+ })
400
+
401
+ // When
402
+ const result = await getBlock(12345)
403
+
404
+ // Then — diff = -12, adjustedDiff = -12 + 12 = 0 → no transfer operation
405
+ expect(result.transactions[0].operations).toEqual([])
406
+ expect(result.transactions[0].fees).toBe(BigInt(12))
407
+ })
408
+
308
409
  it('ignores zero balance changes', async () => {
309
410
  // Given
310
411
  mockGetLedgerByIndex.mockResolvedValue({
@@ -25,9 +25,8 @@ const TX_RESULT_TESSUCCESS = 'tesSUCCESS'
25
25
  const METADATA_NODE_ENTRYTYPE_ACCOUNTROOT = 'AccountRoot'
26
26
 
27
27
  /**
28
- * Creates an operation for an account balance change.
29
- * Returns a transfer operation for actual value transfers, or an "other" operation
30
- * for fee-only balance changes (e.g., AccountSet transactions).
28
+ * Creates a transfer operation for an account balance change.
29
+ * Returns null if the balance change is zero or fee-only (adjustedDiff === 0).
31
30
  */
32
31
  function createBalanceOperation(
33
32
  account: string,
@@ -45,6 +44,8 @@ function createBalanceOperation(
45
44
  adjustedDiff = diff + fee
46
45
  }
47
46
 
47
+ if (adjustedDiff === BigInt(0)) return null
48
+
48
49
  const peer = account === feesPayer ? destination : feesPayer
49
50
 
50
51
  return {
@@ -100,8 +101,25 @@ function mapCreatedNode(
100
101
  return [{ type: BLOCK_OPERATION_OTHER, ...data }]
101
102
  }
102
103
 
103
- function mapDeletedNode(data: DeletedNodeData): BlockOperation[] {
104
+ function mapDeletedNode(
105
+ data: DeletedNodeData,
106
+ fee: bigint,
107
+ feesPayer: string,
108
+ destination: string | undefined
109
+ ): BlockOperation[] {
104
110
  if (data.LedgerEntryType === METADATA_NODE_ENTRYTYPE_ACCOUNTROOT) {
111
+ const balance = data.FinalFields?.Balance
112
+ const account = data.FinalFields?.Account
113
+
114
+ if (typeof balance === 'string' && typeof account === 'string') {
115
+ // AccountDelete: FinalFields.Balance is the post-fee balance sent to the destination.
116
+ // For the fee payer, we include the fee in the diff so createBalanceOperation's
117
+ // adjustment (diff + fee) yields the correct transfer amount (-balance).
118
+ const balanceVal = BigInt(balance)
119
+ const diff = account === feesPayer ? -(balanceVal + fee) : -balanceVal
120
+ const op = createBalanceOperation(account, diff, fee, feesPayer, destination)
121
+ return op ? [op] : []
122
+ }
105
123
  return []
106
124
  }
107
125
 
@@ -149,7 +167,7 @@ function mapBlockTransactions(txs: XrplOperation[]): BlockTransaction[] {
149
167
  return mapCreatedNode(node.CreatedNode, fee, feesPayer, destination)
150
168
  }
151
169
  if ('DeletedNode' in node) {
152
- return mapDeletedNode(node.DeletedNode)
170
+ return mapDeletedNode(node.DeletedNode, fee, feesPayer, destination)
153
171
  }
154
172
  return []
155
173
  })
@@ -343,20 +343,20 @@ describe('Xrp Api (mainnet)', () => {
343
343
  expect(op.tx.feesPayer).toBe(SENDER)
344
344
  })
345
345
 
346
- it('returns FEES operation', async () => {
346
+ it('returns OUT operation for OfferCreate that trades XRP via DEX', async () => {
347
347
  const resp = await api.listOperations(SENDER_WITH_FEES, { minHeight: 0 })
348
- const feesOps = resp.items
348
+ const ops = resp.items
349
349
 
350
350
  // https://xrpscan.com/tx/BEA8B9E4D2A8351417E862D41C8BE1F0013DEFBF6A8893771FE6991E6B20E19C
351
+ // OfferCreate buying SOLO token — sender spent 1 drop XRP beyond fees through DEX
351
352
  const outTx = {
352
353
  hash: 'BEA8B9E4D2A8351417E862D41C8BE1F0013DEFBF6A8893771FE6991E6B20E19C',
353
- amount: 0,
354
- recipient: [],
354
+ amount: 0.000001, // 1 drop XRP traded for SOLO
355
355
  sender: SENDER_WITH_FEES,
356
- type: 'FEES',
356
+ type: 'OUT',
357
357
  fees: 0.00001,
358
358
  }
359
- const op = feesOps.find((o) => o.tx.hash === outTx.hash) as Operation
359
+ const op = ops.find((o) => o.tx.hash === outTx.hash) as Operation
360
360
 
361
361
  expect(op.tx.hash).toEqual(outTx.hash)
362
362
  expect(op.value).toEqual(BigInt(outTx.amount * 1e6))