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.
- package/README.md +214 -0
- package/dist/adapters/partial-sha256.d.ts +2 -0
- package/dist/adapters/partial-sha256.d.ts.map +1 -0
- package/dist/adapters/partial-sha256.js +5 -0
- package/dist/adapters/partial-sha256.js.map +1 -0
- package/dist/adapters/tbc-lib.d.ts +4 -0
- package/dist/adapters/tbc-lib.d.ts.map +1 -0
- package/dist/adapters/tbc-lib.js +4 -0
- package/dist/adapters/tbc-lib.js.map +1 -0
- package/dist/constants/chain.d.ts +4 -0
- package/dist/constants/chain.d.ts.map +1 -0
- package/dist/constants/chain.js +7 -0
- package/dist/constants/chain.js.map +1 -0
- package/dist/core/chain.d.ts +10 -0
- package/dist/core/chain.d.ts.map +1 -0
- package/dist/core/chain.js +41 -0
- package/dist/core/chain.js.map +1 -0
- package/dist/core/input-utxos.d.ts +3 -0
- package/dist/core/input-utxos.d.ts.map +1 -0
- package/dist/core/input-utxos.js +69 -0
- package/dist/core/input-utxos.js.map +1 -0
- package/dist/core/public-chain-compression.d.ts +4 -0
- package/dist/core/public-chain-compression.d.ts.map +1 -0
- package/dist/core/public-chain-compression.js +87 -0
- package/dist/core/public-chain-compression.js.map +1 -0
- package/dist/core/public-script.d.ts +4 -0
- package/dist/core/public-script.d.ts.map +1 -0
- package/dist/core/public-script.js +94 -0
- package/dist/core/public-script.js.map +1 -0
- package/dist/decode-tx-raw.d.ts +3 -0
- package/dist/decode-tx-raw.d.ts.map +1 -0
- package/dist/decode-tx-raw.js +350 -0
- package/dist/decode-tx-raw.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/protocols/ft/index.d.ts +7 -0
- package/dist/protocols/ft/index.d.ts.map +1 -0
- package/dist/protocols/ft/index.js +393 -0
- package/dist/protocols/ft/index.js.map +1 -0
- package/dist/protocols/index.d.ts +5 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/index.js +61 -0
- package/dist/protocols/index.js.map +1 -0
- package/dist/protocols/nft/index.d.ts +8 -0
- package/dist/protocols/nft/index.d.ts.map +1 -0
- package/dist/protocols/nft/index.js +335 -0
- package/dist/protocols/nft/index.js.map +1 -0
- package/dist/protocols/nft/media.js.map +1 -0
- package/dist/protocols/order-book/actions.d.ts +7 -0
- package/dist/protocols/order-book/actions.d.ts.map +1 -0
- package/dist/protocols/order-book/actions.js +102 -0
- package/dist/protocols/order-book/actions.js.map +1 -0
- package/dist/protocols/order-book/facts.d.ts +7 -0
- package/dist/protocols/order-book/facts.d.ts.map +1 -0
- package/dist/protocols/order-book/facts.js +81 -0
- package/dist/protocols/order-book/facts.js.map +1 -0
- package/dist/protocols/order-book/identity.d.ts +3 -0
- package/dist/protocols/order-book/identity.d.ts.map +1 -0
- package/dist/protocols/order-book/identity.js +46 -0
- package/dist/protocols/order-book/identity.js.map +1 -0
- package/dist/protocols/order-book/index.d.ts +12 -0
- package/dist/protocols/order-book/index.d.ts.map +1 -0
- package/dist/protocols/order-book/index.js +34 -0
- package/dist/protocols/order-book/index.js.map +1 -0
- package/dist/protocols/order-book/settlement.d.ts +10 -0
- package/dist/protocols/order-book/settlement.d.ts.map +1 -0
- package/dist/protocols/order-book/settlement.js +318 -0
- package/dist/protocols/order-book/settlement.js.map +1 -0
- package/dist/protocols/order-book/types.d.ts +101 -0
- package/dist/protocols/order-book/types.d.ts.map +1 -0
- package/dist/protocols/order-book/types.js +2 -0
- package/dist/protocols/order-book/types.js.map +1 -0
- package/dist/protocols/piggy-bank/index.d.ts +7 -0
- package/dist/protocols/piggy-bank/index.d.ts.map +1 -0
- package/dist/protocols/piggy-bank/index.js +91 -0
- package/dist/protocols/piggy-bank/index.js.map +1 -0
- package/dist/protocols/pool-nft/actions.d.ts +15 -0
- package/dist/protocols/pool-nft/actions.d.ts.map +1 -0
- package/dist/protocols/pool-nft/actions.js +90 -0
- package/dist/protocols/pool-nft/actions.js.map +1 -0
- package/dist/protocols/pool-nft/amounts.d.ts +10 -0
- package/dist/protocols/pool-nft/amounts.d.ts.map +1 -0
- package/dist/protocols/pool-nft/amounts.js +45 -0
- package/dist/protocols/pool-nft/amounts.js.map +1 -0
- package/dist/protocols/pool-nft/constants.d.ts +15 -0
- package/dist/protocols/pool-nft/constants.d.ts.map +1 -0
- package/dist/protocols/pool-nft/constants.js +27 -0
- package/dist/protocols/pool-nft/constants.js.map +1 -0
- package/dist/protocols/pool-nft/facts.d.ts +11 -0
- package/dist/protocols/pool-nft/facts.d.ts.map +1 -0
- package/dist/protocols/pool-nft/facts.js +113 -0
- package/dist/protocols/pool-nft/facts.js.map +1 -0
- package/dist/protocols/pool-nft/fees.d.ts +14 -0
- package/dist/protocols/pool-nft/fees.d.ts.map +1 -0
- package/dist/protocols/pool-nft/fees.js +161 -0
- package/dist/protocols/pool-nft/fees.js.map +1 -0
- package/dist/protocols/pool-nft/index.d.ts +4 -0
- package/dist/protocols/pool-nft/index.d.ts.map +1 -0
- package/dist/protocols/pool-nft/index.js +19 -0
- package/dist/protocols/pool-nft/index.js.map +1 -0
- package/dist/protocols/pool-nft/movements.d.ts +5 -0
- package/dist/protocols/pool-nft/movements.d.ts.map +1 -0
- package/dist/protocols/pool-nft/movements.js +804 -0
- package/dist/protocols/pool-nft/movements.js.map +1 -0
- package/dist/protocols/pool-nft/selectors.d.ts +40 -0
- package/dist/protocols/pool-nft/selectors.d.ts.map +1 -0
- package/dist/protocols/pool-nft/selectors.js +173 -0
- package/dist/protocols/pool-nft/selectors.js.map +1 -0
- package/dist/protocols/pool-nft/types.d.ts +34 -0
- package/dist/protocols/pool-nft/types.d.ts.map +1 -0
- package/dist/protocols/pool-nft/types.js +2 -0
- package/dist/protocols/pool-nft/types.js.map +1 -0
- package/dist/protocols/tbc/index.d.ts +3 -0
- package/dist/protocols/tbc/index.d.ts.map +1 -0
- package/dist/protocols/tbc/index.js +21 -0
- package/dist/protocols/tbc/index.js.map +1 -0
- package/dist/protocols/types.d.ts +15 -0
- package/dist/protocols/types.d.ts.map +1 -0
- package/dist/protocols/types.js +2 -0
- package/dist/protocols/types.js.map +1 -0
- package/dist/result/index.d.ts +7 -0
- package/dist/result/index.d.ts.map +1 -0
- package/dist/result/index.js +869 -0
- package/dist/result/index.js.map +1 -0
- package/dist/result/semantic.d.ts +6 -0
- package/dist/result/semantic.d.ts.map +1 -0
- package/dist/result/semantic.js +950 -0
- package/dist/result/semantic.js.map +1 -0
- package/dist/script-parser/contracts.d.ts +7 -0
- package/dist/script-parser/contracts.d.ts.map +1 -0
- package/dist/script-parser/contracts.js +104 -0
- package/dist/script-parser/contracts.js.map +1 -0
- package/dist/script-parser/op-return.d.ts +8 -0
- package/dist/script-parser/op-return.d.ts.map +1 -0
- package/dist/script-parser/op-return.js +315 -0
- package/dist/script-parser/op-return.js.map +1 -0
- package/dist/script-parser/origin.d.ts +6 -0
- package/dist/script-parser/origin.d.ts.map +1 -0
- package/dist/script-parser/origin.js +68 -0
- package/dist/script-parser/origin.js.map +1 -0
- package/dist/script-parser.d.ts +3 -0
- package/dist/script-parser.d.ts.map +1 -0
- package/dist/script-parser.js +183 -0
- package/dist/script-parser.js.map +1 -0
- package/dist/types/protocol.d.ts +175 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +2 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/types/result.d.ts +167 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +2 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/script.d.ts +180 -0
- package/dist/types/script.d.ts.map +1 -0
- package/dist/types/script.js +9 -0
- package/dist/types/script.js.map +1 -0
- package/dist/types/semantic.d.ts +94 -0
- package/dist/types/semantic.d.ts.map +1 -0
- package/dist/types/semantic.js +2 -0
- package/dist/types/semantic.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/asm-converter.d.ts +7 -0
- package/dist/utils/asm-converter.d.ts.map +1 -0
- package/dist/utils/asm-converter.js +105 -0
- package/dist/utils/asm-converter.js.map +1 -0
- package/dist/utils/binary.d.ts +3 -0
- package/dist/utils/binary.d.ts.map +1 -0
- package/dist/utils/binary.js +17 -0
- package/dist/utils/binary.js.map +1 -0
- package/dist/utils/multi-sig.d.ts +9 -0
- package/dist/utils/multi-sig.d.ts.map +1 -0
- package/dist/utils/multi-sig.js +125 -0
- package/dist/utils/multi-sig.js.map +1 -0
- package/dist/utils/token-amount.d.ts +3 -0
- package/dist/utils/token-amount.d.ts.map +1 -0
- package/dist/utils/token-amount.js +37 -0
- package/dist/utils/token-amount.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { tbc } from '../../adapters/tbc-lib.js';
|
|
2
|
+
import { ScriptType } from '../../types.js';
|
|
3
|
+
const FT_CODE_MARKER_HEX = '32436f6465';
|
|
4
|
+
const FTLP_CODE_MARKER_HEX = '02436f6465';
|
|
5
|
+
const FT_CODE_OWNER_SUFFIX_PATTERN = /6a15[0-9a-f]{40}[0-9a-f]{2,4}05(?:32|02)436f6465$/u;
|
|
6
|
+
export const ftProtocolDecoder = {
|
|
7
|
+
id: 'FTape',
|
|
8
|
+
analyze({ outputs }) {
|
|
9
|
+
// Candidate detection checks FTape and FT Code evidence; real FT movements also require Code/Tape and prevout verification.
|
|
10
|
+
const hasFtTape = outputs.some((output) => Boolean(output.script.data?.ftTape));
|
|
11
|
+
const hasStableCoinTape = outputs.some((output) => Boolean(output.script.data?.ftTape?.isStableCoin));
|
|
12
|
+
const hasFtCodeOrigin = outputs.some((output) => output.script.originUtxo && output.script.data?.codeType?.toLowerCase().includes('ft'));
|
|
13
|
+
if (!hasFtTape && !hasFtCodeOrigin) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
id: hasStableCoinTape ? 'StableCoin' : this.id,
|
|
18
|
+
transactionType: hasStableCoinTape ? 'Stablecoin contract' : 'FT contract',
|
|
19
|
+
priority: hasStableCoinTape ? 85 : 80,
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
function hasPrevoutFacts(inputs) {
|
|
24
|
+
return inputs.length > 0 && inputs.every((input) => Boolean(input.prevout));
|
|
25
|
+
}
|
|
26
|
+
function ftCodeFamilyKey(script) {
|
|
27
|
+
// Owners change across transfers, so normalize the owner segment when comparing FT families.
|
|
28
|
+
const hex = script.hex?.toLowerCase();
|
|
29
|
+
const marker = hex?.endsWith(FT_CODE_MARKER_HEX)
|
|
30
|
+
? FT_CODE_MARKER_HEX
|
|
31
|
+
: hex?.endsWith(FTLP_CODE_MARKER_HEX)
|
|
32
|
+
? FTLP_CODE_MARKER_HEX
|
|
33
|
+
: undefined;
|
|
34
|
+
if (!hex || !marker) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return hex.replace(FT_CODE_OWNER_SUFFIX_PATTERN, `6a15<owner>05${marker}`);
|
|
38
|
+
}
|
|
39
|
+
function ftCodeIdentity(script) {
|
|
40
|
+
if (script.originUtxo) {
|
|
41
|
+
return `origin:${script.originUtxo.txid}:${script.originUtxo.vout}`;
|
|
42
|
+
}
|
|
43
|
+
return ftCodeFamilyKey(script);
|
|
44
|
+
}
|
|
45
|
+
function isFtCodeScript(script) {
|
|
46
|
+
return Boolean(ftCodeFamilyKey(script));
|
|
47
|
+
}
|
|
48
|
+
function isFtLpCodeScript(script) {
|
|
49
|
+
return Boolean(script.hex?.toLowerCase().endsWith(FTLP_CODE_MARKER_HEX));
|
|
50
|
+
}
|
|
51
|
+
function isFtCodeOutput(output) {
|
|
52
|
+
return isFtCodeScript(output.script);
|
|
53
|
+
}
|
|
54
|
+
function scriptByteLength(script) {
|
|
55
|
+
const hex = script.hex;
|
|
56
|
+
if (!hex || hex.length % 2 !== 0) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return hex.length / 2;
|
|
60
|
+
}
|
|
61
|
+
function isFtContractCodeTapePair(codeOutput, tapeOutput) {
|
|
62
|
+
// FT state requires an adjacent Code/Tape pair whose Code tape-size check matches the actual tape.
|
|
63
|
+
const tapeSize = scriptByteLength(tapeOutput.script);
|
|
64
|
+
const ftTape = tapeOutput.script.data?.ftTape;
|
|
65
|
+
if (!ftTape ||
|
|
66
|
+
tapeOutput.index !== codeOutput.index + 1 ||
|
|
67
|
+
!isFtCodeOutput(codeOutput) ||
|
|
68
|
+
tapeSize === undefined) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const asm = codeOutput.script.asm;
|
|
72
|
+
const tapeSizeHex = tapeSize.toString(16);
|
|
73
|
+
return asm.startsWith('OP_9 OP_PICK OP_TOALTSTACK OP_1 OP_PICK OP_SIZE OP_5 OP_SUB OP_SPLIT 4654617065 OP_EQUALVERIFY') &&
|
|
74
|
+
asm.includes('OP_PARTIAL_HASH') &&
|
|
75
|
+
asm.includes('OP_PUSH_META') &&
|
|
76
|
+
asm.includes('OP_CHECKSIGVERIFY') &&
|
|
77
|
+
asm.includes(`OP_DUP OP_SIZE OP_DUP ${tapeSizeHex} OP_EQUAL`);
|
|
78
|
+
}
|
|
79
|
+
function isFtCodePrevoutCandidate(input) {
|
|
80
|
+
const prevout = input.prevout;
|
|
81
|
+
if (!prevout) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return isFtCodeScript(prevout.script);
|
|
85
|
+
}
|
|
86
|
+
function isVerifiedFtCodePrevout(input) {
|
|
87
|
+
// Transfer inputs must prove that the previous FT Code and associated tape belong to the same historical state bundle.
|
|
88
|
+
const prevout = input.prevout;
|
|
89
|
+
if (!prevout || !isFtCodePrevoutCandidate(input)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return prevout.associatedTape?.outputIndex === input.vout + 1 &&
|
|
93
|
+
Boolean(prevout.associatedTape.script.data?.ftTape);
|
|
94
|
+
}
|
|
95
|
+
function isP2pkhUnlockingInput(input) {
|
|
96
|
+
const parts = input.unlockingScript.asm.split(/\s+/u).filter(Boolean);
|
|
97
|
+
const [signature, publicKey] = parts;
|
|
98
|
+
return parts.length === 2 &&
|
|
99
|
+
Boolean(signature && /^30[0-9a-f]+$/iu.test(signature)) &&
|
|
100
|
+
Boolean(publicKey && /^(02|03)[0-9a-f]{64}$/iu.test(publicKey));
|
|
101
|
+
}
|
|
102
|
+
function isMintMovement(inputs, outputs, movement) {
|
|
103
|
+
const codeOutput = outputs.find((output) => output.index === movement.outputIndex);
|
|
104
|
+
const sourceInput = inputs[0];
|
|
105
|
+
if (!sourceInput) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return codeOutput?.script.originUtxo?.txid === sourceInput.prevTxid &&
|
|
109
|
+
codeOutput.script.originUtxo.vout === sourceInput.vout;
|
|
110
|
+
}
|
|
111
|
+
function parseSupplyValue(value) {
|
|
112
|
+
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
return BigInt(value);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function stringValue(value) {
|
|
123
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
124
|
+
}
|
|
125
|
+
function numberValue(value) {
|
|
126
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
127
|
+
}
|
|
128
|
+
function coinNftIdentity(nftTape) {
|
|
129
|
+
const name = stringValue(nftTape?.nftName);
|
|
130
|
+
const symbol = stringValue(nftTape?.nftSymbol ?? nftTape?.symbol);
|
|
131
|
+
if (!name || !symbol) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
return `${name}\0${symbol}`;
|
|
135
|
+
}
|
|
136
|
+
function coinSupplySnapshot(nftTape) {
|
|
137
|
+
const supply = parseSupplyValue(nftTape?.coinTotalSupply);
|
|
138
|
+
const identity = coinNftIdentity(nftTape);
|
|
139
|
+
if (supply === undefined || !identity) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
supply,
|
|
144
|
+
identity,
|
|
145
|
+
coinDecimal: numberValue(nftTape?.coinDecimal),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function inputCoinSupplySnapshots(inputs) {
|
|
149
|
+
return inputs.flatMap((input) => [
|
|
150
|
+
coinSupplySnapshot(input.prevout?.script.data?.nftTape),
|
|
151
|
+
coinSupplySnapshot(input.prevout?.associatedTape?.script.data?.nftTape),
|
|
152
|
+
].filter((snapshot) => snapshot !== undefined));
|
|
153
|
+
}
|
|
154
|
+
function outputCoinSupplySnapshots(outputs) {
|
|
155
|
+
return outputs
|
|
156
|
+
.map((output) => coinSupplySnapshot(output.script.data?.nftTape))
|
|
157
|
+
.filter((snapshot) => snapshot !== undefined);
|
|
158
|
+
}
|
|
159
|
+
function coinDecimalMatches(snapshot, movement) {
|
|
160
|
+
return snapshot.coinDecimal === undefined || snapshot.coinDecimal === movement.decimal;
|
|
161
|
+
}
|
|
162
|
+
function parseNonNegativeBigInt(value) {
|
|
163
|
+
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const parsed = BigInt(value);
|
|
168
|
+
return parsed >= 0n ? parsed : undefined;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function amountSlotsSumMatchesRawAmount(movement) {
|
|
175
|
+
if (!Array.isArray(movement.amountSlots)) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
const rawAmount = parseNonNegativeBigInt(movement.rawAmount);
|
|
179
|
+
if (rawAmount === undefined) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
let slotsTotal = 0n;
|
|
183
|
+
for (const slot of movement.amountSlots) {
|
|
184
|
+
const slotAmount = parseNonNegativeBigInt(slot);
|
|
185
|
+
if (slotAmount === undefined) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
slotsTotal += slotAmount;
|
|
189
|
+
}
|
|
190
|
+
return slotsTotal === rawAmount;
|
|
191
|
+
}
|
|
192
|
+
function hasMergedAmountSlots(movement) {
|
|
193
|
+
return movement.amountSlots.filter((slot) => {
|
|
194
|
+
try {
|
|
195
|
+
return BigInt(slot) > 0n;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}).length > 1;
|
|
201
|
+
}
|
|
202
|
+
function isStablecoinMintMovement(inputs, outputs, movement) {
|
|
203
|
+
if (!movement.isStableCoin) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
let rawAmount;
|
|
207
|
+
try {
|
|
208
|
+
rawAmount = BigInt(movement.rawAmount);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
return inputCoinSupplySnapshots(inputs).some((previous) => coinDecimalMatches(previous, movement) &&
|
|
214
|
+
outputCoinSupplySnapshots(outputs).some((current) => current.identity === previous.identity &&
|
|
215
|
+
coinDecimalMatches(current, movement) &&
|
|
216
|
+
current.supply - previous.supply === rawAmount));
|
|
217
|
+
}
|
|
218
|
+
function isOrderBookContext(inputs, outputs) {
|
|
219
|
+
return outputs.some((output) => Boolean(output.script.data?.orderBook)) ||
|
|
220
|
+
inputs.some((input) => Boolean(input.prevout?.script.data?.orderBook));
|
|
221
|
+
}
|
|
222
|
+
function isPoolNftContext(inputs, outputs) {
|
|
223
|
+
return outputs.some((output) => Boolean(output.script.data?.poolNft)) ||
|
|
224
|
+
inputs.some((input) => Boolean(input.prevout?.script.data?.poolNft ?? input.prevout?.associatedTape?.script.data?.poolNft));
|
|
225
|
+
}
|
|
226
|
+
function contractIdFromInputs(inputs, codeOutput, txid) {
|
|
227
|
+
// Mint prefers the current txid, while transfer preserves the contractId from the verified input prevout.
|
|
228
|
+
const outputOrigin = codeOutput.script.originUtxo;
|
|
229
|
+
const sourceInput = inputs[0];
|
|
230
|
+
if (txid && outputOrigin && sourceInput?.prevTxid === outputOrigin.txid && sourceInput.vout === outputOrigin.vout) {
|
|
231
|
+
return txid;
|
|
232
|
+
}
|
|
233
|
+
if (outputOrigin) {
|
|
234
|
+
const matchingInput = inputs.find((input) => input.prevout?.contractId &&
|
|
235
|
+
isVerifiedFtCodePrevout(input) &&
|
|
236
|
+
input.prevout.script.originUtxo?.txid === outputOrigin.txid &&
|
|
237
|
+
input.prevout.script.originUtxo.vout === outputOrigin.vout);
|
|
238
|
+
if (matchingInput?.prevout?.contractId) {
|
|
239
|
+
return matchingInput.prevout.contractId;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const firstInputContractId = inputs.find((input) => isVerifiedFtCodePrevout(input) && input.prevout?.contractId)?.prevout?.contractId;
|
|
243
|
+
if (firstInputContractId) {
|
|
244
|
+
return firstInputContractId;
|
|
245
|
+
}
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
function firstVerifiedInputContractId(inputs) {
|
|
249
|
+
return inputs.find((input) => isVerifiedFtCodePrevout(input) && input.prevout?.contractId)?.prevout?.contractId;
|
|
250
|
+
}
|
|
251
|
+
function scriptLockHash(scriptHex) {
|
|
252
|
+
if (!scriptHex || scriptHex.length % 2 !== 0) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
return tbc.crypto.Hash.sha256ripemd160(tbc.crypto.Hash.sha256(Buffer.from(scriptHex, 'hex'))).toString('hex');
|
|
256
|
+
}
|
|
257
|
+
function multiSigAddressByLockHash(outputs, inputs) {
|
|
258
|
+
// An FT owner may expose only a lock hash; recover an address when a matching MultiSig script is available.
|
|
259
|
+
const addressByHash = new Map();
|
|
260
|
+
for (const output of outputs) {
|
|
261
|
+
if (output.scriptKind !== 'multisig' || !output.address) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const hash = scriptLockHash(output.script.hex);
|
|
265
|
+
if (hash) {
|
|
266
|
+
addressByHash.set(hash, output.address);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
for (const input of inputs) {
|
|
270
|
+
const prevout = input.prevout;
|
|
271
|
+
if (prevout?.script.type !== ScriptType.MULTISIG || !prevout.address) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const hash = scriptLockHash(prevout.script.hex);
|
|
275
|
+
if (hash) {
|
|
276
|
+
addressByHash.set(hash, prevout.address);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return addressByHash;
|
|
280
|
+
}
|
|
281
|
+
export function collectFtMovements(outputs, inputs = [], txid) {
|
|
282
|
+
// Collect valid output Code/Tape pairs first, then use the verified input family to reject forged outputs.
|
|
283
|
+
const outputMovements = [];
|
|
284
|
+
const multiSigAddressByHash = multiSigAddressByLockHash(outputs, inputs);
|
|
285
|
+
const poolNftContext = isPoolNftContext(inputs, outputs);
|
|
286
|
+
for (let index = 0; index < outputs.length - 1; index++) {
|
|
287
|
+
const codeOutput = outputs[index];
|
|
288
|
+
const tapeOutput = outputs[index + 1];
|
|
289
|
+
const ftTape = tapeOutput?.script.data?.ftTape;
|
|
290
|
+
if (!codeOutput || !tapeOutput || !ftTape || tapeOutput.index !== codeOutput.index + 1) {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
const codeIdentity = ftCodeIdentity(codeOutput.script);
|
|
294
|
+
const receiverHash = codeOutput.script.data?.hash;
|
|
295
|
+
const receiverFromHash = receiverHash ? multiSigAddressByHash.get(receiverHash) : undefined;
|
|
296
|
+
const receiver = codeOutput.address ?? codeOutput.script.data?.address ?? receiverFromHash;
|
|
297
|
+
if (!isFtContractCodeTapePair(codeOutput, tapeOutput) || !codeIdentity) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
const contractId = contractIdFromInputs(inputs, codeOutput, txid);
|
|
301
|
+
const shouldSuppressPoolNftFtLpFallbackContractId = poolNftContext &&
|
|
302
|
+
isFtLpCodeScript(codeOutput.script) &&
|
|
303
|
+
contractId === firstVerifiedInputContractId(inputs);
|
|
304
|
+
const movement = {
|
|
305
|
+
outputIndex: codeOutput.index,
|
|
306
|
+
tapeOutputIndex: tapeOutput.index,
|
|
307
|
+
receiver,
|
|
308
|
+
...(receiverFromHash ? {} : { receiverHash }),
|
|
309
|
+
...(contractId && !shouldSuppressPoolNftFtLpFallbackContractId ? { contractId } : {}),
|
|
310
|
+
name: ftTape.name,
|
|
311
|
+
symbol: ftTape.symbol,
|
|
312
|
+
amount: ftTape.amount,
|
|
313
|
+
displayAmount: ftTape.displayAmount,
|
|
314
|
+
rawAmount: ftTape.rawAmount,
|
|
315
|
+
amountSlots: ftTape.amountSlots,
|
|
316
|
+
decimal: ftTape.decimal,
|
|
317
|
+
lockTime: ftTape.lockTime,
|
|
318
|
+
isStableCoin: Boolean(ftTape.isStableCoin),
|
|
319
|
+
};
|
|
320
|
+
if (!amountSlotsSumMatchesRawAmount(movement)) {
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
outputMovements.push({
|
|
324
|
+
codeIdentity,
|
|
325
|
+
movement,
|
|
326
|
+
});
|
|
327
|
+
index++;
|
|
328
|
+
}
|
|
329
|
+
const movements = outputMovements.map((outputMovement) => outputMovement.movement);
|
|
330
|
+
const verifiedInputCodeKeys = new Set(inputs
|
|
331
|
+
.filter(isVerifiedFtCodePrevout)
|
|
332
|
+
.map((input) => ftCodeIdentity(input.prevout.script))
|
|
333
|
+
.filter((key) => Boolean(key)));
|
|
334
|
+
if (verifiedInputCodeKeys.size) {
|
|
335
|
+
// Once an FT input is verified, accept only output movements from the same family to reject forged FTapes.
|
|
336
|
+
return outputMovements
|
|
337
|
+
.filter((outputMovement) => (verifiedInputCodeKeys.has(outputMovement.codeIdentity) &&
|
|
338
|
+
!(outputMovement.movement.isStableCoin &&
|
|
339
|
+
hasMergedAmountSlots(outputMovement.movement) &&
|
|
340
|
+
verifiedInputCodeKeys.size > 1)) ||
|
|
341
|
+
(poolNftContext && isFtLpCodeScript(outputs[outputMovement.movement.outputIndex]?.script ?? {})))
|
|
342
|
+
.map((outputMovement) => outputMovement.movement);
|
|
343
|
+
}
|
|
344
|
+
if (inputs.some(isFtCodePrevoutCandidate)) {
|
|
345
|
+
// Conservatively reject FT movements when an FT-like input has no verifiable associated tape.
|
|
346
|
+
return [];
|
|
347
|
+
}
|
|
348
|
+
if (isOrderBookContext(inputs, outputs)) {
|
|
349
|
+
return movements;
|
|
350
|
+
}
|
|
351
|
+
const mintMovements = movements.filter((movement) => isMintMovement(inputs, outputs, movement) &&
|
|
352
|
+
(!movement.isStableCoin || isStablecoinMintMovement(inputs, outputs, movement)));
|
|
353
|
+
if (mintMovements.length) {
|
|
354
|
+
return mintMovements;
|
|
355
|
+
}
|
|
356
|
+
const stablecoinMintMovements = movements.filter((movement) => isStablecoinMintMovement(inputs, outputs, movement));
|
|
357
|
+
if (stablecoinMintMovements.length) {
|
|
358
|
+
return stablecoinMintMovements;
|
|
359
|
+
}
|
|
360
|
+
if (!inputs.length || (!hasPrevoutFacts(inputs) && !inputs.every(isP2pkhUnlockingInput))) {
|
|
361
|
+
return movements;
|
|
362
|
+
}
|
|
363
|
+
return [];
|
|
364
|
+
}
|
|
365
|
+
export function inferFtTransactionType(inputs, outputs, movements) {
|
|
366
|
+
// Transaction type summarizes verified movements and is never determined directly from an FTape marker.
|
|
367
|
+
if (!movements.length) {
|
|
368
|
+
return undefined;
|
|
369
|
+
}
|
|
370
|
+
const isStableCoin = movements.some((movement) => movement.isStableCoin);
|
|
371
|
+
const prefix = isStableCoin ? 'Stablecoin' : 'FT';
|
|
372
|
+
const firstMovement = movements[0];
|
|
373
|
+
const updatesStableCoinNftSupply = isStableCoin
|
|
374
|
+
? outputs.some((output) => Boolean(output.script.data?.nftTape?.coinTotalSupply))
|
|
375
|
+
: false;
|
|
376
|
+
const isMint = outputs.some((output) => output.index === firstMovement?.outputIndex && output.script.originUtxo?.txid === inputs[0]?.prevTxid) || updatesStableCoinNftSupply;
|
|
377
|
+
const hasMergedSlots = firstMovement ? hasMergedAmountSlots(firstMovement) : false;
|
|
378
|
+
if (isMint) {
|
|
379
|
+
return `${prefix} mint`;
|
|
380
|
+
}
|
|
381
|
+
const firstReceiver = firstMovement?.receiver;
|
|
382
|
+
const nativeOutputs = outputs.filter((output) => output.satoshis > 500 && output.address && output.script.type === ScriptType.P2PKH);
|
|
383
|
+
const hasNativeTransfer = nativeOutputs.some((output) => firstReceiver && output.address === firstReceiver);
|
|
384
|
+
const hasNativeChangeCandidate = nativeOutputs.some((output) => firstReceiver && output.address !== firstReceiver);
|
|
385
|
+
if (hasNativeTransfer && (movements.length > 1 || hasNativeChangeCandidate || inputs.length <= 1)) {
|
|
386
|
+
return `${prefix} transfer with TBC`;
|
|
387
|
+
}
|
|
388
|
+
if (movements.length === 1 && hasMergedSlots) {
|
|
389
|
+
return `${prefix} merge`;
|
|
390
|
+
}
|
|
391
|
+
return `${prefix} transfer`;
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocols/ft/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DecodedOutput } from '../types.js';
|
|
2
|
+
import type { ProtocolAnalysis, ProtocolContext } from './types.js';
|
|
3
|
+
export declare function analyzeProtocols(context: ProtocolContext): ProtocolAnalysis[];
|
|
4
|
+
export declare function collectProtocolMarkers(outputs: DecodedOutput[]): string[];
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocols/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAarF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,gBAAgB,EAAE,CAK7E;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,EAAE,YAsC9D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ftProtocolDecoder } from './ft/index.js';
|
|
2
|
+
import { nftProtocolDecoder } from './nft/index.js';
|
|
3
|
+
import { orderBookProtocolDecoder } from './order-book/index.js';
|
|
4
|
+
import { piggyBankProtocolDecoder } from './piggy-bank/index.js';
|
|
5
|
+
import { poolNftProtocolDecoder } from './pool-nft/index.js';
|
|
6
|
+
import { tbcProtocolDecoder } from './tbc/index.js';
|
|
7
|
+
// List high-priority protocols first and still sort by priority so the TBC fallback cannot claim contract transactions.
|
|
8
|
+
const protocolDecoders = [
|
|
9
|
+
piggyBankProtocolDecoder,
|
|
10
|
+
orderBookProtocolDecoder,
|
|
11
|
+
poolNftProtocolDecoder,
|
|
12
|
+
nftProtocolDecoder,
|
|
13
|
+
ftProtocolDecoder,
|
|
14
|
+
tbcProtocolDecoder,
|
|
15
|
+
];
|
|
16
|
+
// Run candidate detection for every protocol without creating movements; results support type fallback and unsupported reporting.
|
|
17
|
+
export function analyzeProtocols(context) {
|
|
18
|
+
return protocolDecoders
|
|
19
|
+
.map((decoder) => decoder.analyze(context))
|
|
20
|
+
.filter((analysis) => Boolean(analysis))
|
|
21
|
+
.sort((a, b) => b.priority - a.priority);
|
|
22
|
+
}
|
|
23
|
+
// Collect protocol markers from scripts for unsupported notices and basic transaction-type fallback.
|
|
24
|
+
export function collectProtocolMarkers(outputs) {
|
|
25
|
+
const protocols = new Set();
|
|
26
|
+
for (const output of outputs) {
|
|
27
|
+
if (output.script.type === 'MULTISIG') {
|
|
28
|
+
protocols.add('MULTISIG');
|
|
29
|
+
}
|
|
30
|
+
if (output.script.originUtxo) {
|
|
31
|
+
protocols.add('CONTRACT_CODE');
|
|
32
|
+
}
|
|
33
|
+
if (output.script.data?.ftTape) {
|
|
34
|
+
protocols.add('FTape');
|
|
35
|
+
if (output.script.data.ftTape.isStableCoin) {
|
|
36
|
+
protocols.add('StableCoin');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (output.script.data?.nftTape || output.script.data?.collectionTape) {
|
|
40
|
+
protocols.add('NTape');
|
|
41
|
+
}
|
|
42
|
+
if (output.script.data?.poolNft) {
|
|
43
|
+
protocols.add('NTape');
|
|
44
|
+
protocols.add('PoolNFT');
|
|
45
|
+
if (output.script.data.poolNft.version === 2) {
|
|
46
|
+
protocols.add('PoolNFT2.0');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (output.script.data?.orderBook) {
|
|
50
|
+
protocols.add('OrderBook');
|
|
51
|
+
}
|
|
52
|
+
if (output.script.data?.piggyBank) {
|
|
53
|
+
protocols.add('PiggyBank');
|
|
54
|
+
}
|
|
55
|
+
if (output.script.data?.codeType) {
|
|
56
|
+
protocols.add(output.script.data.codeType);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return [...protocols];
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocols/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DecodedInput, type DecodedOutput } from '../../types.js';
|
|
2
|
+
import type { NftMovement } from '../../types/protocol.js';
|
|
3
|
+
import type { ProtocolDecoder } from '../types.js';
|
|
4
|
+
export declare function optimizeCollectionMintOutputs(outputs: DecodedOutput[]): DecodedOutput[];
|
|
5
|
+
export declare const nftProtocolDecoder: ProtocolDecoder;
|
|
6
|
+
export declare function collectNftMovements(txid: string, inputs: DecodedInput[], outputs: DecodedOutput[]): NftMovement[];
|
|
7
|
+
export declare function inferNftTransactionType(movements: NftMovement[]): "NFT collection mint" | "NFT mint" | "NFT burn" | "NFT transfer" | undefined;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protocols/nft/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,aAAa,CAAC;AAmDrE,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CA+BvF;AAED,eAAO,MAAM,kBAAkB,EAAE,eAqBhC,CAAC;AAyMF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,EAAE,aAAa,EAAE,GACvB,WAAW,EAAE,CAwFf;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,WAAW,EAAE,gFAgB/D"}
|