@bitgo-beta/utxo-ord 1.0.1-beta.20 → 1.0.1-beta.2000
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/{src → cjs/src}/OutputLayout.d.ts +3 -3
- package/dist/cjs/src/OutputLayout.d.ts.map +1 -0
- package/dist/cjs/src/OutputLayout.js +246 -0
- package/dist/{src → cjs/src}/SatPoint.d.ts +8 -1
- package/dist/cjs/src/SatPoint.d.ts.map +1 -0
- package/dist/cjs/src/SatPoint.js +67 -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 +2 -0
- package/dist/cjs/src/combinations.d.ts.map +1 -0
- package/dist/cjs/src/combinations.js +13 -0
- package/dist/{src → cjs/src}/index.d.ts +2 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +49 -0
- package/dist/cjs/src/inscriptions.d.ts +58 -0
- package/dist/cjs/src/inscriptions.d.ts.map +1 -0
- package/dist/cjs/src/inscriptions.js +94 -0
- package/dist/cjs/src/psbt.d.ts +84 -0
- package/dist/cjs/src/psbt.d.ts.map +1 -0
- package/dist/cjs/src/psbt.js +193 -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.d.ts.map +1 -0
- package/dist/esm/OutputLayout.js +240 -0
- package/dist/esm/SatPoint.d.ts +20 -0
- package/dist/esm/SatPoint.d.ts.map +1 -0
- package/dist/esm/SatPoint.js +61 -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.d.ts.map +1 -0
- package/dist/esm/combinations.js +10 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/{src → esm}/index.d.ts.map +1 -1
- package/dist/esm/index.js +10 -0
- package/dist/esm/inscriptions.d.ts +58 -0
- package/dist/esm/inscriptions.d.ts.map +1 -0
- package/dist/esm/inscriptions.js +89 -0
- package/dist/esm/psbt.d.ts +84 -0
- package/dist/esm/psbt.d.ts.map +1 -0
- package/dist/esm/psbt.js +186 -0
- package/package.json +27 -9
- package/dist/src/OrdOutput.js +0 -197
- package/dist/src/OutputLayout.d.ts.map +0 -1
- package/dist/src/OutputLayout.js +0 -248
- package/dist/src/SatPoint.d.ts.map +0 -1
- package/dist/src/SatPoint.js +0 -49
- package/dist/src/SatRange.js +0 -58
- package/dist/src/index.js +0 -23
- package/dist/src/inscriptions.d.ts +0 -32
- package/dist/src/inscriptions.d.ts.map +0 -1
- package/dist/src/inscriptions.js +0 -168
- package/dist/src/psbt.d.ts +0 -32
- package/dist/src/psbt.d.ts.map +0 -1
- package/dist/src/psbt.js +0 -89
- package/dist/tsconfig.tsbuildinfo +0 -7574
- /package/dist/{src → cjs/src}/OrdOutput.d.ts +0 -0
- /package/dist/{src → cjs/src}/SatRange.d.ts +0 -0
- /package/dist/{src → esm}/OrdOutput.d.ts.map +0 -0
- /package/dist/{src → esm}/SatRange.d.ts.map +0 -0
package/package.json
CHANGED
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/utxo-ord",
|
|
3
3
|
"description": "Utilities for building ordinals with BitGo utxo-lib",
|
|
4
|
-
"main": "./dist/src/index.js",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
4
|
+
"main": "./dist/cjs/src/index.js",
|
|
5
|
+
"module": "./dist/esm/index.js",
|
|
6
|
+
"browser": "./dist/esm/index.js",
|
|
7
|
+
"types": "./dist/cjs/src/index.d.ts",
|
|
8
|
+
"version": "1.0.1-beta.2000",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/esm/index.d.ts",
|
|
13
|
+
"default": "./dist/esm/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/cjs/src/index.d.ts",
|
|
17
|
+
"default": "./dist/cjs/src/index.js"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
7
21
|
"files": [
|
|
8
|
-
"dist
|
|
22
|
+
"dist/cjs",
|
|
23
|
+
"dist/esm"
|
|
9
24
|
],
|
|
10
25
|
"keywords": [
|
|
11
26
|
"bitgo",
|
|
@@ -16,7 +31,9 @@
|
|
|
16
31
|
],
|
|
17
32
|
"scripts": {
|
|
18
33
|
"prepare": "npm run build",
|
|
19
|
-
"build": "
|
|
34
|
+
"build": "npm run build:cjs && npm run build:esm",
|
|
35
|
+
"build:cjs": "yarn tsc --build --incremental --verbose .",
|
|
36
|
+
"build:esm": "yarn tsc --project tsconfig.esm.json",
|
|
20
37
|
"lint": "eslint --quiet .",
|
|
21
38
|
"unit-test": "mocha --recursive test",
|
|
22
39
|
"fmt": "prettier --write '{src,test}/**/*.{ts,js}'",
|
|
@@ -28,9 +45,10 @@
|
|
|
28
45
|
"directory": "modules/utxo-ord"
|
|
29
46
|
},
|
|
30
47
|
"dependencies": {
|
|
31
|
-
"@bitgo
|
|
32
|
-
|
|
33
|
-
|
|
48
|
+
"@bitgo/wasm-utxo": "^4.21.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@bitgo-beta/utxo-lib": "8.0.3-beta.1930"
|
|
34
52
|
},
|
|
35
53
|
"lint-staged": {
|
|
36
54
|
"*.{js,ts}": [
|
|
@@ -42,5 +60,5 @@
|
|
|
42
60
|
"access": "public"
|
|
43
61
|
},
|
|
44
62
|
"license": "MIT",
|
|
45
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "7e963646ae7ad833d58f9106e2fda3caaa9ff50e"
|
|
46
64
|
}
|
package/dist/src/OrdOutput.js
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
|
|
4
|
-
Classes used for tracking sats across transactions.
|
|
5
|
-
|
|
6
|
-
https://github.com/casey/ord/blob/master/bip.mediawiki#design
|
|
7
|
-
|
|
8
|
-
> The ordinal numbers of sats in transaction inputs are transferred to output sats in
|
|
9
|
-
> first-in-first-out order, according to the size and order of the transactions inputs and outputs.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Sample scenario:
|
|
13
|
-
inputs i0, i1, i2
|
|
14
|
-
outputs u0, u1
|
|
15
|
-
inscriptions r0, r1, r2, r3, r4
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
createOutputs(
|
|
19
|
-
[i0, i1],
|
|
20
|
-
[
|
|
21
|
-
[u0, [r0, r1]],
|
|
22
|
-
[u1, [r2, r3]],
|
|
23
|
-
]
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
r4 is donated to the miner
|
|
27
|
-
|
|
28
|
-
┌────────┬────────┐
|
|
29
|
-
│ i0 │ u0 │
|
|
30
|
-
│ │ │
|
|
31
|
-
│ r0 ┼ │
|
|
32
|
-
│ │ │
|
|
33
|
-
├────────┤ │
|
|
34
|
-
│ i1 │ │
|
|
35
|
-
│ r1 ┼ │
|
|
36
|
-
│ │ │
|
|
37
|
-
│ ├────────┤
|
|
38
|
-
│ │ u1 │
|
|
39
|
-
│ r2 ┼ │
|
|
40
|
-
│ │ │
|
|
41
|
-
├────────┤ │
|
|
42
|
-
│ i2 │ │
|
|
43
|
-
│ r3 ┼ │
|
|
44
|
-
│ │ │
|
|
45
|
-
│ │ │
|
|
46
|
-
│ ├────────┘
|
|
47
|
-
│ │
|
|
48
|
-
│ r4 ┼
|
|
49
|
-
│ │
|
|
50
|
-
└────────┘
|
|
51
|
-
|
|
52
|
-
*/
|
|
53
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
-
exports.OrdOutput = exports.InvalidOrdOutput = void 0;
|
|
55
|
-
const SatRange_1 = require("./SatRange");
|
|
56
|
-
class InvalidOrdOutput extends Error {
|
|
57
|
-
constructor(message, value, ordinals) {
|
|
58
|
-
super(message);
|
|
59
|
-
this.value = value;
|
|
60
|
-
this.ordinals = ordinals;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
exports.InvalidOrdOutput = InvalidOrdOutput;
|
|
64
|
-
/**
|
|
65
|
-
* The ordinal metadata for an output
|
|
66
|
-
*/
|
|
67
|
-
class OrdOutput {
|
|
68
|
-
/**
|
|
69
|
-
* @param value - the input value
|
|
70
|
-
* @param ordinals - The ordinal ranges of an output, relative to the first satoshi.
|
|
71
|
-
* Required to be ordered and non-overlapping.
|
|
72
|
-
* Not required to be exhaustive.
|
|
73
|
-
*/
|
|
74
|
-
constructor(value, ordinals = []) {
|
|
75
|
-
this.value = value;
|
|
76
|
-
this.ordinals = ordinals;
|
|
77
|
-
const maxRange = this.asSatRange();
|
|
78
|
-
ordinals.forEach((r, i) => {
|
|
79
|
-
if (!maxRange.isSupersetOf(r)) {
|
|
80
|
-
throw new InvalidOrdOutput(`range ${r} outside output maxRange ${maxRange}`, value, ordinals);
|
|
81
|
-
}
|
|
82
|
-
if (0 < i) {
|
|
83
|
-
const prevRange = ordinals[i - 1];
|
|
84
|
-
if (r.start <= prevRange.end) {
|
|
85
|
-
throw new InvalidOrdOutput(`SatRange #${i - 1} ${prevRange} overlaps SatRange #${i} ${r}`, value, ordinals);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* @param other
|
|
92
|
-
* @return OrdOutput extended by other.value and SatRanges shifted by this.value
|
|
93
|
-
*/
|
|
94
|
-
joinedWith(other) {
|
|
95
|
-
return new OrdOutput(this.value + other.value, [
|
|
96
|
-
...this.ordinals,
|
|
97
|
-
...other.ordinals.map((r) => r.shiftedBy(this.value)),
|
|
98
|
-
]);
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* @param ords
|
|
102
|
-
* @return single OrdOutput containing all SatRanges, shifted by preceding output values
|
|
103
|
-
*/
|
|
104
|
-
static joinAll(ords) {
|
|
105
|
-
if (ords.length === 0) {
|
|
106
|
-
throw new TypeError(`empty input`);
|
|
107
|
-
}
|
|
108
|
-
return ords.reduce((a, b) => a.joinedWith(b));
|
|
109
|
-
}
|
|
110
|
-
asSatRange() {
|
|
111
|
-
return new SatRange_1.SatRange(BigInt(0), this.value - BigInt(1));
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* @param r
|
|
115
|
-
* @return new OrdOutput with all ranges fully contained in _r_. SatRanges are aligned to new start.
|
|
116
|
-
*/
|
|
117
|
-
fromSatRange(r) {
|
|
118
|
-
return new OrdOutput(r.size(), this.ordinals.flatMap((s) => {
|
|
119
|
-
if (r.intersectsWith(s)) {
|
|
120
|
-
if (!r.isSupersetOf(s)) {
|
|
121
|
-
throw new Error(`partial overlap in ${r} and ${s}`);
|
|
122
|
-
}
|
|
123
|
-
return s.shiftedBy(-r.start);
|
|
124
|
-
}
|
|
125
|
-
return [];
|
|
126
|
-
}));
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* @param value
|
|
130
|
-
* @return first OrdOutput with value `value`, second OrdOutput with remaining value.
|
|
131
|
-
* With respective SatRanges
|
|
132
|
-
*/
|
|
133
|
-
splitAt(value) {
|
|
134
|
-
if (this.value < value) {
|
|
135
|
-
throw new Error(`must split at value inside range`);
|
|
136
|
-
}
|
|
137
|
-
return [
|
|
138
|
-
this.fromSatRange(new SatRange_1.SatRange(BigInt(0), value - BigInt(1))),
|
|
139
|
-
this.fromSatRange(new SatRange_1.SatRange(value, this.value - BigInt(1))),
|
|
140
|
-
];
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Like splitAt but returns _null_ where a zero-sized OrdOutput would be
|
|
144
|
-
* @param value
|
|
145
|
-
*/
|
|
146
|
-
splitAtAllowZero(value) {
|
|
147
|
-
if (value === BigInt(0)) {
|
|
148
|
-
return [null, this.fromSatRange(this.asSatRange())];
|
|
149
|
-
}
|
|
150
|
-
if (value === this.value) {
|
|
151
|
-
return [this.fromSatRange(this.asSatRange()), null];
|
|
152
|
-
}
|
|
153
|
-
return this.splitAt(value);
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Split output successively at values.
|
|
157
|
-
* @param values
|
|
158
|
-
* @param exact - when set, ensure that value sum matches _this.value_
|
|
159
|
-
* @param allowZero - when set, return _null_ for zero-sized values
|
|
160
|
-
* @return (OrdOutput | null)[]. Zero-sized outputs are substituted with _null_.
|
|
161
|
-
*/
|
|
162
|
-
splitAllWithParams(values, { exact = false, allowZero = false }) {
|
|
163
|
-
if (values.length === 0) {
|
|
164
|
-
throw new Error(`invalid argument`);
|
|
165
|
-
}
|
|
166
|
-
if (exact) {
|
|
167
|
-
const valueSum = values.reduce((a, b) => a + b, BigInt(0));
|
|
168
|
-
if (this.value !== valueSum) {
|
|
169
|
-
throw new Error(`value sum ${valueSum} does not match this.value ${this.value}`);
|
|
170
|
-
}
|
|
171
|
-
return this.splitAllWithParams(values.slice(0, -1), { allowZero, exact: false });
|
|
172
|
-
}
|
|
173
|
-
const [v, ...rest] = values;
|
|
174
|
-
const [a, b] = allowZero ? this.splitAtAllowZero(v) : this.splitAt(v);
|
|
175
|
-
if (rest.length) {
|
|
176
|
-
if (b === null) {
|
|
177
|
-
throw new Error(`invalid remainder`);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
return [a, ...b.splitAllWithParams(rest, { exact, allowZero })];
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
return [a, b];
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Split output successively at values.
|
|
189
|
-
* @param values
|
|
190
|
-
* @return OrdOutput[] with length _values.length + 1_
|
|
191
|
-
*/
|
|
192
|
-
splitAll(values) {
|
|
193
|
-
return this.splitAllWithParams(values, { exact: false, allowZero: false });
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
exports.OrdOutput = OrdOutput;
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3JkT3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL09yZE91dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RHOzs7QUFFSCx5Q0FBc0M7QUFFdEMsTUFBYSxnQkFBaUIsU0FBUSxLQUFLO0lBQ3pDLFlBQVksT0FBZSxFQUFTLEtBQWEsRUFBUyxRQUFvQjtRQUM1RSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEbUIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQVk7SUFFOUUsQ0FBQztDQUNGO0FBSkQsNENBSUM7QUFFRDs7R0FFRztBQUNILE1BQWEsU0FBUztJQUNwQjs7Ozs7T0FLRztJQUNILFlBQW1CLEtBQWEsRUFBUyxXQUF1QixFQUFFO1FBQS9DLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQy9GO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNULE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUM1QixNQUFNLElBQUksZ0JBQWdCLENBQUMsYUFB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QUU7WUFDZixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNqRTtTQUNGO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxNQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztJQUM1RixDQUFDO0NBQ0Y7QUExSUQsOEJBMElDIiwic291cmNlc0NvbnRlbnQiOlsiLypcblxuQ2xhc3NlcyB1c2VkIGZvciB0cmFja2luZyBzYXRzIGFjcm9zcyB0cmFuc2FjdGlvbnMuXG5cbmh0dHBzOi8vZ2l0aHViLmNvbS9jYXNleS9vcmQvYmxvYi9tYXN0ZXIvYmlwLm1lZGlhd2lraSNkZXNpZ25cblxuPiBUaGUgb3JkaW5hbCBudW1iZXJzIG9mIHNhdHMgaW4gdHJhbnNhY3Rpb24gaW5wdXRzIGFyZSB0cmFuc2ZlcnJlZCB0byBvdXRwdXQgc2F0cyBpblxuPiBmaXJzdC1pbi1maXJzdC1vdXQgb3JkZXIsIGFjY29yZGluZyB0byB0aGUgc2l6ZSBhbmQgb3JkZXIgb2YgdGhlIHRyYW5zYWN0aW9ucyBpbnB1dHMgYW5kIG91dHB1dHMuXG5cblxuU2FtcGxlIHNjZW5hcmlvOlxuICAgaW5wdXRzICAgICAgICAgaTAsIGkxLCBpMlxuICAgb3V0cHV0cyAgICAgICAgdTAsIHUxXG4gICBpbnNjcmlwdGlvbnMgICByMCwgcjEsIHIyLCByMywgcjRcblxuXG5jcmVhdGVPdXRwdXRzKFxuICBbaTAsIGkxXSxcbiAgW1xuICAgIFt1MCwgW3IwLCByMV1dLFxuICAgIFt1MSwgW3IyLCByM11dLFxuICBdXG4pO1xuXG4gIHI0IGlzIGRvbmF0ZWQgdG8gdGhlIG1pbmVyXG5cbiAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gIOKUgiBpMCAgICAg4pSCIHUwICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgIHIwIOKUvCAgICAgICAg4pSCXG4gIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkICAgICAgICDilIJcbiAg4pSCIGkxICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgIHIxIOKUvCAgICAgICAg4pSCXG4gIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAg4pSCICAgICAgICDilIIgdTEgICAgIOKUglxuICDilIIgICAgIHIyIOKUvCAgICAgICAg4pSCXG4gIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkICAgICAgICDilIJcbiAg4pSCIGkyICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgIHIzIOKUvCAgICAgICAg4pSCXG4gIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICDilIIgICAgICAgIOKUglxuICDilIIgICAgIHI0IOKUvFxuICDilIIgICAgICAgIOKUglxuICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuICovXG5cbmltcG9ydCB7IFNhdFJhbmdlIH0gZnJvbSAnLi9TYXRSYW5nZSc7XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkT3JkT3V0cHV0IGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogYmlnaW50LCBwdWJsaWMgb3JkaW5hbHM6IFNhdFJhbmdlW10pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBvcmRpbmFsIG1ldGFkYXRhIGZvciBhbiBvdXRwdXRcbiAqL1xuZXhwb3J0IGNsYXNzIE9yZE91dHB1dCB7XG4gIC8qKlxuICAgKiBAcGFyYW0gdmFsdWUgLSB0aGUgaW5wdXQgdmFsdWVcbiAgICogQHBhcmFtIG9yZGluYWxzIC0gVGhlIG9yZGluYWwgcmFuZ2VzIG9mIGFuIG91dHB1dCwgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IHNhdG9zaGkuXG4gICAqICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIHRvIGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy5cbiAgICogICAgICAgICAgICAgICAgICAgTm90IHJlcXVpcmVkIHRvIGJlIGV4aGF1c3RpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IGJpZ2ludCwgcHVibGljIG9yZGluYWxzOiBTYXRSYW5nZVtdID0gW10pIHtcbiAgICBjb25zdCBtYXhSYW5nZSA9IHRoaXMuYXNTYXRSYW5nZSgpO1xuICAgIG9yZGluYWxzLmZvckVhY2goKHIsIGkpID0+IHtcbiAgICAgIGlmICghbWF4UmFuZ2UuaXNTdXBlcnNldE9mKHIpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3JkT3V0cHV0KGByYW5nZSAke3J9IG91dHNpZGUgb3V0cHV0IG1heFJhbmdlICR7bWF4UmFuZ2V9YCwgdmFsdWUsIG9yZGluYWxzKTtcbiAgICAgIH1cbiAgICAgIGlmICgwIDwgaSkge1xuICAgICAgICBjb25zdCBwcmV2UmFuZ2UgPSBvcmRpbmFsc1tpIC0gMV07XG4gICAgICAgIGlmIChyLnN0YXJ0IDw9IHByZXZSYW5nZS5lbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9yZE91dHB1dChgU2F0UmFuZ2UgIyR7aSAtIDF9ICR7cHJldlJhbmdlfSBvdmVybGFwcyBTYXRSYW5nZSAjJHtpfSAke3J9YCwgdmFsdWUsIG9yZGluYWxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvdGhlclxuICAgKiBAcmV0dXJuIE9yZE91dHB1dCBleHRlbmRlZCBieSBvdGhlci52YWx1ZSBhbmQgU2F0UmFuZ2VzIHNoaWZ0ZWQgYnkgdGhpcy52YWx1ZVxuICAgKi9cbiAgam9pbmVkV2l0aChvdGhlcjogT3JkT3V0cHV0KTogT3JkT3V0cHV0IHtcbiAgICByZXR1cm4gbmV3IE9yZE91dHB1dCh0aGlzLnZhbHVlICsgb3RoZXIudmFsdWUsIFtcbiAgICAgIC4uLnRoaXMub3JkaW5hbHMsXG4gICAgICAuLi5vdGhlci5vcmRpbmFscy5tYXAoKHIpID0+IHIuc2hpZnRlZEJ5KHRoaXMudmFsdWUpKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3Jkc1xuICAgKiBAcmV0dXJuIHNpbmdsZSBPcmRPdXRwdXQgY29udGFpbmluZyBhbGwgU2F0UmFuZ2VzLCBzaGlmdGVkIGJ5IHByZWNlZGluZyBvdXRwdXQgdmFsdWVzXG4gICAqL1xuICBzdGF0aWMgam9pbkFsbChvcmRzOiBPcmRPdXRwdXRbXSk6IE9yZE91dHB1dCB7XG4gICAgaWYgKG9yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBlbXB0eSBpbnB1dGApO1xuICAgIH1cbiAgICByZXR1cm4gb3Jkcy5yZWR1Y2UoKGEsIGIpID0+IGEuam9pbmVkV2l0aChiKSk7XG4gIH1cblxuICBhc1NhdFJhbmdlKCk6IFNhdFJhbmdlIHtcbiAgICByZXR1cm4gbmV3IFNhdFJhbmdlKEJpZ0ludCgwKSwgdGhpcy52YWx1ZSAtIEJpZ0ludCgxKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHJcbiAgICogQHJldHVybiBuZXcgT3JkT3V0cHV0IHdpdGggYWxsIHJhbmdlcyBmdWxseSBjb250YWluZWQgaW4gX3JfLiBTYXRSYW5nZXMgYXJlIGFsaWduZWQgdG8gbmV3IHN0YXJ0LlxuICAgKi9cbiAgZnJvbVNhdFJhbmdlKHI6IFNhdFJhbmdlKTogT3JkT3V0cHV0IHtcbiAgICByZXR1cm4gbmV3IE9yZE91dHB1dChcbiAgICAgIHIuc2l6ZSgpLFxuICAgICAgdGhpcy5vcmRpbmFscy5mbGF0TWFwKChzKSA9PiB7XG4gICAgICAgIGlmIChyLmludGVyc2VjdHNXaXRoKHMpKSB7XG4gICAgICAgICAgaWYgKCFyLmlzU3VwZXJzZXRPZihzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwYXJ0aWFsIG92ZXJsYXAgaW4gJHtyfSBhbmQgJHtzfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcy5zaGlmdGVkQnkoLXIuc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHJldHVybiBmaXJzdCBPcmRPdXRwdXQgd2l0aCB2YWx1ZSBgdmFsdWVgLCBzZWNvbmQgT3JkT3V0cHV0IHdpdGggcmVtYWluaW5nIHZhbHVlLlxuICAgKiAgICAgICAgIFdpdGggcmVzcGVjdGl2ZSBTYXRSYW5nZXNcbiAgICovXG4gIHNwbGl0QXQodmFsdWU6IGJpZ2ludCk6IFtPcmRPdXRwdXQsIE9yZE91dHB1dF0ge1xuICAgIGlmICh0aGlzLnZhbHVlIDwgdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbXVzdCBzcGxpdCBhdCB2YWx1ZSBpbnNpZGUgcmFuZ2VgKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuZnJvbVNhdFJhbmdlKG5ldyBTYXRSYW5nZShCaWdJbnQoMCksIHZhbHVlIC0gQmlnSW50KDEpKSksXG4gICAgICB0aGlzLmZyb21TYXRSYW5nZShuZXcgU2F0UmFuZ2UodmFsdWUsIHRoaXMudmFsdWUgLSBCaWdJbnQoMSkpKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2Ugc3BsaXRBdCBidXQgcmV0dXJucyBfbnVsbF8gd2hlcmUgYSB6ZXJvLXNpemVkIE9yZE91dHB1dCB3b3VsZCBiZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHNwbGl0QXRBbGxvd1plcm8odmFsdWU6IGJpZ2ludCk6IFtPcmRPdXRwdXQgfCBudWxsLCBPcmRPdXRwdXQgfCBudWxsXSB7XG4gICAgaWYgKHZhbHVlID09PSBCaWdJbnQoMCkpIHtcbiAgICAgIHJldHVybiBbbnVsbCwgdGhpcy5mcm9tU2F0UmFuZ2UodGhpcy5hc1NhdFJhbmdlKCkpXTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnZhbHVlKSB7XG4gICAgICByZXR1cm4gW3RoaXMuZnJvbVNhdFJhbmdlKHRoaXMuYXNTYXRSYW5nZSgpKSwgbnVsbF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwbGl0QXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IG91dHB1dCBzdWNjZXNzaXZlbHkgYXQgdmFsdWVzLlxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqIEBwYXJhbSBleGFjdCAtIHdoZW4gc2V0LCBlbnN1cmUgdGhhdCB2YWx1ZSBzdW0gbWF0Y2hlcyBfdGhpcy52YWx1ZV9cbiAgICogQHBhcmFtIGFsbG93WmVybyAtIHdoZW4gc2V0LCByZXR1cm4gX251bGxfIGZvciB6ZXJvLXNpemVkIHZhbHVlc1xuICAgKiBAcmV0dXJuIChPcmRPdXRwdXQgfCBudWxsKVtdLiBaZXJvLXNpemVkIG91dHB1dHMgYXJlIHN1YnN0aXR1dGVkIHdpdGggX251bGxfLlxuICAgKi9cbiAgc3BsaXRBbGxXaXRoUGFyYW1zKFxuICAgIHZhbHVlczogYmlnaW50W10sXG4gICAgeyBleGFjdCA9IGZhbHNlLCBhbGxvd1plcm8gPSBmYWxzZSB9OiB7IGFsbG93WmVybz86IGJvb2xlYW47IGV4YWN0PzogYm9vbGVhbiB9XG4gICk6IChPcmRPdXRwdXQgfCBudWxsKVtdIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFyZ3VtZW50YCk7XG4gICAgfVxuICAgIGlmIChleGFjdCkge1xuICAgICAgY29uc3QgdmFsdWVTdW0gPSB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgQmlnSW50KDApKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSB2YWx1ZVN1bSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIHN1bSAke3ZhbHVlU3VtfSBkb2VzIG5vdCBtYXRjaCB0aGlzLnZhbHVlICR7dGhpcy52YWx1ZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNwbGl0QWxsV2l0aFBhcmFtcyh2YWx1ZXMuc2xpY2UoMCwgLTEpLCB7IGFsbG93WmVybywgZXhhY3Q6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBjb25zdCBbdiwgLi4ucmVzdF0gPSB2YWx1ZXM7XG4gICAgY29uc3QgW2EsIGJdID0gYWxsb3daZXJvID8gdGhpcy5zcGxpdEF0QWxsb3daZXJvKHYpIDogdGhpcy5zcGxpdEF0KHYpO1xuICAgIGlmIChyZXN0Lmxlbmd0aCkge1xuICAgICAgaWYgKGIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHJlbWFpbmRlcmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFthLCAuLi5iLnNwbGl0QWxsV2l0aFBhcmFtcyhyZXN0LCB7IGV4YWN0LCBhbGxvd1plcm8gfSldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2EsIGJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCBvdXRwdXQgc3VjY2Vzc2l2ZWx5IGF0IHZhbHVlcy5cbiAgICogQHBhcmFtIHZhbHVlc1xuICAgKiBAcmV0dXJuIE9yZE91dHB1dFtdIHdpdGggbGVuZ3RoIF92YWx1ZXMubGVuZ3RoICsgMV9cbiAgICovXG4gIHNwbGl0QWxsKHZhbHVlczogYmlnaW50W10pOiBPcmRPdXRwdXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRBbGxXaXRoUGFyYW1zKHZhbHVlcywgeyBleGFjdDogZmFsc2UsIGFsbG93WmVybzogZmFsc2UgfSkgYXMgT3JkT3V0cHV0W107XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OutputLayout.d.ts","sourceRoot":"","sources":["../../src/OutputLayout.ts"],"names":[],"mappings":"AAkGA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAiBxC;;GAEG;AACH,aAAK,UAAU,CAAC,CAAC,IAAI;IACnB,+CAA+C;IAC/C,iBAAiB,EAAE,CAAC,CAAC;IACrB,qEAAqE;IACrE,iBAAiB,EAAE,CAAC,CAAC;IACrB,+CAA+C;IAC/C,kBAAkB,EAAE,CAAC,CAAC;IACtB,4DAA4D;IAC5D,SAAS,EAAE,CAAC,CAAC;CACd,CAAC;AAEF,+CAA+C;AAC/C,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAEzD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,iBAAiB,EAAE,CAAC,EACpB,iBAAiB,EAAE,CAAC,EACpB,kBAAkB,EAAE,CAAC,EACrB,SAAS,EAAE,CAAC,GACX,UAAU,CAAC,CAAC,CAAC,CAOf;AAED,+BAA+B;AAC/B,oBAAY,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,SAAS,EAC3B,MAAM,EAAE,YAAY,GACnB,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,CAO9B;AA0BD;;GAEG;AACH,oBAAY,WAAW,GAAG;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AA2DF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,gBAAgB,EAAE,SAAS,EAC3B,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,GAC5C,YAAY,GAAG,SAAS,CAkC1B"}
|
package/dist/src/OutputLayout.js
DELETED
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
|
|
4
|
-
This file contains code for creating an output layouts for transactions that pass on inscriptions.
|
|
5
|
-
|
|
6
|
-
When passing on an inscription, we want to satisfy a few constraints:
|
|
7
|
-
|
|
8
|
-
* All outputs should be larger than a minimal value (dust limit)
|
|
9
|
-
* The sum of all output values needs to be less than the input to cover the transaction fee.
|
|
10
|
-
* The output containing the inscription should be as small as possible, but large enough to
|
|
11
|
-
contain the inscription.
|
|
12
|
-
|
|
13
|
-
To keep the inscription output small, we can pad the satoshi range preceding and following the range
|
|
14
|
-
with change outputs, which have a minimal size and incur a fee cost.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Broadly speaking, there are four scenarios:
|
|
18
|
-
|
|
19
|
-
(1) Small inscription input that has just enough value to pay for fee and a single inscription
|
|
20
|
-
output (u0). No padding outputs.
|
|
21
|
-
┌────────┬────────┐
|
|
22
|
-
│ │ u0 │
|
|
23
|
-
│ r ┼ │
|
|
24
|
-
│ ├────────┘
|
|
25
|
-
│ │ fee
|
|
26
|
-
└────────┘
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
(2) Large inscription input with inscription close to start of input.
|
|
30
|
-
Inscription output followed by change output (u1) padding the remaining value.
|
|
31
|
-
|
|
32
|
-
┌────────┬────────┐
|
|
33
|
-
│ │ u0 │
|
|
34
|
-
│ r ┼ │
|
|
35
|
-
│ ├────────┤
|
|
36
|
-
│ │ u1 │
|
|
37
|
-
│ │ │
|
|
38
|
-
│ │ │
|
|
39
|
-
│ │ │
|
|
40
|
-
│ │ │
|
|
41
|
-
│ │ │
|
|
42
|
-
│ │ │
|
|
43
|
-
│ │ │
|
|
44
|
-
│ │ │
|
|
45
|
-
│ │ │
|
|
46
|
-
│ ├────────┘
|
|
47
|
-
│ │
|
|
48
|
-
│ │ fee
|
|
49
|
-
│ │
|
|
50
|
-
└────────┘
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
(3) Large inscription input with inscription close to end of input.
|
|
54
|
-
Change output padding start followed by inscription output.
|
|
55
|
-
|
|
56
|
-
┌────────┬────────┐
|
|
57
|
-
│ │ u0 │
|
|
58
|
-
│ │ │
|
|
59
|
-
│ │ │
|
|
60
|
-
│ │ │
|
|
61
|
-
│ │ │
|
|
62
|
-
│ │ │
|
|
63
|
-
│ │ │
|
|
64
|
-
│ │ │
|
|
65
|
-
│ │ │
|
|
66
|
-
│ ├────────┤
|
|
67
|
-
│ r ┼ │
|
|
68
|
-
│ │ u1 │
|
|
69
|
-
│ ├────────┘
|
|
70
|
-
│ │
|
|
71
|
-
│ │ fee
|
|
72
|
-
│ │
|
|
73
|
-
└────────┘
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
(4) Large inscription input with inscription in the middle.
|
|
77
|
-
Inscription input (u1) with padding on both sides (u0 and u2)
|
|
78
|
-
|
|
79
|
-
┌────────┬────────┐
|
|
80
|
-
│ │ u0 │
|
|
81
|
-
│ │ │
|
|
82
|
-
│ │ │
|
|
83
|
-
│ │ │
|
|
84
|
-
│ │ │
|
|
85
|
-
│ ├────────┤
|
|
86
|
-
│ │ u1 │
|
|
87
|
-
│ r ┼ │
|
|
88
|
-
│ ├────────┤
|
|
89
|
-
│ │ u2 │
|
|
90
|
-
│ │ │
|
|
91
|
-
│ │ │
|
|
92
|
-
│ │ │
|
|
93
|
-
│ ├────────┘
|
|
94
|
-
│ │
|
|
95
|
-
│ │ fee
|
|
96
|
-
│ │
|
|
97
|
-
└────────┘
|
|
98
|
-
*/
|
|
99
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
100
|
-
exports.findOutputLayout = exports.getOrdOutputsForLayout = exports.toParameters = exports.toArray = void 0;
|
|
101
|
-
const ZERO = BigInt(0);
|
|
102
|
-
const ONE = BigInt(1);
|
|
103
|
-
function max(a, b) {
|
|
104
|
-
return a < b ? b : a;
|
|
105
|
-
}
|
|
106
|
-
function min(a, b) {
|
|
107
|
-
return a < b ? a : b;
|
|
108
|
-
}
|
|
109
|
-
function sum(arr) {
|
|
110
|
-
return arr.reduce((a, b) => a + b, ZERO);
|
|
111
|
-
}
|
|
112
|
-
/** @return canonical sequence of parameters */
|
|
113
|
-
function toArray(p) {
|
|
114
|
-
return [p.firstChangeOutput, p.inscriptionOutput, p.secondChangeOutput, p.feeOutput];
|
|
115
|
-
}
|
|
116
|
-
exports.toArray = toArray;
|
|
117
|
-
function toParameters(firstChangeOutput, inscriptionOutput, secondChangeOutput, feeOutput) {
|
|
118
|
-
return {
|
|
119
|
-
firstChangeOutput,
|
|
120
|
-
inscriptionOutput,
|
|
121
|
-
secondChangeOutput,
|
|
122
|
-
feeOutput,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
exports.toParameters = toParameters;
|
|
126
|
-
/**
|
|
127
|
-
* Translates a layout into OrdOutputs. Absent outputs are set to `null`.
|
|
128
|
-
*
|
|
129
|
-
* @param inscriptionInput
|
|
130
|
-
* @param layout
|
|
131
|
-
* @return OrdOutputs for layout
|
|
132
|
-
*/
|
|
133
|
-
function getOrdOutputsForLayout(inscriptionInput, layout) {
|
|
134
|
-
const outputs = inscriptionInput.splitAllWithParams(toArray(layout), { exact: true, allowZero: true });
|
|
135
|
-
if (outputs.length !== 4) {
|
|
136
|
-
throw new Error(`unexpected result`);
|
|
137
|
-
}
|
|
138
|
-
return toParameters(...outputs);
|
|
139
|
-
}
|
|
140
|
-
exports.getOrdOutputsForLayout = getOrdOutputsForLayout;
|
|
141
|
-
/**
|
|
142
|
-
* @param constraints
|
|
143
|
-
* @param inscriptionInput
|
|
144
|
-
* @param layout
|
|
145
|
-
* @return true iff layout satisfies constraints
|
|
146
|
-
*/
|
|
147
|
-
function check(constraints, inscriptionInput, layout) {
|
|
148
|
-
var _a;
|
|
149
|
-
if ((layout.firstChangeOutput === ZERO || constraints.minChangeOutput <= layout.firstChangeOutput) &&
|
|
150
|
-
(layout.secondChangeOutput === ZERO || constraints.minChangeOutput <= layout.secondChangeOutput) &&
|
|
151
|
-
constraints.minInscriptionOutput <= layout.inscriptionOutput &&
|
|
152
|
-
layout.inscriptionOutput <= constraints.maxInscriptionOutput &&
|
|
153
|
-
getFeeForOutputs(constraints, [layout.firstChangeOutput, layout.inscriptionOutput, layout.secondChangeOutput]) <=
|
|
154
|
-
layout.feeOutput &&
|
|
155
|
-
sum(toArray(layout)) === inscriptionInput.value) {
|
|
156
|
-
/* make sure inscription actually lies on the inscriptionOutput */
|
|
157
|
-
const outputs = getOrdOutputsForLayout(inscriptionInput, layout);
|
|
158
|
-
return ((_a = outputs.inscriptionOutput) === null || _a === void 0 ? void 0 : _a.ordinals.length) === 1;
|
|
159
|
-
}
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
function getFeeForOutputs(p, outputs) {
|
|
163
|
-
return outputs.reduce((sum, oValue) => sum + (oValue === ZERO ? ZERO : p.feePerOutput), p.feeFixed);
|
|
164
|
-
}
|
|
165
|
-
function getStartChangeOutput(c) {
|
|
166
|
-
// we don't need a change padding output
|
|
167
|
-
if (c.satPos < c.maxInscriptionOutput) {
|
|
168
|
-
return ZERO;
|
|
169
|
-
}
|
|
170
|
-
if (c.minChangeOutput <= c.satPos) {
|
|
171
|
-
return c.satPos;
|
|
172
|
-
}
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
function getInscriptionOutput(c, startChangeOutput) {
|
|
176
|
-
const result = min(c.maxInscriptionOutput, max(c.minInscriptionOutput, c.satPos - startChangeOutput + ONE));
|
|
177
|
-
if (c.satPos < startChangeOutput || startChangeOutput + result < c.satPos) {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
// if is not worth creating an end change output, let's maximize the inscription output
|
|
181
|
-
if (getEndChangeOutput(c, startChangeOutput, result) === ZERO) {
|
|
182
|
-
const remainder = c.total - startChangeOutput - getFeeForOutputs(c, [startChangeOutput, result]);
|
|
183
|
-
return min(remainder, c.maxInscriptionOutput);
|
|
184
|
-
}
|
|
185
|
-
return result;
|
|
186
|
-
}
|
|
187
|
-
function getEndChangeOutput(c, startChangeOutput, inscriptionOutput) {
|
|
188
|
-
const remainder = c.total - sum([startChangeOutput, inscriptionOutput]);
|
|
189
|
-
const minFeeWithoutSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput]);
|
|
190
|
-
const minFeeWithSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, c.minChangeOutput]);
|
|
191
|
-
if (remainder < minFeeWithoutSecondOutput) {
|
|
192
|
-
// We cannot even pay the fee for the output(s) we have so far.
|
|
193
|
-
return null;
|
|
194
|
-
}
|
|
195
|
-
if (remainder - minFeeWithSecondOutput < c.minChangeOutput) {
|
|
196
|
-
// The remainder is too small to pay for the end change output. Let's skip it and pay a higher fee.
|
|
197
|
-
return ZERO;
|
|
198
|
-
}
|
|
199
|
-
// let's use as much as we can for fee while leaving enough for fee
|
|
200
|
-
return remainder - minFeeWithSecondOutput;
|
|
201
|
-
}
|
|
202
|
-
function getFeeOutput(c, startChangeOutput, inscriptionOutput, endChangeOutput) {
|
|
203
|
-
const minFee = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, endChangeOutput]);
|
|
204
|
-
const remainder = c.total - sum([startChangeOutput, inscriptionOutput, endChangeOutput]);
|
|
205
|
-
if (remainder < minFee) {
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
return remainder;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* @param inscriptionInput
|
|
212
|
-
* @param search
|
|
213
|
-
* @return a solution that satisfies constraints. If no solution can be found, return `undefined`.
|
|
214
|
-
*/
|
|
215
|
-
function findOutputLayout(inscriptionInput, search) {
|
|
216
|
-
if (inscriptionInput.ordinals.length !== 1) {
|
|
217
|
-
throw new Error(`unexpected ordinal count`);
|
|
218
|
-
}
|
|
219
|
-
if (inscriptionInput.ordinals[0].size() !== ONE) {
|
|
220
|
-
throw new Error(`only single-satoshi inscriptions are supported`);
|
|
221
|
-
}
|
|
222
|
-
const satPos = inscriptionInput.ordinals[0].start;
|
|
223
|
-
const total = inscriptionInput.value;
|
|
224
|
-
const constraints = { ...search, satPos, total };
|
|
225
|
-
const startChangeOutput = getStartChangeOutput(constraints);
|
|
226
|
-
if (startChangeOutput === null) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
const inscriptionOutput = getInscriptionOutput(constraints, startChangeOutput);
|
|
230
|
-
if (inscriptionOutput === null) {
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const endChangeOutput = getEndChangeOutput(constraints, startChangeOutput, inscriptionOutput);
|
|
234
|
-
if (endChangeOutput === null) {
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
const feeOutput = getFeeOutput(constraints, startChangeOutput, inscriptionOutput, endChangeOutput);
|
|
238
|
-
if (feeOutput === null) {
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
const result = toParameters(startChangeOutput, inscriptionOutput, endChangeOutput, feeOutput);
|
|
242
|
-
if (!check(constraints, inscriptionInput, result)) {
|
|
243
|
-
throw new Error(`invalid result`);
|
|
244
|
-
}
|
|
245
|
-
return result;
|
|
246
|
-
}
|
|
247
|
-
exports.findOutputLayout = findOutputLayout;
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0TGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL091dHB1dExheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdHRzs7O0FBSUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0QixTQUFTLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxHQUFhO0lBQ3hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQWdCRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsT0FBTyxDQUFJLENBQWdCO0lBQ3pDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUZELDBCQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUMxQixpQkFBb0IsRUFDcEIsaUJBQW9C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RCxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRTtRQUM5QixPQUFPO0tBQ1I7SUFDRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9FLElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFO1FBQzlCLE9BQU87S0FDUjtJQUNELE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlGLElBQUksZUFBZSxLQUFLLElBQUksRUFBRTtRQUM1QixPQUFPO0tBQ1I7SUFDRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25HLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtRQUN0QixPQUFPO0tBQ1I7SUFDRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlGLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFO1FBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUNuQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFyQ0QsNENBcUNDIiwic291cmNlc0NvbnRlbnQiOlsiLypcblxuVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGNyZWF0aW5nIGFuIG91dHB1dCBsYXlvdXRzIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBwYXNzIG9uIGluc2NyaXB0aW9ucy5cblxuV2hlbiBwYXNzaW5nIG9uIGFuIGluc2NyaXB0aW9uLCB3ZSB3YW50IHRvIHNhdGlzZnkgYSBmZXcgY29uc3RyYWludHM6XG5cbiogQWxsIG91dHB1dHMgc2hvdWxkIGJlIGxhcmdlciB0aGFuIGEgbWluaW1hbCB2YWx1ZSAoZHVzdCBsaW1pdClcbiogVGhlIHN1bSBvZiBhbGwgb3V0cHV0IHZhbHVlcyBuZWVkcyB0byBiZSBsZXNzIHRoYW4gdGhlIGlucHV0IHRvIGNvdmVyIHRoZSB0cmFuc2FjdGlvbiBmZWUuXG4qIFRoZSBvdXRwdXQgY29udGFpbmluZyB0aGUgaW5zY3JpcHRpb24gc2hvdWxkIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCBidXQgbGFyZ2UgZW5vdWdoIHRvXG4gIGNvbnRhaW4gdGhlIGluc2NyaXB0aW9uLlxuXG5UbyBrZWVwIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgc21hbGwsIHdlIGNhbiBwYWQgdGhlIHNhdG9zaGkgcmFuZ2UgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHJhbmdlXG53aXRoIGNoYW5nZSBvdXRwdXRzLCB3aGljaCBoYXZlIGEgbWluaW1hbCBzaXplIGFuZCBpbmN1ciBhIGZlZSBjb3N0LlxuXG5cbkJyb2FkbHkgc3BlYWtpbmcsIHRoZXJlIGFyZSBmb3VyIHNjZW5hcmlvczpcblxuKDEpIFNtYWxsIGluc2NyaXB0aW9uIGlucHV0IHRoYXQgaGFzIGp1c3QgZW5vdWdoIHZhbHVlIHRvIHBheSBmb3IgZmVlIGFuZCBhIHNpbmdsZSBpbnNjcmlwdGlvblxuICAgIG91dHB1dCAodTApLiBObyBwYWRkaW5nIG91dHB1dHMuXG4gICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAg4pSCICAgICAgICDilIIgdTAgICAgIOKUglxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCIGZlZVxuICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuXG5cbigyKSBMYXJnZSBpbnNjcmlwdGlvbiBpbnB1dCB3aXRoIGluc2NyaXB0aW9uIGNsb3NlIHRvIHN0YXJ0IG9mIGlucHV0LlxuICAgIEluc2NyaXB0aW9uIG91dHB1dCBmb2xsb3dlZCBieSBjaGFuZ2Ugb3V0cHV0ICh1MSkgcGFkZGluZyB0aGUgcmVtYWluaW5nIHZhbHVlLlxuXG4gICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAg4pSCICAgICAgICDilIIgdTAgICAgIOKUglxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICAgIOKUgiAgICAgICAg4pSCIHUxICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgZmVlXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuXG4oMykgTGFyZ2UgaW5zY3JpcHRpb24gaW5wdXQgd2l0aCBpbnNjcmlwdGlvbiBjbG9zZSB0byBlbmQgb2YgaW5wdXQuXG4gICAgQ2hhbmdlIG91dHB1dCBwYWRkaW5nIHN0YXJ0IGZvbGxvd2VkIGJ5IGluc2NyaXB0aW9uIG91dHB1dC5cblxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICAg4pSCICAgICAgciDilLwgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCIHUxICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgZmVlXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuXG4oNCkgTGFyZ2UgaW5zY3JpcHRpb24gaW5wdXQgd2l0aCBpbnNjcmlwdGlvbiBpbiB0aGUgbWlkZGxlLlxuICAgIEluc2NyaXB0aW9uIGlucHV0ICh1MSkgd2l0aCBwYWRkaW5nIG9uIGJvdGggc2lkZXMgKHUwIGFuZCB1MilcblxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAgICDilIIgICAgICAgIOKUgiB1MSAgICAg4pSCXG4gICAg4pSCICAgICAgciDilLwgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICAg4pSCICAgICAgICDilIIgdTIgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiBmZWVcbiAgICDilIIgICAgICAgIOKUglxuICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICovXG5cbmltcG9ydCB7IE9yZE91dHB1dCB9IGZyb20gJy4vT3JkT3V0cHV0JztcblxuY29uc3QgWkVSTyA9IEJpZ0ludCgwKTtcbmNvbnN0IE9ORSA9IEJpZ0ludCgxKTtcblxuZnVuY3Rpb24gbWF4KGE6IGJpZ2ludCwgYjogYmlnaW50KTogYmlnaW50IHtcbiAgcmV0dXJuIGEgPCBiID8gYiA6IGE7XG59XG5cbmZ1bmN0aW9uIG1pbihhOiBiaWdpbnQsIGI6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIHJldHVybiBhIDwgYiA/IGEgOiBiO1xufVxuXG5mdW5jdGlvbiBzdW0oYXJyOiBiaWdpbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgWkVSTyk7XG59XG5cbi8qKlxuICogQSByYW5nZSBjb25zdHJhaW50XG4gKi9cbnR5cGUgUGFyYW1ldGVyczxUPiA9IHtcbiAgLyoqIFBhZGRpbmcgcHJlY2VkaW5nIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgKi9cbiAgZmlyc3RDaGFuZ2VPdXRwdXQ6IFQ7XG4gIC8qKiBUaGUgaW5zY3JpcHRpb24gb3V0cHV0IHRoYXQgd2lsbCBpbmhlcml0IHRoZSBpbnB1dCBpbnNjcmlwdGlvbiAqL1xuICBpbnNjcmlwdGlvbk91dHB1dDogVDtcbiAgLyoqIFBhZGRpbmcgZm9sbG93aW5nIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgKi9cbiAgc2Vjb25kQ2hhbmdlT3V0cHV0OiBUO1xuICAvKiogTm90IGEgcmVhbCBvdXRwdXQsIHVzZWQgb25seSB0byBzaW1wbGlmeSBjYWxjdWxhdGlvbnMgKi9cbiAgZmVlT3V0cHV0OiBUO1xufTtcblxuLyoqIEByZXR1cm4gY2Fub25pY2FsIHNlcXVlbmNlIG9mIHBhcmFtZXRlcnMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KHA6IFBhcmFtZXRlcnM8VD4pOiBbVCwgVCwgVCwgVF0ge1xuICByZXR1cm4gW3AuZmlyc3RDaGFuZ2VPdXRwdXQsIHAuaW5zY3JpcHRpb25PdXRwdXQsIHAuc2Vjb25kQ2hhbmdlT3V0cHV0LCBwLmZlZU91dHB1dF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhcmFtZXRlcnM8VD4oXG4gIGZpcnN0Q2hhbmdlT3V0cHV0OiBULFxuICBpbnNjcmlwdGlvbk91dHB1dDogVCxcbiAgc2Vjb25kQ2hhbmdlT3V0cHV0OiBULFxuICBmZWVPdXRwdXQ6IFRcbik6IFBhcmFtZXRlcnM8VD4ge1xuICByZXR1cm4ge1xuICAgIGZpcnN0Q2hhbmdlT3V0cHV0LFxuICAgIGluc2NyaXB0aW9uT3V0cHV0LFxuICAgIHNlY29uZENoYW5nZU91dHB1dCxcbiAgICBmZWVPdXRwdXQsXG4gIH07XG59XG5cbi8qKiBBIGZpbmlzaGVkIG91dHB1dCBsYXlvdXQgKi9cbmV4cG9ydCB0eXBlIE91dHB1dExheW91dCA9IFBhcmFtZXRlcnM8YmlnaW50PjtcblxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgbGF5b3V0IGludG8gT3JkT3V0cHV0cy4gQWJzZW50IG91dHB1dHMgYXJlIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIGluc2NyaXB0aW9uSW5wdXRcbiAqIEBwYXJhbSBsYXlvdXRcbiAqIEByZXR1cm4gT3JkT3V0cHV0cyBmb3IgbGF5b3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0KFxuICBpbnNjcmlwdGlvbklucHV0OiBPcmRPdXRwdXQsXG4gIGxheW91dDogT3V0cHV0TGF5b3V0XG4pOiBQYXJhbWV0ZXJzPE9yZE91dHB1dCB8IG51bGw+IHtcbiAgY29uc3Qgb3V0cHV0cyA9IGluc2NyaXB0aW9uSW5wdXQuc3BsaXRBbGxXaXRoUGFyYW1zKHRvQXJyYXkobGF5b3V0KSwgeyBleGFjdDogdHJ1ZSwgYWxsb3daZXJvOiB0cnVlIH0pO1xuICBpZiAob3V0cHV0cy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcmVzdWx0YCk7XG4gIH1cbiAgdHlwZSBUID0gT3JkT3V0cHV0IHwgbnVsbDtcbiAgcmV0dXJuIHRvUGFyYW1ldGVycyguLi4ob3V0cHV0cyBhcyBbVCwgVCwgVCwgVF0pKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqIEBwYXJhbSBpbnNjcmlwdGlvbklucHV0XG4gKiBAcGFyYW0gbGF5b3V0XG4gKiBAcmV0dXJuIHRydWUgaWZmIGxheW91dCBzYXRpc2ZpZXMgY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gY2hlY2soY29uc3RyYWludHM6IENvbnN0cmFpbnRzLCBpbnNjcmlwdGlvbklucHV0OiBPcmRPdXRwdXQsIGxheW91dDogT3V0cHV0TGF5b3V0KTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICAobGF5b3V0LmZpcnN0Q2hhbmdlT3V0cHV0ID09PSBaRVJPIHx8IGNvbnN0cmFpbnRzLm1pbkNoYW5nZU91dHB1dCA8PSBsYXlvdXQuZmlyc3RDaGFuZ2VPdXRwdXQpICYmXG4gICAgKGxheW91dC5zZWNvbmRDaGFuZ2VPdXRwdXQgPT09IFpFUk8gfHwgY29uc3RyYWludHMubWluQ2hhbmdlT3V0cHV0IDw9IGxheW91dC5zZWNvbmRDaGFuZ2VPdXRwdXQpICYmXG4gICAgY29uc3RyYWludHMubWluSW5zY3JpcHRpb25PdXRwdXQgPD0gbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0ICYmXG4gICAgbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0IDw9IGNvbnN0cmFpbnRzLm1heEluc2NyaXB0aW9uT3V0cHV0ICYmXG4gICAgZ2V0RmVlRm9yT3V0cHV0cyhjb25zdHJhaW50cywgW2xheW91dC5maXJzdENoYW5nZU91dHB1dCwgbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0LCBsYXlvdXQuc2Vjb25kQ2hhbmdlT3V0cHV0XSkgPD1cbiAgICAgIGxheW91dC5mZWVPdXRwdXQgJiZcbiAgICBzdW0odG9BcnJheShsYXlvdXQpKSA9PT0gaW5zY3JpcHRpb25JbnB1dC52YWx1ZVxuICApIHtcbiAgICAvKiBtYWtlIHN1cmUgaW5zY3JpcHRpb24gYWN0dWFsbHkgbGllcyBvbiB0aGUgaW5zY3JpcHRpb25PdXRwdXQgKi9cbiAgICBjb25zdCBvdXRwdXRzID0gZ2V0T3JkT3V0cHV0c0ZvckxheW91dChpbnNjcmlwdGlvbklucHV0LCBsYXlvdXQpO1xuICAgIHJldHVybiBvdXRwdXRzLmluc2NyaXB0aW9uT3V0cHV0Py5vcmRpbmFscy5sZW5ndGggPT09IDE7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSGlnaC1sZXZlbCBjb25zdHJhaW50cyBmb3Igb3V0cHV0IGxheW91dFxuICovXG5leHBvcnQgdHlwZSBDb25zdHJhaW50cyA9IHtcbiAgbWluQ2hhbmdlT3V0cHV0OiBiaWdpbnQ7XG4gIG1pbkluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQ7XG4gIG1heEluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQ7XG4gIGZlZUZpeGVkOiBiaWdpbnQ7XG4gIGZlZVBlck91dHB1dDogYmlnaW50O1xuICBzYXRQb3M6IGJpZ2ludDtcbiAgdG90YWw6IGJpZ2ludDtcbn07XG5cbmZ1bmN0aW9uIGdldEZlZUZvck91dHB1dHMocDogeyBmZWVQZXJPdXRwdXQ6IGJpZ2ludDsgZmVlRml4ZWQ6IGJpZ2ludCB9LCBvdXRwdXRzOiBiaWdpbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBvdXRwdXRzLnJlZHVjZSgoc3VtLCBvVmFsdWUpOiBiaWdpbnQgPT4gc3VtICsgKG9WYWx1ZSA9PT0gWkVSTyA/IFpFUk8gOiBwLmZlZVBlck91dHB1dCksIHAuZmVlRml4ZWQpO1xufVxuZnVuY3Rpb24gZ2V0U3RhcnRDaGFuZ2VPdXRwdXQoYzogQ29uc3RyYWludHMpOiBiaWdpbnQgfCBudWxsIHtcbiAgLy8gd2UgZG9uJ3QgbmVlZCBhIGNoYW5nZSBwYWRkaW5nIG91dHB1dFxuICBpZiAoYy5zYXRQb3MgPCBjLm1heEluc2NyaXB0aW9uT3V0cHV0KSB7XG4gICAgcmV0dXJuIFpFUk87XG4gIH1cbiAgaWYgKGMubWluQ2hhbmdlT3V0cHV0IDw9IGMuc2F0UG9zKSB7XG4gICAgcmV0dXJuIGMuc2F0UG9zO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRJbnNjcmlwdGlvbk91dHB1dChjOiBDb25zdHJhaW50cywgc3RhcnRDaGFuZ2VPdXRwdXQ6IGJpZ2ludCk6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCByZXN1bHQgPSBtaW4oYy5tYXhJbnNjcmlwdGlvbk91dHB1dCwgbWF4KGMubWluSW5zY3JpcHRpb25PdXRwdXQsIGMuc2F0UG9zIC0gc3RhcnRDaGFuZ2VPdXRwdXQgKyBPTkUpKTtcbiAgaWYgKGMuc2F0UG9zIDwgc3RhcnRDaGFuZ2VPdXRwdXQgfHwgc3RhcnRDaGFuZ2VPdXRwdXQgKyByZXN1bHQgPCBjLnNhdFBvcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGlmIGlzIG5vdCB3b3J0aCBjcmVhdGluZyBhbiBlbmQgY2hhbmdlIG91dHB1dCwgbGV0J3MgbWF4aW1pemUgdGhlIGluc2NyaXB0aW9uIG91dHB1dFxuICBpZiAoZ2V0RW5kQ2hhbmdlT3V0cHV0KGMsIHN0YXJ0Q2hhbmdlT3V0cHV0LCByZXN1bHQpID09PSBaRVJPKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gYy50b3RhbCAtIHN0YXJ0Q2hhbmdlT3V0cHV0IC0gZ2V0RmVlRm9yT3V0cHV0cyhjLCBbc3RhcnRDaGFuZ2VPdXRwdXQsIHJlc3VsdF0pO1xuICAgIHJldHVybiBtaW4ocmVtYWluZGVyLCBjLm1heEluc2NyaXB0aW9uT3V0cHV0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXRFbmRDaGFuZ2VPdXRwdXQoYzogQ29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0OiBiaWdpbnQsIGluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcmVtYWluZGVyID0gYy50b3RhbCAtIHN1bShbc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0XSk7XG4gIGNvbnN0IG1pbkZlZVdpdGhvdXRTZWNvbmRPdXRwdXQgPSBnZXRGZWVGb3JPdXRwdXRzKGMsIFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXRdKTtcbiAgY29uc3QgbWluRmVlV2l0aFNlY29uZE91dHB1dCA9IGdldEZlZUZvck91dHB1dHMoYywgW3N0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCwgYy5taW5DaGFuZ2VPdXRwdXRdKTtcbiAgaWYgKHJlbWFpbmRlciA8IG1pbkZlZVdpdGhvdXRTZWNvbmRPdXRwdXQpIHtcbiAgICAvLyBXZSBjYW5ub3QgZXZlbiBwYXkgdGhlIGZlZSBmb3IgdGhlIG91dHB1dChzKSB3ZSBoYXZlIHNvIGZhci5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocmVtYWluZGVyIC0gbWluRmVlV2l0aFNlY29uZE91dHB1dCA8IGMubWluQ2hhbmdlT3V0cHV0KSB7XG4gICAgLy8gVGhlIHJlbWFpbmRlciBpcyB0b28gc21hbGwgdG8gcGF5IGZvciB0aGUgZW5kIGNoYW5nZSBvdXRwdXQuIExldCdzIHNraXAgaXQgYW5kIHBheSBhIGhpZ2hlciBmZWUuXG4gICAgcmV0dXJuIFpFUk87XG4gIH1cbiAgLy8gbGV0J3MgdXNlIGFzIG11Y2ggYXMgd2UgY2FuIGZvciBmZWUgd2hpbGUgbGVhdmluZyBlbm91Z2ggZm9yIGZlZVxuICByZXR1cm4gcmVtYWluZGVyIC0gbWluRmVlV2l0aFNlY29uZE91dHB1dDtcbn1cblxuZnVuY3Rpb24gZ2V0RmVlT3V0cHV0KFxuICBjOiBDb25zdHJhaW50cyxcbiAgc3RhcnRDaGFuZ2VPdXRwdXQ6IGJpZ2ludCxcbiAgaW5zY3JpcHRpb25PdXRwdXQ6IGJpZ2ludCxcbiAgZW5kQ2hhbmdlT3V0cHV0OiBiaWdpbnRcbik6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCBtaW5GZWUgPSBnZXRGZWVGb3JPdXRwdXRzKGMsIFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGVuZENoYW5nZU91dHB1dF0pO1xuICBjb25zdCByZW1haW5kZXIgPSBjLnRvdGFsIC0gc3VtKFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGVuZENoYW5nZU91dHB1dF0pO1xuICBpZiAocmVtYWluZGVyIDwgbWluRmVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlbWFpbmRlcjtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25JbnB1dFxuICogQHBhcmFtIHNlYXJjaFxuICogQHJldHVybiBhIHNvbHV0aW9uIHRoYXQgc2F0aXNmaWVzIGNvbnN0cmFpbnRzLiBJZiBubyBzb2x1dGlvbiBjYW4gYmUgZm91bmQsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdXRwdXRMYXlvdXQoXG4gIGluc2NyaXB0aW9uSW5wdXQ6IE9yZE91dHB1dCxcbiAgc2VhcmNoOiBPbWl0PENvbnN0cmFpbnRzLCAnc2F0UG9zJyB8ICd0b3RhbCc+XG4pOiBPdXRwdXRMYXlvdXQgfCB1bmRlZmluZWQge1xuICBpZiAoaW5zY3JpcHRpb25JbnB1dC5vcmRpbmFscy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgb3JkaW5hbCBjb3VudGApO1xuICB9XG4gIGlmIChpbnNjcmlwdGlvbklucHV0Lm9yZGluYWxzWzBdLnNpemUoKSAhPT0gT05FKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBvbmx5IHNpbmdsZS1zYXRvc2hpIGluc2NyaXB0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBjb25zdCBzYXRQb3MgPSBpbnNjcmlwdGlvbklucHV0Lm9yZGluYWxzWzBdLnN0YXJ0O1xuICBjb25zdCB0b3RhbCA9IGluc2NyaXB0aW9uSW5wdXQudmFsdWU7XG5cbiAgY29uc3QgY29uc3RyYWludHM6IENvbnN0cmFpbnRzID0geyAuLi5zZWFyY2gsIHNhdFBvcywgdG90YWwgfTtcblxuICBjb25zdCBzdGFydENoYW5nZU91dHB1dCA9IGdldFN0YXJ0Q2hhbmdlT3V0cHV0KGNvbnN0cmFpbnRzKTtcbiAgaWYgKHN0YXJ0Q2hhbmdlT3V0cHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGluc2NyaXB0aW9uT3V0cHV0ID0gZ2V0SW5zY3JpcHRpb25PdXRwdXQoY29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0KTtcbiAgaWYgKGluc2NyaXB0aW9uT3V0cHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGVuZENoYW5nZU91dHB1dCA9IGdldEVuZENoYW5nZU91dHB1dChjb25zdHJhaW50cywgc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0KTtcbiAgaWYgKGVuZENoYW5nZU91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmZWVPdXRwdXQgPSBnZXRGZWVPdXRwdXQoY29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCwgZW5kQ2hhbmdlT3V0cHV0KTtcbiAgaWYgKGZlZU91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB0b1BhcmFtZXRlcnMoc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0LCBlbmRDaGFuZ2VPdXRwdXQsIGZlZU91dHB1dCk7XG4gIGlmICghY2hlY2soY29uc3RyYWludHMsIGluc2NyaXB0aW9uSW5wdXQsIHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgcmVzdWx0YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatPoint.d.ts","sourceRoot":"","sources":["../../src/SatPoint.ts"],"names":[],"mappings":"AAaA,oBAAY,QAAQ,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAEvD,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAiBzF;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAE1F;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,QAAQ,CAOnD"}
|
package/dist/src/SatPoint.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isSatPoint = exports.formatSatPoint = exports.parseSatPoint = void 0;
|
|
4
|
-
/*
|
|
5
|
-
|
|
6
|
-
https://github.com/casey/ord/blob/master/bip.mediawiki#terminology-and-notation
|
|
7
|
-
|
|
8
|
-
> A satpoint may be used to indicate the location of a sat within an output.
|
|
9
|
-
> A satpoint consists of an outpoint, i.e., a transaction ID and output index, with the addition of
|
|
10
|
-
> the offset of the ordinal within that output. For example, if the sat in question is at offset 6
|
|
11
|
-
> in the first output of a transaction, its satpoint is:
|
|
12
|
-
> `680df1e4d43016571e504b0b142ee43c5c0b83398a97bdcfd94ea6f287322d22:0:6`
|
|
13
|
-
|
|
14
|
-
*/
|
|
15
|
-
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
16
|
-
function parseSatPoint(p) {
|
|
17
|
-
const parts = p.split(':');
|
|
18
|
-
if (parts.length !== 3) {
|
|
19
|
-
throw new Error(`expected format txid:vout:sat`);
|
|
20
|
-
}
|
|
21
|
-
const [txid, vout, offsetStr] = parts;
|
|
22
|
-
const offset = BigInt(offsetStr);
|
|
23
|
-
if (offset.toString() !== offsetStr) {
|
|
24
|
-
throw new Error(`SatPoint offset must be base-10`);
|
|
25
|
-
}
|
|
26
|
-
if (offset < 0) {
|
|
27
|
-
throw new Error(`SatPoint offset must be positive`);
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
...utxo_lib_1.bitgo.parseOutputId([txid, vout].join(':')),
|
|
31
|
-
offset,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
exports.parseSatPoint = parseSatPoint;
|
|
35
|
-
function formatSatPoint(p) {
|
|
36
|
-
return `${p.txid}:${p.vout}:${p.offset}`;
|
|
37
|
-
}
|
|
38
|
-
exports.formatSatPoint = formatSatPoint;
|
|
39
|
-
function isSatPoint(v) {
|
|
40
|
-
try {
|
|
41
|
-
parseSatPoint(v);
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
exports.isSatPoint = isSatPoint;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2F0UG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2F0UG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7RUFVRTtBQUNGLG1EQUE2QztBQUk3QyxTQUFnQixhQUFhLENBQUMsQ0FBVztJQUN2QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0tBQ2xEO0lBQ0QsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0tBQ3BEO0lBQ0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsT0FBTztRQUNMLEdBQUcsZ0JBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQztBQWpCRCxzQ0FpQkM7QUFFRCxTQUFnQixjQUFjLENBQUMsQ0FBaUQ7SUFDOUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFXLENBQUM7QUFDcEQsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLENBQVM7SUFDbEMsSUFBSTtRQUNGLGFBQWEsQ0FBQyxDQUFhLENBQUMsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQztLQUNiO0lBQUMsTUFBTTtRQUNOLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDO0FBUEQsZ0NBT0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuXG5odHRwczovL2dpdGh1Yi5jb20vY2FzZXkvb3JkL2Jsb2IvbWFzdGVyL2JpcC5tZWRpYXdpa2kjdGVybWlub2xvZ3ktYW5kLW5vdGF0aW9uXG5cbj4gQSBzYXRwb2ludCBtYXkgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbG9jYXRpb24gb2YgYSBzYXQgd2l0aGluIGFuIG91dHB1dC5cbj4gQSBzYXRwb2ludCBjb25zaXN0cyBvZiBhbiBvdXRwb2ludCwgaS5lLiwgYSB0cmFuc2FjdGlvbiBJRCBhbmQgb3V0cHV0IGluZGV4LCB3aXRoIHRoZSBhZGRpdGlvbiBvZlxuPiB0aGUgb2Zmc2V0IG9mIHRoZSBvcmRpbmFsIHdpdGhpbiB0aGF0IG91dHB1dC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBzYXQgaW4gcXVlc3Rpb24gaXMgYXQgb2Zmc2V0IDZcbj4gaW4gdGhlIGZpcnN0IG91dHB1dCBvZiBhIHRyYW5zYWN0aW9uLCBpdHMgc2F0cG9pbnQgaXM6XG4+IGA2ODBkZjFlNGQ0MzAxNjU3MWU1MDRiMGIxNDJlZTQzYzVjMGI4MzM5OGE5N2JkY2ZkOTRlYTZmMjg3MzIyZDIyOjA6NmBcblxuKi9cbmltcG9ydCB7IGJpdGdvIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5leHBvcnQgdHlwZSBTYXRQb2ludCA9IGAke3N0cmluZ306JHtudW1iZXJ9OiR7YmlnaW50fWA7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhdFBvaW50KHA6IFNhdFBvaW50KTogeyB0eGlkOiBzdHJpbmc7IHZvdXQ6IG51bWJlcjsgb2Zmc2V0OiBiaWdpbnQgfSB7XG4gIGNvbnN0IHBhcnRzID0gcC5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBmb3JtYXQgdHhpZDp2b3V0OnNhdGApO1xuICB9XG4gIGNvbnN0IFt0eGlkLCB2b3V0LCBvZmZzZXRTdHJdID0gcGFydHM7XG4gIGNvbnN0IG9mZnNldCA9IEJpZ0ludChvZmZzZXRTdHIpO1xuICBpZiAob2Zmc2V0LnRvU3RyaW5nKCkgIT09IG9mZnNldFN0cikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2F0UG9pbnQgb2Zmc2V0IG11c3QgYmUgYmFzZS0xMGApO1xuICB9XG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTYXRQb2ludCBvZmZzZXQgbXVzdCBiZSBwb3NpdGl2ZWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uYml0Z28ucGFyc2VPdXRwdXRJZChbdHhpZCwgdm91dF0uam9pbignOicpKSxcbiAgICBvZmZzZXQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTYXRQb2ludChwOiB7IHR4aWQ6IHN0cmluZzsgdm91dDogbnVtYmVyOyBvZmZzZXQ6IGJpZ2ludCB9KTogU2F0UG9pbnQge1xuICByZXR1cm4gYCR7cC50eGlkfToke3Audm91dH06JHtwLm9mZnNldH1gIGFzIGNvbnN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTYXRQb2ludCh2OiBzdHJpbmcpOiB2IGlzIFNhdFBvaW50IHtcbiAgdHJ5IHtcbiAgICBwYXJzZVNhdFBvaW50KHYgYXMgU2F0UG9pbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|