@bitgo-beta/utxo-ord 1.1.3-alpha.412 → 1.1.3-alpha.414
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/dist/cjs/src/OrdOutput.d.ts.map +1 -0
- package/dist/cjs/src/OrdOutput.js +197 -0
- package/dist/cjs/src/OutputLayout.d.ts.map +1 -0
- package/dist/cjs/src/OutputLayout.js +246 -0
- package/dist/cjs/src/SatPoint.d.ts.map +1 -0
- package/dist/cjs/src/SatPoint.js +48 -0
- package/dist/cjs/src/SatRange.d.ts.map +1 -0
- package/dist/cjs/src/SatRange.js +58 -0
- package/dist/cjs/src/combinations.d.ts.map +1 -0
- package/dist/cjs/src/combinations.js +13 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/src/inscriptions.d.ts.map +1 -0
- package/dist/cjs/src/inscriptions.js +202 -0
- package/dist/cjs/src/psbt.d.ts.map +1 -0
- package/dist/cjs/src/psbt.js +154 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/OrdOutput.d.ts +65 -0
- package/dist/esm/OrdOutput.js +192 -0
- package/dist/esm/OutputLayout.d.ts +47 -0
- package/dist/esm/OutputLayout.js +240 -0
- package/dist/esm/SatPoint.d.ts +13 -0
- package/dist/esm/SatPoint.js +43 -0
- package/dist/esm/SatRange.d.ts +26 -0
- package/dist/esm/SatRange.js +53 -0
- package/dist/esm/combinations.d.ts +2 -0
- package/dist/esm/combinations.js +10 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/inscriptions.d.ts +31 -0
- package/dist/esm/inscriptions.js +164 -0
- package/dist/esm/psbt.d.ts +67 -0
- package/dist/{src → esm}/psbt.js +31 -38
- package/package.json +26 -9
- package/dist/src/OrdOutput.js +0 -197
- package/dist/src/OutputLayout.js +0 -246
- package/dist/src/SatPoint.js +0 -48
- package/dist/src/SatRange.js +0 -58
- package/dist/src/combinations.js +0 -13
- package/dist/src/inscriptions.js +0 -202
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src → cjs/src}/OrdOutput.d.ts +0 -0
- /package/dist/{src → cjs/src}/OutputLayout.d.ts +0 -0
- /package/dist/{src → cjs/src}/SatPoint.d.ts +0 -0
- /package/dist/{src → cjs/src}/SatRange.d.ts +0 -0
- /package/dist/{src → cjs/src}/combinations.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/inscriptions.d.ts +0 -0
- /package/dist/{src → cjs/src}/psbt.d.ts +0 -0
- /package/dist/{src → esm}/OrdOutput.d.ts.map +0 -0
- /package/dist/{src → esm}/OutputLayout.d.ts.map +0 -0
- /package/dist/{src → esm}/SatPoint.d.ts.map +0 -0
- /package/dist/{src → esm}/SatRange.d.ts.map +0 -0
- /package/dist/{src → esm}/combinations.d.ts.map +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/inscriptions.d.ts.map +0 -0
- /package/dist/{src → esm}/psbt.d.ts.map +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SatRange } from './SatRange';
|
|
2
|
+
export declare class InvalidOrdOutput extends Error {
|
|
3
|
+
value: bigint;
|
|
4
|
+
ordinals: SatRange[];
|
|
5
|
+
constructor(message: string, value: bigint, ordinals: SatRange[]);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The ordinal metadata for an output
|
|
9
|
+
*/
|
|
10
|
+
export declare class OrdOutput {
|
|
11
|
+
value: bigint;
|
|
12
|
+
ordinals: SatRange[];
|
|
13
|
+
/**
|
|
14
|
+
* @param value - the input value
|
|
15
|
+
* @param ordinals - The ordinal ranges of an output, relative to the first satoshi.
|
|
16
|
+
* Required to be ordered and non-overlapping.
|
|
17
|
+
* Not required to be exhaustive.
|
|
18
|
+
*/
|
|
19
|
+
constructor(value: bigint, ordinals?: SatRange[]);
|
|
20
|
+
/**
|
|
21
|
+
* @param other
|
|
22
|
+
* @return OrdOutput extended by other.value and SatRanges shifted by this.value
|
|
23
|
+
*/
|
|
24
|
+
joinedWith(other: OrdOutput): OrdOutput;
|
|
25
|
+
/**
|
|
26
|
+
* @param ords
|
|
27
|
+
* @return single OrdOutput containing all SatRanges, shifted by preceding output values
|
|
28
|
+
*/
|
|
29
|
+
static joinAll(ords: OrdOutput[]): OrdOutput;
|
|
30
|
+
asSatRange(): SatRange;
|
|
31
|
+
/**
|
|
32
|
+
* @param r
|
|
33
|
+
* @return new OrdOutput with all ranges fully contained in _r_. SatRanges are aligned to new start.
|
|
34
|
+
*/
|
|
35
|
+
fromSatRange(r: SatRange): OrdOutput;
|
|
36
|
+
/**
|
|
37
|
+
* @param value
|
|
38
|
+
* @return first OrdOutput with value `value`, second OrdOutput with remaining value.
|
|
39
|
+
* With respective SatRanges
|
|
40
|
+
*/
|
|
41
|
+
splitAt(value: bigint): [OrdOutput, OrdOutput];
|
|
42
|
+
/**
|
|
43
|
+
* Like splitAt but returns _null_ where a zero-sized OrdOutput would be
|
|
44
|
+
* @param value
|
|
45
|
+
*/
|
|
46
|
+
splitAtAllowZero(value: bigint): [OrdOutput | null, OrdOutput | null];
|
|
47
|
+
/**
|
|
48
|
+
* Split output successively at values.
|
|
49
|
+
* @param values
|
|
50
|
+
* @param exact - when set, ensure that value sum matches _this.value_
|
|
51
|
+
* @param allowZero - when set, return _null_ for zero-sized values
|
|
52
|
+
* @return (OrdOutput | null)[]. Zero-sized outputs are substituted with _null_.
|
|
53
|
+
*/
|
|
54
|
+
splitAllWithParams(values: bigint[], { exact, allowZero }: {
|
|
55
|
+
allowZero?: boolean;
|
|
56
|
+
exact?: boolean;
|
|
57
|
+
}): (OrdOutput | null)[];
|
|
58
|
+
/**
|
|
59
|
+
* Split output successively at values.
|
|
60
|
+
* @param values
|
|
61
|
+
* @return OrdOutput[] with length _values.length + 1_
|
|
62
|
+
*/
|
|
63
|
+
splitAll(values: bigint[]): OrdOutput[];
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=OrdOutput.d.ts.map
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
Classes used for tracking sats across transactions.
|
|
4
|
+
|
|
5
|
+
https://github.com/casey/ord/blob/master/bip.mediawiki#design
|
|
6
|
+
|
|
7
|
+
> The ordinal numbers of sats in transaction inputs are transferred to output sats in
|
|
8
|
+
> first-in-first-out order, according to the size and order of the transactions inputs and outputs.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Sample scenario:
|
|
12
|
+
inputs i0, i1, i2
|
|
13
|
+
outputs u0, u1
|
|
14
|
+
inscriptions r0, r1, r2, r3, r4
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
createOutputs(
|
|
18
|
+
[i0, i1],
|
|
19
|
+
[
|
|
20
|
+
[u0, [r0, r1]],
|
|
21
|
+
[u1, [r2, r3]],
|
|
22
|
+
]
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
r4 is donated to the miner
|
|
26
|
+
|
|
27
|
+
┌────────┬────────┐
|
|
28
|
+
│ i0 │ u0 │
|
|
29
|
+
│ │ │
|
|
30
|
+
│ r0 ┼ │
|
|
31
|
+
│ │ │
|
|
32
|
+
├────────┤ │
|
|
33
|
+
│ i1 │ │
|
|
34
|
+
│ r1 ┼ │
|
|
35
|
+
│ │ │
|
|
36
|
+
│ ├────────┤
|
|
37
|
+
│ │ u1 │
|
|
38
|
+
│ r2 ┼ │
|
|
39
|
+
│ │ │
|
|
40
|
+
├────────┤ │
|
|
41
|
+
│ i2 │ │
|
|
42
|
+
│ r3 ┼ │
|
|
43
|
+
│ │ │
|
|
44
|
+
│ │ │
|
|
45
|
+
│ ├────────┘
|
|
46
|
+
│ │
|
|
47
|
+
│ r4 ┼
|
|
48
|
+
│ │
|
|
49
|
+
└────────┘
|
|
50
|
+
|
|
51
|
+
*/
|
|
52
|
+
import { SatRange } from './SatRange';
|
|
53
|
+
export class InvalidOrdOutput extends Error {
|
|
54
|
+
constructor(message, value, ordinals) {
|
|
55
|
+
super(message);
|
|
56
|
+
this.value = value;
|
|
57
|
+
this.ordinals = ordinals;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The ordinal metadata for an output
|
|
62
|
+
*/
|
|
63
|
+
export class OrdOutput {
|
|
64
|
+
/**
|
|
65
|
+
* @param value - the input value
|
|
66
|
+
* @param ordinals - The ordinal ranges of an output, relative to the first satoshi.
|
|
67
|
+
* Required to be ordered and non-overlapping.
|
|
68
|
+
* Not required to be exhaustive.
|
|
69
|
+
*/
|
|
70
|
+
constructor(value, ordinals = []) {
|
|
71
|
+
this.value = value;
|
|
72
|
+
this.ordinals = ordinals;
|
|
73
|
+
const maxRange = this.asSatRange();
|
|
74
|
+
ordinals.forEach((r, i) => {
|
|
75
|
+
if (!maxRange.isSupersetOf(r)) {
|
|
76
|
+
throw new InvalidOrdOutput(`range ${r} outside output maxRange ${maxRange}`, value, ordinals);
|
|
77
|
+
}
|
|
78
|
+
if (0 < i) {
|
|
79
|
+
const prevRange = ordinals[i - 1];
|
|
80
|
+
if (r.start <= prevRange.end) {
|
|
81
|
+
throw new InvalidOrdOutput(`SatRange #${i - 1} ${prevRange} overlaps SatRange #${i} ${r}`, value, ordinals);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* @param other
|
|
88
|
+
* @return OrdOutput extended by other.value and SatRanges shifted by this.value
|
|
89
|
+
*/
|
|
90
|
+
joinedWith(other) {
|
|
91
|
+
return new OrdOutput(this.value + other.value, [
|
|
92
|
+
...this.ordinals,
|
|
93
|
+
...other.ordinals.map((r) => r.shiftedBy(this.value)),
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* @param ords
|
|
98
|
+
* @return single OrdOutput containing all SatRanges, shifted by preceding output values
|
|
99
|
+
*/
|
|
100
|
+
static joinAll(ords) {
|
|
101
|
+
if (ords.length === 0) {
|
|
102
|
+
throw new TypeError(`empty input`);
|
|
103
|
+
}
|
|
104
|
+
return ords.reduce((a, b) => a.joinedWith(b));
|
|
105
|
+
}
|
|
106
|
+
asSatRange() {
|
|
107
|
+
return new SatRange(BigInt(0), this.value - BigInt(1));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @param r
|
|
111
|
+
* @return new OrdOutput with all ranges fully contained in _r_. SatRanges are aligned to new start.
|
|
112
|
+
*/
|
|
113
|
+
fromSatRange(r) {
|
|
114
|
+
return new OrdOutput(r.size(), this.ordinals.flatMap((s) => {
|
|
115
|
+
if (r.intersectsWith(s)) {
|
|
116
|
+
if (!r.isSupersetOf(s)) {
|
|
117
|
+
throw new Error(`partial overlap in ${r} and ${s}`);
|
|
118
|
+
}
|
|
119
|
+
return s.shiftedBy(-r.start);
|
|
120
|
+
}
|
|
121
|
+
return [];
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* @param value
|
|
126
|
+
* @return first OrdOutput with value `value`, second OrdOutput with remaining value.
|
|
127
|
+
* With respective SatRanges
|
|
128
|
+
*/
|
|
129
|
+
splitAt(value) {
|
|
130
|
+
if (this.value < value) {
|
|
131
|
+
throw new Error(`must split at value inside range`);
|
|
132
|
+
}
|
|
133
|
+
return [
|
|
134
|
+
this.fromSatRange(new SatRange(BigInt(0), value - BigInt(1))),
|
|
135
|
+
this.fromSatRange(new SatRange(value, this.value - BigInt(1))),
|
|
136
|
+
];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Like splitAt but returns _null_ where a zero-sized OrdOutput would be
|
|
140
|
+
* @param value
|
|
141
|
+
*/
|
|
142
|
+
splitAtAllowZero(value) {
|
|
143
|
+
if (value === BigInt(0)) {
|
|
144
|
+
return [null, this.fromSatRange(this.asSatRange())];
|
|
145
|
+
}
|
|
146
|
+
if (value === this.value) {
|
|
147
|
+
return [this.fromSatRange(this.asSatRange()), null];
|
|
148
|
+
}
|
|
149
|
+
return this.splitAt(value);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Split output successively at values.
|
|
153
|
+
* @param values
|
|
154
|
+
* @param exact - when set, ensure that value sum matches _this.value_
|
|
155
|
+
* @param allowZero - when set, return _null_ for zero-sized values
|
|
156
|
+
* @return (OrdOutput | null)[]. Zero-sized outputs are substituted with _null_.
|
|
157
|
+
*/
|
|
158
|
+
splitAllWithParams(values, { exact = false, allowZero = false }) {
|
|
159
|
+
if (values.length === 0) {
|
|
160
|
+
throw new Error(`invalid argument`);
|
|
161
|
+
}
|
|
162
|
+
if (exact) {
|
|
163
|
+
const valueSum = values.reduce((a, b) => a + b, BigInt(0));
|
|
164
|
+
if (this.value !== valueSum) {
|
|
165
|
+
throw new Error(`value sum ${valueSum} does not match this.value ${this.value}`);
|
|
166
|
+
}
|
|
167
|
+
return this.splitAllWithParams(values.slice(0, -1), { allowZero, exact: false });
|
|
168
|
+
}
|
|
169
|
+
const [v, ...rest] = values;
|
|
170
|
+
const [a, b] = allowZero ? this.splitAtAllowZero(v) : this.splitAt(v);
|
|
171
|
+
if (rest.length) {
|
|
172
|
+
if (b === null) {
|
|
173
|
+
throw new Error(`invalid remainder`);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
return [a, ...b.splitAllWithParams(rest, { exact, allowZero })];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return [a, b];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Split output successively at values.
|
|
185
|
+
* @param values
|
|
186
|
+
* @return OrdOutput[] with length _values.length + 1_
|
|
187
|
+
*/
|
|
188
|
+
splitAll(values) {
|
|
189
|
+
return this.splitAllWithParams(values, { exact: false, allowZero: false });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3JkT3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL09yZE91dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBQ3pDLFlBQVksT0FBZSxFQUFTLEtBQWEsRUFBUyxRQUFvQjtRQUM1RSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEbUIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQVk7SUFFOUUsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNwQjs7Ozs7T0FLRztJQUNILFlBQW1CLEtBQWEsRUFBUyxXQUF1QixFQUFFO1FBQS9DLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLDRCQUE0QixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEcsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNWLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsR0FB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LENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxNQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztJQUM1RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuXG5DbGFzc2VzIHVzZWQgZm9yIHRyYWNraW5nIHNhdHMgYWNyb3NzIHRyYW5zYWN0aW9ucy5cblxuaHR0cHM6Ly9naXRodWIuY29tL2Nhc2V5L29yZC9ibG9iL21hc3Rlci9iaXAubWVkaWF3aWtpI2Rlc2lnblxuXG4+IFRoZSBvcmRpbmFsIG51bWJlcnMgb2Ygc2F0cyBpbiB0cmFuc2FjdGlvbiBpbnB1dHMgYXJlIHRyYW5zZmVycmVkIHRvIG91dHB1dCBzYXRzIGluXG4+IGZpcnN0LWluLWZpcnN0LW91dCBvcmRlciwgYWNjb3JkaW5nIHRvIHRoZSBzaXplIGFuZCBvcmRlciBvZiB0aGUgdHJhbnNhY3Rpb25zIGlucHV0cyBhbmQgb3V0cHV0cy5cblxuXG5TYW1wbGUgc2NlbmFyaW86XG4gICBpbnB1dHMgICAgICAgICBpMCwgaTEsIGkyXG4gICBvdXRwdXRzICAgICAgICB1MCwgdTFcbiAgIGluc2NyaXB0aW9ucyAgIHIwLCByMSwgcjIsIHIzLCByNFxuXG5cbmNyZWF0ZU91dHB1dHMoXG4gIFtpMCwgaTFdLFxuICBbXG4gICAgW3UwLCBbcjAsIHIxXV0sXG4gICAgW3UxLCBbcjIsIHIzXV0sXG4gIF1cbik7XG5cbiAgcjQgaXMgZG9uYXRlZCB0byB0aGUgbWluZXJcblxuICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAg4pSCIGkwICAgICDilIIgdTAgICAgIOKUglxuICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjAg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKQgICAgICAgIOKUglxuICDilIIgaTEgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjEg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICDilIIgICAgICAgIOKUgiB1MSAgICAg4pSCXG4gIOKUgiAgICAgcjIg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKQgICAgICAgIOKUglxuICDilIIgaTIgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjMg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjQg4pS8XG4gIOKUgiAgICAgICAg4pSCXG4gIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuXG4gKi9cblxuaW1wb3J0IHsgU2F0UmFuZ2UgfSBmcm9tICcuL1NhdFJhbmdlJztcblxuZXhwb3J0IGNsYXNzIEludmFsaWRPcmRPdXRwdXQgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHZhbHVlOiBiaWdpbnQsIHB1YmxpYyBvcmRpbmFsczogU2F0UmFuZ2VbXSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9yZGluYWwgbWV0YWRhdGEgZm9yIGFuIG91dHB1dFxuICovXG5leHBvcnQgY2xhc3MgT3JkT3V0cHV0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIHRoZSBpbnB1dCB2YWx1ZVxuICAgKiBAcGFyYW0gb3JkaW5hbHMgLSBUaGUgb3JkaW5hbCByYW5nZXMgb2YgYW4gb3V0cHV0LCByZWxhdGl2ZSB0byB0aGUgZmlyc3Qgc2F0b3NoaS5cbiAgICogICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgdG8gYmUgb3JkZXJlZCBhbmQgbm9uLW92ZXJsYXBwaW5nLlxuICAgKiAgICAgICAgICAgICAgICAgICBOb3QgcmVxdWlyZWQgdG8gYmUgZXhoYXVzdGl2ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogYmlnaW50LCBwdWJsaWMgb3JkaW5hbHM6IFNhdFJhbmdlW10gPSBbXSkge1xuICAgIGNvbnN0IG1heFJhbmdlID0gdGhpcy5hc1NhdFJhbmdlKCk7XG4gICAgb3JkaW5hbHMuZm9yRWFjaCgociwgaSkgPT4ge1xuICAgICAgaWYgKCFtYXhSYW5nZS5pc1N1cGVyc2V0T2YocikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcmRPdXRwdXQoYHJhbmdlICR7cn0gb3V0c2lkZSBvdXRwdXQgbWF4UmFuZ2UgJHttYXhSYW5nZX1gLCB2YWx1ZSwgb3JkaW5hbHMpO1xuICAgICAgfVxuICAgICAgaWYgKDAgPCBpKSB7XG4gICAgICAgIGNvbnN0IHByZXZSYW5nZSA9IG9yZGluYWxzW2kgLSAxXTtcbiAgICAgICAgaWYgKHIuc3RhcnQgPD0gcHJldlJhbmdlLmVuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3JkT3V0cHV0KGBTYXRSYW5nZSAjJHtpIC0gMX0gJHtwcmV2UmFuZ2V9IG92ZXJsYXBzIFNhdFJhbmdlICMke2l9ICR7cn1gLCB2YWx1ZSwgb3JkaW5hbHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG90aGVyXG4gICAqIEByZXR1cm4gT3JkT3V0cHV0IGV4dGVuZGVkIGJ5IG90aGVyLnZhbHVlIGFuZCBTYXRSYW5nZXMgc2hpZnRlZCBieSB0aGlzLnZhbHVlXG4gICAqL1xuICBqb2luZWRXaXRoKG90aGVyOiBPcmRPdXRwdXQpOiBPcmRPdXRwdXQge1xuICAgIHJldHVybiBuZXcgT3JkT3V0cHV0KHRoaXMudmFsdWUgKyBvdGhlci52YWx1ZSwgW1xuICAgICAgLi4udGhpcy5vcmRpbmFscyxcbiAgICAgIC4uLm90aGVyLm9yZGluYWxzLm1hcCgocikgPT4gci5zaGlmdGVkQnkodGhpcy52YWx1ZSkpLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcmRzXG4gICAqIEByZXR1cm4gc2luZ2xlIE9yZE91dHB1dCBjb250YWluaW5nIGFsbCBTYXRSYW5nZXMsIHNoaWZ0ZWQgYnkgcHJlY2VkaW5nIG91dHB1dCB2YWx1ZXNcbiAgICovXG4gIHN0YXRpYyBqb2luQWxsKG9yZHM6IE9yZE91dHB1dFtdKTogT3JkT3V0cHV0IHtcbiAgICBpZiAob3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGVtcHR5IGlucHV0YCk7XG4gICAgfVxuICAgIHJldHVybiBvcmRzLnJlZHVjZSgoYSwgYikgPT4gYS5qb2luZWRXaXRoKGIpKTtcbiAgfVxuXG4gIGFzU2F0UmFuZ2UoKTogU2F0UmFuZ2Uge1xuICAgIHJldHVybiBuZXcgU2F0UmFuZ2UoQmlnSW50KDApLCB0aGlzLnZhbHVlIC0gQmlnSW50KDEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gclxuICAgKiBAcmV0dXJuIG5ldyBPcmRPdXRwdXQgd2l0aCBhbGwgcmFuZ2VzIGZ1bGx5IGNvbnRhaW5lZCBpbiBfcl8uIFNhdFJhbmdlcyBhcmUgYWxpZ25lZCB0byBuZXcgc3RhcnQuXG4gICAqL1xuICBmcm9tU2F0UmFuZ2UocjogU2F0UmFuZ2UpOiBPcmRPdXRwdXQge1xuICAgIHJldHVybiBuZXcgT3JkT3V0cHV0KFxuICAgICAgci5zaXplKCksXG4gICAgICB0aGlzLm9yZGluYWxzLmZsYXRNYXAoKHMpID0+IHtcbiAgICAgICAgaWYgKHIuaW50ZXJzZWN0c1dpdGgocykpIHtcbiAgICAgICAgICBpZiAoIXIuaXNTdXBlcnNldE9mKHMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhcnRpYWwgb3ZlcmxhcCBpbiAke3J9IGFuZCAke3N9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzLnNoaWZ0ZWRCeSgtci5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiBAcmV0dXJuIGZpcnN0IE9yZE91dHB1dCB3aXRoIHZhbHVlIGB2YWx1ZWAsIHNlY29uZCBPcmRPdXRwdXQgd2l0aCByZW1haW5pbmcgdmFsdWUuXG4gICAqICAgICAgICAgV2l0aCByZXNwZWN0aXZlIFNhdFJhbmdlc1xuICAgKi9cbiAgc3BsaXRBdCh2YWx1ZTogYmlnaW50KTogW09yZE91dHB1dCwgT3JkT3V0cHV0XSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPCB2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHNwbGl0IGF0IHZhbHVlIGluc2lkZSByYW5nZWApO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5mcm9tU2F0UmFuZ2UobmV3IFNhdFJhbmdlKEJpZ0ludCgwKSwgdmFsdWUgLSBCaWdJbnQoMSkpKSxcbiAgICAgIHRoaXMuZnJvbVNhdFJhbmdlKG5ldyBTYXRSYW5nZSh2YWx1ZSwgdGhpcy52YWx1ZSAtIEJpZ0ludCgxKSkpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBzcGxpdEF0IGJ1dCByZXR1cm5zIF9udWxsXyB3aGVyZSBhIHplcm8tc2l6ZWQgT3JkT3V0cHV0IHdvdWxkIGJlXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc3BsaXRBdEFsbG93WmVybyh2YWx1ZTogYmlnaW50KTogW09yZE91dHB1dCB8IG51bGwsIE9yZE91dHB1dCB8IG51bGxdIHtcbiAgICBpZiAodmFsdWUgPT09IEJpZ0ludCgwKSkge1xuICAgICAgcmV0dXJuIFtudWxsLCB0aGlzLmZyb21TYXRSYW5nZSh0aGlzLmFzU2F0UmFuZ2UoKSldO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHJldHVybiBbdGhpcy5mcm9tU2F0UmFuZ2UodGhpcy5hc1NhdFJhbmdlKCkpLCBudWxsXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRBdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgb3V0cHV0IHN1Y2Nlc3NpdmVseSBhdCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB2YWx1ZXNcbiAgICogQHBhcmFtIGV4YWN0IC0gd2hlbiBzZXQsIGVuc3VyZSB0aGF0IHZhbHVlIHN1bSBtYXRjaGVzIF90aGlzLnZhbHVlX1xuICAgKiBAcGFyYW0gYWxsb3daZXJvIC0gd2hlbiBzZXQsIHJldHVybiBfbnVsbF8gZm9yIHplcm8tc2l6ZWQgdmFsdWVzXG4gICAqIEByZXR1cm4gKE9yZE91dHB1dCB8IG51bGwpW10uIFplcm8tc2l6ZWQgb3V0cHV0cyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCBfbnVsbF8uXG4gICAqL1xuICBzcGxpdEFsbFdpdGhQYXJhbXMoXG4gICAgdmFsdWVzOiBiaWdpbnRbXSxcbiAgICB7IGV4YWN0ID0gZmFsc2UsIGFsbG93WmVybyA9IGZhbHNlIH06IHsgYWxsb3daZXJvPzogYm9vbGVhbjsgZXhhY3Q/OiBib29sZWFuIH1cbiAgKTogKE9yZE91dHB1dCB8IG51bGwpW10ge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYXJndW1lbnRgKTtcbiAgICB9XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICBjb25zdCB2YWx1ZVN1bSA9IHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCBCaWdJbnQoMCkpO1xuICAgICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlU3VtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgc3VtICR7dmFsdWVTdW19IGRvZXMgbm90IG1hdGNoIHRoaXMudmFsdWUgJHt0aGlzLnZhbHVlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3BsaXRBbGxXaXRoUGFyYW1zKHZhbHVlcy5zbGljZSgwLCAtMSksIHsgYWxsb3daZXJvLCBleGFjdDogZmFsc2UgfSk7XG4gICAgfVxuICAgIGNvbnN0IFt2LCAuLi5yZXN0XSA9IHZhbHVlcztcbiAgICBjb25zdCBbYSwgYl0gPSBhbGxvd1plcm8gPyB0aGlzLnNwbGl0QXRBbGxvd1plcm8odikgOiB0aGlzLnNwbGl0QXQodik7XG4gICAgaWYgKHJlc3QubGVuZ3RoKSB7XG4gICAgICBpZiAoYiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgcmVtYWluZGVyYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW2EsIC4uLmIuc3BsaXRBbGxXaXRoUGFyYW1zKHJlc3QsIHsgZXhhY3QsIGFsbG93WmVybyB9KV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbYSwgYl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IG91dHB1dCBzdWNjZXNzaXZlbHkgYXQgdmFsdWVzLlxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqIEByZXR1cm4gT3JkT3V0cHV0W10gd2l0aCBsZW5ndGggX3ZhbHVlcy5sZW5ndGggKyAxX1xuICAgKi9cbiAgc3BsaXRBbGwodmFsdWVzOiBiaWdpbnRbXSk6IE9yZE91dHB1dFtdIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdEFsbFdpdGhQYXJhbXModmFsdWVzLCB7IGV4YWN0OiBmYWxzZSwgYWxsb3daZXJvOiBmYWxzZSB9KSBhcyBPcmRPdXRwdXRbXTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { OrdOutput } from './OrdOutput';
|
|
2
|
+
/**
|
|
3
|
+
* A range constraint
|
|
4
|
+
*/
|
|
5
|
+
type Parameters<T> = {
|
|
6
|
+
/** Padding preceding the inscription output */
|
|
7
|
+
firstChangeOutput: T;
|
|
8
|
+
/** The inscription output that will inherit the input inscription */
|
|
9
|
+
inscriptionOutput: T;
|
|
10
|
+
/** Padding following the inscription output */
|
|
11
|
+
secondChangeOutput: T;
|
|
12
|
+
/** Not a real output, used only to simplify calculations */
|
|
13
|
+
feeOutput: T;
|
|
14
|
+
};
|
|
15
|
+
/** @return canonical sequence of parameters */
|
|
16
|
+
export declare function toArray<T>(p: Parameters<T>): [T, T, T, T];
|
|
17
|
+
export declare function toParameters<T>(firstChangeOutput: T, inscriptionOutput: T, secondChangeOutput: T, feeOutput: T): Parameters<T>;
|
|
18
|
+
/** A finished output layout */
|
|
19
|
+
export type OutputLayout = Parameters<bigint>;
|
|
20
|
+
/**
|
|
21
|
+
* Translates a layout into OrdOutputs. Absent outputs are set to `null`.
|
|
22
|
+
*
|
|
23
|
+
* @param inscriptionInput
|
|
24
|
+
* @param layout
|
|
25
|
+
* @return OrdOutputs for layout
|
|
26
|
+
*/
|
|
27
|
+
export declare function getOrdOutputsForLayout(inscriptionInput: OrdOutput, layout: OutputLayout): Parameters<OrdOutput | null>;
|
|
28
|
+
/**
|
|
29
|
+
* High-level constraints for output layout
|
|
30
|
+
*/
|
|
31
|
+
export type Constraints = {
|
|
32
|
+
minChangeOutput: bigint;
|
|
33
|
+
minInscriptionOutput: bigint;
|
|
34
|
+
maxInscriptionOutput: bigint;
|
|
35
|
+
feeFixed: bigint;
|
|
36
|
+
feePerOutput: bigint;
|
|
37
|
+
satPos: bigint;
|
|
38
|
+
total: bigint;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* @param inscriptionInput
|
|
42
|
+
* @param search
|
|
43
|
+
* @return a solution that satisfies constraints. If no solution can be found, return `undefined`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function findOutputLayout(inscriptionInput: OrdOutput, search: Omit<Constraints, 'satPos' | 'total'>): OutputLayout | undefined;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=OutputLayout.d.ts.map
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
This file contains code for creating an output layouts for transactions that pass on inscriptions.
|
|
4
|
+
|
|
5
|
+
When passing on an inscription, we want to satisfy a few constraints:
|
|
6
|
+
|
|
7
|
+
* All outputs should be larger than a minimal value (dust limit)
|
|
8
|
+
* The sum of all output values needs to be less than the input to cover the transaction fee.
|
|
9
|
+
* The output containing the inscription should be as small as possible, but large enough to
|
|
10
|
+
contain the inscription.
|
|
11
|
+
|
|
12
|
+
To keep the inscription output small, we can pad the satoshi range preceding and following the range
|
|
13
|
+
with change outputs, which have a minimal size and incur a fee cost.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
Broadly speaking, there are four scenarios:
|
|
17
|
+
|
|
18
|
+
(1) Small inscription input that has just enough value to pay for fee and a single inscription
|
|
19
|
+
output (u0). No padding outputs.
|
|
20
|
+
┌────────┬────────┐
|
|
21
|
+
│ │ u0 │
|
|
22
|
+
│ r ┼ │
|
|
23
|
+
│ ├────────┘
|
|
24
|
+
│ │ fee
|
|
25
|
+
└────────┘
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
(2) Large inscription input with inscription close to start of input.
|
|
29
|
+
Inscription output followed by change output (u1) padding the remaining value.
|
|
30
|
+
|
|
31
|
+
┌────────┬────────┐
|
|
32
|
+
│ │ u0 │
|
|
33
|
+
│ r ┼ │
|
|
34
|
+
│ ├────────┤
|
|
35
|
+
│ │ u1 │
|
|
36
|
+
│ │ │
|
|
37
|
+
│ │ │
|
|
38
|
+
│ │ │
|
|
39
|
+
│ │ │
|
|
40
|
+
│ │ │
|
|
41
|
+
│ │ │
|
|
42
|
+
│ │ │
|
|
43
|
+
│ │ │
|
|
44
|
+
│ │ │
|
|
45
|
+
│ ├────────┘
|
|
46
|
+
│ │
|
|
47
|
+
│ │ fee
|
|
48
|
+
│ │
|
|
49
|
+
└────────┘
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
(3) Large inscription input with inscription close to end of input.
|
|
53
|
+
Change output padding start followed by inscription output.
|
|
54
|
+
|
|
55
|
+
┌────────┬────────┐
|
|
56
|
+
│ │ u0 │
|
|
57
|
+
│ │ │
|
|
58
|
+
│ │ │
|
|
59
|
+
│ │ │
|
|
60
|
+
│ │ │
|
|
61
|
+
│ │ │
|
|
62
|
+
│ │ │
|
|
63
|
+
│ │ │
|
|
64
|
+
│ │ │
|
|
65
|
+
│ ├────────┤
|
|
66
|
+
│ r ┼ │
|
|
67
|
+
│ │ u1 │
|
|
68
|
+
│ ├────────┘
|
|
69
|
+
│ │
|
|
70
|
+
│ │ fee
|
|
71
|
+
│ │
|
|
72
|
+
└────────┘
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
(4) Large inscription input with inscription in the middle.
|
|
76
|
+
Inscription input (u1) with padding on both sides (u0 and u2)
|
|
77
|
+
|
|
78
|
+
┌────────┬────────┐
|
|
79
|
+
│ │ u0 │
|
|
80
|
+
│ │ │
|
|
81
|
+
│ │ │
|
|
82
|
+
│ │ │
|
|
83
|
+
│ │ │
|
|
84
|
+
│ ├────────┤
|
|
85
|
+
│ │ u1 │
|
|
86
|
+
│ r ┼ │
|
|
87
|
+
│ ├────────┤
|
|
88
|
+
│ │ u2 │
|
|
89
|
+
│ │ │
|
|
90
|
+
│ │ │
|
|
91
|
+
│ │ │
|
|
92
|
+
│ ├────────┘
|
|
93
|
+
│ │
|
|
94
|
+
│ │ fee
|
|
95
|
+
│ │
|
|
96
|
+
└────────┘
|
|
97
|
+
*/
|
|
98
|
+
const ZERO = BigInt(0);
|
|
99
|
+
const ONE = BigInt(1);
|
|
100
|
+
function max(a, b) {
|
|
101
|
+
return a < b ? b : a;
|
|
102
|
+
}
|
|
103
|
+
function min(a, b) {
|
|
104
|
+
return a < b ? a : b;
|
|
105
|
+
}
|
|
106
|
+
function sum(arr) {
|
|
107
|
+
return arr.reduce((a, b) => a + b, ZERO);
|
|
108
|
+
}
|
|
109
|
+
/** @return canonical sequence of parameters */
|
|
110
|
+
export function toArray(p) {
|
|
111
|
+
return [p.firstChangeOutput, p.inscriptionOutput, p.secondChangeOutput, p.feeOutput];
|
|
112
|
+
}
|
|
113
|
+
export function toParameters(firstChangeOutput, inscriptionOutput, secondChangeOutput, feeOutput) {
|
|
114
|
+
return {
|
|
115
|
+
firstChangeOutput,
|
|
116
|
+
inscriptionOutput,
|
|
117
|
+
secondChangeOutput,
|
|
118
|
+
feeOutput,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Translates a layout into OrdOutputs. Absent outputs are set to `null`.
|
|
123
|
+
*
|
|
124
|
+
* @param inscriptionInput
|
|
125
|
+
* @param layout
|
|
126
|
+
* @return OrdOutputs for layout
|
|
127
|
+
*/
|
|
128
|
+
export function getOrdOutputsForLayout(inscriptionInput, layout) {
|
|
129
|
+
const outputs = inscriptionInput.splitAllWithParams(toArray(layout), { exact: true, allowZero: true });
|
|
130
|
+
if (outputs.length !== 4) {
|
|
131
|
+
throw new Error(`unexpected result`);
|
|
132
|
+
}
|
|
133
|
+
return toParameters(...outputs);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* @param constraints
|
|
137
|
+
* @param inscriptionInput
|
|
138
|
+
* @param layout
|
|
139
|
+
* @return true iff layout satisfies constraints
|
|
140
|
+
*/
|
|
141
|
+
function check(constraints, inscriptionInput, layout) {
|
|
142
|
+
if ((layout.firstChangeOutput === ZERO || constraints.minChangeOutput <= layout.firstChangeOutput) &&
|
|
143
|
+
(layout.secondChangeOutput === ZERO || constraints.minChangeOutput <= layout.secondChangeOutput) &&
|
|
144
|
+
constraints.minInscriptionOutput <= layout.inscriptionOutput &&
|
|
145
|
+
layout.inscriptionOutput <= constraints.maxInscriptionOutput &&
|
|
146
|
+
getFeeForOutputs(constraints, [layout.firstChangeOutput, layout.inscriptionOutput, layout.secondChangeOutput]) <=
|
|
147
|
+
layout.feeOutput &&
|
|
148
|
+
sum(toArray(layout)) === inscriptionInput.value) {
|
|
149
|
+
/* make sure inscription actually lies on the inscriptionOutput */
|
|
150
|
+
const outputs = getOrdOutputsForLayout(inscriptionInput, layout);
|
|
151
|
+
return outputs.inscriptionOutput?.ordinals.length === 1;
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
function getFeeForOutputs(p, outputs) {
|
|
156
|
+
return outputs.reduce((sum, oValue) => sum + (oValue === ZERO ? ZERO : p.feePerOutput), p.feeFixed);
|
|
157
|
+
}
|
|
158
|
+
function getStartChangeOutput(c) {
|
|
159
|
+
// we don't need a change padding output
|
|
160
|
+
if (c.satPos < c.maxInscriptionOutput) {
|
|
161
|
+
return ZERO;
|
|
162
|
+
}
|
|
163
|
+
if (c.minChangeOutput <= c.satPos) {
|
|
164
|
+
return c.satPos;
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
function getInscriptionOutput(c, startChangeOutput) {
|
|
169
|
+
const result = min(c.maxInscriptionOutput, max(c.minInscriptionOutput, c.satPos - startChangeOutput + ONE));
|
|
170
|
+
if (c.satPos < startChangeOutput || startChangeOutput + result < c.satPos) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
// if is not worth creating an end change output, let's maximize the inscription output
|
|
174
|
+
if (getEndChangeOutput(c, startChangeOutput, result) === ZERO) {
|
|
175
|
+
const remainder = c.total - startChangeOutput - getFeeForOutputs(c, [startChangeOutput, result]);
|
|
176
|
+
return min(remainder, c.maxInscriptionOutput);
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
function getEndChangeOutput(c, startChangeOutput, inscriptionOutput) {
|
|
181
|
+
const remainder = c.total - sum([startChangeOutput, inscriptionOutput]);
|
|
182
|
+
const minFeeWithoutSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput]);
|
|
183
|
+
const minFeeWithSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, c.minChangeOutput]);
|
|
184
|
+
if (remainder < minFeeWithoutSecondOutput) {
|
|
185
|
+
// We cannot even pay the fee for the output(s) we have so far.
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
if (remainder - minFeeWithSecondOutput < c.minChangeOutput) {
|
|
189
|
+
// The remainder is too small to pay for the end change output. Let's skip it and pay a higher fee.
|
|
190
|
+
return ZERO;
|
|
191
|
+
}
|
|
192
|
+
// let's use as much as we can for fee while leaving enough for fee
|
|
193
|
+
return remainder - minFeeWithSecondOutput;
|
|
194
|
+
}
|
|
195
|
+
function getFeeOutput(c, startChangeOutput, inscriptionOutput, endChangeOutput) {
|
|
196
|
+
const minFee = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, endChangeOutput]);
|
|
197
|
+
const remainder = c.total - sum([startChangeOutput, inscriptionOutput, endChangeOutput]);
|
|
198
|
+
if (remainder < minFee) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
return remainder;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* @param inscriptionInput
|
|
205
|
+
* @param search
|
|
206
|
+
* @return a solution that satisfies constraints. If no solution can be found, return `undefined`.
|
|
207
|
+
*/
|
|
208
|
+
export function findOutputLayout(inscriptionInput, search) {
|
|
209
|
+
if (inscriptionInput.ordinals.length !== 1) {
|
|
210
|
+
throw new Error(`unexpected ordinal count ${inscriptionInput.ordinals.length}`);
|
|
211
|
+
}
|
|
212
|
+
if (inscriptionInput.ordinals[0].size() !== ONE) {
|
|
213
|
+
throw new Error(`only single-satoshi inscriptions are supported`);
|
|
214
|
+
}
|
|
215
|
+
const satPos = inscriptionInput.ordinals[0].start;
|
|
216
|
+
const total = inscriptionInput.value;
|
|
217
|
+
const constraints = { ...search, satPos, total };
|
|
218
|
+
const startChangeOutput = getStartChangeOutput(constraints);
|
|
219
|
+
if (startChangeOutput === null) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const inscriptionOutput = getInscriptionOutput(constraints, startChangeOutput);
|
|
223
|
+
if (inscriptionOutput === null) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const endChangeOutput = getEndChangeOutput(constraints, startChangeOutput, inscriptionOutput);
|
|
227
|
+
if (endChangeOutput === null) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const feeOutput = getFeeOutput(constraints, startChangeOutput, inscriptionOutput, endChangeOutput);
|
|
231
|
+
if (feeOutput === null) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const result = toParameters(startChangeOutput, inscriptionOutput, endChangeOutput, feeOutput);
|
|
235
|
+
if (!check(constraints, inscriptionInput, result)) {
|
|
236
|
+
throw new Error(`invalid result`);
|
|
237
|
+
}
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0TGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL091dHB1dExheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0dHO0FBSUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0QixTQUFTLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxHQUFhO0lBQ3hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQWdCRCwrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLE9BQU8sQ0FBSSxDQUFnQjtJQUN6QyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUMxQixpQkFBb0IsRUFDcEIsaUJBQW9CLEVBQ3BC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V0FBVyxHQUFnQixFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUU5RCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVELElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDL0IsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9FLElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDL0IsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUM5RixJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM3QixPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbkcsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkIsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlGLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcblxuVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGNyZWF0aW5nIGFuIG91dHB1dCBsYXlvdXRzIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBwYXNzIG9uIGluc2NyaXB0aW9ucy5cblxuV2hlbiBwYXNzaW5nIG9uIGFuIGluc2NyaXB0aW9uLCB3ZSB3YW50IHRvIHNhdGlzZnkgYSBmZXcgY29uc3RyYWludHM6XG5cbiogQWxsIG91dHB1dHMgc2hvdWxkIGJlIGxhcmdlciB0aGFuIGEgbWluaW1hbCB2YWx1ZSAoZHVzdCBsaW1pdClcbiogVGhlIHN1bSBvZiBhbGwgb3V0cHV0IHZhbHVlcyBuZWVkcyB0byBiZSBsZXNzIHRoYW4gdGhlIGlucHV0IHRvIGNvdmVyIHRoZSB0cmFuc2FjdGlvbiBmZWUuXG4qIFRoZSBvdXRwdXQgY29udGFpbmluZyB0aGUgaW5zY3JpcHRpb24gc2hvdWxkIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCBidXQgbGFyZ2UgZW5vdWdoIHRvXG4gIGNvbnRhaW4gdGhlIGluc2NyaXB0aW9uLlxuXG5UbyBrZWVwIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgc21hbGwsIHdlIGNhbiBwYWQgdGhlIHNhdG9zaGkgcmFuZ2UgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHJhbmdlXG53aXRoIGNoYW5nZSBvdXRwdXRzLCB3aGljaCBoYXZlIGEgbWluaW1hbCBzaXplIGFuZCBpbmN1ciBhIGZlZSBjb3N0LlxuXG5cbkJyb2FkbHkgc3BlYWtpbmcsIHRoZXJlIGFyZSBmb3VyIHNjZW5hcmlvczpcblxuKDEpIFNtYWxsIGluc2NyaXB0aW9uIGlucHV0IHRoYXQgaGFzIGp1c3QgZW5vdWdoIHZhbHVlIHRvIHBheSBmb3IgZmVlIGFuZCBhIHNpbmdsZSBpbnNjcmlwdGlvblxuICAgIG91dHB1dCAodTApLiBObyBwYWRkaW5nIG91dHB1dHMuXG4gICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAg4pSCICAgICAgICDilIIgdTAgICAgIOKUglxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCIGZlZVxuICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuXG5cbigyKSBMYXJnZSBpbnNjcmlwdGlvbiBpbnB1dCB3aXRoIGluc2NyaXB0aW9uIGNsb3NlIHRvIHN0YXJ0IG9mIGlucHV0LlxuICAgIEluc2NyaXB0aW9uIG91dHB1dCBmb2xsb3dlZCBieSBjaGFuZ2Ugb3V0cHV0ICh1MSkgcGFkZGluZyB0aGUgcmVtYWluaW5nIHZhbHVlLlxuXG4gICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAg4pSCICAgICAgICDilIIgdTAgICAgIOKUglxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICAgIOKUgiAgICAgICAg4pSCIHUxICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgZmVlXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuXG4oMykgTGFyZ2UgaW5zY3JpcHRpb24gaW5wdXQgd2l0aCBpbnNjcmlwdGlvbiBjbG9zZSB0byBlbmQgb2YgaW5wdXQuXG4gICAgQ2hhbmdlIG91dHB1dCBwYWRkaW5nIHN0YXJ0IGZvbGxvd2VkIGJ5IGluc2NyaXB0aW9uIG91dHB1dC5cblxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICAg4pSCICAgICAgciDilLwgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCIHUxICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgZmVlXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuXG4oNCkgTGFyZ2UgaW5zY3JpcHRpb24gaW5wdXQgd2l0aCBpbnNjcmlwdGlvbiBpbiB0aGUgbWlkZGxlLlxuICAgIEluc2NyaXB0aW9uIGlucHV0ICh1MSkgd2l0aCBwYWRkaW5nIG9uIGJvdGggc2lkZXMgKHUwIGFuZCB1MilcblxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAgICDilIIgICAgICAgIOKUgiB1MSAgICAg4pSCXG4gICAg4pSCICAgICAgciDilLwgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICAg4pSCICAgICAgICDilIIgdTIgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiBmZWVcbiAgICDilIIgICAgICAgIOKUglxuICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICovXG5cbmltcG9ydCB7IE9yZE91dHB1dCB9IGZyb20gJy4vT3JkT3V0cHV0JztcblxuY29uc3QgWkVSTyA9IEJpZ0ludCgwKTtcbmNvbnN0IE9ORSA9IEJpZ0ludCgxKTtcblxuZnVuY3Rpb24gbWF4KGE6IGJpZ2ludCwgYjogYmlnaW50KTogYmlnaW50IHtcbiAgcmV0dXJuIGEgPCBiID8gYiA6IGE7XG59XG5cbmZ1bmN0aW9uIG1pbihhOiBiaWdpbnQsIGI6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIHJldHVybiBhIDwgYiA/IGEgOiBiO1xufVxuXG5mdW5jdGlvbiBzdW0oYXJyOiBiaWdpbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgWkVSTyk7XG59XG5cbi8qKlxuICogQSByYW5nZSBjb25zdHJhaW50XG4gKi9cbnR5cGUgUGFyYW1ldGVyczxUPiA9IHtcbiAgLyoqIFBhZGRpbmcgcHJlY2VkaW5nIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgKi9cbiAgZmlyc3RDaGFuZ2VPdXRwdXQ6IFQ7XG4gIC8qKiBUaGUgaW5zY3JpcHRpb24gb3V0cHV0IHRoYXQgd2lsbCBpbmhlcml0IHRoZSBpbnB1dCBpbnNjcmlwdGlvbiAqL1xuICBpbnNjcmlwdGlvbk91dHB1dDogVDtcbiAgLyoqIFBhZGRpbmcgZm9sbG93aW5nIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgKi9cbiAgc2Vjb25kQ2hhbmdlT3V0cHV0OiBUO1xuICAvKiogTm90IGEgcmVhbCBvdXRwdXQsIHVzZWQgb25seSB0byBzaW1wbGlmeSBjYWxjdWxhdGlvbnMgKi9cbiAgZmVlT3V0cHV0OiBUO1xufTtcblxuLyoqIEByZXR1cm4gY2Fub25pY2FsIHNlcXVlbmNlIG9mIHBhcmFtZXRlcnMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KHA6IFBhcmFtZXRlcnM8VD4pOiBbVCwgVCwgVCwgVF0ge1xuICByZXR1cm4gW3AuZmlyc3RDaGFuZ2VPdXRwdXQsIHAuaW5zY3JpcHRpb25PdXRwdXQsIHAuc2Vjb25kQ2hhbmdlT3V0cHV0LCBwLmZlZU91dHB1dF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhcmFtZXRlcnM8VD4oXG4gIGZpcnN0Q2hhbmdlT3V0cHV0OiBULFxuICBpbnNjcmlwdGlvbk91dHB1dDogVCxcbiAgc2Vjb25kQ2hhbmdlT3V0cHV0OiBULFxuICBmZWVPdXRwdXQ6IFRcbik6IFBhcmFtZXRlcnM8VD4ge1xuICByZXR1cm4ge1xuICAgIGZpcnN0Q2hhbmdlT3V0cHV0LFxuICAgIGluc2NyaXB0aW9uT3V0cHV0LFxuICAgIHNlY29uZENoYW5nZU91dHB1dCxcbiAgICBmZWVPdXRwdXQsXG4gIH07XG59XG5cbi8qKiBBIGZpbmlzaGVkIG91dHB1dCBsYXlvdXQgKi9cbmV4cG9ydCB0eXBlIE91dHB1dExheW91dCA9IFBhcmFtZXRlcnM8YmlnaW50PjtcblxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgbGF5b3V0IGludG8gT3JkT3V0cHV0cy4gQWJzZW50IG91dHB1dHMgYXJlIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIGluc2NyaXB0aW9uSW5wdXRcbiAqIEBwYXJhbSBsYXlvdXRcbiAqIEByZXR1cm4gT3JkT3V0cHV0cyBmb3IgbGF5b3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0KFxuICBpbnNjcmlwdGlvbklucHV0OiBPcmRPdXRwdXQsXG4gIGxheW91dDogT3V0cHV0TGF5b3V0XG4pOiBQYXJhbWV0ZXJzPE9yZE91dHB1dCB8IG51bGw+IHtcbiAgY29uc3Qgb3V0cHV0cyA9IGluc2NyaXB0aW9uSW5wdXQuc3BsaXRBbGxXaXRoUGFyYW1zKHRvQXJyYXkobGF5b3V0KSwgeyBleGFjdDogdHJ1ZSwgYWxsb3daZXJvOiB0cnVlIH0pO1xuICBpZiAob3V0cHV0cy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcmVzdWx0YCk7XG4gIH1cbiAgdHlwZSBUID0gT3JkT3V0cHV0IHwgbnVsbDtcbiAgcmV0dXJuIHRvUGFyYW1ldGVycyguLi4ob3V0cHV0cyBhcyBbVCwgVCwgVCwgVF0pKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqIEBwYXJhbSBpbnNjcmlwdGlvbklucHV0XG4gKiBAcGFyYW0gbGF5b3V0XG4gKiBAcmV0dXJuIHRydWUgaWZmIGxheW91dCBzYXRpc2ZpZXMgY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gY2hlY2soY29uc3RyYWludHM6IENvbnN0cmFpbnRzLCBpbnNjcmlwdGlvbklucHV0OiBPcmRPdXRwdXQsIGxheW91dDogT3V0cHV0TGF5b3V0KTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICAobGF5b3V0LmZpcnN0Q2hhbmdlT3V0cHV0ID09PSBaRVJPIHx8IGNvbnN0cmFpbnRzLm1pbkNoYW5nZU91dHB1dCA8PSBsYXlvdXQuZmlyc3RDaGFuZ2VPdXRwdXQpICYmXG4gICAgKGxheW91dC5zZWNvbmRDaGFuZ2VPdXRwdXQgPT09IFpFUk8gfHwgY29uc3RyYWludHMubWluQ2hhbmdlT3V0cHV0IDw9IGxheW91dC5zZWNvbmRDaGFuZ2VPdXRwdXQpICYmXG4gICAgY29uc3RyYWludHMubWluSW5zY3JpcHRpb25PdXRwdXQgPD0gbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0ICYmXG4gICAgbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0IDw9IGNvbnN0cmFpbnRzLm1heEluc2NyaXB0aW9uT3V0cHV0ICYmXG4gICAgZ2V0RmVlRm9yT3V0cHV0cyhjb25zdHJhaW50cywgW2xheW91dC5maXJzdENoYW5nZU91dHB1dCwgbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0LCBsYXlvdXQuc2Vjb25kQ2hhbmdlT3V0cHV0XSkgPD1cbiAgICAgIGxheW91dC5mZWVPdXRwdXQgJiZcbiAgICBzdW0odG9BcnJheShsYXlvdXQpKSA9PT0gaW5zY3JpcHRpb25JbnB1dC52YWx1ZVxuICApIHtcbiAgICAvKiBtYWtlIHN1cmUgaW5zY3JpcHRpb24gYWN0dWFsbHkgbGllcyBvbiB0aGUgaW5zY3JpcHRpb25PdXRwdXQgKi9cbiAgICBjb25zdCBvdXRwdXRzID0gZ2V0T3JkT3V0cHV0c0ZvckxheW91dChpbnNjcmlwdGlvbklucHV0LCBsYXlvdXQpO1xuICAgIHJldHVybiBvdXRwdXRzLmluc2NyaXB0aW9uT3V0cHV0Py5vcmRpbmFscy5sZW5ndGggPT09IDE7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSGlnaC1sZXZlbCBjb25zdHJhaW50cyBmb3Igb3V0cHV0IGxheW91dFxuICovXG5leHBvcnQgdHlwZSBDb25zdHJhaW50cyA9IHtcbiAgbWluQ2hhbmdlT3V0cHV0OiBiaWdpbnQ7XG4gIG1pbkluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQ7XG4gIG1heEluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQ7XG4gIGZlZUZpeGVkOiBiaWdpbnQ7XG4gIGZlZVBlck91dHB1dDogYmlnaW50O1xuICBzYXRQb3M6IGJpZ2ludDtcbiAgdG90YWw6IGJpZ2ludDtcbn07XG5cbmZ1bmN0aW9uIGdldEZlZUZvck91dHB1dHMocDogeyBmZWVQZXJPdXRwdXQ6IGJpZ2ludDsgZmVlRml4ZWQ6IGJpZ2ludCB9LCBvdXRwdXRzOiBiaWdpbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBvdXRwdXRzLnJlZHVjZSgoc3VtLCBvVmFsdWUpOiBiaWdpbnQgPT4gc3VtICsgKG9WYWx1ZSA9PT0gWkVSTyA/IFpFUk8gOiBwLmZlZVBlck91dHB1dCksIHAuZmVlRml4ZWQpO1xufVxuZnVuY3Rpb24gZ2V0U3RhcnRDaGFuZ2VPdXRwdXQoYzogQ29uc3RyYWludHMpOiBiaWdpbnQgfCBudWxsIHtcbiAgLy8gd2UgZG9uJ3QgbmVlZCBhIGNoYW5nZSBwYWRkaW5nIG91dHB1dFxuICBpZiAoYy5zYXRQb3MgPCBjLm1heEluc2NyaXB0aW9uT3V0cHV0KSB7XG4gICAgcmV0dXJuIFpFUk87XG4gIH1cbiAgaWYgKGMubWluQ2hhbmdlT3V0cHV0IDw9IGMuc2F0UG9zKSB7XG4gICAgcmV0dXJuIGMuc2F0UG9zO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRJbnNjcmlwdGlvbk91dHB1dChjOiBDb25zdHJhaW50cywgc3RhcnRDaGFuZ2VPdXRwdXQ6IGJpZ2ludCk6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCByZXN1bHQgPSBtaW4oYy5tYXhJbnNjcmlwdGlvbk91dHB1dCwgbWF4KGMubWluSW5zY3JpcHRpb25PdXRwdXQsIGMuc2F0UG9zIC0gc3RhcnRDaGFuZ2VPdXRwdXQgKyBPTkUpKTtcbiAgaWYgKGMuc2F0UG9zIDwgc3RhcnRDaGFuZ2VPdXRwdXQgfHwgc3RhcnRDaGFuZ2VPdXRwdXQgKyByZXN1bHQgPCBjLnNhdFBvcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGlmIGlzIG5vdCB3b3J0aCBjcmVhdGluZyBhbiBlbmQgY2hhbmdlIG91dHB1dCwgbGV0J3MgbWF4aW1pemUgdGhlIGluc2NyaXB0aW9uIG91dHB1dFxuICBpZiAoZ2V0RW5kQ2hhbmdlT3V0cHV0KGMsIHN0YXJ0Q2hhbmdlT3V0cHV0LCByZXN1bHQpID09PSBaRVJPKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gYy50b3RhbCAtIHN0YXJ0Q2hhbmdlT3V0cHV0IC0gZ2V0RmVlRm9yT3V0cHV0cyhjLCBbc3RhcnRDaGFuZ2VPdXRwdXQsIHJlc3VsdF0pO1xuICAgIHJldHVybiBtaW4ocmVtYWluZGVyLCBjLm1heEluc2NyaXB0aW9uT3V0cHV0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXRFbmRDaGFuZ2VPdXRwdXQoYzogQ29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0OiBiaWdpbnQsIGluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcmVtYWluZGVyID0gYy50b3RhbCAtIHN1bShbc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0XSk7XG4gIGNvbnN0IG1pbkZlZVdpdGhvdXRTZWNvbmRPdXRwdXQgPSBnZXRGZWVGb3JPdXRwdXRzKGMsIFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXRdKTtcbiAgY29uc3QgbWluRmVlV2l0aFNlY29uZE91dHB1dCA9IGdldEZlZUZvck91dHB1dHMoYywgW3N0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCwgYy5taW5DaGFuZ2VPdXRwdXRdKTtcbiAgaWYgKHJlbWFpbmRlciA8IG1pbkZlZVdpdGhvdXRTZWNvbmRPdXRwdXQpIHtcbiAgICAvLyBXZSBjYW5ub3QgZXZlbiBwYXkgdGhlIGZlZSBmb3IgdGhlIG91dHB1dChzKSB3ZSBoYXZlIHNvIGZhci5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocmVtYWluZGVyIC0gbWluRmVlV2l0aFNlY29uZE91dHB1dCA8IGMubWluQ2hhbmdlT3V0cHV0KSB7XG4gICAgLy8gVGhlIHJlbWFpbmRlciBpcyB0b28gc21hbGwgdG8gcGF5IGZvciB0aGUgZW5kIGNoYW5nZSBvdXRwdXQuIExldCdzIHNraXAgaXQgYW5kIHBheSBhIGhpZ2hlciBmZWUuXG4gICAgcmV0dXJuIFpFUk87XG4gIH1cbiAgLy8gbGV0J3MgdXNlIGFzIG11Y2ggYXMgd2UgY2FuIGZvciBmZWUgd2hpbGUgbGVhdmluZyBlbm91Z2ggZm9yIGZlZVxuICByZXR1cm4gcmVtYWluZGVyIC0gbWluRmVlV2l0aFNlY29uZE91dHB1dDtcbn1cblxuZnVuY3Rpb24gZ2V0RmVlT3V0cHV0KFxuICBjOiBDb25zdHJhaW50cyxcbiAgc3RhcnRDaGFuZ2VPdXRwdXQ6IGJpZ2ludCxcbiAgaW5zY3JpcHRpb25PdXRwdXQ6IGJpZ2ludCxcbiAgZW5kQ2hhbmdlT3V0cHV0OiBiaWdpbnRcbik6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCBtaW5GZWUgPSBnZXRGZWVGb3JPdXRwdXRzKGMsIFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGVuZENoYW5nZU91dHB1dF0pO1xuICBjb25zdCByZW1haW5kZXIgPSBjLnRvdGFsIC0gc3VtKFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGVuZENoYW5nZU91dHB1dF0pO1xuICBpZiAocmVtYWluZGVyIDwgbWluRmVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlbWFpbmRlcjtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25JbnB1dFxuICogQHBhcmFtIHNlYXJjaFxuICogQHJldHVybiBhIHNvbHV0aW9uIHRoYXQgc2F0aXNmaWVzIGNvbnN0cmFpbnRzLiBJZiBubyBzb2x1dGlvbiBjYW4gYmUgZm91bmQsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdXRwdXRMYXlvdXQoXG4gIGluc2NyaXB0aW9uSW5wdXQ6IE9yZE91dHB1dCxcbiAgc2VhcmNoOiBPbWl0PENvbnN0cmFpbnRzLCAnc2F0UG9zJyB8ICd0b3RhbCc+XG4pOiBPdXRwdXRMYXlvdXQgfCB1bmRlZmluZWQge1xuICBpZiAoaW5zY3JpcHRpb25JbnB1dC5vcmRpbmFscy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgb3JkaW5hbCBjb3VudCAke2luc2NyaXB0aW9uSW5wdXQub3JkaW5hbHMubGVuZ3RofWApO1xuICB9XG4gIGlmIChpbnNjcmlwdGlvbklucHV0Lm9yZGluYWxzWzBdLnNpemUoKSAhPT0gT05FKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBvbmx5IHNpbmdsZS1zYXRvc2hpIGluc2NyaXB0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBjb25zdCBzYXRQb3MgPSBpbnNjcmlwdGlvbklucHV0Lm9yZGluYWxzWzBdLnN0YXJ0O1xuICBjb25zdCB0b3RhbCA9IGluc2NyaXB0aW9uSW5wdXQudmFsdWU7XG5cbiAgY29uc3QgY29uc3RyYWludHM6IENvbnN0cmFpbnRzID0geyAuLi5zZWFyY2gsIHNhdFBvcywgdG90YWwgfTtcblxuICBjb25zdCBzdGFydENoYW5nZU91dHB1dCA9IGdldFN0YXJ0Q2hhbmdlT3V0cHV0KGNvbnN0cmFpbnRzKTtcbiAgaWYgKHN0YXJ0Q2hhbmdlT3V0cHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGluc2NyaXB0aW9uT3V0cHV0ID0gZ2V0SW5zY3JpcHRpb25PdXRwdXQoY29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0KTtcbiAgaWYgKGluc2NyaXB0aW9uT3V0cHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGVuZENoYW5nZU91dHB1dCA9IGdldEVuZENoYW5nZU91dHB1dChjb25zdHJhaW50cywgc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0KTtcbiAgaWYgKGVuZENoYW5nZU91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmZWVPdXRwdXQgPSBnZXRGZWVPdXRwdXQoY29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCwgZW5kQ2hhbmdlT3V0cHV0KTtcbiAgaWYgKGZlZU91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB0b1BhcmFtZXRlcnMoc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0LCBlbmRDaGFuZ2VPdXRwdXQsIGZlZU91dHB1dCk7XG4gIGlmICghY2hlY2soY29uc3RyYWludHMsIGluc2NyaXB0aW9uSW5wdXQsIHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgcmVzdWx0YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type SatPoint = `${string}:${number}:${bigint}`;
|
|
2
|
+
export declare function parseSatPoint(p: SatPoint): {
|
|
3
|
+
txid: string;
|
|
4
|
+
vout: number;
|
|
5
|
+
offset: bigint;
|
|
6
|
+
};
|
|
7
|
+
export declare function formatSatPoint(p: {
|
|
8
|
+
txid: string;
|
|
9
|
+
vout: number;
|
|
10
|
+
offset: bigint;
|
|
11
|
+
}): SatPoint;
|
|
12
|
+
export declare function isSatPoint(v: string): v is SatPoint;
|
|
13
|
+
//# sourceMappingURL=SatPoint.d.ts.map
|