@bitgo/utxo-bin 2.11.0 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/dist/bin/index.js +9 -2
- package/dist/src/InputParser.d.ts +44 -0
- package/dist/src/InputParser.d.ts.map +1 -0
- package/dist/src/InputParser.js +239 -0
- package/dist/src/OutputParser.d.ts +24 -0
- package/dist/src/OutputParser.d.ts.map +1 -0
- package/dist/src/OutputParser.js +52 -0
- package/dist/src/Parser.d.ts +7 -1
- package/dist/src/Parser.d.ts.map +1 -1
- package/dist/src/Parser.js +26 -2
- package/dist/src/ParserTx.d.ts +28 -0
- package/dist/src/ParserTx.d.ts.map +1 -0
- package/dist/src/ParserTx.js +94 -0
- package/dist/src/ScriptParser.d.ts +21 -0
- package/dist/src/ScriptParser.d.ts.map +1 -0
- package/dist/src/ScriptParser.js +77 -0
- package/dist/src/TxParser.d.ts +9 -6
- package/dist/src/TxParser.d.ts.map +1 -1
- package/dist/src/TxParser.js +21 -23
- package/dist/src/commands.d.ts +34 -2
- package/dist/src/commands.d.ts.map +1 -1
- package/dist/src/commands.js +102 -19
- package/dist/src/fetch.d.ts +4 -3
- package/dist/src/fetch.d.ts.map +1 -1
- package/dist/src/fetch.js +14 -3
- package/dist/src/format.d.ts +1 -1
- package/dist/src/format.d.ts.map +1 -1
- package/dist/src/format.js +14 -7
- package/dist/src/generateAddress.d.ts +11 -0
- package/dist/src/generateAddress.d.ts.map +1 -0
- package/dist/src/generateAddress.js +29 -0
- package/dist/src/parseString.d.ts +5 -0
- package/dist/src/parseString.d.ts.map +1 -0
- package/dist/src/parseString.js +29 -0
- package/dist/src/parseUnknown.d.ts +5 -0
- package/dist/src/parseUnknown.d.ts.map +1 -0
- package/dist/src/parseUnknown.js +50 -0
- package/dist/test/fixtures.d.ts +24 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +95 -0
- package/dist/test/parseAddress.d.ts +10 -0
- package/dist/test/parseAddress.d.ts.map +1 -0
- package/dist/test/parseAddress.js +87 -0
- package/dist/test/parseScript.d.ts +2 -0
- package/dist/test/parseScript.d.ts.map +1 -0
- package/dist/test/parseScript.js +38 -0
- package/dist/test/parseTransaction.d.ts +2 -0
- package/dist/test/parseTransaction.d.ts.map +1 -0
- package/dist/test/parseTransaction.js +66 -0
- package/dist/test/stringToBuffer.d.ts +2 -0
- package/dist/test/stringToBuffer.d.ts.map +1 -0
- package/dist/test/stringToBuffer.js +16 -0
- package/dist/tsconfig.tsbuildinfo +1 -5401
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -28,6 +28,7 @@ utxo-bin -n bitcoin parseTx --clipboard
|
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
#### From txid
|
|
31
|
+
|
|
31
32
|
```bash
|
|
32
33
|
utxo-bin -n bitcoin parseTx --txid b0b7e5c2fbbbeb42478f91e1c14b300624a9419631e70dd1564084fb28a55155
|
|
33
34
|
```
|
|
@@ -40,7 +41,6 @@ utxo-bin -n bitcoin parseTx \
|
|
|
40
41
|
--fetchInputs
|
|
41
42
|
```
|
|
42
43
|
|
|
43
|
-
|
|
44
44
|
## parseAddress
|
|
45
45
|
|
|
46
46
|
```
|
|
@@ -52,3 +52,11 @@ Convert to other networks:
|
|
|
52
52
|
```
|
|
53
53
|
utxo-bin -n bitcoin parseAddress 3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC --convert
|
|
54
54
|
```
|
|
55
|
+
|
|
56
|
+
## Generate addresses
|
|
57
|
+
```
|
|
58
|
+
utxo-bin generateAddresses \
|
|
59
|
+
--userKey xpub661MyMwAqRbcEvoSo4qrsT5xhByHzUoBjm88hdCPohF1rdQ4TkntuHfccN2N7FbmAmBgmaBxD7VY1QZ43YfgGRLBL37BBkBhYbezgnsPRVP \
|
|
60
|
+
--backupKey xpub661MyMwAqRbcF8Evdu2twZS3ELM8Wg6DqSrVR8GpvCeXMgj3rNPf4nasU1FBzX9yeWYTfyikk7rfuWS5FkMqGnh3HpxeeYtuQEx7FVq5FZa \
|
|
61
|
+
--bitgoKey xpub661MyMwAqRbcEnKX5fhLKdrixijBk4sYCZ7gQ1qRUmib2dXragQVAjv9GmXL4tusTKRwcrYAGrXGETFkFxKFSBCFUAuqdbdM9u2uyQtYkUW
|
|
62
|
+
```
|
package/dist/bin/index.js
CHANGED
|
@@ -3,5 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const yargs = require("yargs");
|
|
5
5
|
const commands_1 = require("../src/commands");
|
|
6
|
-
yargs
|
|
7
|
-
|
|
6
|
+
yargs
|
|
7
|
+
.command(commands_1.cmdParseTx)
|
|
8
|
+
.command(commands_1.cmdParseAddress)
|
|
9
|
+
.command(commands_1.cmdParseScript)
|
|
10
|
+
.command(commands_1.cmdGenerateAddress)
|
|
11
|
+
.demandCommand()
|
|
12
|
+
.help()
|
|
13
|
+
.parse();
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9iaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0JBQStCO0FBQy9CLDhDQUFrRztBQUVsRyxLQUFLO0tBQ0YsT0FBTyxDQUFDLHFCQUFVLENBQUM7S0FDbkIsT0FBTyxDQUFDLDBCQUFlLENBQUM7S0FDeEIsT0FBTyxDQUFDLHlCQUFjLENBQUM7S0FDdkIsT0FBTyxDQUFDLDZCQUFrQixDQUFDO0tBQzNCLGFBQWEsRUFBRTtLQUNmLElBQUksRUFBRTtLQUNOLEtBQUssRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0ICogYXMgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgY21kR2VuZXJhdGVBZGRyZXNzLCBjbWRQYXJzZUFkZHJlc3MsIGNtZFBhcnNlU2NyaXB0LCBjbWRQYXJzZVR4IH0gZnJvbSAnLi4vc3JjL2NvbW1hbmRzJztcblxueWFyZ3NcbiAgLmNvbW1hbmQoY21kUGFyc2VUeClcbiAgLmNvbW1hbmQoY21kUGFyc2VBZGRyZXNzKVxuICAuY29tbWFuZChjbWRQYXJzZVNjcmlwdClcbiAgLmNvbW1hbmQoY21kR2VuZXJhdGVBZGRyZXNzKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5oZWxwKClcbiAgLnBhcnNlKCk7XG4iXX0=
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
3
|
+
import { Parser, ParserNode } from './Parser';
|
|
4
|
+
import { ParserTx } from './ParserTx';
|
|
5
|
+
import { HollowSegwitSpend } from './hollowSegwitSpend';
|
|
6
|
+
import { ChainInfo } from './TxParser';
|
|
7
|
+
declare type ParsedSignatureScript = utxolib.bitgo.ParsedSignatureScriptP2ms | utxolib.bitgo.ParsedSignatureScriptP2shP2pk | utxolib.bitgo.ParsedSignatureScriptTaproot | utxolib.bitgo.ParsedPsbtP2ms | utxolib.bitgo.ParsedPsbtP2shP2pk | utxolib.bitgo.ParsedPsbtTaproot | HollowSegwitSpend;
|
|
8
|
+
export declare class InputParser extends Parser {
|
|
9
|
+
private txid;
|
|
10
|
+
private tx;
|
|
11
|
+
private inputIndex;
|
|
12
|
+
private chainInfo;
|
|
13
|
+
private params;
|
|
14
|
+
private input;
|
|
15
|
+
constructor(txid: string, tx: ParserTx, inputIndex: number, chainInfo: ChainInfo, params: {
|
|
16
|
+
parseOutputScript: boolean;
|
|
17
|
+
parseScriptAsm: boolean;
|
|
18
|
+
parseScriptData: boolean;
|
|
19
|
+
parseSignatureData: {
|
|
20
|
+
script: boolean;
|
|
21
|
+
ecdsa: boolean;
|
|
22
|
+
schnorr: boolean;
|
|
23
|
+
};
|
|
24
|
+
parseError?: 'throw' | 'continue';
|
|
25
|
+
});
|
|
26
|
+
parseScriptAsm(type: string, part: Buffer, i: number, n: number): string | undefined;
|
|
27
|
+
parseScriptParts(type: string, parts: Array<Buffer | number>): ParserNode[];
|
|
28
|
+
parseInputScript(buffer: Buffer | undefined): ParserNode;
|
|
29
|
+
parseWitness(script: Buffer[] | undefined): ParserNode;
|
|
30
|
+
parsePubkeys(parsed: ParsedSignatureScript): ParserNode;
|
|
31
|
+
parseSignatureBuffer(type: utxolib.bitgo.outputScripts.ScriptType2Of3 | utxolib.bitgo.ParsedScriptType2Of3 | utxolib.bitgo.outputScripts.ScriptTypeP2shP2pk, buf: Buffer | 0, signerIndex: number | undefined): ParserNode[];
|
|
32
|
+
parseSignaturesWithSigners(parsed: {
|
|
33
|
+
scriptType: utxolib.bitgo.outputScripts.ScriptType2Of3 | utxolib.bitgo.outputScripts.ScriptTypeP2shP2pk | utxolib.bitgo.ParsedScriptType2Of3;
|
|
34
|
+
signatures: (Buffer | 0)[];
|
|
35
|
+
}, signedByLabels: string[] | undefined, signerIndex: number[] | undefined): ParserNode[];
|
|
36
|
+
parseSignatures(parsed: ParsedSignatureScript): ParserNode;
|
|
37
|
+
parseSigScriptWithType(parsed: ParsedSignatureScript): ParserNode;
|
|
38
|
+
parseSigScript(): ParserNode;
|
|
39
|
+
parsePrevOut(prevOutput: utxolib.TxOutput<bigint> | utxolib.bitgo.PsbtInput): ParserNode[];
|
|
40
|
+
parsePsbtInput(input: utxolib.bitgo.PsbtInput): ParserNode[];
|
|
41
|
+
parseInput(): ParserNode;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=InputParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputParser.d.ts","sourceRoot":"","sources":["../../src/InputParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InputParser = void 0;
|
|
4
|
+
const utxolib = require("@bitgo/utxo-lib");
|
|
5
|
+
const Parser_1 = require("./Parser");
|
|
6
|
+
const ParserTx_1 = require("./ParserTx");
|
|
7
|
+
const hollowSegwitSpend_1 = require("./hollowSegwitSpend");
|
|
8
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
9
|
+
const ecdsa_1 = require("./ecdsa");
|
|
10
|
+
const OutputParser_1 = require("./OutputParser");
|
|
11
|
+
const parseUnknown_1 = require("./parseUnknown");
|
|
12
|
+
const ScriptParser_1 = require("./ScriptParser");
|
|
13
|
+
function getOutputId(v) {
|
|
14
|
+
return utxolib.bitgo.formatOutputId(utxolib.bitgo.getOutputIdForInput(v));
|
|
15
|
+
}
|
|
16
|
+
function parseSignatureScript(tx, inputIndex, network) {
|
|
17
|
+
if (tx instanceof utxolib.bitgo.UtxoTransaction) {
|
|
18
|
+
return (hollowSegwitSpend_1.parseHollowSegwitSpend(tx.ins[inputIndex], network) || utxolib.bitgo.parseSignatureScript(tx.ins[inputIndex]));
|
|
19
|
+
}
|
|
20
|
+
return utxolib.bitgo.parsePsbtInput(tx.data.inputs[inputIndex]);
|
|
21
|
+
}
|
|
22
|
+
function toBufferUInt32BE(n) {
|
|
23
|
+
const buf = Buffer.alloc(4);
|
|
24
|
+
buf.writeUInt32LE(n, 0);
|
|
25
|
+
return buf;
|
|
26
|
+
}
|
|
27
|
+
class InputParser extends Parser_1.Parser {
|
|
28
|
+
constructor(txid, tx, inputIndex, chainInfo, params) {
|
|
29
|
+
super({ parseError: params.parseError });
|
|
30
|
+
this.txid = txid;
|
|
31
|
+
this.tx = tx;
|
|
32
|
+
this.inputIndex = inputIndex;
|
|
33
|
+
this.chainInfo = chainInfo;
|
|
34
|
+
this.params = params;
|
|
35
|
+
if (tx instanceof utxolib.bitgo.UtxoTransaction) {
|
|
36
|
+
this.input = tx.ins[inputIndex];
|
|
37
|
+
}
|
|
38
|
+
else if (tx instanceof utxolib.bitgo.UtxoPsbt) {
|
|
39
|
+
this.input = tx.txInputs[inputIndex];
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new Error('unknown transaction type');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
parseScriptAsm(type, part, i, n) {
|
|
46
|
+
if ((type === 'taproot' && i === n - 2) ||
|
|
47
|
+
((type === 'scripthash' || type === 'witnessscripthash') && i === n - 1)) {
|
|
48
|
+
return ScriptParser_1.ScriptParser.toASM(part);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
parseScriptParts(type, parts) {
|
|
52
|
+
return parts.map((v, i) => {
|
|
53
|
+
let asmNode;
|
|
54
|
+
if (this.params.parseScriptAsm && Buffer.isBuffer(v)) {
|
|
55
|
+
const parsed = this.parseScriptAsm(type, v, i, parts.length);
|
|
56
|
+
asmNode = parsed ? this.node('asm', parsed) : undefined;
|
|
57
|
+
}
|
|
58
|
+
return this.node(i, this.params.parseScriptData ? v : undefined, asmNode ? [asmNode] : undefined);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
parseInputScript(buffer) {
|
|
62
|
+
var _a;
|
|
63
|
+
let value;
|
|
64
|
+
let nodes;
|
|
65
|
+
if (buffer && buffer.length && this.params.parseSignatureData.script) {
|
|
66
|
+
const type = (_a = utxolib.classify.input(buffer, true)) !== null && _a !== void 0 ? _a : 'unknown';
|
|
67
|
+
const decompiled = utxolib.script.decompile(buffer);
|
|
68
|
+
if (decompiled) {
|
|
69
|
+
nodes = this.parseScriptParts(type, decompiled);
|
|
70
|
+
}
|
|
71
|
+
value = type;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
value = buffer;
|
|
75
|
+
}
|
|
76
|
+
return this.node('scriptSig', value, nodes);
|
|
77
|
+
}
|
|
78
|
+
parseWitness(script) {
|
|
79
|
+
var _a;
|
|
80
|
+
if (!script || script.length === 0) {
|
|
81
|
+
return this.node('witness', '[]');
|
|
82
|
+
}
|
|
83
|
+
const type = (_a = utxolib.classify.witness(script, true)) !== null && _a !== void 0 ? _a : 'unknown';
|
|
84
|
+
return this.node('witness', type, this.params.parseScriptData ? this.parseScriptParts(type, script) : undefined);
|
|
85
|
+
}
|
|
86
|
+
parsePubkeys(parsed) {
|
|
87
|
+
if ('publicKeys' in parsed) {
|
|
88
|
+
return this.node('pubkeys', parsed.publicKeys.length, parsed.publicKeys.map((k, i) => this.node(i, k)));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
return this.node('pubkeys', '[]');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
parseSignatureBuffer(type, buf, signerIndex) {
|
|
95
|
+
if (buf === 0) {
|
|
96
|
+
return [this.node('type', 'placeholder (0)')];
|
|
97
|
+
}
|
|
98
|
+
const nodes = [this.node('bytes', buf)];
|
|
99
|
+
if (signerIndex !== undefined) {
|
|
100
|
+
nodes.push(this.node('valid', 0 <= signerIndex));
|
|
101
|
+
if (0 <= signerIndex) {
|
|
102
|
+
nodes.push(this.node('signedBy', ['user', 'backup', 'bitgo'][signerIndex]));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (type === 'taprootScriptPathSpend' || type === 'taprootKeyPathSpend') {
|
|
106
|
+
// TODO
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const { signature, hashType } = bitcoinjs_lib_1.ScriptSignature.decode(buf);
|
|
110
|
+
const r = signature.subarray(0, 32);
|
|
111
|
+
const s = signature.subarray(32);
|
|
112
|
+
if (r.length !== 32 || s.length !== 32) {
|
|
113
|
+
throw new Error(`invalid scalar length`);
|
|
114
|
+
}
|
|
115
|
+
nodes.push(this.node('isCanonical', bitcoinjs_lib_1.script.isCanonicalScriptSignature(buf)), this.node('hashType', hashType), this.node('r', r), this.node('s', s), this.node('highS', ecdsa_1.isHighS(s)));
|
|
116
|
+
}
|
|
117
|
+
return nodes;
|
|
118
|
+
}
|
|
119
|
+
parseSignaturesWithSigners(parsed, signedByLabels, signerIndex) {
|
|
120
|
+
const nodes = signedByLabels ? [this.node('signed by', `[${signedByLabels.join(', ')}]`)] : [];
|
|
121
|
+
if (this.params.parseSignatureData.ecdsa || this.params.parseSignatureData.schnorr) {
|
|
122
|
+
nodes.push(...parsed.signatures.map((s, i) => this.node(i, undefined, this.parseSignatureBuffer(parsed.scriptType, s, signerIndex ? signerIndex[i] : undefined))));
|
|
123
|
+
}
|
|
124
|
+
return nodes;
|
|
125
|
+
}
|
|
126
|
+
parseSignatures(parsed) {
|
|
127
|
+
var _a;
|
|
128
|
+
const nodes = [];
|
|
129
|
+
if ('signatures' in parsed &&
|
|
130
|
+
'publicKeys' in parsed &&
|
|
131
|
+
'scriptType' in parsed &&
|
|
132
|
+
parsed.signatures !== undefined &&
|
|
133
|
+
parsed.scriptType !== undefined) {
|
|
134
|
+
if (this.tx instanceof utxolib.bitgo.UtxoTransaction && this.chainInfo.prevOutputs) {
|
|
135
|
+
const signedBy = utxolib.bitgo.getSignaturesWithPublicKeys(this.tx, this.inputIndex, this.chainInfo.prevOutputs, parsed.publicKeys);
|
|
136
|
+
nodes.push(...this.parseSignaturesWithSigners(parsed, signedBy.flatMap((v, i) => (v ? [i.toString()] : [])), parsed.signatures.map((k) => (k === 0 ? -1 : signedBy.indexOf(k)))));
|
|
137
|
+
}
|
|
138
|
+
if (this.tx instanceof utxolib.bitgo.UtxoPsbt) {
|
|
139
|
+
let signedByLabels;
|
|
140
|
+
if (parsed.publicKeys && Array.isArray(parsed.publicKeys)) {
|
|
141
|
+
const psbt = this.tx;
|
|
142
|
+
signedByLabels = parsed.publicKeys.flatMap((k, i) => Buffer.isBuffer(k) && psbt.validateSignaturesOfInputCommon(this.inputIndex, k) ? [i.toString()] : []);
|
|
143
|
+
}
|
|
144
|
+
// TODO: the current UtxoPsbt API does not allow us to determine which signer created which signature
|
|
145
|
+
const signerIndex = undefined;
|
|
146
|
+
nodes.push(...this.parseSignaturesWithSigners(parsed, signedByLabels, signerIndex));
|
|
147
|
+
}
|
|
148
|
+
return this.node('signatures', parsed.signatures
|
|
149
|
+
.map((s) => utxolib.bitgo.isPlaceholderSignature(s) ? '[]' : Buffer.isBuffer(s) ? `[${s.length}byte]` : `[${s}]`)
|
|
150
|
+
.join(' '), nodes);
|
|
151
|
+
}
|
|
152
|
+
else if ('signatures' in parsed) {
|
|
153
|
+
return this.node('signatures', undefined, ((_a = parsed.signatures) !== null && _a !== void 0 ? _a : []).map((s, i) => this.node(i, s)));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
return this.node('signatures', undefined);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
parseSigScriptWithType(parsed) {
|
|
160
|
+
var _a;
|
|
161
|
+
if (parsed.scriptType &&
|
|
162
|
+
(utxolib.bitgo.outputScripts.isScriptType2Of3(parsed.scriptType) ||
|
|
163
|
+
parsed.scriptType === 'taprootScriptPathSpend' ||
|
|
164
|
+
parsed.scriptType === 'taprootKeyPathSpend')) {
|
|
165
|
+
return this.node('sigScript', parsed.scriptType, [this.parsePubkeys(parsed), this.parseSignatures(parsed)]);
|
|
166
|
+
}
|
|
167
|
+
if (parsed.scriptType === 'p2shP2wshHollow' || parsed.scriptType === 'p2shP2wpkhHollow') {
|
|
168
|
+
return this.node('sigScript', parsed.scriptType, [this.node('info', hollowSegwitSpend_1.getHollowSpendMessage())]);
|
|
169
|
+
}
|
|
170
|
+
return this.node('sigScript', (_a = parsed.scriptType) !== null && _a !== void 0 ? _a : 'unknown');
|
|
171
|
+
}
|
|
172
|
+
parseSigScript() {
|
|
173
|
+
try {
|
|
174
|
+
return this.parseSigScriptWithType(parseSignatureScript(this.tx, this.inputIndex, this.tx.network));
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
return this.handleParseError(e);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
parsePrevOut(prevOutput) {
|
|
181
|
+
let script;
|
|
182
|
+
let value;
|
|
183
|
+
if ('script' in prevOutput && prevOutput.script) {
|
|
184
|
+
({ script, value } = prevOutput);
|
|
185
|
+
}
|
|
186
|
+
else if ('witnessUtxo' in prevOutput || 'nonWitnessUtxo' in prevOutput) {
|
|
187
|
+
if (!(this.tx instanceof utxolib.bitgo.UtxoPsbt)) {
|
|
188
|
+
throw new Error('invalid state');
|
|
189
|
+
}
|
|
190
|
+
const result = ParserTx_1.getPrevOut(prevOutput, this.tx.txInputs[this.inputIndex], this.tx.network);
|
|
191
|
+
if (!result) {
|
|
192
|
+
return [this.node('script', 'unknown'), this.node('value', 'unknown')];
|
|
193
|
+
}
|
|
194
|
+
({ script, value } = result);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw new Error('invalid prevOutput');
|
|
198
|
+
}
|
|
199
|
+
let address;
|
|
200
|
+
try {
|
|
201
|
+
address = utxolib.address.fromOutputScript(script, this.tx.network);
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
address = '(error)';
|
|
205
|
+
}
|
|
206
|
+
return [
|
|
207
|
+
this.node('value', Number(value) / 1e8),
|
|
208
|
+
this.node('pubScript', script, address ? [this.node('address', address)] : undefined),
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
parsePsbtInput(input) {
|
|
212
|
+
return Object.entries({
|
|
213
|
+
musig2Participants: utxolib.bitgo.musig2.parsePsbtMusig2Participants(input),
|
|
214
|
+
musig2Nonces: utxolib.bitgo.musig2.parsePsbtMusig2Nonces(input),
|
|
215
|
+
musig2PartialSignatures: utxolib.bitgo.musig2.parsePsbtMusig2PartialSigs(input),
|
|
216
|
+
}).flatMap(([key, value]) => (value ? [parseUnknown_1.parseUnknown(this, key, value)] : []));
|
|
217
|
+
}
|
|
218
|
+
parseInput() {
|
|
219
|
+
var _a;
|
|
220
|
+
const psbtInput = this.tx instanceof utxolib.bitgo.UtxoPsbt ? this.tx.data.inputs[this.inputIndex] : undefined;
|
|
221
|
+
const { txid: prevTxid, vout, sequence, script, witness } = ParserTx_1.getParserTxInputProperties(this.input, psbtInput);
|
|
222
|
+
const prevOutput = (_a = this.chainInfo.prevOutputs) === null || _a === void 0 ? void 0 : _a[this.inputIndex];
|
|
223
|
+
return this.node(this.inputIndex, getOutputId(this.input), [
|
|
224
|
+
this.node('sequence', sequence === undefined ? undefined : toBufferUInt32BE(sequence)),
|
|
225
|
+
this.parseInputScript(script),
|
|
226
|
+
this.parseWitness(witness),
|
|
227
|
+
this.parseSigScript(),
|
|
228
|
+
...(psbtInput ? this.parsePrevOut(psbtInput) : []),
|
|
229
|
+
...(prevOutput
|
|
230
|
+
? new OutputParser_1.OutputParser(this.tx.network, prevTxid, vout, prevOutput, this.chainInfo, this.params).parseSpend({
|
|
231
|
+
conflict: true,
|
|
232
|
+
})
|
|
233
|
+
: []),
|
|
234
|
+
...(psbtInput ? this.parsePsbtInput(psbtInput) : []),
|
|
235
|
+
]);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
exports.InputParser = InputParser;
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXRQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvSW5wdXRQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTJDO0FBQzNDLHFDQUE4QztBQUM5Qyx5Q0FBNkY7QUFDN0YsMkRBQXVHO0FBQ3ZHLGlEQUF3RDtBQUN4RCxtQ0FBa0M7QUFFbEMsaURBQThDO0FBQzlDLGlEQUE4QztBQUM5QyxpREFBOEM7QUFXOUMsU0FBUyxXQUFXLENBQUMsQ0FBa0M7SUFDckQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsRUFBWSxFQUFFLFVBQWtCLEVBQUUsT0FBd0I7SUFDdEYsSUFBSSxFQUFFLFlBQVksT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7UUFDL0MsT0FBTyxDQUNMLDBDQUFzQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQzlHLENBQUM7S0FDSDtJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFTO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFB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VUFBVTtnQkFDWixDQUFDLENBQUMsSUFBSSwyQkFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQztvQkFDcEcsUUFBUSxFQUFFLElBQUk7aUJBQ2YsQ0FBQztnQkFDSixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3JELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXRTRCxrQ0FzU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBQYXJzZXIsIFBhcnNlck5vZGUgfSBmcm9tICcuL1BhcnNlcic7XG5pbXBvcnQgeyBnZXRQYXJzZXJUeElucHV0UHJvcGVydGllcywgZ2V0UHJldk91dCwgUGFyc2VyVHgsIFBhcnNlclR4SW5wdXQgfSBmcm9tICcuL1BhcnNlclR4JztcbmltcG9ydCB7IGdldEhvbGxvd1NwZW5kTWVzc2FnZSwgSG9sbG93U2Vnd2l0U3BlbmQsIHBhcnNlSG9sbG93U2Vnd2l0U3BlbmQgfSBmcm9tICcuL2hvbGxvd1NlZ3dpdFNwZW5kJztcbmltcG9ydCB7IHNjcmlwdCwgU2NyaXB0U2lnbmF0dXJlIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBpc0hpZ2hTIH0gZnJvbSAnLi9lY2RzYSc7XG5pbXBvcnQgeyBDaGFpbkluZm8gfSBmcm9tICcuL1R4UGFyc2VyJztcbmltcG9ydCB7IE91dHB1dFBhcnNlciB9IGZyb20gJy4vT3V0cHV0UGFyc2VyJztcbmltcG9ydCB7IHBhcnNlVW5rbm93biB9IGZyb20gJy4vcGFyc2VVbmtub3duJztcbmltcG9ydCB7IFNjcmlwdFBhcnNlciB9IGZyb20gJy4vU2NyaXB0UGFyc2VyJztcblxudHlwZSBQYXJzZWRTaWduYXR1cmVTY3JpcHQgPVxuICB8IHV0eG9saWIuYml0Z28uUGFyc2VkU2lnbmF0dXJlU2NyaXB0UDJtc1xuICB8IHV0eG9saWIuYml0Z28uUGFyc2VkU2lnbmF0dXJlU2NyaXB0UDJzaFAycGtcbiAgfCB1dHhvbGliLmJpdGdvLlBhcnNlZFNpZ25hdHVyZVNjcmlwdFRhcHJvb3RcbiAgfCB1dHhvbGliLmJpdGdvLlBhcnNlZFBzYnRQMm1zXG4gIHwgdXR4b2xpYi5iaXRnby5QYXJzZWRQc2J0UDJzaFAycGtcbiAgfCB1dHhvbGliLmJpdGdvLlBhcnNlZFBzYnRUYXByb290XG4gIHwgSG9sbG93U2Vnd2l0U3BlbmQ7XG5cbmZ1bmN0aW9uIGdldE91dHB1dElkKHY6IHsgaGFzaDogQnVmZmVyOyBpbmRleDogbnVtYmVyIH0pOiBzdHJpbmcge1xuICByZXR1cm4gdXR4b2xpYi5iaXRnby5mb3JtYXRPdXRwdXRJZCh1dHhvbGliLmJpdGdvLmdldE91dHB1dElkRm9ySW5wdXQodikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNpZ25hdHVyZVNjcmlwdCh0eDogUGFyc2VyVHgsIGlucHV0SW5kZXg6IG51bWJlciwgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogUGFyc2VkU2lnbmF0dXJlU2NyaXB0IHtcbiAgaWYgKHR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24pIHtcbiAgICByZXR1cm4gKFxuICAgICAgcGFyc2VIb2xsb3dTZWd3aXRTcGVuZCh0eC5pbnNbaW5wdXRJbmRleF0sIG5ldHdvcmspIHx8IHV0eG9saWIuYml0Z28ucGFyc2VTaWduYXR1cmVTY3JpcHQodHguaW5zW2lucHV0SW5kZXhdKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHV0eG9saWIuYml0Z28ucGFyc2VQc2J0SW5wdXQodHguZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0pO1xufVxuXG5mdW5jdGlvbiB0b0J1ZmZlclVJbnQzMkJFKG46IG51bWJlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgYnVmLndyaXRlVUludDMyTEUobiwgMCk7XG4gIHJldHVybiBidWY7XG59XG5cbmV4cG9ydCBjbGFzcyBJbnB1dFBhcnNlciBleHRlbmRzIFBhcnNlciB7XG4gIHByaXZhdGUgaW5wdXQ6IFBhcnNlclR4SW5wdXQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0eGlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSB0eDogUGFyc2VyVHgsXG4gICAgcHJpdmF0ZSBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBjaGFpbkluZm86IENoYWluSW5mbyxcbiAgICBwcml2YXRlIHBhcmFtczoge1xuICAgICAgcGFyc2VPdXRwdXRTY3JpcHQ6IGJvb2xlYW47XG4gICAgICBwYXJzZVNjcmlwdEFzbTogYm9vbGVhbjtcbiAgICAgIHBhcnNlU2NyaXB0RGF0YTogYm9vbGVhbjtcbiAgICAgIHBhcnNlU2lnbmF0dXJlRGF0YToge1xuICAgICAgICBzY3JpcHQ6IGJvb2xlYW47XG4gICAgICAgIGVjZHNhOiBib29sZWFuO1xuICAgICAgICBzY2hub3JyOiBib29sZWFuO1xuICAgICAgfTtcbiAgICAgIHBhcnNlRXJyb3I/OiAndGhyb3cnIHwgJ2NvbnRpbnVlJztcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKHsgcGFyc2VFcnJvcjogcGFyYW1zLnBhcnNlRXJyb3IgfSk7XG4gICAgaWYgKHR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRoaXMuaW5wdXQgPSB0eC5pbnNbaW5wdXRJbmRleF07XG4gICAgfSBlbHNlIGlmICh0eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpIHtcbiAgICAgIHRoaXMuaW5wdXQgPSB0eC50eElucHV0c1tpbnB1dEluZGV4XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZVNjcmlwdEFzbSh0eXBlOiBzdHJpbmcsIHBhcnQ6IEJ1ZmZlciwgaTogbnVtYmVyLCBuOiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChcbiAgICAgICh0eXBlID09PSAndGFwcm9vdCcgJiYgaSA9PT0gbiAtIDIpIHx8XG4gICAgICAoKHR5cGUgPT09ICdzY3JpcHRoYXNoJyB8fCB0eXBlID09PSAnd2l0bmVzc3NjcmlwdGhhc2gnKSAmJiBpID09PSBuIC0gMSlcbiAgICApIHtcbiAgICAgIHJldHVybiBTY3JpcHRQYXJzZXIudG9BU00ocGFydCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTY3JpcHRQYXJ0cyh0eXBlOiBzdHJpbmcsIHBhcnRzOiBBcnJheTxCdWZmZXIgfCBudW1iZXI+KTogUGFyc2VyTm9kZVtdIHtcbiAgICByZXR1cm4gcGFydHMubWFwKCh2LCBpKSA9PiB7XG4gICAgICBsZXQgYXNtTm9kZTogUGFyc2VyTm9kZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLnBhcmFtcy5wYXJzZVNjcmlwdEFzbSAmJiBCdWZmZXIuaXNCdWZmZXIodikpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNjcmlwdEFzbSh0eXBlLCB2LCBpLCBwYXJ0cy5sZW5ndGgpO1xuICAgICAgICBhc21Ob2RlID0gcGFyc2VkID8gdGhpcy5ub2RlKCdhc20nLCBwYXJzZWQpIDogdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ub2RlKGksIHRoaXMucGFyYW1zLnBhcnNlU2NyaXB0RGF0YSA/IHYgOiB1bmRlZmluZWQsIGFzbU5vZGUgPyBbYXNtTm9kZV0gOiB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcGFyc2VJbnB1dFNjcmlwdChidWZmZXI6IEJ1ZmZlciB8IHVuZGVmaW5lZCk6IFBhcnNlck5vZGUge1xuICAgIGxldCB2YWx1ZTtcbiAgICBsZXQgbm9kZXM7XG4gICAgaWYgKGJ1ZmZlciAmJiBidWZmZXIubGVuZ3RoICYmIHRoaXMucGFyYW1zLnBhcnNlU2lnbmF0dXJlRGF0YS5zY3JpcHQpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB1dHhvbGliLmNsYXNzaWZ5LmlucHV0KGJ1ZmZlciwgdHJ1ZSkgPz8gJ3Vua25vd24nO1xuICAgICAgY29uc3QgZGVjb21waWxlZCA9IHV0eG9saWIuc2NyaXB0LmRlY29tcGlsZShidWZmZXIpO1xuICAgICAgaWYgKGRlY29tcGlsZWQpIHtcbiAgICAgICAgbm9kZXMgPSB0aGlzLnBhcnNlU2NyaXB0UGFydHModHlwZSwgZGVjb21waWxlZCk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gYnVmZmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm5vZGUoJ3NjcmlwdFNpZycsIHZhbHVlLCBub2Rlcyk7XG4gIH1cblxuICBwYXJzZVdpdG5lc3Moc2NyaXB0OiBCdWZmZXJbXSB8IHVuZGVmaW5lZCk6IFBhcnNlck5vZGUge1xuICAgIGlmICghc2NyaXB0IHx8IHNjcmlwdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoJ3dpdG5lc3MnLCAnW10nKTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHV0eG9saWIuY2xhc3NpZnkud2l0bmVzcyhzY3JpcHQsIHRydWUpID8/ICd1bmtub3duJztcbiAgICByZXR1cm4gdGhpcy5ub2RlKCd3aXRuZXNzJywgdHlwZSwgdGhpcy5wYXJhbXMucGFyc2VTY3JpcHREYXRhID8gdGhpcy5wYXJzZVNjcmlwdFBhcnRzKHR5cGUsIHNjcmlwdCkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgcGFyc2VQdWJrZXlzKHBhcnNlZDogUGFyc2VkU2lnbmF0dXJlU2NyaXB0KTogUGFyc2VyTm9kZSB7XG4gICAgaWYgKCdwdWJsaWNLZXlzJyBpbiBwYXJzZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoXG4gICAgICAgICdwdWJrZXlzJyxcbiAgICAgICAgcGFyc2VkLnB1YmxpY0tleXMubGVuZ3RoLFxuICAgICAgICBwYXJzZWQucHVibGljS2V5cy5tYXAoKGssIGkpID0+IHRoaXMubm9kZShpLCBrKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoJ3B1YmtleXMnLCAnW10nKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZVNpZ25hdHVyZUJ1ZmZlcihcbiAgICB0eXBlOlxuICAgICAgfCB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjNcbiAgICAgIHwgdXR4b2xpYi5iaXRnby5QYXJzZWRTY3JpcHRUeXBlMk9mM1xuICAgICAgfCB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZVAyc2hQMnBrLFxuICAgIGJ1ZjogQnVmZmVyIHwgMCxcbiAgICBzaWduZXJJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICk6IFBhcnNlck5vZGVbXSB7XG4gICAgaWYgKGJ1ZiA9PT0gMCkge1xuICAgICAgcmV0dXJuIFt0aGlzLm5vZGUoJ3R5cGUnLCAncGxhY2Vob2xkZXIgKDApJyldO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gW3RoaXMubm9kZSgnYnl0ZXMnLCBidWYpXTtcbiAgICBpZiAoc2lnbmVySW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgbm9kZXMucHVzaCh0aGlzLm5vZGUoJ3ZhbGlkJywgMCA8PSBzaWduZXJJbmRleCkpO1xuICAgICAgaWYgKDAgPD0gc2lnbmVySW5kZXgpIHtcbiAgICAgICAgbm9kZXMucHVzaCh0aGlzLm5vZGUoJ3NpZ25lZEJ5JywgWyd1c2VyJywgJ2JhY2t1cCcsICdiaXRnbyddW3NpZ25lckluZGV4XSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcgfHwgdHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKSB7XG4gICAgICAvLyBUT0RPXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgc2lnbmF0dXJlLCBoYXNoVHlwZSB9ID0gU2NyaXB0U2lnbmF0dXJlLmRlY29kZShidWYpO1xuICAgICAgY29uc3QgciA9IHNpZ25hdHVyZS5zdWJhcnJheSgwLCAzMik7XG4gICAgICBjb25zdCBzID0gc2lnbmF0dXJlLnN1YmFycmF5KDMyKTtcblxuICAgICAgaWYgKHIubGVuZ3RoICE9PSAzMiB8fCBzLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNjYWxhciBsZW5ndGhgKTtcbiAgICAgIH1cblxuICAgICAgbm9kZXMucHVzaChcbiAgICAgICAgdGhpcy5ub2RlKCdpc0Nhbm9uaWNhbCcsIHNjcmlwdC5pc0Nhbm9uaWNhbFNjcmlwdFNpZ25hdHVyZShidWYpKSxcbiAgICAgICAgdGhpcy5ub2RlKCdoYXNoVHlwZScsIGhhc2hUeXBlKSxcbiAgICAgICAgdGhpcy5ub2RlKCdyJywgciksXG4gICAgICAgIHRoaXMubm9kZSgncycsIHMpLFxuICAgICAgICB0aGlzLm5vZGUoJ2hpZ2hTJywgaXNIaWdoUyhzKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgcGFyc2VTaWduYXR1cmVzV2l0aFNpZ25lcnMoXG4gICAgcGFyc2VkOiB7XG4gICAgICBzY3JpcHRUeXBlOlxuICAgICAgICB8IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mM1xuICAgICAgICB8IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlUDJzaFAycGtcbiAgICAgICAgfCB1dHhvbGliLmJpdGdvLlBhcnNlZFNjcmlwdFR5cGUyT2YzO1xuICAgICAgc2lnbmF0dXJlczogKEJ1ZmZlciB8IDApW107XG4gICAgfSxcbiAgICBzaWduZWRCeUxhYmVsczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgc2lnbmVySW5kZXg6IG51bWJlcltdIHwgdW5kZWZpbmVkXG4gICk6IFBhcnNlck5vZGVbXSB7XG4gICAgY29uc3Qgbm9kZXMgPSBzaWduZWRCeUxhYmVscyA/IFt0aGlzLm5vZGUoJ3NpZ25lZCBieScsIGBbJHtzaWduZWRCeUxhYmVscy5qb2luKCcsICcpfV1gKV0gOiBbXTtcbiAgICBpZiAodGhpcy5wYXJhbXMucGFyc2VTaWduYXR1cmVEYXRhLmVjZHNhIHx8IHRoaXMucGFyYW1zLnBhcnNlU2lnbmF0dXJlRGF0YS5zY2hub3JyKSB7XG4gICAgICBub2Rlcy5wdXNoKFxuICAgICAgICAuLi5wYXJzZWQuc2lnbmF0dXJlcy5tYXAoKHM6IEJ1ZmZlciB8IDAsIGk6IG51bWJlcikgPT5cbiAgICAgICAgICB0aGlzLm5vZGUoXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdGhpcy5wYXJzZVNpZ25hdHVyZUJ1ZmZlcihwYXJzZWQuc2NyaXB0VHlwZSwgcywgc2lnbmVySW5kZXggPyBzaWduZXJJbmRleFtpXSA6IHVuZGVmaW5lZClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG4gIHBhcnNlU2lnbmF0dXJlcyhwYXJzZWQ6IFBhcnNlZFNpZ25hdHVyZVNjcmlwdCk6IFBhcnNlck5vZGUge1xuICAgIGNvbnN0IG5vZGVzOiBQYXJzZXJOb2RlW10gPSBbXTtcbiAgICBpZiAoXG4gICAgICAnc2lnbmF0dXJlcycgaW4gcGFyc2VkICYmXG4gICAgICAncHVibGljS2V5cycgaW4gcGFyc2VkICYmXG4gICAgICAnc2NyaXB0VHlwZScgaW4gcGFyc2VkICYmXG4gICAgICBwYXJzZWQuc2lnbmF0dXJlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJzZWQuc2NyaXB0VHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy50eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uICYmIHRoaXMuY2hhaW5JbmZvLnByZXZPdXRwdXRzKSB7XG4gICAgICAgIGNvbnN0IHNpZ25lZEJ5ID0gdXR4b2xpYi5iaXRnby5nZXRTaWduYXR1cmVzV2l0aFB1YmxpY0tleXMoXG4gICAgICAgICAgdGhpcy50eCxcbiAgICAgICAgICB0aGlzLmlucHV0SW5kZXgsXG4gICAgICAgICAgdGhpcy5jaGFpbkluZm8ucHJldk91dHB1dHMsXG4gICAgICAgICAgcGFyc2VkLnB1YmxpY0tleXNcbiAgICAgICAgKTtcbiAgICAgICAgbm9kZXMucHVzaChcbiAgICAgICAgICAuLi50aGlzLnBhcnNlU2lnbmF0dXJlc1dpdGhTaWduZXJzKFxuICAgICAgICAgICAgcGFyc2VkLFxuICAgICAgICAgICAgc2lnbmVkQnkuZmxhdE1hcCgodiwgaSkgPT4gKHYgPyBbaS50b1N0cmluZygpXSA6IFtdKSksXG4gICAgICAgICAgICBwYXJzZWQuc2lnbmF0dXJlcy5tYXAoKGs6IEJ1ZmZlciB8IDApID0+IChrID09PSAwID8gLTEgOiBzaWduZWRCeS5pbmRleE9mKGspKSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpIHtcbiAgICAgICAgbGV0IHNpZ25lZEJ5TGFiZWxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHBhcnNlZC5wdWJsaWNLZXlzICYmIEFycmF5LmlzQXJyYXkocGFyc2VkLnB1YmxpY0tleXMpKSB7XG4gICAgICAgICAgY29uc3QgcHNidCA9IHRoaXMudHg7XG4gICAgICAgICAgc2lnbmVkQnlMYWJlbHMgPSBwYXJzZWQucHVibGljS2V5cy5mbGF0TWFwKChrOiBCdWZmZXIsIGkpID0+XG4gICAgICAgICAgICBCdWZmZXIuaXNCdWZmZXIoaykgJiYgcHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKHRoaXMuaW5wdXRJbmRleCwgaykgPyBbaS50b1N0cmluZygpXSA6IFtdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiB0aGUgY3VycmVudCBVdHhvUHNidCBBUEkgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpZ25lciBjcmVhdGVkIHdoaWNoIHNpZ25hdHVyZVxuICAgICAgICBjb25zdCBzaWduZXJJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbm9kZXMucHVzaCguLi50aGlzLnBhcnNlU2lnbmF0dXJlc1dpdGhTaWduZXJzKHBhcnNlZCwgc2lnbmVkQnlMYWJlbHMsIHNpZ25lckluZGV4KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKFxuICAgICAgICAnc2lnbmF0dXJlcycsXG4gICAgICAgIHBhcnNlZC5zaWduYXR1cmVzXG4gICAgICAgICAgLm1hcCgoczogQnVmZmVyIHwgMCkgPT5cbiAgICAgICAgICAgIHV0eG9saWIuYml0Z28uaXNQbGFjZWhvbGRlclNpZ25hdHVyZShzKSA/ICdbXScgOiBCdWZmZXIuaXNCdWZmZXIocykgPyBgWyR7cy5sZW5ndGh9Ynl0ZV1gIDogYFske3N9XWBcbiAgICAgICAgICApXG4gICAgICAgICAgLmpvaW4oJyAnKSxcbiAgICAgICAgbm9kZXNcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICgnc2lnbmF0dXJlcycgaW4gcGFyc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKFxuICAgICAgICAnc2lnbmF0dXJlcycsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgKHBhcnNlZC5zaWduYXR1cmVzID8/IFtdKS5tYXAoKHM6IEJ1ZmZlciB8IDAsIGk6IG51bWJlcikgPT4gdGhpcy5ub2RlKGksIHMpKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZSgnc2lnbmF0dXJlcycsIHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTaWdTY3JpcHRXaXRoVHlwZShwYXJzZWQ6IFBhcnNlZFNpZ25hdHVyZVNjcmlwdCk6IFBhcnNlck5vZGUge1xuICAgIGlmIChcbiAgICAgIHBhcnNlZC5zY3JpcHRUeXBlICYmXG4gICAgICAodXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmlzU2NyaXB0VHlwZTJPZjMocGFyc2VkLnNjcmlwdFR5cGUpIHx8XG4gICAgICAgIHBhcnNlZC5zY3JpcHRUeXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcgfHxcbiAgICAgICAgcGFyc2VkLnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJylcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUoJ3NpZ1NjcmlwdCcsIHBhcnNlZC5zY3JpcHRUeXBlLCBbdGhpcy5wYXJzZVB1YmtleXMocGFyc2VkKSwgdGhpcy5wYXJzZVNpZ25hdHVyZXMocGFyc2VkKV0pO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaEhvbGxvdycgfHwgcGFyc2VkLnNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3cGtoSG9sbG93Jykge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZSgnc2lnU2NyaXB0JywgcGFyc2VkLnNjcmlwdFR5cGUsIFt0aGlzLm5vZGUoJ2luZm8nLCBnZXRIb2xsb3dTcGVuZE1lc3NhZ2UoKSldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ub2RlKCdzaWdTY3JpcHQnLCBwYXJzZWQuc2NyaXB0VHlwZSA/PyAndW5rbm93bicpO1xuICB9XG5cbiAgcGFyc2VTaWdTY3JpcHQoKTogUGFyc2VyTm9kZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlU2lnU2NyaXB0V2l0aFR5cGUocGFyc2VTaWduYXR1cmVTY3JpcHQodGhpcy50eCwgdGhpcy5pbnB1dEluZGV4LCB0aGlzLnR4Lm5ldHdvcmspKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVQYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlUHJldk91dChwcmV2T3V0cHV0OiB1dHhvbGliLlR4T3V0cHV0PGJpZ2ludD4gfCB1dHhvbGliLmJpdGdvLlBzYnRJbnB1dCk6IFBhcnNlck5vZGVbXSB7XG4gICAgbGV0IHNjcmlwdDogQnVmZmVyO1xuICAgIGxldCB2YWx1ZTogYmlnaW50O1xuICAgIGlmICgnc2NyaXB0JyBpbiBwcmV2T3V0cHV0ICYmIHByZXZPdXRwdXQuc2NyaXB0KSB7XG4gICAgICAoeyBzY3JpcHQsIHZhbHVlIH0gPSBwcmV2T3V0cHV0KTtcbiAgICB9IGVsc2UgaWYgKCd3aXRuZXNzVXR4bycgaW4gcHJldk91dHB1dCB8fCAnbm9uV2l0bmVzc1V0eG8nIGluIHByZXZPdXRwdXQpIHtcbiAgICAgIGlmICghKHRoaXMudHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFByZXZPdXQocHJldk91dHB1dCwgdGhpcy50eC50eElucHV0c1t0aGlzLmlucHV0SW5kZXhdLCB0aGlzLnR4Lm5ldHdvcmspO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5vZGUoJ3NjcmlwdCcsICd1bmtub3duJyksIHRoaXMubm9kZSgndmFsdWUnLCAndW5rbm93bicpXTtcbiAgICAgIH1cbiAgICAgICh7IHNjcmlwdCwgdmFsdWUgfSA9IHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2T3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgbGV0IGFkZHJlc3M7XG4gICAgdHJ5IHtcbiAgICAgIGFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChzY3JpcHQsIHRoaXMudHgubmV0d29yayk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYWRkcmVzcyA9ICcoZXJyb3IpJztcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubm9kZSgndmFsdWUnLCBOdW1iZXIodmFsdWUpIC8gMWU4KSxcbiAgICAgIHRoaXMubm9kZSgncHViU2NyaXB0Jywgc2NyaXB0LCBhZGRyZXNzID8gW3RoaXMubm9kZSgnYWRkcmVzcycsIGFkZHJlc3MpXSA6IHVuZGVmaW5lZCksXG4gICAgXTtcbiAgfVxuXG4gIHBhcnNlUHNidElucHV0KGlucHV0OiB1dHhvbGliLmJpdGdvLlBzYnRJbnB1dCk6IFBhcnNlck5vZGVbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHtcbiAgICAgIG11c2lnMlBhcnRpY2lwYW50czogdXR4b2xpYi5iaXRnby5tdXNpZzIucGFyc2VQc2J0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0KSxcbiAgICAgIG11c2lnMk5vbmNlczogdXR4b2xpYi5iaXRnby5tdXNpZzIucGFyc2VQc2J0TXVzaWcyTm9uY2VzKGlucHV0KSxcbiAgICAgIG11c2lnMlBhcnRpYWxTaWduYXR1cmVzOiB1dHhvbGliLmJpdGdvLm11c2lnMi5wYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCksXG4gICAgfSkuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiAodmFsdWUgPyBbcGFyc2VVbmtub3duKHRoaXMsIGtleSwgdmFsdWUpXSA6IFtdKSk7XG4gIH1cblxuICBwYXJzZUlucHV0KCk6IFBhcnNlck5vZGUge1xuICAgIGNvbnN0IHBzYnRJbnB1dCA9IHRoaXMudHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ID8gdGhpcy50eC5kYXRhLmlucHV0c1t0aGlzLmlucHV0SW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgdHhpZDogcHJldlR4aWQsIHZvdXQsIHNlcXVlbmNlLCBzY3JpcHQsIHdpdG5lc3MgfSA9IGdldFBhcnNlclR4SW5wdXRQcm9wZXJ0aWVzKHRoaXMuaW5wdXQsIHBzYnRJbnB1dCk7XG4gICAgY29uc3QgcHJldk91dHB1dCA9IHRoaXMuY2hhaW5JbmZvLnByZXZPdXRwdXRzPy5bdGhpcy5pbnB1dEluZGV4XTtcbiAgICByZXR1cm4gdGhpcy5ub2RlKHRoaXMuaW5wdXRJbmRleCwgZ2V0T3V0cHV0SWQodGhpcy5pbnB1dCksIFtcbiAgICAgIHRoaXMubm9kZSgnc2VxdWVuY2UnLCBzZXF1ZW5jZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9CdWZmZXJVSW50MzJCRShzZXF1ZW5jZSkpLFxuICAgICAgdGhpcy5wYXJzZUlucHV0U2NyaXB0KHNjcmlwdCksXG4gICAgICB0aGlzLnBhcnNlV2l0bmVzcyh3aXRuZXNzKSxcbiAgICAgIHRoaXMucGFyc2VTaWdTY3JpcHQoKSxcbiAgICAgIC4uLihwc2J0SW5wdXQgPyB0aGlzLnBhcnNlUHJldk91dChwc2J0SW5wdXQpIDogW10pLFxuICAgICAgLi4uKHByZXZPdXRwdXRcbiAgICAgICAgPyBuZXcgT3V0cHV0UGFyc2VyKHRoaXMudHgubmV0d29yaywgcHJldlR4aWQsIHZvdXQsIHByZXZPdXRwdXQsIHRoaXMuY2hhaW5JbmZvLCB0aGlzLnBhcmFtcykucGFyc2VTcGVuZCh7XG4gICAgICAgICAgICBjb25mbGljdDogdHJ1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihwc2J0SW5wdXQgPyB0aGlzLnBhcnNlUHNidElucHV0KHBzYnRJbnB1dCkgOiBbXSksXG4gICAgXSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ChainInfo } from './TxParser';
|
|
3
|
+
import { Parser, ParserNode } from './Parser';
|
|
4
|
+
import { Network } from '@bitgo/utxo-lib';
|
|
5
|
+
export declare class OutputParser extends Parser {
|
|
6
|
+
private network;
|
|
7
|
+
private txid;
|
|
8
|
+
private outputIndex;
|
|
9
|
+
private output;
|
|
10
|
+
private chainInfo;
|
|
11
|
+
private params;
|
|
12
|
+
constructor(network: Network, txid: string, outputIndex: number, output: {
|
|
13
|
+
script: Buffer;
|
|
14
|
+
value: bigint;
|
|
15
|
+
}, chainInfo: ChainInfo, params: {
|
|
16
|
+
parseOutputScript: boolean;
|
|
17
|
+
parseError?: 'throw' | 'continue';
|
|
18
|
+
});
|
|
19
|
+
parseSpend(params: {
|
|
20
|
+
conflict: boolean;
|
|
21
|
+
}): ParserNode[];
|
|
22
|
+
parseOutput(): ParserNode;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=OutputParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputParser.d.ts","sourceRoot":"","sources":["../../src/OutputParser.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,qBAAa,YAAa,SAAQ,MAAM;IAEpC,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;gBALN,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EACzC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE;QACd,iBAAiB,EAAE,OAAO,CAAC;QAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;KACnC;IAKH,UAAU,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU,EAAE;IAgBvD,WAAW,IAAI,UAAU;CAkB1B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OutputParser = void 0;
|
|
4
|
+
const utxolib = require("@bitgo/utxo-lib");
|
|
5
|
+
const Parser_1 = require("./Parser");
|
|
6
|
+
const AddressParser_1 = require("./AddressParser");
|
|
7
|
+
const format_1 = require("./format");
|
|
8
|
+
class OutputParser extends Parser_1.Parser {
|
|
9
|
+
constructor(network, txid, outputIndex, output, chainInfo, params) {
|
|
10
|
+
super(params);
|
|
11
|
+
this.network = network;
|
|
12
|
+
this.txid = txid;
|
|
13
|
+
this.outputIndex = outputIndex;
|
|
14
|
+
this.output = output;
|
|
15
|
+
this.chainInfo = chainInfo;
|
|
16
|
+
this.params = params;
|
|
17
|
+
}
|
|
18
|
+
parseSpend(params) {
|
|
19
|
+
if (!this.chainInfo.prevOutputSpends || !this.chainInfo.prevOutputSpends[this.outputIndex]) {
|
|
20
|
+
// no spend data available
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const spend = this.chainInfo.prevOutputSpends[this.outputIndex];
|
|
24
|
+
if (spend.txid === undefined) {
|
|
25
|
+
return [this.node('spent', false)];
|
|
26
|
+
}
|
|
27
|
+
if (spend.txid === this.txid) {
|
|
28
|
+
// if input is spent by this transaction we don't display it
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
return [this.node('spent', `${spend.txid}:${spend.vin}`, params.conflict ? [this.node('conflict', true)] : [])];
|
|
32
|
+
}
|
|
33
|
+
parseOutput() {
|
|
34
|
+
let address;
|
|
35
|
+
try {
|
|
36
|
+
address = utxolib.address.fromOutputScript(this.output.script, this.network);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
// ignore
|
|
40
|
+
}
|
|
41
|
+
const addressParser = new AddressParser_1.AddressParser({ network: this.network, all: false, convert: false });
|
|
42
|
+
return this.node(this.outputIndex, address !== null && address !== void 0 ? address : '(no address)', [
|
|
43
|
+
this.node(`value`, format_1.formatSat(this.output.value)),
|
|
44
|
+
...(this.params.parseOutputScript || address === undefined
|
|
45
|
+
? addressParser.parseOutputScript(this.output.script)
|
|
46
|
+
: []),
|
|
47
|
+
...this.parseSpend({ conflict: false }),
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.OutputParser = OutputParser;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0UGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL091dHB1dFBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBMkM7QUFFM0MscUNBQThDO0FBQzlDLG1EQUFnRDtBQUNoRCxxQ0FBcUM7QUFHckMsTUFBYSxZQUFhLFNBQVEsZUFBTTtJQUN0QyxZQUNVLE9BQWdCLEVBQ2hCLElBQVksRUFDWixXQUFtQixFQUNuQixNQUF5QyxFQUN6QyxTQUFvQixFQUNwQixNQUdQO1FBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBVk4sWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBbUM7UUFDekMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixXQUFNLEdBQU4sTUFBTSxDQUdiO0lBR0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUE2QjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzFGLDBCQUEwQjtZQUMxQixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEUsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzVCLDREQUE0RDtZQUM1RCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxPQUFPLENBQUM7UUFDWixJQUFJO1lBQ0YsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixTQUFTO1NBQ1Y7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLDZCQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRS9GLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLGNBQWMsRUFBRTtZQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxrQkFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksT0FBTyxLQUFLLFNBQVM7Z0JBQ3hELENBQUMsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDeEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBakRELG9DQWlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IENoYWluSW5mbyB9IGZyb20gJy4vVHhQYXJzZXInO1xuaW1wb3J0IHsgUGFyc2VyLCBQYXJzZXJOb2RlIH0gZnJvbSAnLi9QYXJzZXInO1xuaW1wb3J0IHsgQWRkcmVzc1BhcnNlciB9IGZyb20gJy4vQWRkcmVzc1BhcnNlcic7XG5pbXBvcnQgeyBmb3JtYXRTYXQgfSBmcm9tICcuL2Zvcm1hdCc7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuZXhwb3J0IGNsYXNzIE91dHB1dFBhcnNlciBleHRlbmRzIFBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmV0d29yazogTmV0d29yayxcbiAgICBwcml2YXRlIHR4aWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIG91dHB1dEluZGV4OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBvdXRwdXQ6IHsgc2NyaXB0OiBCdWZmZXI7IHZhbHVlOiBiaWdpbnQgfSxcbiAgICBwcml2YXRlIGNoYWluSW5mbzogQ2hhaW5JbmZvLFxuICAgIHByaXZhdGUgcGFyYW1zOiB7XG4gICAgICBwYXJzZU91dHB1dFNjcmlwdDogYm9vbGVhbjtcbiAgICAgIHBhcnNlRXJyb3I/OiAndGhyb3cnIHwgJ2NvbnRpbnVlJztcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKHBhcmFtcyk7XG4gIH1cblxuICBwYXJzZVNwZW5kKHBhcmFtczogeyBjb25mbGljdDogYm9vbGVhbiB9KTogUGFyc2VyTm9kZVtdIHtcbiAgICBpZiAoIXRoaXMuY2hhaW5JbmZvLnByZXZPdXRwdXRTcGVuZHMgfHwgIXRoaXMuY2hhaW5JbmZvLnByZXZPdXRwdXRTcGVuZHNbdGhpcy5vdXRwdXRJbmRleF0pIHtcbiAgICAgIC8vIG5vIHNwZW5kIGRhdGEgYXZhaWxhYmxlXG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHNwZW5kID0gdGhpcy5jaGFpbkluZm8ucHJldk91dHB1dFNwZW5kc1t0aGlzLm91dHB1dEluZGV4XTtcbiAgICBpZiAoc3BlbmQudHhpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gW3RoaXMubm9kZSgnc3BlbnQnLCBmYWxzZSldO1xuICAgIH1cbiAgICBpZiAoc3BlbmQudHhpZCA9PT0gdGhpcy50eGlkKSB7XG4gICAgICAvLyBpZiBpbnB1dCBpcyBzcGVudCBieSB0aGlzIHRyYW5zYWN0aW9uIHdlIGRvbid0IGRpc3BsYXkgaXRcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLm5vZGUoJ3NwZW50JywgYCR7c3BlbmQudHhpZH06JHtzcGVuZC52aW59YCwgcGFyYW1zLmNvbmZsaWN0ID8gW3RoaXMubm9kZSgnY29uZmxpY3QnLCB0cnVlKV0gOiBbXSldO1xuICB9XG5cbiAgcGFyc2VPdXRwdXQoKTogUGFyc2VyTm9kZSB7XG4gICAgbGV0IGFkZHJlc3M7XG4gICAgdHJ5IHtcbiAgICAgIGFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdCh0aGlzLm91dHB1dC5zY3JpcHQsIHRoaXMubmV0d29yayk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzc1BhcnNlciA9IG5ldyBBZGRyZXNzUGFyc2VyKHsgbmV0d29yazogdGhpcy5uZXR3b3JrLCBhbGw6IGZhbHNlLCBjb252ZXJ0OiBmYWxzZSB9KTtcblxuICAgIHJldHVybiB0aGlzLm5vZGUodGhpcy5vdXRwdXRJbmRleCwgYWRkcmVzcyA/PyAnKG5vIGFkZHJlc3MpJywgW1xuICAgICAgdGhpcy5ub2RlKGB2YWx1ZWAsIGZvcm1hdFNhdCh0aGlzLm91dHB1dC52YWx1ZSkpLFxuICAgICAgLi4uKHRoaXMucGFyYW1zLnBhcnNlT3V0cHV0U2NyaXB0IHx8IGFkZHJlc3MgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGFkZHJlc3NQYXJzZXIucGFyc2VPdXRwdXRTY3JpcHQodGhpcy5vdXRwdXQuc2NyaXB0KVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLnRoaXMucGFyc2VTcGVuZCh7IGNvbmZsaWN0OiBmYWxzZSB9KSxcbiAgICBdKTtcbiAgfVxufVxuIl19
|
package/dist/src/Parser.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
export declare type ParserNodeValue = number | string | Buffer | boolean | undefined | null;
|
|
2
|
+
export declare type ParserNodeValue = number | bigint | string | Buffer | boolean | undefined | null;
|
|
3
|
+
export declare function isParserNodeValue(v: unknown): v is ParserNodeValue;
|
|
3
4
|
export declare type ParserNode = {
|
|
4
5
|
type: 'node';
|
|
5
6
|
label: string;
|
|
@@ -7,6 +8,11 @@ export declare type ParserNode = {
|
|
|
7
8
|
nodes: ParserNode[] | undefined;
|
|
8
9
|
};
|
|
9
10
|
export declare class Parser {
|
|
11
|
+
parseError: 'throw' | 'continue';
|
|
12
|
+
constructor(params?: {
|
|
13
|
+
parseError?: 'throw' | 'continue';
|
|
14
|
+
});
|
|
10
15
|
node(label: string | number, value: ParserNodeValue, nodes?: ParserNode[]): ParserNode;
|
|
16
|
+
handleParseError(e: unknown): ParserNode;
|
|
11
17
|
}
|
|
12
18
|
//# sourceMappingURL=Parser.d.ts.map
|
package/dist/src/Parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":";AAAA,oBAAY,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":";AAAA,oBAAY,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;AAE7F,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,eAAe,CAYlE;AAED,oBAAY,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,qBAAa,MAAM;IACjB,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;gBACrB,MAAM,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;KAAO;IAG9D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,GAAE,UAAU,EAAO,GAAG,UAAU;IAS1F,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU;CAMzC"}
|
package/dist/src/Parser.js
CHANGED
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Parser = void 0;
|
|
3
|
+
exports.Parser = exports.isParserNodeValue = void 0;
|
|
4
|
+
function isParserNodeValue(v) {
|
|
5
|
+
switch (typeof v) {
|
|
6
|
+
case 'undefined':
|
|
7
|
+
case 'boolean':
|
|
8
|
+
case 'number':
|
|
9
|
+
case 'string':
|
|
10
|
+
case 'bigint':
|
|
11
|
+
return true;
|
|
12
|
+
case 'object':
|
|
13
|
+
return v === null || Buffer.isBuffer(v);
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
exports.isParserNodeValue = isParserNodeValue;
|
|
4
18
|
class Parser {
|
|
19
|
+
constructor(params = {}) {
|
|
20
|
+
var _a;
|
|
21
|
+
this.parseError = (_a = params.parseError) !== null && _a !== void 0 ? _a : 'continue';
|
|
22
|
+
}
|
|
5
23
|
node(label, value, nodes = []) {
|
|
6
24
|
return {
|
|
7
25
|
type: 'node',
|
|
@@ -10,6 +28,12 @@ class Parser {
|
|
|
10
28
|
nodes,
|
|
11
29
|
};
|
|
12
30
|
}
|
|
31
|
+
handleParseError(e) {
|
|
32
|
+
if (this.parseError === 'throw') {
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
return this.node('error', String(e));
|
|
36
|
+
}
|
|
13
37
|
}
|
|
14
38
|
exports.Parser = Parser;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxTQUFnQixpQkFBaUIsQ0FBQyxDQUFVO0lBQzFDLFFBQVEsT0FBTyxDQUFDLEVBQUU7UUFDaEIsS0FBSyxXQUFXLENBQUM7UUFDakIsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssUUFBUSxDQUFDO1FBQ2QsS0FBSyxRQUFRO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLFFBQVE7WUFDWCxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMzQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVpELDhDQVlDO0FBU0QsTUFBYSxNQUFNO0lBRWpCLFlBQVksU0FBZ0QsRUFBRTs7UUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFBLE1BQU0sQ0FBQyxVQUFVLG1DQUFJLFVBQVUsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQXNCLEVBQUUsS0FBc0IsRUFBRSxRQUFzQixFQUFFO1FBQzNFLE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3BCLEtBQUs7WUFDTCxLQUFLO1NBQ04sQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxDQUFVO1FBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPLEVBQUU7WUFDL0IsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBcEJELHdCQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFBhcnNlck5vZGVWYWx1ZSA9IG51bWJlciB8IGJpZ2ludCB8IHN0cmluZyB8IEJ1ZmZlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzZXJOb2RlVmFsdWUodjogdW5rbm93bik6IHYgaXMgUGFyc2VyTm9kZVZhbHVlIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIHYgPT09IG51bGwgfHwgQnVmZmVyLmlzQnVmZmVyKHYpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgUGFyc2VyTm9kZSA9IHtcbiAgdHlwZTogJ25vZGUnO1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogUGFyc2VyTm9kZVZhbHVlIHwgdW5kZWZpbmVkO1xuICBub2RlczogUGFyc2VyTm9kZVtdIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhcnNlciB7XG4gIHBhcnNlRXJyb3I6ICd0aHJvdycgfCAnY29udGludWUnO1xuICBjb25zdHJ1Y3RvcihwYXJhbXM6IHsgcGFyc2VFcnJvcj86ICd0aHJvdycgfCAnY29udGludWUnIH0gPSB7fSkge1xuICAgIHRoaXMucGFyc2VFcnJvciA9IHBhcmFtcy5wYXJzZUVycm9yID8/ICdjb250aW51ZSc7XG4gIH1cbiAgbm9kZShsYWJlbDogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogUGFyc2VyTm9kZVZhbHVlLCBub2RlczogUGFyc2VyTm9kZVtdID0gW10pOiBQYXJzZXJOb2RlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ25vZGUnLFxuICAgICAgbGFiZWw6IFN0cmluZyhsYWJlbCksXG4gICAgICB2YWx1ZSxcbiAgICAgIG5vZGVzLFxuICAgIH07XG4gIH1cblxuICBoYW5kbGVQYXJzZUVycm9yKGU6IHVua25vd24pOiBQYXJzZXJOb2RlIHtcbiAgICBpZiAodGhpcy5wYXJzZUVycm9yID09PSAndGhyb3cnKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ub2RlKCdlcnJvcicsIFN0cmluZyhlKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
3
|
+
export declare type ParserTx = utxolib.bitgo.UtxoTransaction<bigint> | utxolib.bitgo.UtxoPsbt;
|
|
4
|
+
export declare type ParserTxInput = utxolib.TxInput | utxolib.PsbtTxInput;
|
|
5
|
+
export declare type ParserTxOutput = utxolib.TxOutput<bigint> | utxolib.PsbtTxOutput;
|
|
6
|
+
export declare function getPrevOut(prevOutput: utxolib.bitgo.PsbtInput, prevOutpoint: utxolib.PsbtTxInput | number, network: utxolib.Network): {
|
|
7
|
+
value: bigint;
|
|
8
|
+
script: Buffer;
|
|
9
|
+
} | undefined;
|
|
10
|
+
export declare function getParserTxProperties(tx: ParserTx, prevOutputs: utxolib.TxOutput<bigint>[] | undefined): {
|
|
11
|
+
format: 'network' | 'legacy' | 'psbt';
|
|
12
|
+
complete: boolean;
|
|
13
|
+
id: string;
|
|
14
|
+
weight: number;
|
|
15
|
+
inputs: ParserTxInput[];
|
|
16
|
+
outputs: ParserTxOutput[];
|
|
17
|
+
outputSum: bigint;
|
|
18
|
+
inputSum: bigint | undefined;
|
|
19
|
+
hasWitnesses: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare function getParserTxInputProperties(input: ParserTxInput, prevOut?: utxolib.bitgo.PsbtInput): {
|
|
22
|
+
txid: string;
|
|
23
|
+
vout: number;
|
|
24
|
+
sequence?: number;
|
|
25
|
+
script?: Buffer;
|
|
26
|
+
witness?: Buffer[];
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=ParserTx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParserTx.d.ts","sourceRoot":"","sources":["../../src/ParserTx.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAE3C,oBAAY,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;AACtF,oBAAY,aAAa,GACrB,OAAO,CAAC,OAAO,GACf,OAAO,CAAC,WAAW,CAAuD;AAC9E,oBAAY,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;AAE7E,wBAAgB,UAAU,CACxB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EACnC,YAAY,EAAE,OAAO,CAAC,WAAW,GAAG,MAAM,EAC1C,OAAO,EAAE,OAAO,CAAC,OAAO,GAEtB;IACE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GACD,SAAS,CAWZ;AAMD,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,EACZ,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,GAClD;IACD,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;CACvB,CAwDA;AACD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,GAChC;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAqBA"}
|