tbc-tx-parser 0.1.6 → 0.1.8
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/README.md +65 -8
- package/dist/decode-tx-raw.d.ts.map +1 -1
- package/dist/decode-tx-raw.js +28 -5
- package/dist/decode-tx-raw.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/protocols/ft/index.d.ts +12 -0
- package/dist/protocols/ft/index.d.ts.map +1 -1
- package/dist/protocols/ft/index.js +141 -18
- package/dist/protocols/ft/index.js.map +1 -1
- package/dist/protocols/order-book/facts.d.ts +1 -1
- package/dist/protocols/order-book/facts.d.ts.map +1 -1
- package/dist/protocols/order-book/facts.js +8 -6
- package/dist/protocols/order-book/facts.js.map +1 -1
- package/dist/protocols/order-book/settlement.js +2 -2
- package/dist/protocols/order-book/settlement.js.map +1 -1
- package/dist/render-transaction-description.d.ts +8 -0
- package/dist/render-transaction-description.d.ts.map +1 -0
- package/dist/render-transaction-description.js +32 -0
- package/dist/render-transaction-description.js.map +1 -0
- package/dist/result/classification-description.d.ts +11 -0
- package/dist/result/classification-description.d.ts.map +1 -0
- package/dist/result/classification-description.js +570 -0
- package/dist/result/classification-description.js.map +1 -0
- package/dist/result/classification.d.ts +20 -0
- package/dist/result/classification.d.ts.map +1 -0
- package/dist/result/classification.js +495 -0
- package/dist/result/classification.js.map +1 -0
- package/dist/result/index.d.ts +2 -1
- package/dist/result/index.d.ts.map +1 -1
- package/dist/result/index.js +23 -1
- package/dist/result/index.js.map +1 -1
- package/dist/result/semantic.d.ts.map +1 -1
- package/dist/result/semantic.js +17 -7
- package/dist/result/semantic.js.map +1 -1
- package/dist/types/result.d.ts +44 -0
- package/dist/types/result.d.ts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
import { SATOSHIS_PER_TBC } from '../constants/chain.js';
|
|
2
|
+
import { getMultiSigAddress, getSignatureAndPublicKeyCount } from '../utils/multi-sig.js';
|
|
3
|
+
import { formatTokenRawAmount } from '../utils/token-amount.js';
|
|
4
|
+
function commaInteger(value) {
|
|
5
|
+
const [integer = '0', decimal] = value.split('.');
|
|
6
|
+
const grouped = integer.replace(/\B(?=(\d{3})+(?!\d))/gu, ',');
|
|
7
|
+
return decimal ? `${grouped}.${decimal}` : grouped;
|
|
8
|
+
}
|
|
9
|
+
function trimDecimal(value) {
|
|
10
|
+
return value.includes('.') ? value.replace(/0+$/u, '').replace(/\.$/u, '') : value;
|
|
11
|
+
}
|
|
12
|
+
function formatNativeAmount(satoshis, unit = 'satoshi', fixedTbcDecimals = false) {
|
|
13
|
+
if (unit === 'satoshi') {
|
|
14
|
+
return `${commaInteger(satoshis.toString())} ${satoshis === 1n ? 'satoshi' : 'satoshis'}`;
|
|
15
|
+
}
|
|
16
|
+
const negative = satoshis < 0n;
|
|
17
|
+
const absolute = negative ? -satoshis : satoshis;
|
|
18
|
+
const scale = BigInt(SATOSHIS_PER_TBC);
|
|
19
|
+
const integer = absolute / scale;
|
|
20
|
+
const fraction = (absolute % scale).toString().padStart(6, '0');
|
|
21
|
+
const displayedFraction = fixedTbcDecimals ? fraction : fraction.replace(/0+$/u, '');
|
|
22
|
+
const unsigned = displayedFraction ? `${integer}.${displayedFraction}` : integer.toString();
|
|
23
|
+
return `${commaInteger(`${negative ? '-' : ''}${unsigned}`)} TBC`;
|
|
24
|
+
}
|
|
25
|
+
function cleanLabel(value, fallback) {
|
|
26
|
+
const normalized = value?.replace(/\s+/gu, ' ').trim();
|
|
27
|
+
if (!normalized)
|
|
28
|
+
return fallback;
|
|
29
|
+
return normalized.length > 40 ? `${normalized.slice(0, 37)}...` : normalized;
|
|
30
|
+
}
|
|
31
|
+
function amountKey(flow) {
|
|
32
|
+
return [
|
|
33
|
+
flow.asset.type,
|
|
34
|
+
'contractId' in flow.asset ? flow.asset.contractId : undefined,
|
|
35
|
+
'collectionId' in flow.asset ? flow.asset.collectionId : undefined,
|
|
36
|
+
'symbol' in flow.asset ? flow.asset.symbol : undefined,
|
|
37
|
+
'decimal' in flow.asset ? flow.asset.decimal : undefined,
|
|
38
|
+
].join('|');
|
|
39
|
+
}
|
|
40
|
+
function summarizeAmounts(flows, tbcUnit = 'satoshi') {
|
|
41
|
+
const groups = new Map();
|
|
42
|
+
flows.forEach((flow) => {
|
|
43
|
+
if (!('amount' in flow) || !flow.amount)
|
|
44
|
+
return;
|
|
45
|
+
const key = amountKey(flow);
|
|
46
|
+
groups.set(key, [...(groups.get(key) ?? []), flow]);
|
|
47
|
+
});
|
|
48
|
+
return [...groups.values()].map((group) => {
|
|
49
|
+
const first = group[0];
|
|
50
|
+
if (first.asset.type === 'tbc') {
|
|
51
|
+
const satoshis = group.reduce((total, flow) => total + BigInt('amount' in flow && flow.amount && 'satoshis' in flow.amount ? flow.amount.satoshis : 0), 0n);
|
|
52
|
+
return {
|
|
53
|
+
assetType: 'tbc',
|
|
54
|
+
symbol: 'TBC',
|
|
55
|
+
text: formatNativeAmount(satoshis, tbcUnit),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const raw = group.reduce((total, flow) => total + BigInt('amount' in flow && flow.amount && 'raw' in flow.amount ? flow.amount.raw : 0), 0n);
|
|
59
|
+
const decimal = 'decimal' in first.asset
|
|
60
|
+
? first.asset.decimal ?? ('amount' in first && first.amount && 'decimal' in first.amount ? first.amount.decimal : 0)
|
|
61
|
+
: 0;
|
|
62
|
+
const display = trimDecimal(formatTokenRawAmount(raw, decimal ?? 0));
|
|
63
|
+
const symbol = cleanLabel('symbol' in first.asset ? first.asset.symbol : undefined, 'tokens');
|
|
64
|
+
return {
|
|
65
|
+
assetType: first.asset.type,
|
|
66
|
+
symbol,
|
|
67
|
+
text: `${commaInteger(display)} ${symbol}${first.asset.type === 'ftlp' ? ' liquidity tokens' : ''}`,
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function amountText(flows, fallback, tbcUnit = 'satoshi') {
|
|
72
|
+
const summaries = summarizeAmounts(flows, tbcUnit);
|
|
73
|
+
if (!summaries.length)
|
|
74
|
+
return fallback;
|
|
75
|
+
if (summaries.length === 1)
|
|
76
|
+
return summaries[0].text;
|
|
77
|
+
if (summaries.length === 2)
|
|
78
|
+
return `${summaries[0].text} and ${summaries[1].text}`;
|
|
79
|
+
return `${summaries.slice(0, -1).map((item) => item.text).join(', ')}, and ${summaries.at(-1).text}`;
|
|
80
|
+
}
|
|
81
|
+
function isMultisigAddress(address, facts) {
|
|
82
|
+
return facts.outputs.some((output) => output.address === address &&
|
|
83
|
+
(output.script.type === 'MULTISIG' || ('scriptKind' in output && output.scriptKind === 'multisig'))) || facts.inputs.some((input) => input.prevout?.address === address && input.prevout.script.type === 'MULTISIG');
|
|
84
|
+
}
|
|
85
|
+
function addressIdentity(address, facts) {
|
|
86
|
+
return {
|
|
87
|
+
key: `address:${address}`,
|
|
88
|
+
kind: isMultisigAddress(address, facts) ? 'multisig' : 'address',
|
|
89
|
+
value: address,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function endpointIdentities(endpoint, facts) {
|
|
93
|
+
if (!endpoint)
|
|
94
|
+
return [];
|
|
95
|
+
if (endpoint.poolId)
|
|
96
|
+
return [{ key: `pool:${endpoint.poolId}`, kind: 'pool', value: endpoint.poolId }];
|
|
97
|
+
if (endpoint.address)
|
|
98
|
+
return [addressIdentity(endpoint.address, facts)];
|
|
99
|
+
if (endpoint.addresses?.length) {
|
|
100
|
+
return [...new Set(endpoint.addresses)].map((address) => addressIdentity(address, facts));
|
|
101
|
+
}
|
|
102
|
+
if (endpoint.hash)
|
|
103
|
+
return [{ key: `hash:${endpoint.hash}`, kind: 'hash', value: endpoint.hash }];
|
|
104
|
+
if (endpoint.txid !== undefined || endpoint.vout !== undefined) {
|
|
105
|
+
return [{ key: `outpoint:${endpoint.txid ?? ''}:${endpoint.vout ?? ''}`, kind: 'outpoint' }];
|
|
106
|
+
}
|
|
107
|
+
if (endpoint.outpoints?.length) {
|
|
108
|
+
return endpoint.outpoints.map((outpoint) => ({
|
|
109
|
+
key: `outpoint:${outpoint.txid}:${outpoint.vout}`,
|
|
110
|
+
kind: 'outpoint',
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
if (endpoint.script?.hex || endpoint.script?.asm) {
|
|
114
|
+
return [{ key: `script:${endpoint.script.hex ?? endpoint.script.asm}`, kind: 'script' }];
|
|
115
|
+
}
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
function summarizeDestinations(flows, facts, direction = 'to') {
|
|
119
|
+
const identities = new Map();
|
|
120
|
+
let complete = flows.length > 0;
|
|
121
|
+
for (const flow of flows) {
|
|
122
|
+
const endpoint = direction === 'to' ? flow.to : flow.from;
|
|
123
|
+
const values = endpointIdentities(endpoint, facts);
|
|
124
|
+
if (!values.length)
|
|
125
|
+
complete = false;
|
|
126
|
+
values.forEach((value) => identities.set(value.key, value));
|
|
127
|
+
}
|
|
128
|
+
return { complete, identities: [...identities.values()] };
|
|
129
|
+
}
|
|
130
|
+
function destinationGroupPhrase(kind, count, other) {
|
|
131
|
+
if (kind === 'address') {
|
|
132
|
+
if (count === 1)
|
|
133
|
+
return other ? 'another address' : 'an address';
|
|
134
|
+
return `${count} ${other ? 'other ' : ''}addresses`;
|
|
135
|
+
}
|
|
136
|
+
if (kind === 'multisig') {
|
|
137
|
+
if (count === 1)
|
|
138
|
+
return 'a multisignature wallet';
|
|
139
|
+
return `${count} multisignature wallets`;
|
|
140
|
+
}
|
|
141
|
+
if (kind === 'pool') {
|
|
142
|
+
if (count === 1)
|
|
143
|
+
return 'a liquidity pool';
|
|
144
|
+
return `${count} liquidity pools`;
|
|
145
|
+
}
|
|
146
|
+
if (count === 1)
|
|
147
|
+
return other ? 'another destination' : 'a destination';
|
|
148
|
+
return `${count} ${other ? 'other ' : ''}destinations`;
|
|
149
|
+
}
|
|
150
|
+
function singleDestinationPhrase(identity) {
|
|
151
|
+
if (identity.kind === 'address' && identity.value)
|
|
152
|
+
return `address ${identity.value}`;
|
|
153
|
+
if (identity.kind === 'multisig' && identity.value)
|
|
154
|
+
return `multisignature wallet ${identity.value}`;
|
|
155
|
+
if (identity.kind === 'pool' && identity.value)
|
|
156
|
+
return `liquidity pool ${identity.value}`;
|
|
157
|
+
if (identity.kind === 'hash' && identity.value)
|
|
158
|
+
return `destination hash ${identity.value}`;
|
|
159
|
+
if (identity.kind === 'script')
|
|
160
|
+
return 'an unrecognized script destination';
|
|
161
|
+
return 'a destination';
|
|
162
|
+
}
|
|
163
|
+
function joinPhrases(values) {
|
|
164
|
+
if (values.length <= 1)
|
|
165
|
+
return values[0] ?? '';
|
|
166
|
+
if (values.length === 2)
|
|
167
|
+
return `${values[0]} and ${values[1]}`;
|
|
168
|
+
return `${values.slice(0, -1).join(', ')}, and ${values.at(-1)}`;
|
|
169
|
+
}
|
|
170
|
+
function destinationPhrase(summary, other) {
|
|
171
|
+
if (!summary.complete || !summary.identities.length) {
|
|
172
|
+
return other ? 'other destinations' : 'destinations';
|
|
173
|
+
}
|
|
174
|
+
if (summary.identities.length === 1) {
|
|
175
|
+
return singleDestinationPhrase(summary.identities[0]);
|
|
176
|
+
}
|
|
177
|
+
const groups = new Map();
|
|
178
|
+
summary.identities.forEach((identity) => groups.set(identity.kind, (groups.get(identity.kind) ?? 0) + 1));
|
|
179
|
+
if (groups.has('hash') || groups.has('script') || groups.has('outpoint')) {
|
|
180
|
+
return destinationGroupPhrase('outpoint', summary.identities.length, other);
|
|
181
|
+
}
|
|
182
|
+
const phrase = joinPhrases([...groups.entries()].map(([kind, count]) => destinationGroupPhrase(kind, count, other)));
|
|
183
|
+
return groups.size > 1 ? `${summary.identities.length} destinations: ${phrase}` : phrase;
|
|
184
|
+
}
|
|
185
|
+
function sendClause(flows, facts, fallback, origin) {
|
|
186
|
+
const destinations = summarizeDestinations(flows, facts);
|
|
187
|
+
const destination = destinationPhrase(destinations, true);
|
|
188
|
+
const originClause = origin ? ` ${origin}` : '';
|
|
189
|
+
const amount = amountText(flows, fallback, facts.tbcUnit);
|
|
190
|
+
if (destinations.complete && destinations.identities.length > 1) {
|
|
191
|
+
return `Sends a total of ${amount}${originClause} to ${destination}`;
|
|
192
|
+
}
|
|
193
|
+
return `Sends ${amount}${originClause} to ${destination}`;
|
|
194
|
+
}
|
|
195
|
+
function actionToDestinationClause(action, flows, facts, fallback, other = false) {
|
|
196
|
+
const destinations = summarizeDestinations(flows, facts);
|
|
197
|
+
const amount = amountText(flows, fallback, facts.tbcUnit);
|
|
198
|
+
const total = destinations.complete && destinations.identities.length > 1 ? 'a total of ' : '';
|
|
199
|
+
return `${action} ${total}${amount} to ${destinationPhrase(destinations, other)}`;
|
|
200
|
+
}
|
|
201
|
+
function internalTransferClauses(flows, facts) {
|
|
202
|
+
const sources = summarizeDestinations(flows, facts, 'from');
|
|
203
|
+
const targets = summarizeDestinations(flows, facts);
|
|
204
|
+
const scope = sources.complete && sources.identities.length ? sources : targets;
|
|
205
|
+
const kinds = new Set(scope.identities.map((identity) => identity.kind));
|
|
206
|
+
const count = scope.identities.length;
|
|
207
|
+
if (scope.complete && count === 1) {
|
|
208
|
+
const identity = scope.identities[0];
|
|
209
|
+
if (identity.kind === 'address' && identity.value) {
|
|
210
|
+
return [`Internal transfer at address ${identity.value}`, 'no funds were sent to another address'];
|
|
211
|
+
}
|
|
212
|
+
if (identity.kind === 'multisig' && identity.value) {
|
|
213
|
+
return [`Internal transfer in multisignature wallet ${identity.value}`, 'no funds were sent elsewhere'];
|
|
214
|
+
}
|
|
215
|
+
if (identity.kind === 'pool' && identity.value) {
|
|
216
|
+
return [`Internal transfer in liquidity pool ${identity.value}`, 'no funds were sent elsewhere'];
|
|
217
|
+
}
|
|
218
|
+
if (identity.kind === 'hash' && identity.value) {
|
|
219
|
+
return [`Internal transfer at destination hash ${identity.value}`, 'no funds were sent elsewhere'];
|
|
220
|
+
}
|
|
221
|
+
return ['Internal transfer at the original destination', 'no funds were sent elsewhere'];
|
|
222
|
+
}
|
|
223
|
+
if (scope.complete && count > 1 && kinds.size === 1 && kinds.has('address')) {
|
|
224
|
+
return ['Transfer within the original addresses', 'no funds were sent outside those addresses'];
|
|
225
|
+
}
|
|
226
|
+
if (scope.complete && count > 1 && kinds.size === 1 && kinds.has('multisig')) {
|
|
227
|
+
return ['Transfer within the original multisignature wallets', 'no funds were sent outside those wallets'];
|
|
228
|
+
}
|
|
229
|
+
return ['Transfer within the original destinations', 'no funds were sent outside those destinations'];
|
|
230
|
+
}
|
|
231
|
+
function feeClause(facts) {
|
|
232
|
+
if (facts.feeSatoshis === undefined)
|
|
233
|
+
return undefined;
|
|
234
|
+
return `network fee: ${formatNativeAmount(BigInt(facts.feeSatoshis), facts.tbcUnit, true)}`;
|
|
235
|
+
}
|
|
236
|
+
function sentence(clauses) {
|
|
237
|
+
const values = clauses.filter((value) => Boolean(value));
|
|
238
|
+
if (!values.length)
|
|
239
|
+
return '';
|
|
240
|
+
return `${values.join('; ')}.`;
|
|
241
|
+
}
|
|
242
|
+
function flowsFor(flows, purpose, assetTypes) {
|
|
243
|
+
return flows.filter((flow) => flow.purpose === purpose && (!assetTypes || assetTypes.includes(flow.asset.type)));
|
|
244
|
+
}
|
|
245
|
+
function scriptAsmContains(asm, value) {
|
|
246
|
+
if (asm === undefined)
|
|
247
|
+
return false;
|
|
248
|
+
const searchable = typeof asm === 'string' ? asm : `${asm.prefix} ${asm.suffix}`;
|
|
249
|
+
return typeof value === 'string' ? searchable.includes(value) : value.test(searchable);
|
|
250
|
+
}
|
|
251
|
+
function poolFlows(flows, direction, assetTypes) {
|
|
252
|
+
return flows.filter((flow) => {
|
|
253
|
+
const endpoint = direction === 'to' ? flow.to : flow.from;
|
|
254
|
+
return Boolean(endpoint?.poolId) && (!assetTypes || assetTypes.includes(flow.asset.type));
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
function ftCodeInputCount(inputs) {
|
|
258
|
+
return inputs.reduce((count, input) => {
|
|
259
|
+
if (!input.prevout?.associatedTape?.script.data?.ftTape)
|
|
260
|
+
return count;
|
|
261
|
+
return count + ('compression' in input ? input.compression?.count ?? 1 : 1);
|
|
262
|
+
}, 0);
|
|
263
|
+
}
|
|
264
|
+
function materialSecondaryTbcFlows(facts) {
|
|
265
|
+
return flowsFor(facts.assetFlows ?? [], 'transfer', ['tbc']).filter((flow) => {
|
|
266
|
+
const address = flow.to?.address;
|
|
267
|
+
const satoshis = 'amount' in flow && flow.amount && 'satoshis' in flow.amount
|
|
268
|
+
? flow.amount.satoshis
|
|
269
|
+
: undefined;
|
|
270
|
+
if (!address || satoshis === undefined)
|
|
271
|
+
return false;
|
|
272
|
+
return facts.outputs.some((output) => output.address === address &&
|
|
273
|
+
output.satoshis === satoshis &&
|
|
274
|
+
!scriptAsmContains(output.script.asm, 'OP_RETURN'));
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
function secondaryTbcClause(facts) {
|
|
278
|
+
const transfers = materialSecondaryTbcFlows(facts);
|
|
279
|
+
if (!transfers.length)
|
|
280
|
+
return undefined;
|
|
281
|
+
const description = sendClause(transfers, facts, 'native TBC');
|
|
282
|
+
return `also ${description.charAt(0).toLowerCase()}${description.slice(1)}`;
|
|
283
|
+
}
|
|
284
|
+
function describeNativeTransfer(facts) {
|
|
285
|
+
const flows = facts.assetFlows ?? [];
|
|
286
|
+
const transfers = flowsFor(flows, 'transfer', ['tbc']);
|
|
287
|
+
const self = flowsFor(flows, 'self', ['tbc']);
|
|
288
|
+
if (!transfers.length && self.length) {
|
|
289
|
+
return sentence([
|
|
290
|
+
...internalTransferClauses(self, facts),
|
|
291
|
+
feeClause(facts),
|
|
292
|
+
]);
|
|
293
|
+
}
|
|
294
|
+
return sentence([
|
|
295
|
+
sendClause(transfers, facts, 'native TBC'),
|
|
296
|
+
feeClause(facts),
|
|
297
|
+
]);
|
|
298
|
+
}
|
|
299
|
+
function describeFungible(type, facts, assetType) {
|
|
300
|
+
const flows = facts.assetFlows ?? [];
|
|
301
|
+
const tokenFlows = flows.filter((flow) => flow.asset.type === assetType);
|
|
302
|
+
const mint = flowsFor(tokenFlows, 'mint');
|
|
303
|
+
const transfers = flowsFor(tokenFlows, 'transfer');
|
|
304
|
+
const self = flowsFor(tokenFlows, 'self');
|
|
305
|
+
const fallback = `${assetType === 'stablecoin' ? 'StableCoin' : 'FT'} tokens`;
|
|
306
|
+
if (type.endsWith('.mint')) {
|
|
307
|
+
return sentence([
|
|
308
|
+
actionToDestinationClause('Mints', mint, facts, fallback),
|
|
309
|
+
secondaryTbcClause(facts),
|
|
310
|
+
feeClause(facts),
|
|
311
|
+
]);
|
|
312
|
+
}
|
|
313
|
+
if (type.endsWith('.merge')) {
|
|
314
|
+
const inputCount = ftCodeInputCount(facts.inputs);
|
|
315
|
+
return sentence([
|
|
316
|
+
`Combines ${inputCount || 'multiple'} token balances into a single balance of ${amountText(self, fallback, facts.tbcUnit)}`,
|
|
317
|
+
secondaryTbcClause(facts),
|
|
318
|
+
feeClause(facts),
|
|
319
|
+
]);
|
|
320
|
+
}
|
|
321
|
+
return sentence([
|
|
322
|
+
sendClause(transfers, facts, fallback),
|
|
323
|
+
secondaryTbcClause(facts),
|
|
324
|
+
feeClause(facts),
|
|
325
|
+
]);
|
|
326
|
+
}
|
|
327
|
+
function nftLabel(flow) {
|
|
328
|
+
if (!flow || (flow.asset.type !== 'nft' && flow.asset.type !== 'nftCollection'))
|
|
329
|
+
return 'NFT';
|
|
330
|
+
return `${cleanLabel(flow.asset.name ?? flow.asset.symbol, 'unnamed')} NFT`;
|
|
331
|
+
}
|
|
332
|
+
function nftAssetName(flow) {
|
|
333
|
+
if (!flow || (flow.asset.type !== 'nft' && flow.asset.type !== 'nftCollection'))
|
|
334
|
+
return undefined;
|
|
335
|
+
return flow.asset.name;
|
|
336
|
+
}
|
|
337
|
+
function describeNft(type, facts) {
|
|
338
|
+
const flows = facts.assetFlows ?? [];
|
|
339
|
+
const nftFlows = flows.filter((flow) => flow.asset.type === 'nft' || flow.asset.type === 'nftCollection');
|
|
340
|
+
const primary = nftFlows[0];
|
|
341
|
+
if (type === 'nft.collectionMint') {
|
|
342
|
+
const movement = facts.protocolDetails?.nft?.actions.find((action) => action.action === 'mintCollection');
|
|
343
|
+
const collectionTape = facts.outputs
|
|
344
|
+
.map((output) => output.script.data?.collectionTape)
|
|
345
|
+
.find((tape) => tape !== undefined);
|
|
346
|
+
const slots = movement?.action === 'mintCollection' ? movement.supply : collectionTape?.supply;
|
|
347
|
+
const collectionName = movement?.action === 'mintCollection'
|
|
348
|
+
? movement.collectionName
|
|
349
|
+
: collectionTape?.collectionName ?? nftAssetName(primary);
|
|
350
|
+
return sentence([
|
|
351
|
+
`Creates the ${cleanLabel(collectionName, 'unnamed')} NFT collection${slots === undefined ? '' : ` with ${commaInteger(String(slots))} mint slots`}`,
|
|
352
|
+
secondaryTbcClause(facts),
|
|
353
|
+
feeClause(facts),
|
|
354
|
+
]);
|
|
355
|
+
}
|
|
356
|
+
if (type === 'nft.mint') {
|
|
357
|
+
return sentence([
|
|
358
|
+
`Mints the ${nftLabel(primary)} to ${destinationPhrase(summarizeDestinations(nftFlows, facts), false)}`,
|
|
359
|
+
secondaryTbcClause(facts),
|
|
360
|
+
feeClause(facts),
|
|
361
|
+
]);
|
|
362
|
+
}
|
|
363
|
+
return sentence([
|
|
364
|
+
`Transfers the ${nftLabel(primary)} to ${destinationPhrase(summarizeDestinations(primary ? [primary] : [], facts), true)}`,
|
|
365
|
+
secondaryTbcClause(facts),
|
|
366
|
+
feeClause(facts),
|
|
367
|
+
]);
|
|
368
|
+
}
|
|
369
|
+
function parseMultiSigTape(value) {
|
|
370
|
+
if (!value || value.length % 2 !== 0 || !/^[0-9a-f]+$/iu.test(value))
|
|
371
|
+
return undefined;
|
|
372
|
+
try {
|
|
373
|
+
const parsed = JSON.parse(Buffer.from(value, 'hex').toString('utf8'));
|
|
374
|
+
if (!parsed || typeof parsed !== 'object')
|
|
375
|
+
return undefined;
|
|
376
|
+
const candidate = parsed;
|
|
377
|
+
if (typeof candidate.address !== 'string' || !Array.isArray(candidate.pubkeys))
|
|
378
|
+
return undefined;
|
|
379
|
+
if (!candidate.pubkeys.every((pubkey) => typeof pubkey === 'string' && /^(?:02|03)[0-9a-f]{64}$/iu.test(pubkey))) {
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
return { address: candidate.address, pubkeys: candidate.pubkeys };
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
return undefined;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
function multisigCreationClause(transfers, facts) {
|
|
389
|
+
const outputs = facts.outputs.filter((output) => output.script.type === 'MULTISIG' && typeof output.address === 'string');
|
|
390
|
+
const tapeOutputs = facts.outputs.filter((output) => output.script.data?.codeType === 'MTape');
|
|
391
|
+
if (outputs.length !== 1 || tapeOutputs.length !== 1)
|
|
392
|
+
return undefined;
|
|
393
|
+
const output = outputs[0];
|
|
394
|
+
const tape = parseMultiSigTape(tapeOutputs[0].script.data?.publicKeyHash);
|
|
395
|
+
if (!tape || tape.address !== output.address)
|
|
396
|
+
return undefined;
|
|
397
|
+
try {
|
|
398
|
+
const { signatureCount, publicKeyCount } = getSignatureAndPublicKeyCount(tape.address);
|
|
399
|
+
if (publicKeyCount !== tape.pubkeys.length)
|
|
400
|
+
return undefined;
|
|
401
|
+
if (getMultiSigAddress(tape.pubkeys, signatureCount, publicKeyCount) !== tape.address)
|
|
402
|
+
return undefined;
|
|
403
|
+
const participantMarkerCount = facts.outputs.filter((candidate) => candidate.script.type === 'P2PKH' &&
|
|
404
|
+
scriptAsmContains(candidate.script.asm, /(?:^|\s)OP_RETURN\s+6d756c7469736967(?:\s|$)/iu)).length;
|
|
405
|
+
if (participantMarkerCount !== publicKeyCount)
|
|
406
|
+
return undefined;
|
|
407
|
+
const funding = transfers.filter((flow) => flow.to?.address === tape.address || flow.to?.addresses?.includes(tape.address));
|
|
408
|
+
if (!funding.length)
|
|
409
|
+
return undefined;
|
|
410
|
+
return `Creates and funds a ${signatureCount}-of-${publicKeyCount} multisignature wallet ${tape.address} with ${amountText(funding, 'native TBC', facts.tbcUnit)}`;
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return undefined;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
function describeMultisig(facts) {
|
|
417
|
+
const flows = facts.assetFlows ?? [];
|
|
418
|
+
const transfers = flowsFor(flows, 'transfer', ['tbc']);
|
|
419
|
+
const spendsMultisig = facts.inputs.some((input) => input.prevout?.script.type === 'MULTISIG');
|
|
420
|
+
const creation = multisigCreationClause(transfers, facts);
|
|
421
|
+
const source = summarizeDestinations(transfers, facts, 'from');
|
|
422
|
+
return sentence([
|
|
423
|
+
creation ?? sendClause(transfers, facts, 'native TBC', spendsMultisig ? `from ${destinationPhrase(source, false)}` : undefined),
|
|
424
|
+
feeClause(facts),
|
|
425
|
+
]);
|
|
426
|
+
}
|
|
427
|
+
function describePiggyBank(type, facts) {
|
|
428
|
+
const flows = facts.assetFlows ?? [];
|
|
429
|
+
const movement = facts.protocolDetails?.piggyBank?.actions[0];
|
|
430
|
+
if (type === 'piggyBank.freeze') {
|
|
431
|
+
const locked = flowsFor(flows, 'lock', ['tbc']);
|
|
432
|
+
const publicPiggyBank = facts.outputs
|
|
433
|
+
.map((output) => output.script.data?.piggyBank)
|
|
434
|
+
.find((piggyBank) => piggyBank !== undefined);
|
|
435
|
+
const lockTime = movement?.lockTime ?? publicPiggyBank?.lockTime;
|
|
436
|
+
return sentence([
|
|
437
|
+
`Locks ${amountText(locked, 'native TBC', facts.tbcUnit)} in PiggyBank${lockTime === undefined ? '' : ` until block ${commaInteger(String(lockTime))}`}`,
|
|
438
|
+
feeClause(facts),
|
|
439
|
+
]);
|
|
440
|
+
}
|
|
441
|
+
const released = flowsFor(flows, 'release', ['tbc']);
|
|
442
|
+
return sentence([
|
|
443
|
+
`Withdraws ${amountText(released, 'native TBC', facts.tbcUnit)} from PiggyBank after maturity`,
|
|
444
|
+
feeClause(facts),
|
|
445
|
+
]);
|
|
446
|
+
}
|
|
447
|
+
function exchangeAmountText(flows, facts) {
|
|
448
|
+
const summaries = summarizeAmounts(flows, facts.tbcUnit);
|
|
449
|
+
if (summaries.length === 2)
|
|
450
|
+
return `${summaries[0].text} for ${summaries[1].text}`;
|
|
451
|
+
return amountText(flows, 'the traded assets', facts.tbcUnit);
|
|
452
|
+
}
|
|
453
|
+
function describeOrderBook(type, facts) {
|
|
454
|
+
const flows = facts.assetFlows ?? [];
|
|
455
|
+
const locked = flowsFor(flows, 'lock');
|
|
456
|
+
const released = flowsFor(flows, 'release');
|
|
457
|
+
const transferred = flowsFor(flows, 'transfer');
|
|
458
|
+
if (type === 'orderBook.placeBuy' || type === 'orderBook.placeSell') {
|
|
459
|
+
return sentence([
|
|
460
|
+
`Places a ${type === 'orderBook.placeBuy' ? 'buy' : 'sell'} order using ${amountText(locked, 'the required asset', facts.tbcUnit)}`,
|
|
461
|
+
feeClause(facts),
|
|
462
|
+
]);
|
|
463
|
+
}
|
|
464
|
+
if (type === 'orderBook.cancelBuy' || type === 'orderBook.cancelSell') {
|
|
465
|
+
return sentence([
|
|
466
|
+
`Cancels a ${type === 'orderBook.cancelBuy' ? 'buy' : 'sell'} order and releases ${amountText(released, 'the locked asset', facts.tbcUnit)}`,
|
|
467
|
+
feeClause(facts),
|
|
468
|
+
]);
|
|
469
|
+
}
|
|
470
|
+
if (type === 'orderBook.match') {
|
|
471
|
+
return sentence([
|
|
472
|
+
`Matches a buy and sell order, exchanging ${exchangeAmountText(transferred, facts)}`,
|
|
473
|
+
feeClause(facts),
|
|
474
|
+
]);
|
|
475
|
+
}
|
|
476
|
+
return sentence([
|
|
477
|
+
`Updates an order while keeping ${amountText(locked, 'its asset', facts.tbcUnit)} locked`,
|
|
478
|
+
feeClause(facts),
|
|
479
|
+
]);
|
|
480
|
+
}
|
|
481
|
+
function describePoolNft(type, facts) {
|
|
482
|
+
const flows = facts.assetFlows ?? [];
|
|
483
|
+
const intoPool = poolFlows(flows, 'to');
|
|
484
|
+
const fromPool = poolFlows(flows, 'from');
|
|
485
|
+
const lpMinted = flowsFor(flows, 'mint', ['ftlp']);
|
|
486
|
+
const lpSpent = intoPool.filter((flow) => flow.asset.type === 'ftlp');
|
|
487
|
+
const selfTokens = flowsFor(flows, 'self', ['ft', 'ftlp']);
|
|
488
|
+
const burned = flowsFor(flows, 'burn', ['ftlp']);
|
|
489
|
+
const sentToBurnAddress = flowsFor(flows, 'transfer', ['ftlp']);
|
|
490
|
+
const createdPoolFlow = flows.find((flow) => flow.asset.type === 'nft' && flow.asset.subtype === 'poolNft');
|
|
491
|
+
const createdPoolId = createdPoolFlow?.asset.type === 'nft' && createdPoolFlow.asset.subtype === 'poolNft'
|
|
492
|
+
? createdPoolFlow.asset.contractId
|
|
493
|
+
: undefined;
|
|
494
|
+
const poolTarget = intoPool.length
|
|
495
|
+
? destinationPhrase(summarizeDestinations(intoPool, facts), false)
|
|
496
|
+
: fromPool.length
|
|
497
|
+
? destinationPhrase(summarizeDestinations(fromPool, facts, 'from'), false)
|
|
498
|
+
: 'a liquidity pool';
|
|
499
|
+
switch (type) {
|
|
500
|
+
case 'poolNft.init':
|
|
501
|
+
return sentence([`Starts ${poolTarget} with ${amountText(intoPool, 'its starting assets', facts.tbcUnit)}`, feeClause(facts)]);
|
|
502
|
+
case 'poolNft.increaseLiquidity':
|
|
503
|
+
return sentence([
|
|
504
|
+
`Adds ${amountText(intoPool.filter((flow) => flow.asset.type !== 'ftlp'), 'assets', facts.tbcUnit)} to ${poolTarget}`,
|
|
505
|
+
lpMinted.length ? `receives ${amountText(lpMinted, 'liquidity tokens', facts.tbcUnit)}` : undefined,
|
|
506
|
+
feeClause(facts),
|
|
507
|
+
]);
|
|
508
|
+
case 'poolNft.consumeLiquidity':
|
|
509
|
+
return sentence([
|
|
510
|
+
`Removes liquidity from ${poolTarget} by redeeming ${amountText(lpSpent, 'liquidity tokens', facts.tbcUnit)}`,
|
|
511
|
+
`receives ${amountText(fromPool.filter((flow) => flow.asset.type !== 'ftlp'), 'the underlying assets', facts.tbcUnit)}`,
|
|
512
|
+
feeClause(facts),
|
|
513
|
+
]);
|
|
514
|
+
case 'poolNft.swapTbcToFt':
|
|
515
|
+
return sentence([
|
|
516
|
+
`Swaps ${amountText(intoPool.filter((flow) => flow.asset.type === 'tbc'), 'native TBC', facts.tbcUnit)} for ${amountText(fromPool.filter((flow) => flow.asset.type === 'ft'), 'FT tokens', facts.tbcUnit)} in ${poolTarget}`,
|
|
517
|
+
feeClause(facts),
|
|
518
|
+
]);
|
|
519
|
+
case 'poolNft.swapFtToTbc':
|
|
520
|
+
return sentence([
|
|
521
|
+
`Swaps ${amountText(intoPool.filter((flow) => flow.asset.type === 'ft'), 'FT tokens', facts.tbcUnit)} for ${amountText(fromPool.filter((flow) => flow.asset.type === 'tbc'), 'native TBC', facts.tbcUnit)} in ${poolTarget}`,
|
|
522
|
+
feeClause(facts),
|
|
523
|
+
]);
|
|
524
|
+
case 'poolNft.mergeFtInPool':
|
|
525
|
+
return sentence([`Combines token balances held by ${poolTarget} into ${amountText(selfTokens, 'FT tokens', facts.tbcUnit)}`, feeClause(facts)]);
|
|
526
|
+
case 'poolNft.mergeFtLp':
|
|
527
|
+
return sentence([`Combines liquidity-token balances into ${amountText(selfTokens, 'liquidity tokens', facts.tbcUnit)}`, feeClause(facts)]);
|
|
528
|
+
case 'poolNft.burnFtLp':
|
|
529
|
+
return sentence([
|
|
530
|
+
`Burns ${amountText(burned.length ? burned : sentToBurnAddress.length ? sentToBurnAddress : lpSpent, 'liquidity tokens', facts.tbcUnit)}`,
|
|
531
|
+
feeClause(facts),
|
|
532
|
+
]);
|
|
533
|
+
default:
|
|
534
|
+
return sentence([
|
|
535
|
+
createdPoolId ? `Creates liquidity pool ${createdPoolId}` : 'Creates a liquidity pool',
|
|
536
|
+
feeClause(facts),
|
|
537
|
+
]);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
export function buildStandardClassificationDescription(type, fallback, facts) {
|
|
541
|
+
if (!facts.assetFlows?.length && !type.startsWith('poolNft.'))
|
|
542
|
+
return fallback;
|
|
543
|
+
if (type === 'tbc.transfer')
|
|
544
|
+
return describeNativeTransfer(facts);
|
|
545
|
+
if (type === 'tbc.coinbase') {
|
|
546
|
+
const minted = flowsFor(facts.assetFlows ?? [], 'mint', ['tbc']);
|
|
547
|
+
return sentence([
|
|
548
|
+
`Creates ${amountText(minted, 'native TBC', facts.tbcUnit)} as block rewards for ${destinationPhrase(summarizeDestinations(minted, facts), false)}`,
|
|
549
|
+
]);
|
|
550
|
+
}
|
|
551
|
+
if (type === 'tbc.multisig')
|
|
552
|
+
return describeMultisig(facts);
|
|
553
|
+
if (type.startsWith('ft.'))
|
|
554
|
+
return describeFungible(type, facts, 'ft');
|
|
555
|
+
if (type.startsWith('stablecoin.') && type !== 'stablecoin.bootstrap')
|
|
556
|
+
return describeFungible(type, facts, 'stablecoin');
|
|
557
|
+
if (type === 'stablecoin.bootstrap') {
|
|
558
|
+
return sentence(['Creates the certificate used to issue a StableCoin', feeClause(facts)]);
|
|
559
|
+
}
|
|
560
|
+
if (type.startsWith('nft.'))
|
|
561
|
+
return describeNft(type, facts);
|
|
562
|
+
if (type.startsWith('piggyBank.'))
|
|
563
|
+
return describePiggyBank(type, facts);
|
|
564
|
+
if (type.startsWith('orderBook.'))
|
|
565
|
+
return describeOrderBook(type, facts);
|
|
566
|
+
if (type.startsWith('poolNft.'))
|
|
567
|
+
return describePoolNft(type, facts);
|
|
568
|
+
return fallback;
|
|
569
|
+
}
|
|
570
|
+
//# sourceMappingURL=classification-description.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classification-description.js","sourceRoot":"","sources":["../../src/result/classification-description.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AssetFlow, DecodeDisplayOptions, DecodedInput, DecodedOutput, ProtocolDetails, TransactionClassification, TransactionProtocol, TransactionSemantic, UnsupportedProtocol } from '../types.js';
|
|
2
|
+
export declare function buildTransactionClassification(options: {
|
|
3
|
+
transactionType: string;
|
|
4
|
+
semantic: TransactionSemantic;
|
|
5
|
+
protocolDetails?: ProtocolDetails;
|
|
6
|
+
unsupported: UnsupportedProtocol[];
|
|
7
|
+
protocolMarkers: string[];
|
|
8
|
+
inputs: DecodedInput[];
|
|
9
|
+
outputs?: DecodedOutput[];
|
|
10
|
+
assetFlows?: AssetFlow[];
|
|
11
|
+
feeSatoshis?: number;
|
|
12
|
+
display?: DecodeDisplayOptions;
|
|
13
|
+
conformanceIssues?: Array<{
|
|
14
|
+
protocol: TransactionProtocol;
|
|
15
|
+
conformance: 'nonstandard' | 'indeterminate';
|
|
16
|
+
code: string;
|
|
17
|
+
description: string;
|
|
18
|
+
}>;
|
|
19
|
+
}): TransactionClassification;
|
|
20
|
+
//# sourceMappingURL=classification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classification.d.ts","sourceRoot":"","sources":["../../src/result/classification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,eAAe,EAEf,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EAEnB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAuerB,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,KAAK,CAAC;QACxB,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,WAAW,EAAE,aAAa,GAAG,eAAe,CAAC;QAC7C,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ,GAAG,yBAAyB,CAiH5B"}
|