tbc-tx-parser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +214 -0
  2. package/dist/adapters/partial-sha256.d.ts +2 -0
  3. package/dist/adapters/partial-sha256.d.ts.map +1 -0
  4. package/dist/adapters/partial-sha256.js +5 -0
  5. package/dist/adapters/partial-sha256.js.map +1 -0
  6. package/dist/adapters/tbc-lib.d.ts +4 -0
  7. package/dist/adapters/tbc-lib.d.ts.map +1 -0
  8. package/dist/adapters/tbc-lib.js +4 -0
  9. package/dist/adapters/tbc-lib.js.map +1 -0
  10. package/dist/constants/chain.d.ts +4 -0
  11. package/dist/constants/chain.d.ts.map +1 -0
  12. package/dist/constants/chain.js +7 -0
  13. package/dist/constants/chain.js.map +1 -0
  14. package/dist/core/chain.d.ts +10 -0
  15. package/dist/core/chain.d.ts.map +1 -0
  16. package/dist/core/chain.js +41 -0
  17. package/dist/core/chain.js.map +1 -0
  18. package/dist/core/input-utxos.d.ts +3 -0
  19. package/dist/core/input-utxos.d.ts.map +1 -0
  20. package/dist/core/input-utxos.js +69 -0
  21. package/dist/core/input-utxos.js.map +1 -0
  22. package/dist/core/public-chain-compression.d.ts +4 -0
  23. package/dist/core/public-chain-compression.d.ts.map +1 -0
  24. package/dist/core/public-chain-compression.js +87 -0
  25. package/dist/core/public-chain-compression.js.map +1 -0
  26. package/dist/core/public-script.d.ts +4 -0
  27. package/dist/core/public-script.d.ts.map +1 -0
  28. package/dist/core/public-script.js +94 -0
  29. package/dist/core/public-script.js.map +1 -0
  30. package/dist/decode-tx-raw.d.ts +3 -0
  31. package/dist/decode-tx-raw.d.ts.map +1 -0
  32. package/dist/decode-tx-raw.js +350 -0
  33. package/dist/decode-tx-raw.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +3 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/protocols/ft/index.d.ts +7 -0
  39. package/dist/protocols/ft/index.d.ts.map +1 -0
  40. package/dist/protocols/ft/index.js +393 -0
  41. package/dist/protocols/ft/index.js.map +1 -0
  42. package/dist/protocols/index.d.ts +5 -0
  43. package/dist/protocols/index.d.ts.map +1 -0
  44. package/dist/protocols/index.js +61 -0
  45. package/dist/protocols/index.js.map +1 -0
  46. package/dist/protocols/nft/index.d.ts +8 -0
  47. package/dist/protocols/nft/index.d.ts.map +1 -0
  48. package/dist/protocols/nft/index.js +335 -0
  49. package/dist/protocols/nft/index.js.map +1 -0
  50. package/dist/protocols/nft/media.js.map +1 -0
  51. package/dist/protocols/order-book/actions.d.ts +7 -0
  52. package/dist/protocols/order-book/actions.d.ts.map +1 -0
  53. package/dist/protocols/order-book/actions.js +102 -0
  54. package/dist/protocols/order-book/actions.js.map +1 -0
  55. package/dist/protocols/order-book/facts.d.ts +7 -0
  56. package/dist/protocols/order-book/facts.d.ts.map +1 -0
  57. package/dist/protocols/order-book/facts.js +81 -0
  58. package/dist/protocols/order-book/facts.js.map +1 -0
  59. package/dist/protocols/order-book/identity.d.ts +3 -0
  60. package/dist/protocols/order-book/identity.d.ts.map +1 -0
  61. package/dist/protocols/order-book/identity.js +46 -0
  62. package/dist/protocols/order-book/identity.js.map +1 -0
  63. package/dist/protocols/order-book/index.d.ts +12 -0
  64. package/dist/protocols/order-book/index.d.ts.map +1 -0
  65. package/dist/protocols/order-book/index.js +34 -0
  66. package/dist/protocols/order-book/index.js.map +1 -0
  67. package/dist/protocols/order-book/settlement.d.ts +10 -0
  68. package/dist/protocols/order-book/settlement.d.ts.map +1 -0
  69. package/dist/protocols/order-book/settlement.js +318 -0
  70. package/dist/protocols/order-book/settlement.js.map +1 -0
  71. package/dist/protocols/order-book/types.d.ts +101 -0
  72. package/dist/protocols/order-book/types.d.ts.map +1 -0
  73. package/dist/protocols/order-book/types.js +2 -0
  74. package/dist/protocols/order-book/types.js.map +1 -0
  75. package/dist/protocols/piggy-bank/index.d.ts +7 -0
  76. package/dist/protocols/piggy-bank/index.d.ts.map +1 -0
  77. package/dist/protocols/piggy-bank/index.js +91 -0
  78. package/dist/protocols/piggy-bank/index.js.map +1 -0
  79. package/dist/protocols/pool-nft/actions.d.ts +15 -0
  80. package/dist/protocols/pool-nft/actions.d.ts.map +1 -0
  81. package/dist/protocols/pool-nft/actions.js +90 -0
  82. package/dist/protocols/pool-nft/actions.js.map +1 -0
  83. package/dist/protocols/pool-nft/amounts.d.ts +10 -0
  84. package/dist/protocols/pool-nft/amounts.d.ts.map +1 -0
  85. package/dist/protocols/pool-nft/amounts.js +45 -0
  86. package/dist/protocols/pool-nft/amounts.js.map +1 -0
  87. package/dist/protocols/pool-nft/constants.d.ts +15 -0
  88. package/dist/protocols/pool-nft/constants.d.ts.map +1 -0
  89. package/dist/protocols/pool-nft/constants.js +27 -0
  90. package/dist/protocols/pool-nft/constants.js.map +1 -0
  91. package/dist/protocols/pool-nft/facts.d.ts +11 -0
  92. package/dist/protocols/pool-nft/facts.d.ts.map +1 -0
  93. package/dist/protocols/pool-nft/facts.js +113 -0
  94. package/dist/protocols/pool-nft/facts.js.map +1 -0
  95. package/dist/protocols/pool-nft/fees.d.ts +14 -0
  96. package/dist/protocols/pool-nft/fees.d.ts.map +1 -0
  97. package/dist/protocols/pool-nft/fees.js +161 -0
  98. package/dist/protocols/pool-nft/fees.js.map +1 -0
  99. package/dist/protocols/pool-nft/index.d.ts +4 -0
  100. package/dist/protocols/pool-nft/index.d.ts.map +1 -0
  101. package/dist/protocols/pool-nft/index.js +19 -0
  102. package/dist/protocols/pool-nft/index.js.map +1 -0
  103. package/dist/protocols/pool-nft/movements.d.ts +5 -0
  104. package/dist/protocols/pool-nft/movements.d.ts.map +1 -0
  105. package/dist/protocols/pool-nft/movements.js +804 -0
  106. package/dist/protocols/pool-nft/movements.js.map +1 -0
  107. package/dist/protocols/pool-nft/selectors.d.ts +40 -0
  108. package/dist/protocols/pool-nft/selectors.d.ts.map +1 -0
  109. package/dist/protocols/pool-nft/selectors.js +173 -0
  110. package/dist/protocols/pool-nft/selectors.js.map +1 -0
  111. package/dist/protocols/pool-nft/types.d.ts +34 -0
  112. package/dist/protocols/pool-nft/types.d.ts.map +1 -0
  113. package/dist/protocols/pool-nft/types.js +2 -0
  114. package/dist/protocols/pool-nft/types.js.map +1 -0
  115. package/dist/protocols/tbc/index.d.ts +3 -0
  116. package/dist/protocols/tbc/index.d.ts.map +1 -0
  117. package/dist/protocols/tbc/index.js +21 -0
  118. package/dist/protocols/tbc/index.js.map +1 -0
  119. package/dist/protocols/types.d.ts +15 -0
  120. package/dist/protocols/types.d.ts.map +1 -0
  121. package/dist/protocols/types.js +2 -0
  122. package/dist/protocols/types.js.map +1 -0
  123. package/dist/result/index.d.ts +7 -0
  124. package/dist/result/index.d.ts.map +1 -0
  125. package/dist/result/index.js +869 -0
  126. package/dist/result/index.js.map +1 -0
  127. package/dist/result/semantic.d.ts +6 -0
  128. package/dist/result/semantic.d.ts.map +1 -0
  129. package/dist/result/semantic.js +950 -0
  130. package/dist/result/semantic.js.map +1 -0
  131. package/dist/script-parser/contracts.d.ts +7 -0
  132. package/dist/script-parser/contracts.d.ts.map +1 -0
  133. package/dist/script-parser/contracts.js +104 -0
  134. package/dist/script-parser/contracts.js.map +1 -0
  135. package/dist/script-parser/op-return.d.ts +8 -0
  136. package/dist/script-parser/op-return.d.ts.map +1 -0
  137. package/dist/script-parser/op-return.js +315 -0
  138. package/dist/script-parser/op-return.js.map +1 -0
  139. package/dist/script-parser/origin.d.ts +6 -0
  140. package/dist/script-parser/origin.d.ts.map +1 -0
  141. package/dist/script-parser/origin.js +68 -0
  142. package/dist/script-parser/origin.js.map +1 -0
  143. package/dist/script-parser.d.ts +3 -0
  144. package/dist/script-parser.d.ts.map +1 -0
  145. package/dist/script-parser.js +183 -0
  146. package/dist/script-parser.js.map +1 -0
  147. package/dist/types/protocol.d.ts +175 -0
  148. package/dist/types/protocol.d.ts.map +1 -0
  149. package/dist/types/protocol.js +2 -0
  150. package/dist/types/protocol.js.map +1 -0
  151. package/dist/types/result.d.ts +167 -0
  152. package/dist/types/result.d.ts.map +1 -0
  153. package/dist/types/result.js +2 -0
  154. package/dist/types/result.js.map +1 -0
  155. package/dist/types/script.d.ts +180 -0
  156. package/dist/types/script.d.ts.map +1 -0
  157. package/dist/types/script.js +9 -0
  158. package/dist/types/script.js.map +1 -0
  159. package/dist/types/semantic.d.ts +94 -0
  160. package/dist/types/semantic.d.ts.map +1 -0
  161. package/dist/types/semantic.js +2 -0
  162. package/dist/types/semantic.js.map +1 -0
  163. package/dist/types.d.ts +6 -0
  164. package/dist/types.d.ts.map +1 -0
  165. package/dist/types.js +4 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/utils/asm-converter.d.ts +7 -0
  168. package/dist/utils/asm-converter.d.ts.map +1 -0
  169. package/dist/utils/asm-converter.js +105 -0
  170. package/dist/utils/asm-converter.js.map +1 -0
  171. package/dist/utils/binary.d.ts +3 -0
  172. package/dist/utils/binary.d.ts.map +1 -0
  173. package/dist/utils/binary.js +17 -0
  174. package/dist/utils/binary.js.map +1 -0
  175. package/dist/utils/multi-sig.d.ts +9 -0
  176. package/dist/utils/multi-sig.d.ts.map +1 -0
  177. package/dist/utils/multi-sig.js +125 -0
  178. package/dist/utils/multi-sig.js.map +1 -0
  179. package/dist/utils/token-amount.d.ts +3 -0
  180. package/dist/utils/token-amount.d.ts.map +1 -0
  181. package/dist/utils/token-amount.js +37 -0
  182. package/dist/utils/token-amount.js.map +1 -0
  183. package/package.json +47 -0
@@ -0,0 +1,3 @@
1
+ import type { DecodeTxRawOptions, DecodeTxRawResult } from './types.js';
2
+ export declare function decodeTxRaw(txraw: string, options?: DecodeTxRawOptions): Promise<DecodeTxRawResult>;
3
+ //# sourceMappingURL=decode-tx-raw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-tx-raw.d.ts","sourceRoot":"","sources":["../src/decode-tx-raw.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EASlB,MAAM,YAAY,CAAC;AAiapB,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAwE5B"}
@@ -0,0 +1,350 @@
1
+ import { analyzeProtocols, collectProtocolMarkers } from './protocols/index.js';
2
+ import { calculateChainStats, inferScriptKind, parseScriptWithHex } from './core/chain.js';
3
+ import { parseInputUtxo } from './core/input-utxos.js';
4
+ import { compressPublicInputs, compressPublicOutputs } from './core/public-chain-compression.js';
5
+ import { sanitizeScriptForPublicResult } from './core/public-script.js';
6
+ import { buildAssetFlows } from './result/index.js';
7
+ import { buildFallbackSemantic, buildSemantic } from './result/semantic.js';
8
+ import { collectFtMovements, inferFtTransactionType } from './protocols/ft/index.js';
9
+ import { collectNftMovements, inferNftTransactionType, optimizeCollectionMintOutputs } from './protocols/nft/index.js';
10
+ import { collectOrderBookOrders, inferOrderBookTransactionType } from './protocols/order-book/index.js';
11
+ import { collectPiggyBankMovements, inferPiggyBankTransactionType } from './protocols/piggy-bank/index.js';
12
+ import { collectPoolNftMovements, inferPoolNftTransactionType } from './protocols/pool-nft/index.js';
13
+ import { tbc } from './adapters/tbc-lib.js';
14
+ // Accept txraw with whitespace and normalize it to contiguous lowercase hex before passing it to the SDK.
15
+ function normalizeTxraw(txraw) {
16
+ return txraw.replace(/\s+/g, '').toLowerCase();
17
+ }
18
+ // Once txraw is validated as even-length hex, its byte length is half its character length.
19
+ function byteLengthFromHex(hex) {
20
+ return Math.ceil(hex.length / 2);
21
+ }
22
+ function readVarint(buffer, offset) {
23
+ const first = buffer[offset];
24
+ if (first === undefined) {
25
+ throw new Error('Invalid txraw varint');
26
+ }
27
+ if (first < 0xfd) {
28
+ return { value: first, offset: offset + 1 };
29
+ }
30
+ if (first === 0xfd) {
31
+ return { value: buffer.readUInt16LE(offset + 1), offset: offset + 3 };
32
+ }
33
+ if (first === 0xfe) {
34
+ return { value: buffer.readUInt32LE(offset + 1), offset: offset + 5 };
35
+ }
36
+ return { value: Number(buffer.readBigUInt64LE(offset + 1)), offset: offset + 9 };
37
+ }
38
+ function uint64Le(value) {
39
+ const buffer = Buffer.alloc(8);
40
+ buffer.writeBigUInt64LE(BigInt(value));
41
+ return buffer;
42
+ }
43
+ function txidFromRawParts(version, locktime, inputs, outputs) {
44
+ const header = Buffer.alloc(16);
45
+ header.writeUInt32LE(version, 0);
46
+ header.writeUInt32LE(locktime, 4);
47
+ header.writeInt32LE(inputs.length, 8);
48
+ header.writeInt32LE(outputs.length, 12);
49
+ const inputOutpoints = inputs.map((input) => {
50
+ const buffer = Buffer.alloc(40);
51
+ input.prevTxRaw.copy(buffer, 0);
52
+ buffer.writeUInt32LE(input.outputIndex, 32);
53
+ buffer.writeUInt32LE(input.sequenceNumber, 36);
54
+ return buffer;
55
+ });
56
+ const inputScripts = inputs.map((input) => tbc.crypto.Hash.sha256(input.script));
57
+ const outputStates = outputs.map((output) => Buffer.concat([uint64Le(output.satoshis), tbc.crypto.Hash.sha256(output.script)]));
58
+ const hash = tbc.crypto.Hash.sha256sha256(Buffer.concat([
59
+ header,
60
+ tbc.crypto.Hash.sha256(Buffer.concat(inputOutpoints)),
61
+ tbc.crypto.Hash.sha256(Buffer.concat(inputScripts)),
62
+ tbc.crypto.Hash.sha256(Buffer.concat(outputStates)),
63
+ ]));
64
+ return Buffer.from(hash).reverse().toString('hex');
65
+ }
66
+ function parseRawTransactionObject(txraw) {
67
+ const buffer = Buffer.from(txraw, 'hex');
68
+ let offset = 0;
69
+ const version = buffer.readInt32LE(offset);
70
+ offset += 4;
71
+ const inputCount = readVarint(buffer, offset);
72
+ offset = inputCount.offset;
73
+ const rawInputs = [];
74
+ const inputs = [];
75
+ for (let index = 0; index < inputCount.value; index += 1) {
76
+ const prevTxRaw = buffer.subarray(offset, offset + 32);
77
+ offset += 32;
78
+ const outputIndex = buffer.readUInt32LE(offset);
79
+ offset += 4;
80
+ const scriptLength = readVarint(buffer, offset);
81
+ offset = scriptLength.offset;
82
+ const script = buffer.subarray(offset, offset + scriptLength.value);
83
+ offset += scriptLength.value;
84
+ const sequenceNumber = buffer.readUInt32LE(offset);
85
+ offset += 4;
86
+ rawInputs.push({ prevTxRaw, outputIndex, sequenceNumber, script });
87
+ inputs.push({
88
+ prevTxId: Buffer.from(prevTxRaw).reverse().toString('hex'),
89
+ outputIndex,
90
+ sequenceNumber,
91
+ script: script.toString('hex'),
92
+ });
93
+ }
94
+ const outputCount = readVarint(buffer, offset);
95
+ offset = outputCount.offset;
96
+ const rawOutputs = [];
97
+ const outputs = [];
98
+ for (let index = 0; index < outputCount.value; index += 1) {
99
+ const satoshis = Number(buffer.readBigUInt64LE(offset));
100
+ offset += 8;
101
+ const scriptLength = readVarint(buffer, offset);
102
+ offset = scriptLength.offset;
103
+ const script = buffer.subarray(offset, offset + scriptLength.value);
104
+ offset += scriptLength.value;
105
+ rawOutputs.push({ satoshis, script });
106
+ outputs.push({
107
+ satoshis,
108
+ script: script.toString('hex'),
109
+ });
110
+ }
111
+ const nLockTime = buffer.readUInt32LE(offset);
112
+ return {
113
+ hash: txidFromRawParts(version, nLockTime, rawInputs, rawOutputs),
114
+ version,
115
+ nLockTime,
116
+ inputs,
117
+ outputs,
118
+ };
119
+ }
120
+ function isCoinbaseInput(input) {
121
+ return /^0+$/u.test(input.prevTxId) && input.outputIndex === 0xffffffff;
122
+ }
123
+ function isCoinbaseTransaction(txObject) {
124
+ return txObject.inputs.length === 1 && isCoinbaseInput(txObject.inputs[0]);
125
+ }
126
+ function parseTransactionObject(txraw) {
127
+ try {
128
+ const transaction = new tbc.Transaction(txraw);
129
+ return transaction.toObject();
130
+ }
131
+ catch (error) {
132
+ const parsed = parseRawTransactionObject(txraw);
133
+ if (isCoinbaseTransaction(parsed)) {
134
+ return parsed;
135
+ }
136
+ throw error;
137
+ }
138
+ }
139
+ // Provide a readable fallback transaction type from protocol markers when no stronger protocol result exists.
140
+ function inferTransactionType(protocolAnalyses, protocolMarkers, ftMovements) {
141
+ const primaryProtocol = protocolAnalyses.find((analysis) => !['FTape', 'StableCoin'].includes(analysis.id) || ftMovements.length > 0);
142
+ if (primaryProtocol) {
143
+ return primaryProtocol.transactionType;
144
+ }
145
+ if (protocolMarkers.includes('CONTRACT_CODE') || protocolMarkers.some((protocol) => protocol.includes('Code'))) {
146
+ return 'Contract';
147
+ }
148
+ if (protocolMarkers.includes('MULTISIG')) {
149
+ return 'Multisig';
150
+ }
151
+ return 'TBC transfer';
152
+ }
153
+ // Combine movements and orders collected by protocol modules into the public protocolDetails structure.
154
+ function buildProtocolDetails(ftMovements, nftMovements, piggyBankMovements, poolNftMovements, orderBookOrders) {
155
+ const ftTransfers = ftMovements.filter((movement) => !movement.isStableCoin);
156
+ const stablecoinTransfers = ftMovements.filter((movement) => movement.isStableCoin);
157
+ const details = {
158
+ ...(ftTransfers.length ? { ft: { type: 'ft', transfers: ftTransfers } } : {}),
159
+ ...(stablecoinTransfers.length ? { stablecoin: { type: 'stablecoin', transfers: stablecoinTransfers } } : {}),
160
+ ...(nftMovements.length ? { nft: { type: 'nft', actions: nftMovements } } : {}),
161
+ ...(piggyBankMovements.length ? { piggyBank: { type: 'piggyBank', actions: piggyBankMovements } } : {}),
162
+ ...(poolNftMovements.length ? { poolNft: { type: 'poolNft', actions: poolNftMovements } } : {}),
163
+ ...(orderBookOrders.length ? { orderBook: { type: 'orderBook', orders: orderBookOrders } } : {}),
164
+ };
165
+ return Object.keys(details).length ? details : undefined;
166
+ }
167
+ function hasKnownProtocolDetails(details) {
168
+ return details !== undefined && Object.keys(details).length > 0;
169
+ }
170
+ // Preserve prevout facts while hiding internal fields such as unlockingScript that are not part of the public contract.
171
+ function sanitizeInputPrevoutForPublicResult(prevout) {
172
+ const { script, associatedTape, associatedOrigin, ...prevoutFacts } = prevout;
173
+ return {
174
+ ...prevoutFacts,
175
+ script: sanitizeScriptForPublicResult(script),
176
+ ...(associatedTape
177
+ ? {
178
+ associatedTape: {
179
+ ...associatedTape,
180
+ script: sanitizeScriptForPublicResult(associatedTape.script),
181
+ },
182
+ }
183
+ : {}),
184
+ ...(associatedOrigin
185
+ ? {
186
+ associatedOrigin: {
187
+ ...associatedOrigin,
188
+ script: sanitizeScriptForPublicResult(associatedOrigin.script),
189
+ },
190
+ }
191
+ : {}),
192
+ };
193
+ }
194
+ function sanitizeInputsForPublicResult(inputs) {
195
+ return inputs.map(({ unlockingScript: _unlockingScript, prevout, ...input }) => ({
196
+ ...input,
197
+ prevout: prevout ? sanitizeInputPrevoutForPublicResult(prevout) : undefined,
198
+ }));
199
+ }
200
+ // Hide the internal scriptKind classification while retaining script facts and caller-facing address and amount data.
201
+ function sanitizeOutputsForPublicResult(outputs) {
202
+ return outputs.map(({ scriptKind: _scriptKind, ...output }) => ({
203
+ ...output,
204
+ script: sanitizeScriptForPublicResult(output.script),
205
+ }));
206
+ }
207
+ // Record unsupported evidence when contract markers exist but no supported protocol matches.
208
+ function buildUnsupportedProtocols(inputs, outputs, protocolMarkers, details) {
209
+ if (hasKnownProtocolDetails(details)) {
210
+ return [];
211
+ }
212
+ const unsupported = [];
213
+ const hasContractMarker = protocolMarkers.includes('CONTRACT_CODE') ||
214
+ protocolMarkers.some((marker) => /contract|code/iu.test(marker));
215
+ for (const input of inputs) {
216
+ const marker = input.prevout?.script.data?.codeType ?? (input.prevout?.script.originUtxo ? 'CONTRACT_CODE' : undefined);
217
+ if (!marker && !input.prevout?.script.originUtxo) {
218
+ continue;
219
+ }
220
+ unsupported.push({
221
+ inputIndex: input.index,
222
+ marker,
223
+ reason: 'Input prevout contains a contract script that does not match a supported protocol decoder.',
224
+ });
225
+ }
226
+ for (const output of outputs) {
227
+ const marker = output.script.data?.codeType ?? (output.script.originUtxo || output.scriptKind === 'contract' ? 'CONTRACT_CODE' : undefined);
228
+ if (marker === 'MTape') {
229
+ continue;
230
+ }
231
+ if (!marker && !hasContractMarker) {
232
+ continue;
233
+ }
234
+ if (output.scriptKind === 'contract' || marker) {
235
+ unsupported.push({
236
+ outputIndex: output.index,
237
+ marker,
238
+ reason: 'Output contains a contract script that does not match a supported protocol decoder.',
239
+ });
240
+ }
241
+ }
242
+ return unsupported;
243
+ }
244
+ // Inputs require caller-provided prevouts because only prevout facts establish asset origins and protocol state.
245
+ function decodeInputs(txObject, options) {
246
+ return txObject.inputs.map((input, index) => {
247
+ const unlockingScript = parseScriptWithHex(input.script ?? '');
248
+ const prevout = parseInputUtxo(input.prevTxId, input.outputIndex, index, options);
249
+ return {
250
+ index,
251
+ prevTxid: input.prevTxId,
252
+ vout: input.outputIndex,
253
+ sequence: input.sequenceNumber,
254
+ unlockingScript,
255
+ prevout,
256
+ };
257
+ });
258
+ }
259
+ // Parse outputs in on-chain order before applying display optimization for NFT collection creation.
260
+ function decodeOutputs(txObject) {
261
+ const parsedOutputs = txObject.outputs.map((output, index) => {
262
+ const script = parseScriptWithHex(output.script);
263
+ return {
264
+ index,
265
+ satoshis: output.satoshis,
266
+ script,
267
+ address: script.address ?? script.data?.address,
268
+ scriptKind: inferScriptKind(script),
269
+ };
270
+ });
271
+ return {
272
+ parsedOutputs,
273
+ outputs: optimizeCollectionMintOutputs(parsedOutputs),
274
+ };
275
+ }
276
+ // Collect fact results from protocol modules without introducing business coupling between protocols.
277
+ function collectProtocolFacts(txObject, inputs, parsedOutputs, outputs) {
278
+ const nftMovements = collectNftMovements(txObject.hash, inputs, parsedOutputs);
279
+ const protocolAnalyses = analyzeProtocols({ inputs, outputs });
280
+ const protocols = collectProtocolMarkers(outputs);
281
+ const ftMovements = collectFtMovements(outputs, inputs, txObject.hash);
282
+ const piggyBankMovements = collectPiggyBankMovements(inputs, outputs, txObject.nLockTime ?? 0);
283
+ const orderBookOrders = collectOrderBookOrders(inputs, outputs);
284
+ const poolNftMovements = collectPoolNftMovements(inputs, outputs, ftMovements, txObject.hash);
285
+ if (piggyBankMovements.length && !protocols.includes('PiggyBank')) {
286
+ protocols.push('PiggyBank');
287
+ }
288
+ if (poolNftMovements.length && !protocols.includes('PoolNFT')) {
289
+ protocols.push('PoolNFT');
290
+ }
291
+ if (orderBookOrders.some((order) => order.source === 'input') && !protocols.includes('OrderBook')) {
292
+ protocols.push('OrderBook');
293
+ }
294
+ return {
295
+ protocolAnalyses,
296
+ protocols,
297
+ ftMovements,
298
+ nftMovements,
299
+ piggyBankMovements,
300
+ poolNftMovements,
301
+ orderBookOrders,
302
+ };
303
+ }
304
+ // Decode txraw with input UTXOs to recover on-chain facts, protocol semantics, and asset flows.
305
+ export async function decodeTxRaw(txraw, options = {}) {
306
+ const normalizedTxraw = normalizeTxraw(txraw);
307
+ if (!normalizedTxraw || !/^[0-9a-f]+$/.test(normalizedTxraw) || normalizedTxraw.length % 2 !== 0) {
308
+ throw new Error('Invalid txraw hex');
309
+ }
310
+ const txObject = parseTransactionObject(normalizedTxraw);
311
+ const isCoinbase = isCoinbaseTransaction(txObject);
312
+ if (!isCoinbase && (!options.inputUtxos || Object.keys(options.inputUtxos).length === 0)) {
313
+ throw new Error('inputUtxos are required for every transaction input');
314
+ }
315
+ const size = byteLengthFromHex(normalizedTxraw);
316
+ const inputs = decodeInputs(txObject, options);
317
+ const missingInput = isCoinbase ? undefined : inputs.find((input) => !input.prevout || input.prevout.error);
318
+ if (missingInput) {
319
+ throw new Error(`inputUtxos are required for every transaction input; missing or invalid prevout for input ${missingInput.index}`);
320
+ }
321
+ const { parsedOutputs, outputs } = decodeOutputs(txObject);
322
+ const { protocolAnalyses, protocols, ftMovements, nftMovements, piggyBankMovements, poolNftMovements, orderBookOrders, } = collectProtocolFacts(txObject, inputs, parsedOutputs, outputs);
323
+ const transactionType = isCoinbase
324
+ ? 'TBC coinbase'
325
+ : inferPiggyBankTransactionType(piggyBankMovements) ??
326
+ inferPoolNftTransactionType(poolNftMovements) ??
327
+ inferOrderBookTransactionType(orderBookOrders, ftMovements, outputs) ??
328
+ inferNftTransactionType(nftMovements) ??
329
+ inferFtTransactionType(inputs, outputs, ftMovements) ??
330
+ inferTransactionType(protocolAnalyses, protocols, ftMovements);
331
+ const chainStats = calculateChainStats(inputs, outputs, size);
332
+ const protocolDetails = buildProtocolDetails(ftMovements, nftMovements, piggyBankMovements, poolNftMovements, orderBookOrders);
333
+ const unsupported = buildUnsupportedProtocols(inputs, outputs, protocols, protocolDetails);
334
+ const semantic = buildSemantic(transactionType, inputs, outputs, ftMovements, nftMovements, orderBookOrders, poolNftMovements) ??
335
+ buildFallbackSemantic(transactionType, unsupported);
336
+ const assetFlows = buildAssetFlows(transactionType, inputs, outputs, ftMovements, nftMovements, piggyBankMovements, poolNftMovements, orderBookOrders, semantic, unsupported);
337
+ return {
338
+ txid: txObject.hash,
339
+ version: txObject.version,
340
+ locktime: txObject.nLockTime ?? 0,
341
+ size,
342
+ chain: {
343
+ inputs: compressPublicInputs(sanitizeInputsForPublicResult(inputs)),
344
+ outputs: compressPublicOutputs(sanitizeOutputsForPublicResult(outputs)),
345
+ ...(chainStats.fee === undefined ? {} : { fee: { satoshis: chainStats.fee, satoshisPerKB: chainStats.feeRate ?? 0 } }),
346
+ },
347
+ assetFlows,
348
+ };
349
+ }
350
+ //# sourceMappingURL=decode-tx-raw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-tx-raw.js","sourceRoot":"","sources":["../src/decode-tx-raw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { decodeTxRaw } from './decode-tx-raw.js';
2
+ export type { DecodeInputUtxo, DecodeTxRawOptions, DecodeTxRawResult, ChainLayer, CollectionTapeData, CompactPublicAsm, CompactPublicHex, DecodedInput, DecodedOutput, AssetFlow, AssetFlowContext, AssetFlowDirection, AssetFlowEndpoint, AssetFlowPurpose, FungibleTokenMovement, InputUTXODetail, NftMovement, NftTapeData, OrderBookData, OrderBookOrder, PiggyBankData, PiggyBankMovement, PoolNftMovement, PoolNftTapeData, PublicScriptHex, PublicScriptDetail, PublicCollectionTapeData, PublicNftTapeData, ProtocolDetails, ScriptKind, ScriptType, ScriptDetail, ScriptOpReturnData, TransactionAmount, TransactionAsset, UnsupportedProtocol, } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // Public SDK entry point: export only stable APIs, types, and chain constants.
2
+ export { decodeTxRaw } from './decode-tx-raw.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type DecodedInput, type DecodedOutput } from '../../types.js';
2
+ import type { FungibleTokenMovement } from '../../types/protocol.js';
3
+ import type { ProtocolDecoder } from '../types.js';
4
+ export declare const ftProtocolDecoder: ProtocolDecoder;
5
+ export declare function collectFtMovements(outputs: DecodedOutput[], inputs?: DecodedInput[], txid?: string): FungibleTokenMovement[];
6
+ export declare function inferFtTransactionType(inputs: DecodedInput[], outputs: DecodedOutput[], movements: FungibleTokenMovement[]): string | undefined;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protocols/ft/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,aAAa,CAAC;AAMrE,eAAO,MAAM,iBAAiB,EAAE,eAoB/B,CAAC;AAsUF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,MAAM,GAAE,YAAY,EAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,qBAAqB,EAAE,CA6GhI;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,EAAE,aAAa,EAAE,EACxB,SAAS,EAAE,qBAAqB,EAAE,sBAsCnC"}