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,46 @@
|
|
|
1
|
+
const MUTABLE_UPDATE_FIELDS = [
|
|
2
|
+
'saleVolumeSatoshis',
|
|
3
|
+
'unitPriceRaw',
|
|
4
|
+
'feeRateRaw',
|
|
5
|
+
'satoshis',
|
|
6
|
+
];
|
|
7
|
+
function changedFields(inputOrder, outputOrder) {
|
|
8
|
+
return MUTABLE_UPDATE_FIELDS.filter((field) => inputOrder[field] !== outputOrder[field]);
|
|
9
|
+
}
|
|
10
|
+
export function verifyOrderBookUpdateContinuity(inputOrders, outputOrders) {
|
|
11
|
+
const inputOrder = inputOrders[0];
|
|
12
|
+
const outputOrder = outputOrders[0];
|
|
13
|
+
const reasons = [];
|
|
14
|
+
if (inputOrders.length !== 1 || outputOrders.length !== 1) {
|
|
15
|
+
reasons.push('update identity requires exactly one input order and one output order');
|
|
16
|
+
}
|
|
17
|
+
if (!inputOrder || !outputOrder) {
|
|
18
|
+
return {
|
|
19
|
+
...(inputOrder ? { inputOrder } : {}),
|
|
20
|
+
...(outputOrder ? { outputOrder } : {}),
|
|
21
|
+
isContinuous: false,
|
|
22
|
+
changedFields: [],
|
|
23
|
+
reasons,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (inputOrder.side !== outputOrder.side) {
|
|
27
|
+
reasons.push('update order side does not continue from input to output');
|
|
28
|
+
}
|
|
29
|
+
if (inputOrder.holdAddress !== outputOrder.holdAddress) {
|
|
30
|
+
reasons.push('update order holder does not continue from input to output');
|
|
31
|
+
}
|
|
32
|
+
if (inputOrder.ftID !== outputOrder.ftID) {
|
|
33
|
+
reasons.push('update order token identity does not continue from input to output');
|
|
34
|
+
}
|
|
35
|
+
if (inputOrder.ftPartialHash !== outputOrder.ftPartialHash) {
|
|
36
|
+
reasons.push('update order partial token hash does not continue from input to output');
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
inputOrder,
|
|
40
|
+
outputOrder,
|
|
41
|
+
isContinuous: reasons.length === 0,
|
|
42
|
+
changedFields: changedFields(inputOrder, outputOrder),
|
|
43
|
+
reasons,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/protocols/order-book/identity.ts"],"names":[],"mappings":"AAEA,MAAM,qBAAqB,GAAG;IAC5B,oBAAoB;IACpB,cAAc;IACd,YAAY;IACZ,UAAU;CACF,CAAC;AAEX,SAAS,aAAa,CAAC,UAA6B,EAAE,WAA8B;IAClF,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,WAAgC,EAChC,YAAiC;IAEjC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO;YACL,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,EAAE;YACjB,OAAO;SACR,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,UAAU,CAAC,aAAa,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO;QACL,UAAU;QACV,WAAW;QACX,YAAY,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;QAClC,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC;QACrD,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DecodedInput, DecodedOutput } from '../../types.js';
|
|
2
|
+
import type { FungibleTokenMovement, OrderBookOrder } from '../../types/protocol.js';
|
|
3
|
+
import type { ProtocolDecoder } from '../types.js';
|
|
4
|
+
export declare const orderBookProtocolDecoder: ProtocolDecoder;
|
|
5
|
+
export declare function collectOrderBookOrders(inputs: DecodedInput[], outputs: DecodedOutput[]): OrderBookOrder[];
|
|
6
|
+
export declare function inferOrderBookTransactionType(orderBookOrders: OrderBookOrder[], ftMovements: FungibleTokenMovement[], outputs?: DecodedOutput[]): "OrderBook buy order" | "OrderBook sell order" | "OrderBook buy order cancel" | "OrderBook sell order cancel" | "OrderBook order update" | "OrderBook match" | "OrderBook transaction" | undefined;
|
|
7
|
+
export { buildOrderBookFacts, collectOrderBookFacts } from './facts.js';
|
|
8
|
+
export { verifyOrderBookUpdateContinuity } from './identity.js';
|
|
9
|
+
export { inferOrderBookActionMatch, matchOrderBookAction, orderBookTransactionType } from './actions.js';
|
|
10
|
+
export { orderBookExpectedFtRaw, settleOrderBookCancel, settleOrderBookMatch, settleOrderBookPlace, settleOrderBookUpdateDelta, } from './settlement.js';
|
|
11
|
+
export type { OrderBookAction, OrderBookActionMatch, OrderBookCancelRelease, OrderBookFacts, OrderBookPlaceLock, OrderBookSettlement, OrderBookStateRef, OrderBookUpdateContinuity, OrderBookUpdateDelta, } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protocols/order-book/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,aAAa,CAAC;AAIrE,eAAO,MAAM,wBAAwB,EAAE,eAiBtC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAGzG;AAED,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,cAAc,EAAE,EACjC,WAAW,EAAE,qBAAqB,EAAE,EACpC,OAAO,GAAE,aAAa,EAAO,sMAQ9B;AAED,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { inferOrderBookActionMatch, orderBookTransactionType } from './actions.js';
|
|
2
|
+
import { collectOrderBookFacts, orderBookOrdersFromFacts } from './facts.js';
|
|
3
|
+
export const orderBookProtocolDecoder = {
|
|
4
|
+
id: 'OrderBook',
|
|
5
|
+
analyze({ inputs, outputs }) {
|
|
6
|
+
// Treat OrderBook data on inputs or outputs as candidates without validating settlement amounts during analysis.
|
|
7
|
+
const hasOutputOrder = outputs.some((output) => Boolean(output.script.data?.orderBook));
|
|
8
|
+
const hasInputOrder = inputs.some((input) => Boolean(input.prevout?.script.data?.orderBook));
|
|
9
|
+
if (!hasOutputOrder && !hasInputOrder) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
id: this.id,
|
|
14
|
+
transactionType: 'OrderBook transaction',
|
|
15
|
+
priority: 95,
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export function collectOrderBookOrders(inputs, outputs) {
|
|
20
|
+
// Keep the public OrderBookOrder shape stable while retaining script evidence in the internal facts layer.
|
|
21
|
+
return orderBookOrdersFromFacts(collectOrderBookFacts(inputs, outputs));
|
|
22
|
+
}
|
|
23
|
+
export function inferOrderBookTransactionType(orderBookOrders, ftMovements, outputs = []) {
|
|
24
|
+
// Infer the type from facts and matcher results; the matcher also records confidence and reasons for semantics.
|
|
25
|
+
if (!orderBookOrders.length) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return orderBookTransactionType(inferOrderBookActionMatch(orderBookOrders, ftMovements, outputs)?.action);
|
|
29
|
+
}
|
|
30
|
+
export { buildOrderBookFacts, collectOrderBookFacts } from './facts.js';
|
|
31
|
+
export { verifyOrderBookUpdateContinuity } from './identity.js';
|
|
32
|
+
export { inferOrderBookActionMatch, matchOrderBookAction, orderBookTransactionType } from './actions.js';
|
|
33
|
+
export { orderBookExpectedFtRaw, settleOrderBookCancel, settleOrderBookMatch, settleOrderBookPlace, settleOrderBookUpdateDelta, } from './settlement.js';
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocols/order-book/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,EAAE,EAAE,WAAW;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;QACzB,iHAAiH;QACjH,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QACxF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QAE7F,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,eAAe,EAAE,uBAAuB;YACxC,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAsB,EAAE,OAAwB;IACrF,2GAA2G;IAC3G,OAAO,wBAAwB,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,eAAiC,EACjC,WAAoC,EACpC,UAA2B,EAAE;IAE7B,gHAAgH;IAChH,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,wBAAwB,CAAC,yBAAyB,CAAC,eAAe,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5G,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DecodedOutput } from '../../types.js';
|
|
2
|
+
import type { FungibleTokenMovement } from '../../types/protocol.js';
|
|
3
|
+
import type { OrderBookCancelRelease, OrderBookPlaceLock, OrderBookSettlement, OrderBookStateRef, OrderBookUpdateDelta } from './types.js';
|
|
4
|
+
export declare const ORDER_BOOK_PRECISION = 1000000n;
|
|
5
|
+
export declare function orderBookExpectedFtRaw(order: OrderBookStateRef): string;
|
|
6
|
+
export declare function settleOrderBookCancel(order: OrderBookStateRef, ftMovements: FungibleTokenMovement[], outputs: DecodedOutput[]): OrderBookCancelRelease;
|
|
7
|
+
export declare function settleOrderBookPlace(order: OrderBookStateRef, ftMovements: FungibleTokenMovement[], outputs: DecodedOutput[]): OrderBookPlaceLock;
|
|
8
|
+
export declare function settleOrderBookUpdateDelta(inputOrder: OrderBookStateRef, outputOrder: OrderBookStateRef, ftMovements: FungibleTokenMovement[], outputs: DecodedOutput[]): OrderBookUpdateDelta;
|
|
9
|
+
export declare function settleOrderBookMatch(buyOrder: OrderBookStateRef, sellOrder: OrderBookStateRef, ftMovements: FungibleTokenMovement[], outputs: DecodedOutput[], outputOrders?: OrderBookStateRef[]): OrderBookSettlement;
|
|
10
|
+
//# sourceMappingURL=settlement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../../../src/protocols/order-book/settlement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAYrE,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAElB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,WAAa,CAAC;AAuG/C,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,UAE9D;AAuED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,qBAAqB,EAAE,EACpC,OAAO,EAAE,aAAa,EAAE,GACvB,sBAAsB,CAuCxB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,qBAAqB,EAAE,EACpC,OAAO,EAAE,aAAa,EAAE,GACvB,kBAAkB,CAsCpB;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,qBAAqB,EAAE,EACpC,OAAO,EAAE,aAAa,EAAE,GACvB,oBAAoB,CA6DtB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,qBAAqB,EAAE,EACpC,OAAO,EAAE,aAAa,EAAE,EACxB,YAAY,GAAE,iBAAiB,EAAO,GACrC,mBAAmB,CA+ErB"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { calculatePartialSha256 } from '../../adapters/partial-sha256.js';
|
|
2
|
+
import { COIN_CODE_LENGTH, COIN_PARTIAL_HASH_OFFSET, FT_A_CODE_MARKER_HEX, FT_LP_CODE_MARKER_HEX, FT_V1_CODE_LENGTH, FT_V1_PARTIAL_HASH_OFFSET, FT_V2_CODE_LENGTH, FT_V2_PARTIAL_HASH_OFFSET, } from '../pool-nft/constants.js';
|
|
3
|
+
export const ORDER_BOOK_PRECISION = 1000000n;
|
|
4
|
+
function multiplySatoshisByRaw(value, rawMultiplier) {
|
|
5
|
+
return (BigInt(value) * BigInt(rawMultiplier)) / ORDER_BOOK_PRECISION;
|
|
6
|
+
}
|
|
7
|
+
function orderBookPartialHashOffset(scriptByteLength) {
|
|
8
|
+
if (scriptByteLength === FT_V1_CODE_LENGTH) {
|
|
9
|
+
return FT_V1_PARTIAL_HASH_OFFSET;
|
|
10
|
+
}
|
|
11
|
+
if (scriptByteLength === FT_V2_CODE_LENGTH) {
|
|
12
|
+
return FT_V2_PARTIAL_HASH_OFFSET;
|
|
13
|
+
}
|
|
14
|
+
if (scriptByteLength === COIN_CODE_LENGTH) {
|
|
15
|
+
return COIN_PARTIAL_HASH_OFFSET;
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
function computedPartialHash(scriptHex) {
|
|
20
|
+
if (scriptHex.length % 2 !== 0) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const script = Buffer.from(scriptHex, 'hex');
|
|
24
|
+
const offset = orderBookPartialHashOffset(script.length);
|
|
25
|
+
if (offset === undefined || script.length < offset) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return calculatePartialSha256(script.subarray(0, offset));
|
|
29
|
+
}
|
|
30
|
+
function parseNonNegativeBigInt(value) {
|
|
31
|
+
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const parsed = BigInt(value);
|
|
36
|
+
return parsed >= 0n ? parsed : undefined;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function movementAmountSlotsMatchRawAmount(movement) {
|
|
43
|
+
if (!Array.isArray(movement.amountSlots)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const rawAmount = parseNonNegativeBigInt(movement.rawAmount);
|
|
47
|
+
if (rawAmount === undefined) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
let slotsTotal = 0n;
|
|
51
|
+
for (const slot of movement.amountSlots) {
|
|
52
|
+
const slotAmount = parseNonNegativeBigInt(slot);
|
|
53
|
+
if (slotAmount === undefined) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
slotsTotal += slotAmount;
|
|
57
|
+
}
|
|
58
|
+
return slotsTotal === rawAmount;
|
|
59
|
+
}
|
|
60
|
+
function movementPartialHashMatchesOrder(movement, order, outputs) {
|
|
61
|
+
const output = outputs.find((candidate) => candidate.index === movement.outputIndex);
|
|
62
|
+
const scriptHex = output?.script.hex?.toLowerCase();
|
|
63
|
+
if (!order.ftPartialHash || !scriptHex) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (!scriptHex.endsWith(FT_A_CODE_MARKER_HEX) && !scriptHex.endsWith(FT_LP_CODE_MARKER_HEX)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const partialHash = order.ftPartialHash.toLowerCase();
|
|
70
|
+
return computedPartialHash(scriptHex) === partialHash || scriptHex.includes(partialHash);
|
|
71
|
+
}
|
|
72
|
+
function movementTokenIdentityMatchesOrder(movement, order, outputs) {
|
|
73
|
+
if (!movementAmountSlotsMatchRawAmount(movement)) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (movement.contractId && order.ftID && movement.contractId === order.ftID) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return movementPartialHashMatchesOrder(movement, order, outputs);
|
|
80
|
+
}
|
|
81
|
+
export function orderBookExpectedFtRaw(order) {
|
|
82
|
+
return multiplySatoshisByRaw(order.saleVolumeSatoshis, order.unitPriceRaw).toString();
|
|
83
|
+
}
|
|
84
|
+
function uniquePositiveNumbers(values) {
|
|
85
|
+
return [...new Set(values.filter((value) => value !== undefined && value > 0))];
|
|
86
|
+
}
|
|
87
|
+
function satoshisLockedByOrder(order) {
|
|
88
|
+
return order.satoshis ?? order.saleVolumeSatoshis;
|
|
89
|
+
}
|
|
90
|
+
function orderIdentityContinues(inputOrder, outputOrder) {
|
|
91
|
+
return inputOrder.side === outputOrder.side &&
|
|
92
|
+
inputOrder.holdAddress === outputOrder.holdAddress &&
|
|
93
|
+
inputOrder.ftID === outputOrder.ftID &&
|
|
94
|
+
inputOrder.ftPartialHash === outputOrder.ftPartialHash &&
|
|
95
|
+
inputOrder.unitPriceRaw === outputOrder.unitPriceRaw &&
|
|
96
|
+
inputOrder.feeRateRaw === outputOrder.feeRateRaw;
|
|
97
|
+
}
|
|
98
|
+
function movementReceiverMatchesOrderScript(movement, order) {
|
|
99
|
+
return Boolean(order.scriptHash && movement.receiverHash === order.scriptHash);
|
|
100
|
+
}
|
|
101
|
+
function settleOrderBookRemainder(inputOrder, matchedSatoshis, outputOrders, ftMovements, outputs) {
|
|
102
|
+
const expectedSaleVolumeSatoshis = inputOrder.saleVolumeSatoshis - matchedSatoshis;
|
|
103
|
+
if (expectedSaleVolumeSatoshis <= 0) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const outputOrder = outputOrders.find((candidate) => candidate.saleVolumeSatoshis === expectedSaleVolumeSatoshis &&
|
|
107
|
+
orderIdentityContinues(inputOrder, candidate));
|
|
108
|
+
const reasons = [];
|
|
109
|
+
let expectedRawAmount;
|
|
110
|
+
let ftMovement;
|
|
111
|
+
if (!outputOrder) {
|
|
112
|
+
reasons.push(`remaining ${inputOrder.side} order output does not match expected partial-fill state`);
|
|
113
|
+
}
|
|
114
|
+
if (inputOrder.side === 'buy' && outputOrder) {
|
|
115
|
+
expectedRawAmount = orderBookExpectedFtRaw(outputOrder);
|
|
116
|
+
ftMovement = ftMovements.find((movement) => movement.rawAmount === expectedRawAmount &&
|
|
117
|
+
movementReceiverMatchesOrderScript(movement, outputOrder) &&
|
|
118
|
+
movementTokenIdentityMatchesOrder(movement, outputOrder, outputs));
|
|
119
|
+
if (!ftMovement) {
|
|
120
|
+
reasons.push('remaining buy order FT change movement does not match expected partial-fill state');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
inputOrder,
|
|
125
|
+
expectedSaleVolumeSatoshis,
|
|
126
|
+
...(outputOrder ? { outputOrder } : {}),
|
|
127
|
+
...(expectedRawAmount ? { expectedRawAmount } : {}),
|
|
128
|
+
...(ftMovement ? { ftMovement } : {}),
|
|
129
|
+
isComplete: reasons.length === 0,
|
|
130
|
+
reasons,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function settleOrderBookCancel(order, ftMovements, outputs) {
|
|
134
|
+
if (order.side === 'sell') {
|
|
135
|
+
const candidateSatoshis = uniquePositiveNumbers([order.satoshis, order.saleVolumeSatoshis]);
|
|
136
|
+
const tbcOutput = outputs.find((output) => candidateSatoshis.includes(output.satoshis) &&
|
|
137
|
+
output.address === order.holdAddress);
|
|
138
|
+
const reasons = tbcOutput
|
|
139
|
+
? []
|
|
140
|
+
: ['cancel sell TBC release output does not match OrderBook locked amount and holder'];
|
|
141
|
+
return {
|
|
142
|
+
order,
|
|
143
|
+
asset: 'tbc',
|
|
144
|
+
expectedSatoshis: candidateSatoshis[0],
|
|
145
|
+
...(tbcOutput ? { tbcOutput } : {}),
|
|
146
|
+
isComplete: reasons.length === 0,
|
|
147
|
+
reasons,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const expectedRawAmount = orderBookExpectedFtRaw(order);
|
|
151
|
+
const ftMovement = ftMovements.find((movement) => movement.rawAmount === expectedRawAmount &&
|
|
152
|
+
movement.receiver === order.holdAddress &&
|
|
153
|
+
movementTokenIdentityMatchesOrder(movement, order, outputs));
|
|
154
|
+
const reasons = ftMovement
|
|
155
|
+
? []
|
|
156
|
+
: ['cancel buy FT release movement does not match OrderBook locked amount, holder, and token identity'];
|
|
157
|
+
return {
|
|
158
|
+
order,
|
|
159
|
+
asset: 'ft',
|
|
160
|
+
expectedRawAmount,
|
|
161
|
+
...(ftMovement ? { ftMovement } : {}),
|
|
162
|
+
isComplete: reasons.length === 0,
|
|
163
|
+
reasons,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function settleOrderBookPlace(order, ftMovements, outputs) {
|
|
167
|
+
if (order.side === 'sell') {
|
|
168
|
+
const tbcOutput = outputs.find((output) => output.index === order.outputIndex &&
|
|
169
|
+
output.satoshis === order.saleVolumeSatoshis);
|
|
170
|
+
const reasons = tbcOutput
|
|
171
|
+
? []
|
|
172
|
+
: ['place sell TBC lock output does not match OrderBook locked amount and carrier output'];
|
|
173
|
+
return {
|
|
174
|
+
order,
|
|
175
|
+
asset: 'tbc',
|
|
176
|
+
expectedSatoshis: order.saleVolumeSatoshis,
|
|
177
|
+
...(tbcOutput ? { tbcOutput } : {}),
|
|
178
|
+
isComplete: reasons.length === 0,
|
|
179
|
+
reasons,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const expectedRawAmount = orderBookExpectedFtRaw(order);
|
|
183
|
+
const ftMovement = ftMovements.find((movement) => movement.rawAmount === expectedRawAmount &&
|
|
184
|
+
(movement.receiver === order.holdAddress || movementReceiverMatchesOrderScript(movement, order)) &&
|
|
185
|
+
movementTokenIdentityMatchesOrder(movement, order, outputs));
|
|
186
|
+
const reasons = ftMovement
|
|
187
|
+
? []
|
|
188
|
+
: ['place buy FT lock movement does not match OrderBook locked amount, holder or order script, and token identity'];
|
|
189
|
+
return {
|
|
190
|
+
order,
|
|
191
|
+
asset: 'ft',
|
|
192
|
+
expectedRawAmount,
|
|
193
|
+
...(ftMovement ? { ftMovement } : {}),
|
|
194
|
+
isComplete: reasons.length === 0,
|
|
195
|
+
reasons,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
export function settleOrderBookUpdateDelta(inputOrder, outputOrder, ftMovements, outputs) {
|
|
199
|
+
if (inputOrder.side === 'buy') {
|
|
200
|
+
const oldRaw = BigInt(orderBookExpectedFtRaw(inputOrder));
|
|
201
|
+
const newRaw = BigInt(orderBookExpectedFtRaw(outputOrder));
|
|
202
|
+
const rawDelta = newRaw - oldRaw;
|
|
203
|
+
const direction = rawDelta > 0n ? 'lock' : rawDelta < 0n ? 'release' : 'none';
|
|
204
|
+
const expectedRawAmount = (rawDelta < 0n ? -rawDelta : rawDelta).toString();
|
|
205
|
+
const ftMovement = direction === 'none'
|
|
206
|
+
? undefined
|
|
207
|
+
: ftMovements.find((movement) => movement.rawAmount === expectedRawAmount &&
|
|
208
|
+
movement.receiver === outputOrder.holdAddress &&
|
|
209
|
+
movementTokenIdentityMatchesOrder(movement, outputOrder, outputs));
|
|
210
|
+
const reasons = direction === 'none' || ftMovement
|
|
211
|
+
? []
|
|
212
|
+
: [`update buy FT ${direction} movement does not match OrderBook delta amount, holder, and token identity`];
|
|
213
|
+
return {
|
|
214
|
+
inputOrder,
|
|
215
|
+
outputOrder,
|
|
216
|
+
asset: 'ft',
|
|
217
|
+
direction,
|
|
218
|
+
expectedRawAmount,
|
|
219
|
+
...(ftMovement ? { ftMovement } : {}),
|
|
220
|
+
isComplete: reasons.length === 0,
|
|
221
|
+
reasons,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const oldSatoshis = satoshisLockedByOrder(inputOrder);
|
|
225
|
+
const newSatoshis = satoshisLockedByOrder(outputOrder);
|
|
226
|
+
const satoshisDelta = newSatoshis - oldSatoshis;
|
|
227
|
+
const direction = satoshisDelta > 0 ? 'lock' : satoshisDelta < 0 ? 'release' : 'none';
|
|
228
|
+
const expectedSatoshis = Math.abs(satoshisDelta);
|
|
229
|
+
const tbcOutput = direction === 'none'
|
|
230
|
+
? undefined
|
|
231
|
+
: direction === 'lock'
|
|
232
|
+
? outputs.find((output) => output.index === outputOrder.outputIndex &&
|
|
233
|
+
output.satoshis === newSatoshis)
|
|
234
|
+
: outputs.find((output) => output.index !== outputOrder.outputIndex &&
|
|
235
|
+
output.satoshis === expectedSatoshis &&
|
|
236
|
+
output.address === inputOrder.holdAddress);
|
|
237
|
+
const reasons = direction === 'none' || tbcOutput
|
|
238
|
+
? []
|
|
239
|
+
: [`update sell TBC ${direction} output does not match OrderBook delta amount and holder`];
|
|
240
|
+
return {
|
|
241
|
+
inputOrder,
|
|
242
|
+
outputOrder,
|
|
243
|
+
asset: 'tbc',
|
|
244
|
+
direction,
|
|
245
|
+
expectedSatoshis,
|
|
246
|
+
...(tbcOutput ? { tbcOutput } : {}),
|
|
247
|
+
isComplete: reasons.length === 0,
|
|
248
|
+
reasons,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
export function settleOrderBookMatch(buyOrder, sellOrder, ftMovements, outputs, outputOrders = []) {
|
|
252
|
+
const matchedSatoshis = Math.min(buyOrder.saleVolumeSatoshis, sellOrder.saleVolumeSatoshis);
|
|
253
|
+
const tbcFeeSatoshis = Number(multiplySatoshisByRaw(matchedSatoshis, buyOrder.feeRateRaw));
|
|
254
|
+
const buyerTbcSatoshis = matchedSatoshis - tbcFeeSatoshis;
|
|
255
|
+
const ftPayRawBigInt = multiplySatoshisByRaw(matchedSatoshis, sellOrder.unitPriceRaw);
|
|
256
|
+
const ftFeeRawBigInt = (ftPayRawBigInt * BigInt(sellOrder.feeRateRaw)) / ORDER_BOOK_PRECISION;
|
|
257
|
+
const sellerFtRawBigInt = ftPayRawBigInt - ftFeeRawBigInt;
|
|
258
|
+
const ftPayRaw = ftPayRawBigInt.toString();
|
|
259
|
+
const ftFeeRaw = ftFeeRawBigInt.toString();
|
|
260
|
+
const sellerFtRaw = sellerFtRawBigInt.toString();
|
|
261
|
+
const buyerTbcOutput = outputs.find((output) => output.satoshis === buyerTbcSatoshis &&
|
|
262
|
+
output.address === buyOrder.holdAddress);
|
|
263
|
+
const tbcFeeOutput = tbcFeeSatoshis > 0
|
|
264
|
+
? outputs.find((output) => output.satoshis === tbcFeeSatoshis &&
|
|
265
|
+
Boolean(output.address) &&
|
|
266
|
+
output.address !== buyOrder.holdAddress)
|
|
267
|
+
: undefined;
|
|
268
|
+
const sellerFtMovement = ftMovements.find((movement) => movement.rawAmount === sellerFtRaw &&
|
|
269
|
+
movement.receiver === sellOrder.holdAddress &&
|
|
270
|
+
movementTokenIdentityMatchesOrder(movement, sellOrder, outputs));
|
|
271
|
+
const ftFeeMovement = ftFeeRawBigInt > 0n
|
|
272
|
+
? ftMovements.find((movement) => movement.rawAmount === ftFeeRaw &&
|
|
273
|
+
movement.receiver !== sellOrder.holdAddress &&
|
|
274
|
+
movementTokenIdentityMatchesOrder(movement, sellOrder, outputs))
|
|
275
|
+
: undefined;
|
|
276
|
+
const tokenTemplate = sellerFtMovement ?? ftFeeMovement ?? ftMovements.find((movement) => movementTokenIdentityMatchesOrder(movement, sellOrder, outputs));
|
|
277
|
+
const reasons = [];
|
|
278
|
+
if (buyerTbcSatoshis > 0 && !buyerTbcOutput) {
|
|
279
|
+
reasons.push('buyer TBC payout output does not match OrderBook settlement formula');
|
|
280
|
+
}
|
|
281
|
+
if (tbcFeeSatoshis > 0 && !tbcFeeOutput) {
|
|
282
|
+
reasons.push('TBC fee output does not match OrderBook settlement formula');
|
|
283
|
+
}
|
|
284
|
+
if (sellerFtRawBigInt > 0n && !sellerFtMovement) {
|
|
285
|
+
reasons.push('seller FT payout movement does not match OrderBook settlement formula');
|
|
286
|
+
}
|
|
287
|
+
if (ftFeeRawBigInt > 0n && !ftFeeMovement) {
|
|
288
|
+
reasons.push('FT fee movement does not match OrderBook settlement formula');
|
|
289
|
+
}
|
|
290
|
+
if (!tokenTemplate) {
|
|
291
|
+
reasons.push('no verified FT movement matches OrderBook token identity');
|
|
292
|
+
}
|
|
293
|
+
const remainders = [
|
|
294
|
+
settleOrderBookRemainder(buyOrder, matchedSatoshis, outputOrders, ftMovements, outputs),
|
|
295
|
+
settleOrderBookRemainder(sellOrder, matchedSatoshis, outputOrders, ftMovements, outputs),
|
|
296
|
+
].filter((remainder) => Boolean(remainder));
|
|
297
|
+
reasons.push(...remainders.flatMap((remainder) => remainder.reasons));
|
|
298
|
+
const isComplete = reasons.length === 0;
|
|
299
|
+
return {
|
|
300
|
+
buyOrder,
|
|
301
|
+
sellOrder,
|
|
302
|
+
matchedSatoshis,
|
|
303
|
+
tbcFeeSatoshis,
|
|
304
|
+
buyerTbcSatoshis,
|
|
305
|
+
ftPayRaw,
|
|
306
|
+
ftFeeRaw,
|
|
307
|
+
sellerFtRaw,
|
|
308
|
+
...(buyerTbcOutput ? { buyerTbcOutput } : {}),
|
|
309
|
+
...(tbcFeeOutput ? { tbcFeeOutput } : {}),
|
|
310
|
+
...(sellerFtMovement ? { sellerFtMovement } : {}),
|
|
311
|
+
...(ftFeeMovement ? { ftFeeMovement } : {}),
|
|
312
|
+
...(tokenTemplate ? { tokenTemplate } : {}),
|
|
313
|
+
remainders,
|
|
314
|
+
isComplete,
|
|
315
|
+
reasons,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=settlement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settlement.js","sourceRoot":"","sources":["../../../src/protocols/order-book/settlement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { DecodedOutput } from '../../types.js';
|
|
2
|
+
import type { FungibleTokenMovement, OrderBookOrder } from '../../types/protocol.js';
|
|
3
|
+
export type OrderBookAction = 'placeBuy' | 'placeSell' | 'cancelBuy' | 'cancelSell' | 'update' | 'match' | 'unknown';
|
|
4
|
+
export type OrderBookConfidence = 'exact' | 'heuristic' | 'partial';
|
|
5
|
+
export interface OrderBookStateRef extends OrderBookOrder {
|
|
6
|
+
orderIndex: number;
|
|
7
|
+
scriptHex?: string;
|
|
8
|
+
scriptHash?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface OrderBookFacts {
|
|
11
|
+
orders: OrderBookStateRef[];
|
|
12
|
+
inputOrders: OrderBookStateRef[];
|
|
13
|
+
outputOrders: OrderBookStateRef[];
|
|
14
|
+
buyInputOrders: OrderBookStateRef[];
|
|
15
|
+
sellInputOrders: OrderBookStateRef[];
|
|
16
|
+
buyOutputOrders: OrderBookStateRef[];
|
|
17
|
+
sellOutputOrders: OrderBookStateRef[];
|
|
18
|
+
ftMovements: FungibleTokenMovement[];
|
|
19
|
+
tbcOutputs: DecodedOutput[];
|
|
20
|
+
}
|
|
21
|
+
export interface OrderBookSettlement {
|
|
22
|
+
buyOrder: OrderBookStateRef;
|
|
23
|
+
sellOrder: OrderBookStateRef;
|
|
24
|
+
matchedSatoshis: number;
|
|
25
|
+
tbcFeeSatoshis: number;
|
|
26
|
+
buyerTbcSatoshis: number;
|
|
27
|
+
ftPayRaw: string;
|
|
28
|
+
ftFeeRaw: string;
|
|
29
|
+
sellerFtRaw: string;
|
|
30
|
+
buyerTbcOutput?: DecodedOutput;
|
|
31
|
+
tbcFeeOutput?: DecodedOutput;
|
|
32
|
+
sellerFtMovement?: FungibleTokenMovement;
|
|
33
|
+
ftFeeMovement?: FungibleTokenMovement;
|
|
34
|
+
tokenTemplate?: FungibleTokenMovement;
|
|
35
|
+
remainders: OrderBookRemainderState[];
|
|
36
|
+
isComplete: boolean;
|
|
37
|
+
reasons: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface OrderBookRemainderState {
|
|
40
|
+
inputOrder: OrderBookStateRef;
|
|
41
|
+
outputOrder?: OrderBookStateRef;
|
|
42
|
+
expectedSaleVolumeSatoshis: number;
|
|
43
|
+
expectedRawAmount?: string;
|
|
44
|
+
ftMovement?: FungibleTokenMovement;
|
|
45
|
+
isComplete: boolean;
|
|
46
|
+
reasons: string[];
|
|
47
|
+
}
|
|
48
|
+
export interface OrderBookCancelRelease {
|
|
49
|
+
order: OrderBookStateRef;
|
|
50
|
+
asset: 'tbc' | 'ft';
|
|
51
|
+
expectedSatoshis?: number;
|
|
52
|
+
expectedRawAmount?: string;
|
|
53
|
+
tbcOutput?: DecodedOutput;
|
|
54
|
+
ftMovement?: FungibleTokenMovement;
|
|
55
|
+
isComplete: boolean;
|
|
56
|
+
reasons: string[];
|
|
57
|
+
}
|
|
58
|
+
export interface OrderBookPlaceLock {
|
|
59
|
+
order: OrderBookStateRef;
|
|
60
|
+
asset: 'tbc' | 'ft';
|
|
61
|
+
expectedSatoshis?: number;
|
|
62
|
+
expectedRawAmount?: string;
|
|
63
|
+
tbcOutput?: DecodedOutput;
|
|
64
|
+
ftMovement?: FungibleTokenMovement;
|
|
65
|
+
isComplete: boolean;
|
|
66
|
+
reasons: string[];
|
|
67
|
+
}
|
|
68
|
+
export interface OrderBookUpdateContinuity {
|
|
69
|
+
inputOrder?: OrderBookStateRef;
|
|
70
|
+
outputOrder?: OrderBookStateRef;
|
|
71
|
+
isContinuous: boolean;
|
|
72
|
+
changedFields: string[];
|
|
73
|
+
reasons: string[];
|
|
74
|
+
}
|
|
75
|
+
export interface OrderBookUpdateDelta {
|
|
76
|
+
inputOrder: OrderBookStateRef;
|
|
77
|
+
outputOrder: OrderBookStateRef;
|
|
78
|
+
asset: 'tbc' | 'ft';
|
|
79
|
+
direction: 'lock' | 'release' | 'none';
|
|
80
|
+
expectedSatoshis?: number;
|
|
81
|
+
expectedRawAmount?: string;
|
|
82
|
+
tbcOutput?: DecodedOutput;
|
|
83
|
+
ftMovement?: FungibleTokenMovement;
|
|
84
|
+
isComplete: boolean;
|
|
85
|
+
reasons: string[];
|
|
86
|
+
}
|
|
87
|
+
export interface OrderBookActionMatch {
|
|
88
|
+
action: OrderBookAction;
|
|
89
|
+
confidence: OrderBookConfidence;
|
|
90
|
+
reasons: string[];
|
|
91
|
+
inputOrders: OrderBookStateRef[];
|
|
92
|
+
outputOrders: OrderBookStateRef[];
|
|
93
|
+
buyOrder?: OrderBookStateRef;
|
|
94
|
+
sellOrder?: OrderBookStateRef;
|
|
95
|
+
settlement?: OrderBookSettlement;
|
|
96
|
+
cancelRelease?: OrderBookCancelRelease;
|
|
97
|
+
placeLock?: OrderBookPlaceLock;
|
|
98
|
+
updateContinuity?: OrderBookUpdateContinuity;
|
|
99
|
+
updateDelta?: OrderBookUpdateDelta;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/protocols/order-book/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/protocols/order-book/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DecodedInput, DecodedOutput } from '../../types.js';
|
|
2
|
+
import type { PiggyBankMovement } from '../../types/protocol.js';
|
|
3
|
+
import type { ProtocolDecoder } from '../types.js';
|
|
4
|
+
export declare const piggyBankProtocolDecoder: ProtocolDecoder;
|
|
5
|
+
export declare function collectPiggyBankMovements(inputs: DecodedInput[], outputs: DecodedOutput[], locktime: number): PiggyBankMovement[];
|
|
6
|
+
export declare function inferPiggyBankTransactionType(movements: PiggyBankMovement[]): "PiggyBank unfreeze" | "PiggyBank freeze" | undefined;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protocols/piggy-bank/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,aAAa,CAAC;AAUrE,eAAO,MAAM,wBAAwB,EAAE,eAiBtC,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,EAAE,aAAa,EAAE,EACxB,QAAQ,EAAE,MAAM,GACf,iBAAiB,EAAE,CA0ErB;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,iBAAiB,EAAE,yDAO3E"}
|