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,335 @@
|
|
|
1
|
+
import tbcContract from 'tbc-contract';
|
|
2
|
+
import { ScriptType } from '../../types.js';
|
|
3
|
+
const NFT_CODE_SATOSHIS = 200;
|
|
4
|
+
const NFT_HOLD_SATOSHIS = 100;
|
|
5
|
+
const NFT_V0_CODE_MARKER_HEX = '33436f6465';
|
|
6
|
+
const { NFT } = tbcContract;
|
|
7
|
+
function collectionMintShape(outputs) {
|
|
8
|
+
// The standard shape is a Collection Tape followed by supply Mint NHolds and optionally one ordinary change output.
|
|
9
|
+
const tapeOutput = outputs[0];
|
|
10
|
+
const collectionTape = tapeOutput?.script.data?.collectionTape;
|
|
11
|
+
if (!tapeOutput ||
|
|
12
|
+
!collectionTape?.collectionName ||
|
|
13
|
+
typeof collectionTape.supply !== 'number' ||
|
|
14
|
+
!Number.isInteger(collectionTape.supply) ||
|
|
15
|
+
collectionTape.supply <= 0) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const mintOutputs = outputs.slice(1, collectionTape.supply + 1);
|
|
19
|
+
if (mintOutputs.length !== collectionTape.supply ||
|
|
20
|
+
mintOutputs.some((output) => output.satoshis !== NFT_HOLD_SATOSHIS ||
|
|
21
|
+
output.script.type !== ScriptType.P2PKH ||
|
|
22
|
+
!output.address ||
|
|
23
|
+
output.script.data?.nftHoldType !== 'mint')) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const trailingOutputs = outputs.slice(collectionTape.supply + 1);
|
|
27
|
+
if (trailingOutputs.length > 1 || trailingOutputs[0]?.script.data?.nftHoldType === 'mint') {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
tapeOutput,
|
|
32
|
+
mintOutputs,
|
|
33
|
+
changeOutput: trailingOutputs[0],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function isCollectionMint(outputs) {
|
|
37
|
+
return collectionMintShape(outputs) !== undefined;
|
|
38
|
+
}
|
|
39
|
+
export function optimizeCollectionMintOutputs(outputs) {
|
|
40
|
+
// Collection mint may create many slots, so the public chain layer keeps an explicitly labeled compressed summary.
|
|
41
|
+
const shape = collectionMintShape(outputs);
|
|
42
|
+
if (!shape) {
|
|
43
|
+
return outputs;
|
|
44
|
+
}
|
|
45
|
+
const { tapeOutput, mintOutputs, changeOutput } = shape;
|
|
46
|
+
const representativeMintOutput = mintOutputs[0];
|
|
47
|
+
if (!representativeMintOutput) {
|
|
48
|
+
return outputs;
|
|
49
|
+
}
|
|
50
|
+
return [
|
|
51
|
+
tapeOutput,
|
|
52
|
+
{
|
|
53
|
+
...representativeMintOutput,
|
|
54
|
+
satoshis: mintOutputs.reduce((sum, output) => sum + output.satoshis, 0),
|
|
55
|
+
compression: {
|
|
56
|
+
type: 'nftMintSlots',
|
|
57
|
+
count: mintOutputs.length,
|
|
58
|
+
indexRange: {
|
|
59
|
+
from: mintOutputs[0]?.index ?? representativeMintOutput.index,
|
|
60
|
+
to: mintOutputs[mintOutputs.length - 1]?.index ?? representativeMintOutput.index,
|
|
61
|
+
},
|
|
62
|
+
satoshisPerOutput: representativeMintOutput.satoshis,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
...(changeOutput ? [changeOutput] : []),
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
export const nftProtocolDecoder = {
|
|
69
|
+
id: 'NTape',
|
|
70
|
+
analyze({ outputs }) {
|
|
71
|
+
// Candidate detection checks NTape or NFT Code evidence; Code/Hold/Tape state relationships must prove mint or transfer.
|
|
72
|
+
const hasNtapeData = outputs.some((output) => Boolean(output.script.data?.nftTape || output.script.data?.collectionTape));
|
|
73
|
+
const hasNftCodeOrigin = outputs.some((output) => output.script.originUtxo && output.script.data?.codeType?.toLowerCase().includes('nft'));
|
|
74
|
+
if (!hasNtapeData && !hasNftCodeOrigin) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
id: this.id,
|
|
79
|
+
transactionType: isCollectionMint(outputs) ? 'NFT collection mint' : 'NFT contract',
|
|
80
|
+
priority: 90,
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
function readCollectionIndexFromFile(file) {
|
|
85
|
+
// NFT transfer file references usually contain a collection txid plus little-endian vout for collectionIndex recovery.
|
|
86
|
+
if (typeof file !== 'string' || file.length < 72 || !/^[0-9a-f]{72}$/iu.test(file)) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
const voutHex = file.slice(64, 72);
|
|
90
|
+
const buffer = Buffer.from(voutHex, 'hex');
|
|
91
|
+
if (buffer.length !== 4) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
return buffer.readUInt32LE(0);
|
|
95
|
+
}
|
|
96
|
+
function isNftCodeScript(script) {
|
|
97
|
+
const hex = script.hex?.toLowerCase();
|
|
98
|
+
return Boolean(script.originUtxo ||
|
|
99
|
+
hex?.endsWith(NFT_V0_CODE_MARKER_HEX) ||
|
|
100
|
+
script.data?.codeType?.toLowerCase().includes('nft'));
|
|
101
|
+
}
|
|
102
|
+
function isNftCodeOutput(output) {
|
|
103
|
+
return output.satoshis >= NFT_CODE_SATOSHIS && isNftCodeScript(output.script);
|
|
104
|
+
}
|
|
105
|
+
function isNftHoldOutput(output) {
|
|
106
|
+
return output.satoshis >= NFT_HOLD_SATOSHIS && output.script.data?.nftHoldType === 'current';
|
|
107
|
+
}
|
|
108
|
+
function isVerifiedNftCodePrevout(input) {
|
|
109
|
+
// A transfer Code input must include a zero-satoshi associated NTape at vout + 2.
|
|
110
|
+
const prevout = input.prevout;
|
|
111
|
+
if (!prevout || (prevout.satoshis ?? 0) < NFT_CODE_SATOSHIS || !isNftCodeScript(prevout.script)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return prevout.associatedTape?.outputIndex === input.vout + 2 &&
|
|
115
|
+
prevout.associatedTape.satoshis === 0 &&
|
|
116
|
+
Boolean(prevout.associatedTape.script.data?.nftTape);
|
|
117
|
+
}
|
|
118
|
+
function isVerifiedNftHoldPrevout(input) {
|
|
119
|
+
const prevout = input.prevout;
|
|
120
|
+
return (prevout?.satoshis ?? 0) >= NFT_HOLD_SATOSHIS &&
|
|
121
|
+
prevout?.script.type === ScriptType.P2PKH &&
|
|
122
|
+
Boolean(prevout.address ?? prevout.script.address ?? prevout.script.data?.address) &&
|
|
123
|
+
prevout.script.data?.nftHoldType === 'current';
|
|
124
|
+
}
|
|
125
|
+
function isVerifiedNftMintSlotPrevout(input, codeOutput) {
|
|
126
|
+
// NFT mint consumes a slot reserved by collection mint and must match the new Code output's origin UTXO.
|
|
127
|
+
const prevout = input.prevout;
|
|
128
|
+
return input.prevTxid === codeOutput.script.originUtxo?.txid &&
|
|
129
|
+
input.vout === codeOutput.script.originUtxo.vout &&
|
|
130
|
+
(prevout?.satoshis ?? 0) >= NFT_HOLD_SATOSHIS &&
|
|
131
|
+
prevout?.script.type === ScriptType.P2PKH &&
|
|
132
|
+
Boolean(prevout.address ?? prevout.script.address ?? prevout.script.data?.address) &&
|
|
133
|
+
prevout?.script.data?.nftHoldType === 'mint';
|
|
134
|
+
}
|
|
135
|
+
function isCanonicalNftCodeOutput(output) {
|
|
136
|
+
const origin = output.script.originUtxo;
|
|
137
|
+
const actualHex = output.script.hex?.toLowerCase();
|
|
138
|
+
if (!origin || !actualHex) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const canonicalHex = NFT.buildCodeScript(origin.txid, origin.vout)
|
|
143
|
+
.toBuffer()
|
|
144
|
+
.toString('hex')
|
|
145
|
+
.toLowerCase();
|
|
146
|
+
return actualHex === canonicalHex;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function isVerifiedStandaloneNftMintOrigin(input, codeOutput) {
|
|
153
|
+
const origin = codeOutput.script.originUtxo;
|
|
154
|
+
return Boolean(origin &&
|
|
155
|
+
input.prevTxid === origin.txid &&
|
|
156
|
+
input.vout === origin.vout &&
|
|
157
|
+
input.prevout?.script.type === ScriptType.P2PKH &&
|
|
158
|
+
!input.prevout.script.data?.nftHoldType &&
|
|
159
|
+
isCanonicalNftCodeOutput(codeOutput));
|
|
160
|
+
}
|
|
161
|
+
function verifiedCollectionIdentity(codeInput, codeOutput) {
|
|
162
|
+
const origin = codeOutput.script.originUtxo;
|
|
163
|
+
const associatedOrigin = codeInput?.prevout?.associatedOrigin;
|
|
164
|
+
if (!origin || !associatedOrigin) {
|
|
165
|
+
return {};
|
|
166
|
+
}
|
|
167
|
+
const isMatchingMintSlot = associatedOrigin.txid === origin.txid &&
|
|
168
|
+
associatedOrigin.outputIndex === origin.vout &&
|
|
169
|
+
associatedOrigin.satoshis >= NFT_HOLD_SATOSHIS &&
|
|
170
|
+
associatedOrigin.script.data?.nftHoldType === 'mint';
|
|
171
|
+
return isMatchingMintSlot
|
|
172
|
+
? { collectionId: origin.txid, collectionIndex: origin.vout }
|
|
173
|
+
: {};
|
|
174
|
+
}
|
|
175
|
+
function nftFileIdentity(file) {
|
|
176
|
+
return typeof file === 'string' && file.length >= 64 ? file : undefined;
|
|
177
|
+
}
|
|
178
|
+
function nftReferenceIdentity(file) {
|
|
179
|
+
return typeof file === 'string' && /^[0-9a-f]{72}$/iu.test(file) ? file : undefined;
|
|
180
|
+
}
|
|
181
|
+
function nftReceiverFromOutput(output) {
|
|
182
|
+
if (output?.script.type !== ScriptType.P2PKH) {
|
|
183
|
+
return {};
|
|
184
|
+
}
|
|
185
|
+
const receiver = output.address ?? output.script.address ?? output.script.data?.address;
|
|
186
|
+
return {
|
|
187
|
+
...(receiver ? { receiver } : {}),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function nftSenderFromInput(input) {
|
|
191
|
+
const sender = input?.prevout?.address ?? input?.prevout?.script.address ?? input?.prevout?.script.data?.address;
|
|
192
|
+
return {
|
|
193
|
+
...(sender ? { sender } : {}),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function isMatchingVerifiedNftCodeInput(input, nftTape) {
|
|
197
|
+
// The Code input first proves historical NFT state, then file identity prevents cross-NFT or cross-collection reuse.
|
|
198
|
+
if (!isVerifiedNftCodePrevout(input)) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
const outputFile = nftFileIdentity(nftTape?.file);
|
|
202
|
+
const inputFile = nftFileIdentity(input.prevout?.associatedTape?.script.data?.nftTape?.file);
|
|
203
|
+
if (!outputFile || !inputFile || outputFile === inputFile) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
const outputReference = nftReferenceIdentity(outputFile);
|
|
207
|
+
const inputReference = nftReferenceIdentity(inputFile);
|
|
208
|
+
// A real mint tape often stores a data URI, while transfer tape is rewritten as a previous-NFT txid/vout reference.
|
|
209
|
+
// If the input tape already contains another on-chain reference, require an exact match instead of trusting input.prevTxid alone.
|
|
210
|
+
return Boolean(outputReference?.startsWith(input.prevTxid) && !inputReference);
|
|
211
|
+
}
|
|
212
|
+
function isPairedNftHoldInput(codeInput, holdInput) {
|
|
213
|
+
return isVerifiedNftHoldPrevout(holdInput) &&
|
|
214
|
+
holdInput.prevTxid === codeInput.prevTxid &&
|
|
215
|
+
holdInput.vout === codeInput.vout + 1;
|
|
216
|
+
}
|
|
217
|
+
function findVerifiedNftTransferInputPair(inputs, nftTape) {
|
|
218
|
+
for (const codeInput of inputs) {
|
|
219
|
+
if (!isMatchingVerifiedNftCodeInput(codeInput, nftTape)) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// Transfer must spend one previous NFT state bundle: Code at vout, Hold at vout + 1, and verified tape at vout + 2.
|
|
223
|
+
const holdInput = inputs.find((input) => isPairedNftHoldInput(codeInput, input));
|
|
224
|
+
if (holdInput) {
|
|
225
|
+
return { codeInput, holdInput };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
function isSameNftCodeOrigin(codeOutput, codeInput) {
|
|
231
|
+
// Transfer outputs must not replace the collection origin from the previous Code input.
|
|
232
|
+
const outputOrigin = codeOutput.script.originUtxo;
|
|
233
|
+
const inputOrigin = codeInput.prevout?.script.originUtxo;
|
|
234
|
+
if (!outputOrigin || !inputOrigin) {
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
return outputOrigin.txid === inputOrigin.txid && outputOrigin.vout === inputOrigin.vout;
|
|
238
|
+
}
|
|
239
|
+
export function collectNftMovements(txid, inputs, outputs) {
|
|
240
|
+
// State bundles must prove NFT movements: output shape proves collection mint, while Code/Hold/Tape relations prove mint or transfer.
|
|
241
|
+
const movements = [];
|
|
242
|
+
// Require the complete collection-mint output shape so a forged Collection Tape cannot override a real NFT transfer.
|
|
243
|
+
const collectionTapeOutput = isCollectionMint(outputs) ? outputs[0] : undefined;
|
|
244
|
+
if (collectionTapeOutput?.script.data?.collectionTape) {
|
|
245
|
+
const tape = collectionTapeOutput.script.data.collectionTape;
|
|
246
|
+
const mintOutputs = outputs.filter((output) => output.script.data?.nftHoldType === 'mint');
|
|
247
|
+
const slotController = nftReceiverFromOutput(mintOutputs[0]);
|
|
248
|
+
movements.push({
|
|
249
|
+
action: 'mintCollection',
|
|
250
|
+
contractId: txid,
|
|
251
|
+
collectionId: txid,
|
|
252
|
+
collectionName: tape.collectionName,
|
|
253
|
+
supply: tape.supply,
|
|
254
|
+
tapeOutputIndex: collectionTapeOutput.index,
|
|
255
|
+
...(slotController.receiver ? { mintSlotAddress: slotController.receiver } : {}),
|
|
256
|
+
description: tape.description,
|
|
257
|
+
});
|
|
258
|
+
return movements;
|
|
259
|
+
}
|
|
260
|
+
for (let index = 0; index < outputs.length - 2; index++) {
|
|
261
|
+
const codeOutput = outputs[index];
|
|
262
|
+
const holdOutput = outputs[index + 1];
|
|
263
|
+
const tapeOutput = outputs[index + 2];
|
|
264
|
+
const nftTape = tapeOutput?.script.data?.nftTape;
|
|
265
|
+
if (!codeOutput || !holdOutput || !tapeOutput || !nftTape) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (!isNftCodeOutput(codeOutput) || !isNftHoldOutput(holdOutput)) {
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const fileReference = nftReferenceIdentity(nftTape.file);
|
|
272
|
+
const receiver = nftReceiverFromOutput(holdOutput);
|
|
273
|
+
const isBurn = !receiver.receiver;
|
|
274
|
+
const collectionMintInput = inputs.find((input) => isVerifiedNftMintSlotPrevout(input, codeOutput));
|
|
275
|
+
const standaloneMintInput = collectionMintInput
|
|
276
|
+
? undefined
|
|
277
|
+
: inputs.find((input) => isVerifiedStandaloneNftMintOrigin(input, codeOutput));
|
|
278
|
+
const isMint = Boolean(collectionMintInput ?? standaloneMintInput);
|
|
279
|
+
const transferInputPair = isMint ? undefined : findVerifiedNftTransferInputPair(inputs, nftTape);
|
|
280
|
+
if (!isMint && !transferInputPair) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
if (transferInputPair && !isSameNftCodeOrigin(codeOutput, transferInputPair.codeInput)) {
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const sender = isMint ? {} : nftSenderFromInput(transferInputPair?.holdInput);
|
|
287
|
+
const collectionIdentity = collectionMintInput
|
|
288
|
+
? {
|
|
289
|
+
collectionId: codeOutput.script.originUtxo?.txid,
|
|
290
|
+
collectionIndex: codeOutput.script.originUtxo?.vout ?? readCollectionIndexFromFile(nftTape.file),
|
|
291
|
+
}
|
|
292
|
+
: verifiedCollectionIdentity(transferInputPair?.codeInput, codeOutput);
|
|
293
|
+
// Transfer contractId prefers the file reference, then the input prevout, and finally the on-chain origin.
|
|
294
|
+
const transferFileContractId = !isMint && transferInputPair && fileReference?.startsWith(transferInputPair.codeInput.prevTxid)
|
|
295
|
+
? fileReference.slice(0, 64)
|
|
296
|
+
: undefined;
|
|
297
|
+
movements.push({
|
|
298
|
+
action: isBurn ? 'burn' : isMint ? 'mint' : 'transfer',
|
|
299
|
+
contractId: isMint
|
|
300
|
+
? txid
|
|
301
|
+
: transferFileContractId ??
|
|
302
|
+
transferInputPair?.codeInput.prevout?.contractId ??
|
|
303
|
+
transferInputPair?.codeInput.prevTxid ??
|
|
304
|
+
fileReference?.slice(0, 64) ??
|
|
305
|
+
codeOutput.script.originUtxo?.txid,
|
|
306
|
+
...collectionIdentity,
|
|
307
|
+
outputIndex: codeOutput.index,
|
|
308
|
+
holdOutputIndex: holdOutput.index,
|
|
309
|
+
tapeOutputIndex: tapeOutput.index,
|
|
310
|
+
...sender,
|
|
311
|
+
...receiver,
|
|
312
|
+
nftName: nftTape.nftName,
|
|
313
|
+
symbol: nftTape.symbol,
|
|
314
|
+
description: nftTape.description,
|
|
315
|
+
attributes: typeof nftTape.attributes === 'string' || nftTape.attributes === null ? nftTape.attributes : undefined,
|
|
316
|
+
});
|
|
317
|
+
index += 2;
|
|
318
|
+
}
|
|
319
|
+
return movements;
|
|
320
|
+
}
|
|
321
|
+
export function inferNftTransactionType(movements) {
|
|
322
|
+
// Infer an NFT transaction type only when a verified NFT movement exists.
|
|
323
|
+
const firstMovement = movements[0];
|
|
324
|
+
if (!firstMovement) {
|
|
325
|
+
return undefined;
|
|
326
|
+
}
|
|
327
|
+
if (firstMovement.action === 'mintCollection') {
|
|
328
|
+
return 'NFT collection mint';
|
|
329
|
+
}
|
|
330
|
+
if (firstMovement.action === 'mint') {
|
|
331
|
+
return 'NFT mint';
|
|
332
|
+
}
|
|
333
|
+
return firstMovement.action === 'burn' ? 'NFT burn' : 'NFT transfer';
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocols/nft/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/protocols/nft/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DecodedOutput } from '../../types.js';
|
|
2
|
+
import type { FungibleTokenMovement, OrderBookOrder } from '../../types/protocol.js';
|
|
3
|
+
import type { OrderBookAction, OrderBookActionMatch, OrderBookFacts } from './types.js';
|
|
4
|
+
export declare function matchOrderBookAction(facts: OrderBookFacts): OrderBookActionMatch | undefined;
|
|
5
|
+
export declare function orderBookTransactionType(action: OrderBookAction | undefined): "OrderBook buy order" | "OrderBook sell order" | "OrderBook buy order cancel" | "OrderBook sell order cancel" | "OrderBook order update" | "OrderBook match" | "OrderBook transaction";
|
|
6
|
+
export declare function inferOrderBookActionMatch(orderBookOrders: OrderBookOrder[], ftMovements: FungibleTokenMovement[], outputs?: DecodedOutput[]): OrderBookActionMatch | undefined;
|
|
7
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/protocols/order-book/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIrF,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAmD3G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAsE5F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,0LAiB3E;AAED,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,cAAc,EAAE,EACjC,WAAW,EAAE,qBAAqB,EAAE,EACpC,OAAO,GAAE,aAAa,EAAO,oCAG9B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { buildOrderBookFacts } from './facts.js';
|
|
2
|
+
import { verifyOrderBookUpdateContinuity } from './identity.js';
|
|
3
|
+
import { settleOrderBookCancel, settleOrderBookMatch, settleOrderBookPlace, settleOrderBookUpdateDelta } from './settlement.js';
|
|
4
|
+
function createOrderBookActionMatch(action, facts, reasons, confidence = 'heuristic', extra = {}) {
|
|
5
|
+
return {
|
|
6
|
+
action,
|
|
7
|
+
confidence,
|
|
8
|
+
reasons,
|
|
9
|
+
inputOrders: facts.inputOrders,
|
|
10
|
+
outputOrders: facts.outputOrders,
|
|
11
|
+
...extra,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function firstOutputOrder(facts) {
|
|
15
|
+
return facts.outputOrders[0];
|
|
16
|
+
}
|
|
17
|
+
function firstInputOrder(facts) {
|
|
18
|
+
return facts.inputOrders[0];
|
|
19
|
+
}
|
|
20
|
+
function cancelAction(order) {
|
|
21
|
+
if (order?.side === 'buy') {
|
|
22
|
+
return 'cancelBuy';
|
|
23
|
+
}
|
|
24
|
+
if (order?.side === 'sell') {
|
|
25
|
+
return 'cancelSell';
|
|
26
|
+
}
|
|
27
|
+
return 'unknown';
|
|
28
|
+
}
|
|
29
|
+
function placeAction(order) {
|
|
30
|
+
if (order?.side === 'buy') {
|
|
31
|
+
return 'placeBuy';
|
|
32
|
+
}
|
|
33
|
+
if (order?.side === 'sell') {
|
|
34
|
+
return 'placeSell';
|
|
35
|
+
}
|
|
36
|
+
return 'unknown';
|
|
37
|
+
}
|
|
38
|
+
export function matchOrderBookAction(facts) {
|
|
39
|
+
if (!facts.orders.length) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const buyOrder = facts.buyInputOrders[0];
|
|
43
|
+
const sellOrder = facts.sellInputOrders[0];
|
|
44
|
+
if (buyOrder && sellOrder) {
|
|
45
|
+
const settlement = settleOrderBookMatch(buyOrder, sellOrder, facts.ftMovements, facts.tbcOutputs, facts.outputOrders);
|
|
46
|
+
return createOrderBookActionMatch('match', facts, [
|
|
47
|
+
'input buy and sell orders are both spent',
|
|
48
|
+
...(settlement.isComplete ? ['settlement outputs match OrderBook amount formulas'] : settlement.reasons),
|
|
49
|
+
], settlement.isComplete ? 'exact' : 'partial', { buyOrder, sellOrder, settlement });
|
|
50
|
+
}
|
|
51
|
+
if (facts.inputOrders.length && facts.outputOrders.length) {
|
|
52
|
+
const updateContinuity = verifyOrderBookUpdateContinuity(facts.inputOrders, facts.outputOrders);
|
|
53
|
+
const updateDelta = updateContinuity.isContinuous && updateContinuity.inputOrder && updateContinuity.outputOrder
|
|
54
|
+
? settleOrderBookUpdateDelta(updateContinuity.inputOrder, updateContinuity.outputOrder, facts.ftMovements, facts.tbcOutputs)
|
|
55
|
+
: undefined;
|
|
56
|
+
return createOrderBookActionMatch('update', facts, [
|
|
57
|
+
'input order is spent and output order state is created in the same transaction',
|
|
58
|
+
...(updateContinuity.isContinuous ? ['old and new order identity is continuous'] : updateContinuity.reasons),
|
|
59
|
+
...(updateDelta
|
|
60
|
+
? updateDelta.isComplete
|
|
61
|
+
? ['update asset delta matches chain evidence']
|
|
62
|
+
: updateDelta.reasons
|
|
63
|
+
: []),
|
|
64
|
+
], updateContinuity.isContinuous && (updateDelta?.isComplete ?? true) ? 'exact' : 'partial', { updateContinuity, ...(updateDelta ? { updateDelta } : {}) });
|
|
65
|
+
}
|
|
66
|
+
if (facts.inputOrders.length) {
|
|
67
|
+
const order = firstInputOrder(facts);
|
|
68
|
+
const cancelRelease = order ? settleOrderBookCancel(order, facts.ftMovements, facts.tbcOutputs) : undefined;
|
|
69
|
+
return createOrderBookActionMatch(cancelAction(order), facts, [
|
|
70
|
+
'input order is spent without an output order continuation',
|
|
71
|
+
...(cancelRelease?.isComplete ? ['cancel release asset matches chain evidence'] : cancelRelease?.reasons ?? []),
|
|
72
|
+
], cancelRelease?.isComplete ? 'exact' : 'partial', cancelRelease ? { cancelRelease } : {});
|
|
73
|
+
}
|
|
74
|
+
const order = firstOutputOrder(facts);
|
|
75
|
+
const placeLock = order ? settleOrderBookPlace(order, facts.ftMovements, facts.tbcOutputs) : undefined;
|
|
76
|
+
return createOrderBookActionMatch(placeAction(order), facts, [
|
|
77
|
+
'output order state is created',
|
|
78
|
+
...(placeLock?.isComplete ? ['place order lock asset matches chain evidence'] : placeLock?.reasons ?? []),
|
|
79
|
+
], placeLock?.isComplete ? 'exact' : 'partial', placeLock ? { placeLock } : {});
|
|
80
|
+
}
|
|
81
|
+
export function orderBookTransactionType(action) {
|
|
82
|
+
switch (action) {
|
|
83
|
+
case 'placeBuy':
|
|
84
|
+
return 'OrderBook buy order';
|
|
85
|
+
case 'placeSell':
|
|
86
|
+
return 'OrderBook sell order';
|
|
87
|
+
case 'cancelBuy':
|
|
88
|
+
return 'OrderBook buy order cancel';
|
|
89
|
+
case 'cancelSell':
|
|
90
|
+
return 'OrderBook sell order cancel';
|
|
91
|
+
case 'update':
|
|
92
|
+
return 'OrderBook order update';
|
|
93
|
+
case 'match':
|
|
94
|
+
return 'OrderBook match';
|
|
95
|
+
default:
|
|
96
|
+
return 'OrderBook transaction';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function inferOrderBookActionMatch(orderBookOrders, ftMovements, outputs = []) {
|
|
100
|
+
return matchOrderBookAction(buildOrderBookFacts(orderBookOrders, ftMovements, outputs));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/protocols/order-book/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DecodedInput, DecodedOutput } from '../../types.js';
|
|
2
|
+
import type { FungibleTokenMovement, OrderBookOrder } from '../../types/protocol.js';
|
|
3
|
+
import type { OrderBookFacts } from './types.js';
|
|
4
|
+
export declare function buildOrderBookFacts(orders: OrderBookOrder[], ftMovements: FungibleTokenMovement[], outputs?: DecodedOutput[]): OrderBookFacts;
|
|
5
|
+
export declare function collectOrderBookFacts(inputs: DecodedInput[], outputs: DecodedOutput[], ftMovements?: FungibleTokenMovement[]): OrderBookFacts;
|
|
6
|
+
export declare function orderBookOrdersFromFacts(facts: OrderBookFacts): OrderBookOrder[];
|
|
7
|
+
//# sourceMappingURL=facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../../src/protocols/order-book/facts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAgDpE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EAAE,EACxB,WAAW,EAAE,qBAAqB,EAAE,EACpC,OAAO,GAAE,aAAa,EAAO,GAC5B,cAAc,CA6BhB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,EAAE,aAAa,EAAE,EACxB,WAAW,GAAE,qBAAqB,EAAO,GACxC,cAAc,CAWhB;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,EAAE,CAEhF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { tbc } from '../../adapters/tbc-lib.js';
|
|
2
|
+
function scriptLockHash(scriptHex) {
|
|
3
|
+
if (!scriptHex || scriptHex.length % 2 !== 0) {
|
|
4
|
+
return undefined;
|
|
5
|
+
}
|
|
6
|
+
return tbc.crypto.Hash.sha256ripemd160(tbc.crypto.Hash.sha256(Buffer.from(scriptHex, 'hex'))).toString('hex');
|
|
7
|
+
}
|
|
8
|
+
function stateRefFromInput(input, orderIndex) {
|
|
9
|
+
const orderBook = input.prevout?.script.data?.orderBook;
|
|
10
|
+
if (!orderBook) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const scriptHex = input.prevout?.script.hex;
|
|
14
|
+
return {
|
|
15
|
+
orderIndex,
|
|
16
|
+
inputIndex: input.index,
|
|
17
|
+
source: 'input',
|
|
18
|
+
satoshis: input.prevout?.satoshis,
|
|
19
|
+
scriptHex,
|
|
20
|
+
scriptHash: scriptLockHash(scriptHex),
|
|
21
|
+
...orderBook,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function stateRefFromOutput(output, orderIndex) {
|
|
25
|
+
const orderBook = output.script.data?.orderBook;
|
|
26
|
+
if (!orderBook) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
orderIndex,
|
|
31
|
+
outputIndex: output.index,
|
|
32
|
+
source: 'output',
|
|
33
|
+
satoshis: output.satoshis,
|
|
34
|
+
scriptHex: output.script.hex,
|
|
35
|
+
scriptHash: scriptLockHash(output.script.hex),
|
|
36
|
+
...orderBook,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function buildOrderBookFacts(orders, ftMovements, outputs = []) {
|
|
40
|
+
const stateRefs = orders.map((order, orderIndex) => {
|
|
41
|
+
const outputScriptHex = order.source === 'output' && order.outputIndex !== undefined
|
|
42
|
+
? outputs.find((output) => output.index === order.outputIndex)?.script.hex
|
|
43
|
+
: undefined;
|
|
44
|
+
return {
|
|
45
|
+
...order,
|
|
46
|
+
...(outputScriptHex
|
|
47
|
+
? {
|
|
48
|
+
scriptHex: outputScriptHex,
|
|
49
|
+
scriptHash: scriptLockHash(outputScriptHex),
|
|
50
|
+
}
|
|
51
|
+
: {}),
|
|
52
|
+
orderIndex,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
orders: stateRefs,
|
|
57
|
+
inputOrders: stateRefs.filter((order) => order.source === 'input'),
|
|
58
|
+
outputOrders: stateRefs.filter((order) => order.source === 'output'),
|
|
59
|
+
buyInputOrders: stateRefs.filter((order) => order.source === 'input' && order.side === 'buy'),
|
|
60
|
+
sellInputOrders: stateRefs.filter((order) => order.source === 'input' && order.side === 'sell'),
|
|
61
|
+
buyOutputOrders: stateRefs.filter((order) => order.source === 'output' && order.side === 'buy'),
|
|
62
|
+
sellOutputOrders: stateRefs.filter((order) => order.source === 'output' && order.side === 'sell'),
|
|
63
|
+
ftMovements,
|
|
64
|
+
tbcOutputs: outputs.filter((output) => output.satoshis > 0),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function collectOrderBookFacts(inputs, outputs, ftMovements = []) {
|
|
68
|
+
const inputOrders = inputs
|
|
69
|
+
.map((input, index) => stateRefFromInput(input, index))
|
|
70
|
+
.filter((order) => Boolean(order));
|
|
71
|
+
const outputOrders = outputs
|
|
72
|
+
.map((output, index) => stateRefFromOutput(output, inputOrders.length + index))
|
|
73
|
+
.filter((order) => Boolean(order))
|
|
74
|
+
.map((order, index) => ({ ...order, orderIndex: inputOrders.length + index }));
|
|
75
|
+
const orders = [...inputOrders, ...outputOrders];
|
|
76
|
+
return buildOrderBookFacts(orders, ftMovements, outputs);
|
|
77
|
+
}
|
|
78
|
+
export function orderBookOrdersFromFacts(facts) {
|
|
79
|
+
return facts.orders.map(({ orderIndex: _orderIndex, scriptHex: _scriptHex, scriptHash: _scriptHash, ...order }) => order);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.js","sourceRoot":"","sources":["../../../src/protocols/order-book/facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/protocols/order-book/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAa/E,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,iBAAiB,EAAE,EAChC,YAAY,EAAE,iBAAiB,EAAE,GAChC,yBAAyB,CA0C3B"}
|