@ledgerhq/coin-xrp 7.23.5 → 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 +6 -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-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/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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @ledgerhq/coin-xrp
|
|
2
2
|
|
|
3
|
+
## 7.24.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#699](https://github.com/LedgerHQ/coin-modules/pull/699) [`7f21a29`](https://github.com/LedgerHQ/coin-modules/commit/7f21a2920fb5e5253215585f7cffddbc20e47823) Thanks [@estrauser-ledger](https://github.com/estrauser-ledger)! - fix: coin-xrp now uses AffectedNodes ledger metadata instead of Account/Destination field matching to capture all XRP balance changes from non-Payment transactions
|
|
8
|
+
|
|
3
9
|
## 7.23.5
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBlock.d.ts","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,KAAK,EAIN,MAAM,2CAA2C,CAAA;
|
|
1
|
+
{"version":3,"file":"getBlock.d.ts","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,KAAK,EAIN,MAAM,2CAA2C,CAAA;AA2HlD,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAW5D"}
|
package/lib/api/getBlock.js
CHANGED
|
@@ -10,9 +10,8 @@ const ASSETINFO_NATIVE = { type: 'native', name: 'XRP' };
|
|
|
10
10
|
const TX_RESULT_TESSUCCESS = 'tesSUCCESS';
|
|
11
11
|
const METADATA_NODE_ENTRYTYPE_ACCOUNTROOT = 'AccountRoot';
|
|
12
12
|
/**
|
|
13
|
-
* Creates
|
|
14
|
-
* Returns
|
|
15
|
-
* for fee-only balance changes (e.g., AccountSet transactions).
|
|
13
|
+
* Creates a transfer operation for an account balance change.
|
|
14
|
+
* Returns null if the balance change is zero or fee-only (adjustedDiff === 0).
|
|
16
15
|
*/
|
|
17
16
|
function createBalanceOperation(account, diff, fee, feesPayer, destination) {
|
|
18
17
|
if (diff === BigInt(0))
|
|
@@ -23,6 +22,8 @@ function createBalanceOperation(account, diff, fee, feesPayer, destination) {
|
|
|
23
22
|
if (account === feesPayer) {
|
|
24
23
|
adjustedDiff = diff + fee;
|
|
25
24
|
}
|
|
25
|
+
if (adjustedDiff === BigInt(0))
|
|
26
|
+
return null;
|
|
26
27
|
const peer = account === feesPayer ? destination : feesPayer;
|
|
27
28
|
return {
|
|
28
29
|
type: BLOCK_OPERATION_TRANSFER,
|
|
@@ -59,8 +60,19 @@ function mapCreatedNode(data, fee, feesPayer, destination) {
|
|
|
59
60
|
}
|
|
60
61
|
return [{ type: BLOCK_OPERATION_OTHER, ...data }];
|
|
61
62
|
}
|
|
62
|
-
function mapDeletedNode(data) {
|
|
63
|
+
function mapDeletedNode(data, fee, feesPayer, destination) {
|
|
63
64
|
if (data.LedgerEntryType === METADATA_NODE_ENTRYTYPE_ACCOUNTROOT) {
|
|
65
|
+
const balance = data.FinalFields?.Balance;
|
|
66
|
+
const account = data.FinalFields?.Account;
|
|
67
|
+
if (typeof balance === 'string' && typeof account === 'string') {
|
|
68
|
+
// AccountDelete: FinalFields.Balance is the post-fee balance sent to the destination.
|
|
69
|
+
// For the fee payer, we include the fee in the diff so createBalanceOperation's
|
|
70
|
+
// adjustment (diff + fee) yields the correct transfer amount (-balance).
|
|
71
|
+
const balanceVal = BigInt(balance);
|
|
72
|
+
const diff = account === feesPayer ? -(balanceVal + fee) : -balanceVal;
|
|
73
|
+
const op = createBalanceOperation(account, diff, fee, feesPayer, destination);
|
|
74
|
+
return op ? [op] : [];
|
|
75
|
+
}
|
|
64
76
|
return [];
|
|
65
77
|
}
|
|
66
78
|
return [{ type: BLOCK_OPERATION_OTHER, ...data }];
|
|
@@ -102,7 +114,7 @@ function mapBlockTransactions(txs) {
|
|
|
102
114
|
return mapCreatedNode(node.CreatedNode, fee, feesPayer, destination);
|
|
103
115
|
}
|
|
104
116
|
if ('DeletedNode' in node) {
|
|
105
|
-
return mapDeletedNode(node.DeletedNode);
|
|
117
|
+
return mapDeletedNode(node.DeletedNode, fee, feesPayer, destination);
|
|
106
118
|
}
|
|
107
119
|
return [];
|
|
108
120
|
})
|
package/lib/api/getBlock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBlock.js","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,sCAAsC;;
|
|
1
|
+
{"version":3,"file":"getBlock.js","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listOperations.d.ts","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAA;AAErE,OAAO,EAAE,qBAAqB,EAAW,MAAM,UAAU,CAAA;AAGzD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,qBAAqB,GACxD,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"listOperations.d.ts","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAA;AAErE,OAAO,EAAE,qBAAqB,EAAW,MAAM,UAAU,CAAA;AAGzD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,qBAAqB,GACxD,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,CAkGhC"}
|
|
@@ -55,7 +55,7 @@ async function listOperations(address, { limit, minHeight, token, order }) {
|
|
|
55
55
|
/**
|
|
56
56
|
* Fetches one page of account_tx and splits results into:
|
|
57
57
|
* - Payment transactions (OUT/IN)
|
|
58
|
-
* - Non-Payment transactions
|
|
58
|
+
* - Non-Payment transactions (balance changes extracted from AffectedNodes metadata)
|
|
59
59
|
*
|
|
60
60
|
* tx_type node RPC filter is unreliable (see LIVE-16705), so we filter client-side.
|
|
61
61
|
*/
|
|
@@ -64,10 +64,8 @@ async function listOperations(address, { limit, minHeight, token, order }) {
|
|
|
64
64
|
const txs = response.transactions;
|
|
65
65
|
const responseMarker = response.marker;
|
|
66
66
|
const paymentTxs = txs.filter((tx) => tx.tx_json.TransactionType === 'Payment');
|
|
67
|
-
// Non-Payment transactions
|
|
68
|
-
const
|
|
69
|
-
// Non-Payment transactions received by this account: the account received XRP but did not pay fees.
|
|
70
|
-
const receivedTxs = txs.filter((tx) => tx.tx_json.TransactionType !== 'Payment' && tx.tx_json.Destination === address);
|
|
67
|
+
// Non-Payment transactions — filtered for balance impact later by convertNonPaymentToCoreOperation
|
|
68
|
+
const nonPaymentTxs = txs.filter((tx) => tx.tx_json.TransactionType !== 'Payment');
|
|
71
69
|
const shortage = (opts.limit && txs.length < opts.limit) || false;
|
|
72
70
|
const { marker: _marker, ...restOpts } = opts;
|
|
73
71
|
const nextOpts = { ...restOpts };
|
|
@@ -76,31 +74,30 @@ async function listOperations(address, { limit, minHeight, token, order }) {
|
|
|
76
74
|
if (nextOpts.limit)
|
|
77
75
|
nextOpts.limit -= paymentTxs.length;
|
|
78
76
|
}
|
|
79
|
-
return [shortage, nextOpts, paymentTxs,
|
|
77
|
+
return [shortage, nextOpts, paymentTxs, nonPaymentTxs];
|
|
80
78
|
}
|
|
81
|
-
let [txShortage, nextOptions, transactions,
|
|
79
|
+
let [txShortage, nextOptions, transactions, nonPaymentTxs] = await getAccountTransactions(address, options);
|
|
82
80
|
const isEnough = () => txShortage || (limit && transactions.length >= limit);
|
|
83
81
|
// We need to call the node RPC multiple times to get the desired number of transactions by the limiter.
|
|
84
82
|
while (nextOptions.limit && !isEnough()) {
|
|
85
|
-
const [newTxShortage, newNextOptions, newTransactions,
|
|
83
|
+
const [newTxShortage, newNextOptions, newTransactions, newNonPaymentTxs] = await getAccountTransactions(address, nextOptions);
|
|
86
84
|
txShortage = newTxShortage;
|
|
87
85
|
nextOptions = newNextOptions;
|
|
88
86
|
transactions = transactions.concat(newTransactions);
|
|
89
|
-
|
|
90
|
-
receivedTxs = receivedTxs.concat(newReceivedTxs);
|
|
87
|
+
nonPaymentTxs = nonPaymentTxs.concat(newNonPaymentTxs);
|
|
91
88
|
}
|
|
92
89
|
// the order is reversed so that the results are always sorted by newest tx first element of the list
|
|
93
90
|
if (order === 'asc') {
|
|
94
91
|
transactions.reverse();
|
|
95
|
-
|
|
96
|
-
receivedTxs.reverse();
|
|
92
|
+
nonPaymentTxs.reverse();
|
|
97
93
|
}
|
|
98
94
|
// the next index to start the pagination from
|
|
99
95
|
const next = nextOptions.marker ? JSON.stringify(nextOptions.marker) : '';
|
|
100
96
|
const paymentOps = transactions.map(convertToCoreOperation(address));
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
97
|
+
const nonPaymentOps = nonPaymentTxs
|
|
98
|
+
.map(convertNonPaymentToCoreOperation(address))
|
|
99
|
+
.filter((op) => op !== null);
|
|
100
|
+
return [[...paymentOps, ...nonPaymentOps], next];
|
|
104
101
|
}
|
|
105
102
|
const convertToCoreOperation = (address) => (operation) => {
|
|
106
103
|
const { ledger_hash, hash, close_time_iso, meta: { delivered_amount }, tx_json: { TransactionType, Fee, date, Account, Destination, DestinationTag, Memos, ledger_index, Sequence, SigningPubKey, }, } = operation;
|
|
@@ -173,38 +170,117 @@ const convertToCoreOperation = (address) => (operation) => {
|
|
|
173
170
|
return op;
|
|
174
171
|
};
|
|
175
172
|
/**
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
173
|
+
* Finds the XRP (native) balance change for a specific address in a transaction's AffectedNodes.
|
|
174
|
+
* Returns the balance diff in drops, or null if the address's AccountRoot was not affected.
|
|
175
|
+
*
|
|
176
|
+
* For ModifiedNode: diff = FinalFields.Balance - PreviousFields.Balance (includes fee deduction).
|
|
177
|
+
* For CreatedNode: diff = NewFields.Balance (initial funding amount).
|
|
178
|
+
* For DeletedNode: diff = -(FinalFields.Balance + fee). FinalFields.Balance is the post-fee balance
|
|
179
|
+
* remaining when the account was deleted. We add the fee back so the caller's fee adjustment
|
|
180
|
+
* (adjustedDiff = diff + fee) yields the correct transfer amount.
|
|
179
181
|
*/
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
+
function findXrpBalanceDiff(address, affectedNodes, fee) {
|
|
183
|
+
for (const node of affectedNodes) {
|
|
184
|
+
if ('ModifiedNode' in node) {
|
|
185
|
+
const data = node.ModifiedNode;
|
|
186
|
+
if (data.LedgerEntryType === 'AccountRoot' &&
|
|
187
|
+
data.FinalFields?.Account === address &&
|
|
188
|
+
typeof data.FinalFields?.Balance === 'string' &&
|
|
189
|
+
typeof data.PreviousFields?.Balance === 'string') {
|
|
190
|
+
return (BigInt(data.FinalFields.Balance) - BigInt(data.PreviousFields.Balance));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if ('CreatedNode' in node) {
|
|
194
|
+
const data = node.CreatedNode;
|
|
195
|
+
if (data.LedgerEntryType === 'AccountRoot' &&
|
|
196
|
+
data.NewFields?.Account === address &&
|
|
197
|
+
typeof data.NewFields?.Balance === 'string') {
|
|
198
|
+
return BigInt(data.NewFields.Balance);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if ('DeletedNode' in node) {
|
|
202
|
+
const data = node.DeletedNode;
|
|
203
|
+
// AccountDelete: the sender's AccountRoot is deleted. FinalFields.Balance is the post-fee balance
|
|
204
|
+
// (the fee was already deducted before deletion). We return -(Balance + fee) so that the caller's
|
|
205
|
+
// fee adjustment (diff + fee) yields the correct transfer amount (= FinalFields.Balance).
|
|
206
|
+
if (data.LedgerEntryType === 'AccountRoot' &&
|
|
207
|
+
data.FinalFields?.Account === address &&
|
|
208
|
+
typeof data.FinalFields?.Balance === 'string') {
|
|
209
|
+
const balance = BigInt(data.FinalFields.Balance);
|
|
210
|
+
// Include the fee in the diff so the caller's adjustedDiff = (-balance - fee) + fee = -balance
|
|
211
|
+
return -(balance + fee);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Converts a non-Payment transaction into an Operation by inspecting AffectedNodes metadata
|
|
219
|
+
* to determine the actual XRP balance change for the queried address.
|
|
220
|
+
*
|
|
221
|
+
* This handles DEX trades (OfferCreate), TrustSet, AccountSet, etc. where the queried address
|
|
222
|
+
* may gain or lose XRP through offer matching — not just pay fees.
|
|
223
|
+
*
|
|
224
|
+
* Returns null if the transaction does not affect the address's XRP balance and the address
|
|
225
|
+
* is not the fee payer.
|
|
226
|
+
*/
|
|
227
|
+
const convertNonPaymentToCoreOperation = (address) => (operation) => {
|
|
228
|
+
const { ledger_hash, hash, close_time_iso, meta: { AffectedNodes, TransactionResult }, tx_json: { TransactionType, Fee, date, Account, Destination, ledger_index, Sequence, SigningPubKey, }, } = operation;
|
|
229
|
+
const fee = BigInt(Fee);
|
|
182
230
|
const toEpochDate = (utils_1.RIPPLE_EPOCH + date) * 1000;
|
|
183
|
-
const failed =
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
type: 'FEES',
|
|
200
|
-
value: BigInt(0),
|
|
201
|
-
senders: [Account],
|
|
202
|
-
recipients: [],
|
|
203
|
-
details: {
|
|
204
|
-
xrpTxType: TransactionType,
|
|
205
|
-
sequence: Sequence,
|
|
206
|
-
signingPubKey: SigningPubKey,
|
|
231
|
+
const failed = TransactionResult !== 'tesSUCCESS';
|
|
232
|
+
const isFeePayer = Account === address;
|
|
233
|
+
// Extract actual XRP balance change from ledger metadata
|
|
234
|
+
const diff = findXrpBalanceDiff(address, AffectedNodes ?? [], fee);
|
|
235
|
+
// The ledger diff already includes the fee deduction, so add the fee back to isolate the transfer amount.
|
|
236
|
+
// Example: sender trades 5 XRP + 12 drops fee → diff = -5000012, adjustedDiff = -5000012 + 12 = -5000000
|
|
237
|
+
const adjustedDiff = diff !== null && isFeePayer ? diff + fee : diff;
|
|
238
|
+
const baseTx = {
|
|
239
|
+
hash,
|
|
240
|
+
fees: fee,
|
|
241
|
+
feesPayer: Account,
|
|
242
|
+
date: new Date(toEpochDate),
|
|
243
|
+
block: {
|
|
244
|
+
time: new Date(close_time_iso),
|
|
245
|
+
hash: ledger_hash,
|
|
246
|
+
height: ledger_index,
|
|
207
247
|
},
|
|
248
|
+
failed,
|
|
208
249
|
};
|
|
250
|
+
const details = {
|
|
251
|
+
xrpTxType: TransactionType,
|
|
252
|
+
sequence: Sequence,
|
|
253
|
+
signingPubKey: SigningPubKey,
|
|
254
|
+
};
|
|
255
|
+
// Non-zero transfer amount: emit IN or OUT operation
|
|
256
|
+
if (adjustedDiff !== null && adjustedDiff !== BigInt(0)) {
|
|
257
|
+
const type = adjustedDiff > BigInt(0) ? 'IN' : 'OUT';
|
|
258
|
+
const value = adjustedDiff > BigInt(0) ? adjustedDiff : -adjustedDiff;
|
|
259
|
+
return {
|
|
260
|
+
id: hash,
|
|
261
|
+
asset: { type: 'native' },
|
|
262
|
+
tx: baseTx,
|
|
263
|
+
type,
|
|
264
|
+
value,
|
|
265
|
+
senders: [Account],
|
|
266
|
+
recipients: Destination ? [Destination] : [],
|
|
267
|
+
details,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// No transfer beyond fees — only emit FEES for the fee payer
|
|
271
|
+
if (isFeePayer) {
|
|
272
|
+
return {
|
|
273
|
+
id: hash,
|
|
274
|
+
asset: { type: 'native' },
|
|
275
|
+
tx: baseTx,
|
|
276
|
+
type: 'FEES',
|
|
277
|
+
value: BigInt(0),
|
|
278
|
+
senders: [Account],
|
|
279
|
+
recipients: [],
|
|
280
|
+
details,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
// Not fee payer, no XRP balance change — skip
|
|
284
|
+
return null;
|
|
209
285
|
};
|
|
210
286
|
//# sourceMappingURL=listOperations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,sCAAsC;;AAqBtC,
|
|
1
|
+
{"version":3,"file":"listOperations.js","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBlock.d.ts","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,KAAK,EAIN,MAAM,2CAA2C,CAAA;
|
|
1
|
+
{"version":3,"file":"getBlock.d.ts","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,KAAK,EAIN,MAAM,2CAA2C,CAAA;AA2HlD,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAW5D"}
|
package/lib-es/api/getBlock.js
CHANGED
|
@@ -7,9 +7,8 @@ const ASSETINFO_NATIVE = { type: 'native', name: 'XRP' };
|
|
|
7
7
|
const TX_RESULT_TESSUCCESS = 'tesSUCCESS';
|
|
8
8
|
const METADATA_NODE_ENTRYTYPE_ACCOUNTROOT = 'AccountRoot';
|
|
9
9
|
/**
|
|
10
|
-
* Creates
|
|
11
|
-
* Returns
|
|
12
|
-
* for fee-only balance changes (e.g., AccountSet transactions).
|
|
10
|
+
* Creates a transfer operation for an account balance change.
|
|
11
|
+
* Returns null if the balance change is zero or fee-only (adjustedDiff === 0).
|
|
13
12
|
*/
|
|
14
13
|
function createBalanceOperation(account, diff, fee, feesPayer, destination) {
|
|
15
14
|
if (diff === BigInt(0))
|
|
@@ -20,6 +19,8 @@ function createBalanceOperation(account, diff, fee, feesPayer, destination) {
|
|
|
20
19
|
if (account === feesPayer) {
|
|
21
20
|
adjustedDiff = diff + fee;
|
|
22
21
|
}
|
|
22
|
+
if (adjustedDiff === BigInt(0))
|
|
23
|
+
return null;
|
|
23
24
|
const peer = account === feesPayer ? destination : feesPayer;
|
|
24
25
|
return {
|
|
25
26
|
type: BLOCK_OPERATION_TRANSFER,
|
|
@@ -56,8 +57,19 @@ function mapCreatedNode(data, fee, feesPayer, destination) {
|
|
|
56
57
|
}
|
|
57
58
|
return [{ type: BLOCK_OPERATION_OTHER, ...data }];
|
|
58
59
|
}
|
|
59
|
-
function mapDeletedNode(data) {
|
|
60
|
+
function mapDeletedNode(data, fee, feesPayer, destination) {
|
|
60
61
|
if (data.LedgerEntryType === METADATA_NODE_ENTRYTYPE_ACCOUNTROOT) {
|
|
62
|
+
const balance = data.FinalFields?.Balance;
|
|
63
|
+
const account = data.FinalFields?.Account;
|
|
64
|
+
if (typeof balance === 'string' && typeof account === 'string') {
|
|
65
|
+
// AccountDelete: FinalFields.Balance is the post-fee balance sent to the destination.
|
|
66
|
+
// For the fee payer, we include the fee in the diff so createBalanceOperation's
|
|
67
|
+
// adjustment (diff + fee) yields the correct transfer amount (-balance).
|
|
68
|
+
const balanceVal = BigInt(balance);
|
|
69
|
+
const diff = account === feesPayer ? -(balanceVal + fee) : -balanceVal;
|
|
70
|
+
const op = createBalanceOperation(account, diff, fee, feesPayer, destination);
|
|
71
|
+
return op ? [op] : [];
|
|
72
|
+
}
|
|
61
73
|
return [];
|
|
62
74
|
}
|
|
63
75
|
return [{ type: BLOCK_OPERATION_OTHER, ...data }];
|
|
@@ -99,7 +111,7 @@ function mapBlockTransactions(txs) {
|
|
|
99
111
|
return mapCreatedNode(node.CreatedNode, fee, feesPayer, destination);
|
|
100
112
|
}
|
|
101
113
|
if ('DeletedNode' in node) {
|
|
102
|
-
return mapDeletedNode(node.DeletedNode);
|
|
114
|
+
return mapDeletedNode(node.DeletedNode, fee, feesPayer, destination);
|
|
103
115
|
}
|
|
104
116
|
return [];
|
|
105
117
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBlock.js","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sCAAsC;AAiBtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,qBAAqB,GAAG,OAAO,CAAA;AACrC,MAAM,wBAAwB,GAAG,UAAU,CAAA;AAC3C,MAAM,gBAAgB,GAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACnE,MAAM,oBAAoB,GAAG,YAAY,CAAA;AACzC,MAAM,mCAAmC,GAAG,aAAa,CAAA;AAEzD
|
|
1
|
+
{"version":3,"file":"getBlock.js","sourceRoot":"","sources":["../../src/api/getBlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listOperations.d.ts","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAA;AAErE,OAAO,EAAE,qBAAqB,EAAW,MAAM,UAAU,CAAA;AAGzD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,qBAAqB,GACxD,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"listOperations.d.ts","sourceRoot":"","sources":["../../src/api/listOperations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAA;AAErE,OAAO,EAAE,qBAAqB,EAAW,MAAM,UAAU,CAAA;AAGzD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,qBAAqB,GACxD,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,CAkGhC"}
|