@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.
- package/CHANGELOG.md +12 -0
- package/lib/api/getBlock.d.ts.map +1 -1
- package/lib/api/getBlock.js +17 -5
- package/lib/api/getBlock.js.map +1 -1
- package/lib/api/listOperations.d.ts.map +1 -1
- package/lib/api/listOperations.js +120 -44
- package/lib/api/listOperations.js.map +1 -1
- package/lib/api/validateIntent.d.ts.map +1 -1
- package/lib/api/validateIntent.js +12 -7
- package/lib/api/validateIntent.js.map +1 -1
- package/lib/network/index.d.ts.map +1 -1
- package/lib/network/index.js +2 -0
- package/lib/network/index.js.map +1 -1
- package/lib/types/model.d.ts +1 -0
- package/lib/types/model.d.ts.map +1 -1
- package/lib/utils/errors.d.ts +3 -0
- package/lib/utils/errors.d.ts.map +1 -1
- package/lib/utils/errors.js +2 -1
- package/lib/utils/errors.js.map +1 -1
- package/lib-es/api/getBlock.d.ts.map +1 -1
- package/lib-es/api/getBlock.js +17 -5
- package/lib-es/api/getBlock.js.map +1 -1
- package/lib-es/api/listOperations.d.ts.map +1 -1
- package/lib-es/api/listOperations.js +120 -44
- package/lib-es/api/listOperations.js.map +1 -1
- package/lib-es/api/validateIntent.d.ts.map +1 -1
- package/lib-es/api/validateIntent.js +14 -9
- package/lib-es/api/validateIntent.js.map +1 -1
- package/lib-es/network/index.d.ts.map +1 -1
- package/lib-es/network/index.js +2 -0
- package/lib-es/network/index.js.map +1 -1
- package/lib-es/types/model.d.ts +1 -0
- package/lib-es/types/model.d.ts.map +1 -1
- package/lib-es/utils/errors.d.ts +3 -0
- package/lib-es/utils/errors.d.ts.map +1 -1
- package/lib-es/utils/errors.js +1 -0
- package/lib-es/utils/errors.js.map +1 -1
- package/package.json +1 -1
- package/src/api/getBlock.test.ts +102 -1
- package/src/api/getBlock.ts +23 -5
- package/src/api/index.integ.test.ts +6 -6
- package/src/api/index.test.ts +21 -5
- package/src/api/listOperations.test.ts +211 -3
- package/src/api/listOperations.ts +153 -49
- package/src/api/validateIntent.test.ts +105 -11
- package/src/api/validateIntent.ts +14 -9
- package/src/network/index.test.ts +32 -0
- package/src/network/index.ts +2 -0
- package/src/types/model.ts +1 -0
- 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
|
|
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
|
|
65
|
-
const
|
|
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,
|
|
74
|
+
return [shortage, nextOpts, paymentTxs, nonPaymentTxs];
|
|
77
75
|
}
|
|
78
|
-
let [txShortage, nextOptions, transactions,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
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
|
-
|
|
178
|
-
const
|
|
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 =
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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":"AAAA,4CAA4C;AAC5C,sCAAsC;AAItC,OAAO,EAAE,cAAc,EAAE,eAAe,EAA0B,MAAM,YAAY,CAAA;AAEpF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAyB;IAEzD,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAA;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAE3C,sFAAsF;IACtF,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IAED,IAAI,OAAO,GAA2B;QACpC,OAAO,EAAE,OAAO;KACjB,CAAA;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,GAAG;YACR,GAAG,OAAO;YACV,KAAK;SACN,CAAA;IACH,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,GAAG;YACR,GAAG,OAAO;YACV,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;SAC1B,CAAA;IACH,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAC7D,mFAAmF;QACnF,gDAAgD;QAChD,OAAO,GAAG;YACR,GAAG,OAAO;YACV,uGAAuG;YACvG,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACxD,CAAA;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,sBAAsB,CACnC,OAAe,EACf,IAA4B;QAE5B,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAA;QACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAA;QAEtC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAA;QAC/E
|
|
1
|
+
{"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sCAAsC;AAItC,OAAO,EAAE,cAAc,EAAE,eAAe,EAA0B,MAAM,YAAY,CAAA;AAEpF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAyB;IAEzD,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAA;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAE3C,sFAAsF;IACtF,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IAED,IAAI,OAAO,GAA2B;QACpC,OAAO,EAAE,OAAO;KACjB,CAAA;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,GAAG;YACR,GAAG,OAAO;YACV,KAAK;SACN,CAAA;IACH,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,GAAG;YACR,GAAG,OAAO;YACV,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;SAC1B,CAAA;IACH,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAAC;QAC7D,mFAAmF;QACnF,gDAAgD;QAChD,OAAO,GAAG;YACR,GAAG,OAAO;YACV,uGAAuG;YACvG,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACxD,CAAA;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,sBAAsB,CACnC,OAAe,EACf,IAA4B;QAE5B,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAA;QACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAA;QAEtC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAA;QAC/E,mGAAmG;QACnG,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAA;QAElF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAA;QACjE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAA;QAC7C,MAAM,QAAQ,GAA2B,EAAE,GAAG,QAAQ,EAAE,CAAA;QAExD,IAAI,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAA;YAChC,IAAI,QAAQ,CAAC,KAAK;gBAAE,QAAQ,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,CAAA;QACzD,CAAC;QACD,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,GAAG,MAAM,sBAAsB,CACvF,OAAO,EACP,OAAO,CACR,CAAA;IACD,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,IAAI,KAAK,CAAC,CAAA;IAC5E,wGAAwG;IACxG,OAAO,WAAW,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,CAAC,GACtE,MAAM,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACpD,UAAU,GAAG,aAAa,CAAA;QAC1B,WAAW,GAAG,cAAc,CAAA;QAC5B,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;QACnD,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACxD,CAAC;IAED,qGAAqG;IACrG,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,YAAY,CAAC,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,OAAO,EAAE,CAAA;IACzB,CAAC;IAED,8CAA8C;IAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzE,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAA;IACpE,MAAM,aAAa,GAAG,aAAa;SAChC,GAAG,CAAC,gCAAgC,CAAC,OAAO,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,EAAE,EAAmB,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAA;IAC/C,OAAO,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,aAAa,CAAC,EAAE,IAAI,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,sBAAsB,GAC1B,CAAC,OAAe,EAAE,EAAE,CACpB,CAAC,SAAwB,EAAa,EAAE;IACtC,MAAM,EACJ,WAAW,EACX,IAAI,EACJ,cAAc,EACd,IAAI,EAAE,EAAE,gBAAgB,EAAE,EAC1B,OAAO,EAAE,EACP,eAAe,EACf,GAAG,EACH,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,EACd,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,aAAa,GACd,GACF,GAAG,SAAS,CAAA;IAEb,MAAM,IAAI,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/C,MAAM,KAAK,GACT,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ;QACtD,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC1B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAEf,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAExB,MAAM,WAAW,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAEhD,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,GAAG;YACR,GAAG,OAAO;YACV,cAAc,EAAE,cAAc;SAC/B,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAA0B,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ;YACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU;YAC3B,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ;SACxB,CAAA;QACD,gCAAgC;QAChC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IACF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,GAAG;YACR,GAAG,OAAO;YACV,KAAK;SACN,CAAA;IACH,CAAC;IAED,OAAO,GAAG;QACR,GAAG,OAAO;QACV,SAAS,EAAE,eAAe;QAC1B,QAAQ,EAAE,QAAQ;QAClB,aAAa,EAAE,aAAa;KAC7B,CAAA;IAED,+GAA+G;IAC/G,gHAAgH;IAChH,+CAA+C;IAC/C,iFAAiF;IACjF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,iBAAiB,KAAK,YAAY,CAAA;IAEhE,IAAI,EAAE,GAAc;QAClB,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,EAAE,EAAE;YACF,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI;YACV,8EAA8E;YAC9E,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC;YAC3B,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC;gBAC9B,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,YAAY;aACrB;YACD,MAAM,EAAE,MAAM;SACf;QACD,IAAI,EAAE,IAAI;QACV,KAAK;QACL,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;KAC7C,CAAA;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,EAAE,GAAG;YACH,GAAG,EAAE;YACL,OAAO;SACR,CAAA;IACH,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAEH;;;;;;;;;GASG;AACH,SAAS,kBAAkB,CACzB,OAAe,EACf,aAA6B,EAC7B,GAAW;IAEX,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAA;YAC9B,IACE,IAAI,CAAC,eAAe,KAAK,aAAa;gBACtC,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO;gBACrC,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,QAAQ;gBAC7C,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,KAAK,QAAQ,EAChD,CAAC;gBACD,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAiB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,OAAiB,CAAC,CAC3F,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAA;YAC7B,IACE,IAAI,CAAC,eAAe,KAAK,aAAa;gBACtC,IAAI,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO;gBACnC,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,KAAK,QAAQ,EAC3C,CAAC;gBACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAiB,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAA;YAC7B,kGAAkG;YAClG,kGAAkG;YAClG,0FAA0F;YAC1F,IACE,IAAI,CAAC,eAAe,KAAK,aAAa;gBACtC,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO;gBACrC,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,QAAQ,EAC7C,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAiB,CAAC,CAAA;gBAC1D,+FAA+F;gBAC/F,OAAO,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,gCAAgC,GACpC,CAAC,OAAe,EAAE,EAAE,CACpB,CAAC,SAAwB,EAAoB,EAAE;IAC7C,MAAM,EACJ,WAAW,EACX,IAAI,EACJ,cAAc,EACd,IAAI,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE,EAC1C,OAAO,EAAE,EACP,eAAe,EACf,GAAG,EACH,IAAI,EACJ,OAAO,EACP,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,GACd,GACF,GAAG,SAAS,CAAA;IAEb,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,WAAW,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAChD,MAAM,MAAM,GAAG,iBAAiB,KAAK,YAAY,CAAA;IACjD,MAAM,UAAU,GAAG,OAAO,KAAK,OAAO,CAAA;IAEtC,yDAAyD;IACzD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,aAAa,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;IAElE,0GAA0G;IAC1G,yGAAyG;IACzG,MAAM,YAAY,GAAG,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IAEpE,MAAM,MAAM,GAAG;QACb,IAAI;QACJ,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC;QAC3B,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC;YAC9B,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,YAAY;SACrB;QACD,MAAM;KACP,CAAA;IAED,MAAM,OAAO,GAAG;QACd,SAAS,EAAE,eAAe;QAC1B,QAAQ,EAAE,QAAQ;QAClB,aAAa,EAAE,aAAa;KAC7B,CAAA;IAED,qDAAqD;IACrD,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;QACpD,MAAM,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;QAErE,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,EAAE,EAAE,MAAM;YACV,IAAI;YACJ,KAAK;YACL,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;YAC5C,OAAO;SACR,CAAA;IACH,CAAC;IAED,6DAA6D;IAC7D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAChB,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,UAAU,EAAE,EAAE;YACd,OAAO;SACR,CAAA;IACH,CAAC;IAED,8CAA8C;IAC9C,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -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;
|
|
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 (
|
|
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
|
-
|
|
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":"AAAA,4CAA4C;AAC5C,sCAAsC;AAQtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAA;AACrF,OAAO,EACL,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,4CAA4C,EAC5C,4CAA4C,EAC5C,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,
|
|
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,
|
|
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"}
|
package/lib-es/network/index.js
CHANGED
|
@@ -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":"AAAA,4CAA4C;AAC5C,sCAAsC;AAGtC,OAAO,OAAO,MAAM,wBAAwB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,UAAU,MAAM,WAAW,CAAA;AAClC,OAAO,EAEL,eAAe,EACf,gBAAgB,GAQjB,MAAM,SAAS,CAAA;AAEhB,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,IAAI,CAAA;AAExD,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAA;AACtD,MAAM,uBAAuB,GAAG,cAAc,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,SAAiB,EAA0B,EAAE;IACxE,OAAO,OAAO,CAAgB,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,SAAiB,EACjB,OAAiB,EACK,EAAE;IACxB,MAAM,EACJ,IAAI,EAAE,EAAE,MAAM,EAAE,GACjB,GAAG,MAAM,OAAO,CAAkD;QACjE,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,UAAU,EAAE;QACjB,IAAI,EAAE;YACJ,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE;gBACN;oBACE,OAAO,EAAE,SAAS;oBAClB,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;iBAChD;aACF;SACF;KACF,CAAC,CAAA;IAEF,IACE,MAAM,CAAC,MAAM,KAAK,SAAS;QAC3B,MAAM,CAAC,KAAK;QACZ,CAAC,CAAC,uBAAuB,EAAE,yBAAyB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"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"}
|
package/lib-es/types/model.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/lib-es/utils/errors.d.ts
CHANGED
|
@@ -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"}
|
package/lib-es/utils/errors.js
CHANGED
|
@@ -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
package/src/api/getBlock.test.ts
CHANGED
|
@@ -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
|
|
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({
|
package/src/api/getBlock.ts
CHANGED
|
@@ -25,9 +25,8 @@ const TX_RESULT_TESSUCCESS = 'tesSUCCESS'
|
|
|
25
25
|
const METADATA_NODE_ENTRYTYPE_ACCOUNTROOT = 'AccountRoot'
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
* Creates
|
|
29
|
-
* Returns
|
|
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(
|
|
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
|
|
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
|
|
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: '
|
|
356
|
+
type: 'OUT',
|
|
357
357
|
fees: 0.00001,
|
|
358
358
|
}
|
|
359
|
-
const op =
|
|
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))
|