@witnet/sdk 1.0.0-beta.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/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/package.json +72 -0
- package/dist/src/bin/helpers.d.ts +91 -0
- package/dist/src/bin/helpers.d.ts.map +1 -0
- package/dist/src/bin/helpers.js +816 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +47 -0
- package/dist/src/lib/crypto/account.d.ts +32 -0
- package/dist/src/lib/crypto/account.d.ts.map +1 -0
- package/dist/src/lib/crypto/account.js +106 -0
- package/dist/src/lib/crypto/coinbase.d.ts +10 -0
- package/dist/src/lib/crypto/coinbase.d.ts.map +1 -0
- package/dist/src/lib/crypto/coinbase.js +28 -0
- package/dist/src/lib/crypto/index.d.ts +8 -0
- package/dist/src/lib/crypto/index.d.ts.map +1 -0
- package/dist/src/lib/crypto/index.js +30 -0
- package/dist/src/lib/crypto/interfaces.d.ts +85 -0
- package/dist/src/lib/crypto/interfaces.d.ts.map +1 -0
- package/dist/src/lib/crypto/interfaces.js +3 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +55 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.js +339 -0
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts +28 -0
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/StakePayload.js +142 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +36 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.js +154 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +25 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +128 -0
- package/dist/src/lib/crypto/payloads.d.ts +57 -0
- package/dist/src/lib/crypto/payloads.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads.js +170 -0
- package/dist/src/lib/crypto/signer.d.ts +33 -0
- package/dist/src/lib/crypto/signer.d.ts.map +1 -0
- package/dist/src/lib/crypto/signer.js +194 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +15 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.js +23 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +12 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.js +17 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +18 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +53 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +11 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.js +16 -0
- package/dist/src/lib/crypto/transmitters.d.ts +47 -0
- package/dist/src/lib/crypto/transmitters.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters.js +416 -0
- package/dist/src/lib/crypto/types.d.ts +161 -0
- package/dist/src/lib/crypto/types.d.ts.map +1 -0
- package/dist/src/lib/crypto/types.js +273 -0
- package/dist/src/lib/crypto/utils.d.ts +21 -0
- package/dist/src/lib/crypto/utils.d.ts.map +1 -0
- package/dist/src/lib/crypto/utils.js +156 -0
- package/dist/src/lib/crypto/wallet.d.ts +120 -0
- package/dist/src/lib/crypto/wallet.d.ts.map +1 -0
- package/dist/src/lib/crypto/wallet.js +258 -0
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +44 -0
- package/dist/src/lib/radon/ccdr/eth.d.ts +160 -0
- package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/eth.js +272 -0
- package/dist/src/lib/radon/ccdr/index.d.ts +14 -0
- package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/index.js +39 -0
- package/dist/src/lib/radon/ccdr/wit.d.ts +23 -0
- package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/wit.js +35 -0
- package/dist/src/lib/radon/filters.d.ts +14 -0
- package/dist/src/lib/radon/filters.d.ts.map +1 -0
- package/dist/src/lib/radon/filters.js +45 -0
- package/dist/src/lib/radon/index.d.ts +296 -0
- package/dist/src/lib/radon/index.d.ts.map +1 -0
- package/dist/src/lib/radon/index.js +707 -0
- package/dist/src/lib/radon/reducers.d.ts +29 -0
- package/dist/src/lib/radon/reducers.d.ts.map +1 -0
- package/dist/src/lib/radon/reducers.js +66 -0
- package/dist/src/lib/radon/types.d.ts +521 -0
- package/dist/src/lib/radon/types.d.ts.map +1 -0
- package/dist/src/lib/radon/types.js +936 -0
- package/dist/src/lib/radon/utils.d.ts +53 -0
- package/dist/src/lib/radon/utils.d.ts.map +1 -0
- package/dist/src/lib/radon/utils.js +153 -0
- package/dist/src/lib/rpc/index.d.ts +3 -0
- package/dist/src/lib/rpc/index.d.ts.map +1 -0
- package/dist/src/lib/rpc/index.js +19 -0
- package/dist/src/lib/rpc/nodes.d.ts +40 -0
- package/dist/src/lib/rpc/nodes.d.ts.map +1 -0
- package/dist/src/lib/rpc/nodes.js +293 -0
- package/dist/src/lib/rpc/provider.d.ts +88 -0
- package/dist/src/lib/rpc/provider.d.ts.map +1 -0
- package/dist/src/lib/rpc/provider.js +336 -0
- package/dist/src/lib/rpc/reporter.d.ts +18 -0
- package/dist/src/lib/rpc/reporter.d.ts.map +1 -0
- package/dist/src/lib/rpc/reporter.js +30 -0
- package/dist/src/lib/rpc/types.d.ts +409 -0
- package/dist/src/lib/rpc/types.d.ts.map +1 -0
- package/dist/src/lib/rpc/types.js +81 -0
- package/dist/src/lib/types.d.ts +18 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +7 -0
- package/dist/src/lib/utils.d.ts +13 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +97 -0
- package/dist/witnet/assets/index.d.ts +30 -0
- package/dist/witnet/assets/index.d.ts.map +1 -0
- package/dist/witnet/assets/index.js +6 -0
- package/dist/witnet/assets/modals/index.d.ts +18 -0
- package/dist/witnet/assets/modals/index.d.ts.map +1 -0
- package/dist/witnet/assets/modals/index.js +21 -0
- package/dist/witnet/assets/modals/web3/eth.d.ts +5 -0
- package/dist/witnet/assets/modals/web3/eth.d.ts.map +1 -0
- package/dist/witnet/assets/modals/web3/eth.js +26 -0
- package/dist/witnet/assets/modals/web3/wit.d.ts +4 -0
- package/dist/witnet/assets/modals/web3/wit.d.ts.map +1 -0
- package/dist/witnet/assets/modals/web3/wit.js +20 -0
- package/dist/witnet/assets/requests.d.ts +11 -0
- package/dist/witnet/assets/requests.d.ts.map +1 -0
- package/dist/witnet/assets/requests.js +88 -0
- package/dist/witnet/witnet.proto.json +1325 -0
- package/package.json +72 -0
- package/src/bin/cli/history.js +31 -0
- package/src/bin/cli/inspect.js +359 -0
- package/src/bin/cli/network.js +592 -0
- package/src/bin/cli/nodes.js +364 -0
- package/src/bin/cli/radon.js +814 -0
- package/src/bin/cli/wallet.js +1000 -0
- package/src/bin/helpers.js +829 -0
- package/src/bin/postinstall.js +9 -0
- package/src/bin/toolkit.js +294 -0
- package/witnet/assets/_index.js +8 -0
- package/witnet/assets/_requests.js +25 -0
- package/witnet/assets/_sources.js +36 -0
- package/witnet/assets/_templates.js +36 -0
- package/witnet/assets/index.js +4 -0
- package/witnet/assets/modals/index.js +25 -0
- package/witnet/assets/modals/web3/btc.js +0 -0
- package/witnet/assets/modals/web3/eth.js +29 -0
- package/witnet/assets/modals/web3/sol.js +0 -0
- package/witnet/assets/modals/web3/wit.js +23 -0
- package/witnet/assets/requests.js +94 -0
- package/witnet/witnet.proto.json +1325 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseXprv = exports.BigMath = exports.Signature = exports.RecoverableSignature = exports.PublicKeyHash = exports.PublicKey = exports.bech32 = void 0;
|
|
4
|
+
exports.decipherXprv = decipherXprv;
|
|
5
|
+
exports.selectUtxos = selectUtxos;
|
|
6
|
+
exports.sha256 = sha256;
|
|
7
|
+
exports.totalCoins = totalCoins;
|
|
8
|
+
const secp256k1 = require("secp256k1");
|
|
9
|
+
const bech32_1 = require("bech32");
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
11
|
+
const types_1 = require("./types");
|
|
12
|
+
var bech32_2 = require("bech32");
|
|
13
|
+
Object.defineProperty(exports, "bech32", { enumerable: true, get: function () { return bech32_2.bech32; } });
|
|
14
|
+
var types_2 = require("./types");
|
|
15
|
+
Object.defineProperty(exports, "PublicKey", { enumerable: true, get: function () { return types_2.PublicKey; } });
|
|
16
|
+
Object.defineProperty(exports, "PublicKeyHash", { enumerable: true, get: function () { return types_2.PublicKeyHash; } });
|
|
17
|
+
Object.defineProperty(exports, "RecoverableSignature", { enumerable: true, get: function () { return types_2.RecoverableSignature; } });
|
|
18
|
+
Object.defineProperty(exports, "Signature", { enumerable: true, get: function () { return types_2.Signature; } });
|
|
19
|
+
exports.BigMath = {
|
|
20
|
+
max(value, ...values) {
|
|
21
|
+
for (const v of values)
|
|
22
|
+
if (v > value)
|
|
23
|
+
value = v;
|
|
24
|
+
return value;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const CHAIN_CODE_LENGTH = 32;
|
|
28
|
+
const DEPTH_LENGTH = 1;
|
|
29
|
+
const KEY_LENGTH = 33;
|
|
30
|
+
const KEY_PATH_LENGTH = 4;
|
|
31
|
+
const BECH32_LIMIT = (DEPTH_LENGTH
|
|
32
|
+
+ ((Math.pow(256, DEPTH_LENGTH) - 1) * KEY_PATH_LENGTH)
|
|
33
|
+
+ CHAIN_CODE_LENGTH
|
|
34
|
+
+ KEY_LENGTH);
|
|
35
|
+
const getExpectedDataLength = (depth) => (DEPTH_LENGTH
|
|
36
|
+
+ depth * KEY_PATH_LENGTH
|
|
37
|
+
+ CHAIN_CODE_LENGTH
|
|
38
|
+
+ KEY_LENGTH);
|
|
39
|
+
function decipherXprv(slip32, passwd) {
|
|
40
|
+
const { prefix, words } = bech32_1.bech32.decode(slip32, BECH32_LIMIT);
|
|
41
|
+
if (prefix !== "xprv") {
|
|
42
|
+
throw Error(`Invalid XPRV header: "${prefix}" != "xprv"`);
|
|
43
|
+
}
|
|
44
|
+
const buffer = new Uint8Array(bech32_1.bech32.fromWords(words)).buffer;
|
|
45
|
+
const iv = buffer.slice(0, 16);
|
|
46
|
+
const salt = buffer.slice(16, 48);
|
|
47
|
+
const data = buffer.slice(48);
|
|
48
|
+
const key = (0, crypto_1.pbkdf2Sync)(passwd, Buffer.from(salt), 10000, 32, 'sha256');
|
|
49
|
+
const decipher = (0, crypto_1.createDecipheriv)("aes-256-cbc", key, Buffer.from(iv));
|
|
50
|
+
let decrypted = decipher.update(Buffer.from(data), undefined, 'utf-8');
|
|
51
|
+
decrypted += decipher.final('utf-8');
|
|
52
|
+
return decrypted;
|
|
53
|
+
}
|
|
54
|
+
const parseXprv = (slip32) => {
|
|
55
|
+
// decode slip32 string
|
|
56
|
+
const { prefix, words } = bech32_1.bech32.decode(slip32, BECH32_LIMIT);
|
|
57
|
+
const bytes = bech32_1.bech32.fromWords(words);
|
|
58
|
+
// check prefix
|
|
59
|
+
if (prefix !== "xprv") {
|
|
60
|
+
throw Error(`Invalid XPRV: bad header: "${prefix}" != "xprv"`);
|
|
61
|
+
}
|
|
62
|
+
// check expected data length
|
|
63
|
+
const depth = bytes[0];
|
|
64
|
+
if (depth !== 0) {
|
|
65
|
+
throw Error(`Invalid XPRV: not a master private key (depth: ${depth})`);
|
|
66
|
+
}
|
|
67
|
+
const expectedLength = getExpectedDataLength(depth);
|
|
68
|
+
if (bytes.length !== expectedLength) {
|
|
69
|
+
throw Error("Invalid XPRV: bad data length"
|
|
70
|
+
+ `(expected: ${expectedLength}, was: ${bytes.length}`);
|
|
71
|
+
}
|
|
72
|
+
const buffer = new Uint8Array(bytes).buffer;
|
|
73
|
+
// extract key path (32-bit unsigned integers, big endian)
|
|
74
|
+
const keyPath = [];
|
|
75
|
+
const keyPathView = new DataView(buffer, DEPTH_LENGTH, depth * KEY_PATH_LENGTH);
|
|
76
|
+
for (let i = 0; i < depth; i++) {
|
|
77
|
+
keyPath.push((keyPathView.getUint32(i * KEY_PATH_LENGTH, false)));
|
|
78
|
+
}
|
|
79
|
+
// extract chain code
|
|
80
|
+
const chainCode = new Uint8Array(CHAIN_CODE_LENGTH);
|
|
81
|
+
const chainCodeOffset = DEPTH_LENGTH + depth * KEY_PATH_LENGTH;
|
|
82
|
+
const chainCodeView = new DataView(buffer, chainCodeOffset, CHAIN_CODE_LENGTH);
|
|
83
|
+
for (let i = 0; i < chainCode.length; i++) {
|
|
84
|
+
chainCode[i] = (chainCodeView.getUint8(i));
|
|
85
|
+
}
|
|
86
|
+
// extract key bytes
|
|
87
|
+
const privateKey = new Uint8Array(KEY_LENGTH);
|
|
88
|
+
const privateKeyView = new DataView(buffer, chainCodeOffset + CHAIN_CODE_LENGTH);
|
|
89
|
+
for (let i = 0; i < privateKey.length; i++) {
|
|
90
|
+
privateKey[i] = (privateKeyView.getUint8(i));
|
|
91
|
+
}
|
|
92
|
+
// check if private or public key are valid
|
|
93
|
+
if (privateKey[0] !== 0 || !secp256k1.privateKeyVerify(privateKey.slice(1))) {
|
|
94
|
+
throw Error(`Malformed slip32: not a private key`);
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
chainCode,
|
|
98
|
+
keyPath,
|
|
99
|
+
privateKey: privateKey.slice(1),
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
exports.parseXprv = parseXprv;
|
|
103
|
+
function selectUtxos(specs) {
|
|
104
|
+
const strategy = specs.strategy || types_1.UtxoSelectionStrategy.SlimFit;
|
|
105
|
+
switch (strategy) {
|
|
106
|
+
case types_1.UtxoSelectionStrategy.BigFirst:
|
|
107
|
+
case types_1.UtxoSelectionStrategy.SlimFit:
|
|
108
|
+
specs.utxos = specs.utxos.sort((a, b) => (a.value > b.value) ? -1 : ((a.value < b.value) ? 1 : 0));
|
|
109
|
+
break;
|
|
110
|
+
case types_1.UtxoSelectionStrategy.Random:
|
|
111
|
+
const len = specs.utxos.length;
|
|
112
|
+
for (let i = 0; i < len; i++) {
|
|
113
|
+
const index = Math.floor(Math.random() * (len - i));
|
|
114
|
+
const tmp = specs.utxos[index];
|
|
115
|
+
specs.utxos[index] = specs.utxos[len - i - 1];
|
|
116
|
+
specs.utxos[len - i - 1] = tmp;
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
case types_1.UtxoSelectionStrategy.SmallFirst:
|
|
120
|
+
specs.utxos = specs.utxos.sort((a, b) => (a.value < b.value) ? -1 : ((a.value > b.value) ? 1 : 0));
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
// filter locked UTXOs:
|
|
124
|
+
const now = Math.floor(Date.now() / 1000);
|
|
125
|
+
specs.utxos = specs.utxos.filter(utxo => utxo.timelock <= now);
|
|
126
|
+
// if target value is specified, filter spare UTXOs
|
|
127
|
+
const pedros = specs?.value?.pedros;
|
|
128
|
+
if (pedros) {
|
|
129
|
+
if (strategy === types_1.UtxoSelectionStrategy.SlimFit) {
|
|
130
|
+
const slimFitIndex = specs.utxos.findIndex(utxo => utxo.value <= pedros);
|
|
131
|
+
if (slimFitIndex >= 1) {
|
|
132
|
+
return specs.utxos.slice(slimFitIndex - 1, slimFitIndex);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
let covered = 0n;
|
|
136
|
+
return specs.utxos.filter(utxo => {
|
|
137
|
+
const filter = covered <= pedros;
|
|
138
|
+
covered += BigInt(utxo.value);
|
|
139
|
+
return filter;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
return specs.utxos;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function sha256(buffer) {
|
|
147
|
+
const hash = (0, crypto_1.createHash)('sha256');
|
|
148
|
+
hash.update(buffer);
|
|
149
|
+
return hash.digest();
|
|
150
|
+
}
|
|
151
|
+
function totalCoins(balance) {
|
|
152
|
+
return types_1.Coins.fromPedros(BigInt(balance.locked)
|
|
153
|
+
+ BigInt(balance.staked)
|
|
154
|
+
+ BigInt(balance.unlocked));
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NyeXB0by91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzQ0Esb0NBY0M7QUFnRUQsa0NBaURDO0FBRUQsd0JBSUM7QUFFRCxnQ0FNQztBQW5MRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7QUFFdEMsbUNBQStCO0FBQy9CLG1DQUFpRTtBQUVqRSxtQ0FBNEQ7QUFFNUQsaUNBQStCO0FBQXRCLGdHQUFBLE1BQU0sT0FBQTtBQUVmLGlDQUErRztBQUExRixrR0FBQSxTQUFTLE9BQUE7QUFBRSxzR0FBQSxhQUFhLE9BQUE7QUFBa0IsNkdBQUEsb0JBQW9CLE9BQUE7QUFBRSxrR0FBQSxTQUFTLE9BQUE7QUFFakYsUUFBQSxPQUFPLEdBQUc7SUFDbkIsR0FBRyxDQUFDLEtBQWEsRUFBRSxHQUFHLE1BQWdCO1FBQ2xDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTTtZQUNsQixJQUFJLENBQUMsR0FBRyxLQUFLO2dCQUFFLEtBQUssR0FBRyxDQUFDLENBQUE7UUFDcEIsT0FBTyxLQUFLLENBQUE7SUFDeEIsQ0FBQztDQUNKLENBQUE7QUFFRCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQTtBQUM1QixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUE7QUFDdEIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0FBQ3JCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQTtBQUV6QixNQUFNLFlBQVksR0FBRyxDQUNqQixZQUFZO01BQ04sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztNQUNyRCxpQkFBaUI7TUFDakIsVUFBVSxDQUNuQixDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FD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QU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQ2pDLENBQUE7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc2VjcDI1NmsxID0gcmVxdWlyZShcInNlY3AyNTZrMVwiKVxyXG5cclxuaW1wb3J0IHsgYmVjaDMyIH0gZnJvbSAnYmVjaDMyJ1xyXG5pbXBvcnQgeyBjcmVhdGVEZWNpcGhlcml2LCBjcmVhdGVIYXNoLCBwYmtkZjJTeW5jIH0gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgeyBCYWxhbmNlIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IENvaW5zLCBVdHhvLCBVdHhvU2VsZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL3R5cGVzJ1xyXG5cclxuZXhwb3J0IHsgYmVjaDMyIH0gZnJvbSAnYmVjaDMyJ1xyXG5cclxuZXhwb3J0IHsgUHJpdmF0ZUtleSwgUHVibGljS2V5LCBQdWJsaWNLZXlIYXNoLCBLZXllZFNpZ25hdHVyZSwgUmVjb3ZlcmFibGVTaWduYXR1cmUsIFNpZ25hdHVyZSB9IGZyb20gXCIuL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBCaWdNYXRoID0ge1xyXG4gICAgbWF4KHZhbHVlOiBiaWdpbnQsIC4uLnZhbHVlczogYmlnaW50W10pOiBiaWdpbnQge1xyXG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpXHJcbiAgICAgICAgICAgIGlmICh2ID4gdmFsdWUpIHZhbHVlID0gdlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICB9LFxyXG59XHJcblxyXG5jb25zdCBDSEFJTl9DT0RFX0xFTkdUSCA9IDMyXHJcbmNvbnN0IERFUFRIX0xFTkdUSCA9IDFcclxuY29uc3QgS0VZX0xFTkdUSCA9IDMzXHJcbmNvbnN0IEtFWV9QQVRIX0xFTkdUSCA9IDRcclxuXHJcbmNvbnN0IEJFQ0gzMl9MSU1JVCA9IChcclxuICAgIERFUFRIX0xFTkdUSCBcclxuICAgICAgICArICgoTWF0aC5wb3coMjU2LCBERVBUSF9MRU5HVEgpIC0gMSkgKiBLRVlfUEFUSF9MRU5HVEgpIFxyXG4gICAgICAgICsgQ0hBSU5fQ09ERV9MRU5HVEggXHJcbiAgICAgICAgKyBLRVlfTEVOR1RIXHJcbik7XHJcblxyXG5jb25zdCBnZXRFeHBlY3RlZERhdGFMZW5ndGggPSAoZGVwdGg6IG51bWJlcikgPT4gKFxyXG4gICAgREVQVEhfTEVOR1RIXHJcbiAgICAgICAgKyBkZXB0aCAqIEtFWV9QQVRIX0xFTkdUSFxyXG4gICAgICAgICsgQ0hBSU5fQ09ERV9MRU5HVEhcclxuICAgICAgICArIEtFWV9MRU5HVEhcclxuKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWNpcGhlclhwcnYoc2xpcDMyOiBzdHJpbmcsIHBhc3N3ZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHsgcHJlZml4LCB3b3JkcyB9ID0gYmVjaDMyLmRlY29kZShzbGlwMzIsIEJFQ0gzMl9MSU1JVClcclxuICAgIGlmIChwcmVmaXggIT09IFwieHBydlwiKSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgWFBSViBoZWFkZXI6IFwiJHtwcmVmaXh9XCIgIT0gXCJ4cHJ2XCJgKVxyXG4gICAgfVxyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYmVjaDMyLmZyb21Xb3Jkcyh3b3JkcykpLmJ1ZmZlclxyXG4gICAgY29uc3QgaXYgPSBidWZmZXIuc2xpY2UoMCwgMTYpXHJcbiAgICBjb25zdCBzYWx0ID0gYnVmZmVyLnNsaWNlKDE2LCA0OClcclxuICAgIGNvbnN0IGRhdGEgPSBidWZmZXIuc2xpY2UoNDgpXHJcbiAgICBjb25zdCBrZXkgPSBwYmtkZjJTeW5jKHBhc3N3ZCwgQnVmZmVyLmZyb20oc2FsdCksIDEwMDAwLCAzMiwgJ3NoYTI1NicpICAgIFxyXG4gICAgY29uc3QgZGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlcml2KFwiYWVzLTI1Ni1jYmNcIiwga2V5LCBCdWZmZXIuZnJvbShpdikpXHJcbiAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEpLCB1bmRlZmluZWQsICd1dGYtOCcpXHJcbiAgICBkZWNyeXB0ZWQgKz0gZGVjaXBoZXIuZmluYWwoJ3V0Zi04JylcclxuICAgIHJldHVybiBkZWNyeXB0ZWRcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBhcnNlWHBydiA9IChzbGlwMzI6IHN0cmluZyk6IHtcclxuICAgIGNoYWluQ29kZTogVWludDhBcnJheSxcclxuICAgIGtleVBhdGg6IEFycmF5PG51bWJlcj4sXHJcbiAgICBwcml2YXRlS2V5OiBVaW50OEFycmF5LFxyXG59ID0+IHtcclxuICAgIC8vIGRlY29kZSBzbGlwMzIgc3RyaW5nXHJcbiAgICBjb25zdCB7IHByZWZpeCwgd29yZHMgfSA9IGJlY2gzMi5kZWNvZGUoc2xpcDMyLCBCRUNIMzJfTElNSVQpXHJcbiAgICBjb25zdCBieXRlcyA9IGJlY2gzMi5mcm9tV29yZHMod29yZHMpXHJcblxyXG4gICAgLy8gY2hlY2sgcHJlZml4XHJcbiAgICBpZiAocHJlZml4ICE9PSBcInhwcnZcIikge1xyXG4gICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIFhQUlY6IGJhZCBoZWFkZXI6IFwiJHtwcmVmaXh9XCIgIT0gXCJ4cHJ2XCJgKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIGV4cGVjdGVkIGRhdGEgbGVuZ3RoXHJcbiAgICBjb25zdCBkZXB0aCA9IGJ5dGVzWzBdXHJcbiAgICBpZiAoZGVwdGggIT09IDApIHtcclxuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBYUFJWOiBub3QgYSBtYXN0ZXIgcHJpdmF0ZSBrZXkgKGRlcHRoOiAke2RlcHRofSlgKVxyXG4gICAgfVxyXG4gICAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBnZXRFeHBlY3RlZERhdGFMZW5ndGgoZGVwdGgpXHJcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICE9PSBleHBlY3RlZExlbmd0aCkge1xyXG4gICAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgICAgICBcIkludmFsaWQgWFBSVjogYmFkIGRhdGEgbGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICsgYChleHBlY3RlZDogJHtleHBlY3RlZExlbmd0aH0sIHdhczogJHtieXRlcy5sZW5ndGh9YFxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXJcclxuXHJcbiAgICAvLyBleHRyYWN0IGtleSBwYXRoICgzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMsIGJpZyBlbmRpYW4pXHJcbiAgICBjb25zdCBrZXlQYXRoOiBBcnJheTxudW1iZXI+ID0gW11cclxuICAgIGNvbnN0IGtleVBhdGhWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlciwgREVQVEhfTEVOR1RILCBkZXB0aCAqIEtFWV9QQVRIX0xFTkdUSClcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykge1xyXG4gICAgICAgIGtleVBhdGgucHVzaCgoa2V5UGF0aFZpZXcuZ2V0VWludDMyKGkgKiBLRVlfUEFUSF9MRU5HVEgsIGZhbHNlKSkpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXh0cmFjdCBjaGFpbiBjb2RlXHJcbiAgICBjb25zdCBjaGFpbkNvZGU6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShDSEFJTl9DT0RFX0xFTkdUSClcclxuICAgIGNvbnN0IGNoYWluQ29kZU9mZnNldCA9IERFUFRIX0xFTkdUSCArIGRlcHRoICogS0VZX1BBVEhfTEVOR1RIXHJcbiAgICBjb25zdCBjaGFpbkNvZGVWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlciwgY2hhaW5Db2RlT2Zmc2V0LCBDSEFJTl9DT0RFX0xFTkdUSClcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhaW5Db2RlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY2hhaW5Db2RlW2ldID0gKGNoYWluQ29kZVZpZXcuZ2V0VWludDgoaSkpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXh0cmFjdCBrZXkgYnl0ZXNcclxuICAgIGNvbnN0IHByaXZhdGVLZXk6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShLRVlfTEVOR1RIKVxyXG4gICAgY29uc3QgcHJpdmF0ZUtleVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyLCBjaGFpbkNvZGVPZmZzZXQgKyBDSEFJTl9DT0RFX0xFTkdUSClcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJpdmF0ZUtleS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHByaXZhdGVLZXlbaV0gPSAocHJpdmF0ZUtleVZpZXcuZ2V0VWludDgoaSkpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgaWYgcHJpdmF0ZSBvciBwdWJsaWMga2V5IGFyZSB2YWxpZFxyXG4gICAgaWYgKHByaXZhdGVLZXlbMF0gIT09IDAgfHwgIXNlY3AyNTZrMS5wcml2YXRlS2V5VmVyaWZ5KHByaXZhdGVLZXkuc2xpY2UoMSkpKSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoYE1hbGZvcm1lZCBzbGlwMzI6IG5vdCBhIHByaXZhdGUga2V5YClcclxuICAgIH0gXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBjaGFpbkNvZGUsXHJcbiAgICAgICAga2V5UGF0aCxcclxuICAgICAgICBwcml2YXRlS2V5OiBwcml2YXRlS2V5LnNsaWNlKDEpLFxyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFV0eG9zKHNwZWNzOiB7IFxyXG4gICAgdXR4b3M6IEFycmF5PFV0eG8+LCBcclxuICAgIHZhbHVlPzogQ29pbnMsIFxyXG4gICAgc3RyYXRlZ3k/OiBVdHhvU2VsZWN0aW9uU3RyYXRlZ3ksIFxyXG59KTogQXJyYXk8VXR4bz4ge1xyXG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBzcGVjcy5zdHJhdGVneSB8fCBVdHhvU2VsZWN0aW9uU3RyYXRlZ3kuU2xpbUZpdFxyXG4gICAgc3dpdGNoIChzdHJhdGVneSkge1xyXG4gICAgICAgIGNhc2UgVXR4b1NlbGVjdGlvblN0cmF0ZWd5LkJpZ0ZpcnN0OlxyXG4gICAgICAgIGNhc2UgVXR4b1NlbGVjdGlvblN0cmF0ZWd5LlNsaW1GaXQ6XHJcbiAgICAgICAgICAgIHNwZWNzLnV0eG9zID0gc3BlY3MudXR4b3Muc29ydCgoYSwgYikgPT4gKGEudmFsdWUgPiBiLnZhbHVlKSA/IC0xIDogKChhLnZhbHVlIDwgYi52YWx1ZSkgPyAxIDogMCkpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGNhc2UgVXR4b1NlbGVjdGlvblN0cmF0ZWd5LlJhbmRvbTpcclxuICAgICAgICAgICAgY29uc3QgbGVuID0gc3BlY3MudXR4b3MubGVuZ3RoXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChsZW4gLSBpKSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IHNwZWNzLnV0eG9zW2luZGV4XVxyXG4gICAgICAgICAgICAgICAgc3BlY3MudXR4b3NbaW5kZXhdID0gc3BlY3MudXR4b3NbbGVuIC0gaSAtIDFdXHJcbiAgICAgICAgICAgICAgICBzcGVjcy51dHhvc1tsZW4gLSBpIC0gMV0gPSB0bXBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIFV0eG9TZWxlY3Rpb25TdHJhdGVneS5TbWFsbEZpcnN0OlxyXG4gICAgICAgICAgICBzcGVjcy51dHhvcyA9IHNwZWNzLnV0eG9zLnNvcnQoKGEsIGIpID0+IChhLnZhbHVlIDwgYi52YWx1ZSkgPyAtMSA6ICgoYS52YWx1ZSA+IGIudmFsdWUpID8gMSA6IDApKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBmaWx0ZXIgbG9ja2VkIFVUWE9zOlxyXG4gICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcclxuICAgIHNwZWNzLnV0eG9zID0gc3BlY3MudXR4b3MuZmlsdGVyKHV0eG8gPT4gdXR4by50aW1lbG9jayA8PSBub3cpXHJcblxyXG4gICAgLy8gaWYgdGFyZ2V0IHZhbHVlIGlzIHNwZWNpZmllZCwgZmlsdGVyIHNwYXJlIFVUWE9zXHJcbiAgICBjb25zdCBwZWRyb3MgPSBzcGVjcz8udmFsdWU/LnBlZHJvc1xyXG4gICAgaWYgKHBlZHJvcykge1xyXG4gICAgICAgIGlmIChzdHJhdGVneSA9PT0gVXR4b1NlbGVjdGlvblN0cmF0ZWd5LlNsaW1GaXQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2xpbUZpdEluZGV4ID0gc3BlY3MudXR4b3MuZmluZEluZGV4KHV0eG8gPT4gdXR4by52YWx1ZSA8PSBwZWRyb3MpXHJcbiAgICAgICAgICAgIGlmIChzbGltRml0SW5kZXggPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNzLnV0eG9zLnNsaWNlKHNsaW1GaXRJbmRleCAtIDEsIHNsaW1GaXRJbmRleClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY292ZXJlZDogYmlnaW50ID0gMG4gXHJcbiAgICAgICAgcmV0dXJuIHNwZWNzLnV0eG9zLmZpbHRlcih1dHhvID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gY292ZXJlZCA8PSBwZWRyb3NcclxuICAgICAgICAgICAgY292ZXJlZCArPSBCaWdJbnQodXR4by52YWx1ZSlcclxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclxyXG4gICAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBzcGVjcy51dHhvc1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2hhMjU2KGJ1ZmZlcjogYW55KSB7XHJcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JylcclxuICAgIGhhc2gudXBkYXRlKGJ1ZmZlcilcclxuICAgIHJldHVybiBoYXNoLmRpZ2VzdCgpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b3RhbENvaW5zKGJhbGFuY2U6IEJhbGFuY2UpOiBDb2lucyB7XHJcbiAgICByZXR1cm4gQ29pbnMuZnJvbVBlZHJvcyhcclxuICAgICAgICBCaWdJbnQoYmFsYW5jZS5sb2NrZWQpXHJcbiAgICAgICAgICAgICsgQmlnSW50KGJhbGFuY2Uuc3Rha2VkKVxyXG4gICAgICAgICAgICArIEJpZ0ludChiYWxhbmNlLnVubG9ja2VkKVxyXG4gICAgKVxyXG59Il19
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Balance, Network, QueryStakesOrder, StakeEntry } from "../types";
|
|
2
|
+
import { IAccount, IBIP32, ICoinbase, IJsonRpcProvider, ISigner, IWallet } from "./interfaces";
|
|
3
|
+
import { Coins, PublicKey, PublicKeyHashString, Utxo, UtxoCacheInfo, UtxoSelectionStrategy } from "./types";
|
|
4
|
+
export declare class Wallet implements IWallet {
|
|
5
|
+
protected root: IBIP32;
|
|
6
|
+
protected _accounts: Array<IAccount>;
|
|
7
|
+
readonly coinbase: ICoinbase;
|
|
8
|
+
readonly provider: IJsonRpcProvider;
|
|
9
|
+
strategy: UtxoSelectionStrategy;
|
|
10
|
+
/**
|
|
11
|
+
* Create a Wallet by reading the XPRV master key from the WITNET_SDK_WALLET_MASTER_KEY environment variable.
|
|
12
|
+
* @param specs Wallet creation parameters.
|
|
13
|
+
*/
|
|
14
|
+
static fromEnv(options: {
|
|
15
|
+
/**
|
|
16
|
+
* Password to decrypt the XPRV master key read from environment, in case it's encrypted.
|
|
17
|
+
*/
|
|
18
|
+
passwd?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Number of consecutive accounts with no funds before stopping derivation of new Wallet accounts.
|
|
21
|
+
*/
|
|
22
|
+
gap?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Maximum number of accounts to derive.
|
|
25
|
+
*/
|
|
26
|
+
limit?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Specific Wit/RPC provider to use for interacting with the Witnet network.
|
|
29
|
+
*/
|
|
30
|
+
provider?: IJsonRpcProvider;
|
|
31
|
+
/**
|
|
32
|
+
* UTXO selection strategy when building transactions out of this wallet (default: UtxoSelectionStrategy.SmallFirst).
|
|
33
|
+
*/
|
|
34
|
+
strategy?: UtxoSelectionStrategy;
|
|
35
|
+
/**
|
|
36
|
+
* Only derive accounts that hold some unlocked balance of $WIT.
|
|
37
|
+
*/
|
|
38
|
+
onlyWithFunds?: boolean;
|
|
39
|
+
}): Promise<Wallet>;
|
|
40
|
+
/**
|
|
41
|
+
* Create a Wallet by using passed XPRV master key.
|
|
42
|
+
* @param xprv Decrypted XPRV master key string.
|
|
43
|
+
* @param options Wallet creation parameters.
|
|
44
|
+
*/
|
|
45
|
+
static fromXprv(xprv: string, options?: {
|
|
46
|
+
/**
|
|
47
|
+
* Number of consecutive accounts with no funds before stopping derivation of new Wallet accounts.
|
|
48
|
+
*/
|
|
49
|
+
gap?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Maximum number of accounts to derive.
|
|
52
|
+
*/
|
|
53
|
+
limit?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Specific Wit/RPC provider to use for interacting with the Witnet network.
|
|
56
|
+
*/
|
|
57
|
+
provider?: IJsonRpcProvider;
|
|
58
|
+
/**
|
|
59
|
+
* UTXO selection strategy when building transactions out of this wallet (default: UtxoSelectionStrategy.SmallFirst).
|
|
60
|
+
*/
|
|
61
|
+
strategy?: UtxoSelectionStrategy;
|
|
62
|
+
/**
|
|
63
|
+
* Only derive accounts holding some $WIT funds (either locked, staked or unlocked).
|
|
64
|
+
*/
|
|
65
|
+
onlyWithFunds?: boolean;
|
|
66
|
+
}): Promise<Wallet>;
|
|
67
|
+
/**
|
|
68
|
+
* Create a Wallet by using passed XPRV master key.
|
|
69
|
+
* @param xprv Encrypted XPRV master key string.
|
|
70
|
+
* @param passwd Password to decipher the XPRV master key.
|
|
71
|
+
* @param options Wallet creation parameters.
|
|
72
|
+
*/
|
|
73
|
+
static fromEncryptedXprv(xprv: string, passwd: string, options?: {
|
|
74
|
+
/**
|
|
75
|
+
* Number of consecutive accounts with no funds before stopping derivation of new Wallet accounts.
|
|
76
|
+
*/
|
|
77
|
+
gap?: number;
|
|
78
|
+
/**
|
|
79
|
+
* Maximum number of accounts to derive.
|
|
80
|
+
*/
|
|
81
|
+
limit?: number;
|
|
82
|
+
/**
|
|
83
|
+
* Specific Wit/RPC provider to use for interacting with the Witnet network.
|
|
84
|
+
*/
|
|
85
|
+
provider?: IJsonRpcProvider;
|
|
86
|
+
/**
|
|
87
|
+
* UTXO selection strategy when building transactions out of this wallet (default: UtxoSelectionStrategy.SmallFirst).
|
|
88
|
+
*/
|
|
89
|
+
strategy?: UtxoSelectionStrategy;
|
|
90
|
+
/**
|
|
91
|
+
* Only derive accounts holding some $WIT funds (either locked, staked or unlocked).
|
|
92
|
+
*/
|
|
93
|
+
onlyWithFunds?: boolean;
|
|
94
|
+
}): Promise<Wallet>;
|
|
95
|
+
constructor(root: IBIP32, provider: IJsonRpcProvider, strategy?: UtxoSelectionStrategy);
|
|
96
|
+
get accounts(): Array<IAccount>;
|
|
97
|
+
get cacheInfo(): UtxoCacheInfo;
|
|
98
|
+
get changePkh(): PublicKeyHashString;
|
|
99
|
+
get network(): Network | undefined;
|
|
100
|
+
get pkh(): PublicKeyHashString;
|
|
101
|
+
get publicKey(): PublicKey;
|
|
102
|
+
addUtxos(...utxos: Array<Utxo>): {
|
|
103
|
+
excluded: Array<Utxo>;
|
|
104
|
+
included: Array<Utxo>;
|
|
105
|
+
};
|
|
106
|
+
consumeUtxos(...utxos: Array<Utxo>): Array<Utxo>;
|
|
107
|
+
getBalance(): Promise<Balance>;
|
|
108
|
+
getDelegatees(order?: QueryStakesOrder, leftJoin?: boolean): Promise<Array<StakeEntry>>;
|
|
109
|
+
getUtxos(reload?: boolean): Promise<Array<Utxo>>;
|
|
110
|
+
selectUtxos(specs?: {
|
|
111
|
+
value?: Coins;
|
|
112
|
+
reload?: boolean;
|
|
113
|
+
strategy?: UtxoSelectionStrategy;
|
|
114
|
+
}): Promise<Array<Utxo>>;
|
|
115
|
+
deriveAccounts(limit: number): Array<IAccount>;
|
|
116
|
+
exploreAccounts(limit?: number, gap?: number): Promise<Array<IAccount>>;
|
|
117
|
+
getAccount(pkh: PublicKeyHashString, gap?: number): IAccount | undefined;
|
|
118
|
+
getSigner(pkh?: PublicKeyHashString, gap?: number): ISigner | undefined;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.Wallet = void 0;
|
|
40
|
+
const utils = __importStar(require("./utils"));
|
|
41
|
+
const bip32_1 = __importDefault(require("bip32"));
|
|
42
|
+
const ecc = __importStar(require("tiny-secp256k1"));
|
|
43
|
+
const bip32 = (0, bip32_1.default)(ecc);
|
|
44
|
+
const rpc_1 = require("../rpc");
|
|
45
|
+
const types_1 = require("../types");
|
|
46
|
+
const account_1 = require("./account");
|
|
47
|
+
const coinbase_1 = require("./coinbase");
|
|
48
|
+
const types_2 = require("./types");
|
|
49
|
+
const DEFAULT_GAP = 20;
|
|
50
|
+
class Wallet {
|
|
51
|
+
/**
|
|
52
|
+
* Create a Wallet by reading the XPRV master key from the WITNET_SDK_WALLET_MASTER_KEY environment variable.
|
|
53
|
+
* @param specs Wallet creation parameters.
|
|
54
|
+
*/
|
|
55
|
+
static async fromEnv(options) {
|
|
56
|
+
const xprv = process.env.WITNET_SDK_WALLET_MASTER_KEY;
|
|
57
|
+
if (!xprv)
|
|
58
|
+
throw Error(`WITNET_SDK_WALLET_MASTER_KEY must be set on environment.`);
|
|
59
|
+
if (xprv.length > 117) {
|
|
60
|
+
if (!options.passwd)
|
|
61
|
+
throw Error(`Missing password for WITNET_SDK_WALLET_MASTER_KEY.`);
|
|
62
|
+
return Wallet.fromEncryptedXprv(xprv, options?.passwd, options);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return Wallet.fromXprv(xprv, options);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a Wallet by using passed XPRV master key.
|
|
70
|
+
* @param xprv Decrypted XPRV master key string.
|
|
71
|
+
* @param options Wallet creation parameters.
|
|
72
|
+
*/
|
|
73
|
+
static async fromXprv(xprv, options) {
|
|
74
|
+
const { chainCode, privateKey } = utils.parseXprv(xprv);
|
|
75
|
+
const root = bip32.fromPrivateKey(Buffer.from(privateKey), Buffer.from(chainCode));
|
|
76
|
+
const provider = options?.provider || (await rpc_1.JsonRpcProvider.fromEnv());
|
|
77
|
+
await provider.constants();
|
|
78
|
+
const wallet = new Wallet(root, provider, options?.strategy);
|
|
79
|
+
if (options?.onlyWithFunds) {
|
|
80
|
+
await wallet.exploreAccounts(options?.limit || 0, options?.gap);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
wallet.deriveAccounts(options?.limit || 1);
|
|
84
|
+
}
|
|
85
|
+
// load up utxos cache
|
|
86
|
+
await wallet.getUtxos(true);
|
|
87
|
+
return wallet;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a Wallet by using passed XPRV master key.
|
|
91
|
+
* @param xprv Encrypted XPRV master key string.
|
|
92
|
+
* @param passwd Password to decipher the XPRV master key.
|
|
93
|
+
* @param options Wallet creation parameters.
|
|
94
|
+
*/
|
|
95
|
+
static async fromEncryptedXprv(xprv, passwd, options) {
|
|
96
|
+
return Wallet.fromXprv(utils.decipherXprv(xprv, passwd), options);
|
|
97
|
+
}
|
|
98
|
+
constructor(root, provider, strategy) {
|
|
99
|
+
this._accounts = [];
|
|
100
|
+
this.provider = provider;
|
|
101
|
+
this.coinbase = new coinbase_1.Coinbase(root, provider, strategy);
|
|
102
|
+
this.root = root;
|
|
103
|
+
this.strategy = strategy || types_2.UtxoSelectionStrategy.SmallFirst;
|
|
104
|
+
this.deriveAccounts(1);
|
|
105
|
+
}
|
|
106
|
+
get accounts() {
|
|
107
|
+
return this._accounts;
|
|
108
|
+
}
|
|
109
|
+
get cacheInfo() {
|
|
110
|
+
const info = { expendable: 0n, size: 0, timelock: Number.MAX_SAFE_INTEGER };
|
|
111
|
+
this.accounts?.forEach(account => {
|
|
112
|
+
const accountInfo = account.cacheInfo;
|
|
113
|
+
info.expendable += accountInfo.expendable;
|
|
114
|
+
info.size += accountInfo.size;
|
|
115
|
+
if (accountInfo.timelock !== 0 && accountInfo.timelock < info.timelock) {
|
|
116
|
+
info.timelock = accountInfo.timelock;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
if (info.timelock === Number.MAX_SAFE_INTEGER)
|
|
120
|
+
info.timelock = 0;
|
|
121
|
+
return info;
|
|
122
|
+
}
|
|
123
|
+
get changePkh() {
|
|
124
|
+
return this.accounts.length > 0 ? this.accounts[0].changePkh : this.coinbase.pkh;
|
|
125
|
+
}
|
|
126
|
+
get network() {
|
|
127
|
+
return this.provider.network;
|
|
128
|
+
}
|
|
129
|
+
get pkh() {
|
|
130
|
+
return this.accounts.length > 0 ? this.accounts[0].pkh : this.coinbase.pkh;
|
|
131
|
+
}
|
|
132
|
+
get publicKey() {
|
|
133
|
+
return this.accounts.length > 0 ? this.accounts[0].publicKey : this.coinbase.publicKey;
|
|
134
|
+
}
|
|
135
|
+
addUtxos(...utxos) {
|
|
136
|
+
const included = [];
|
|
137
|
+
this.accounts.forEach(account => {
|
|
138
|
+
const _utxos = account.addUtxos(...utxos);
|
|
139
|
+
utxos = _utxos.excluded;
|
|
140
|
+
included.push(..._utxos.included);
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
excluded: utxos,
|
|
144
|
+
included
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
consumeUtxos(...utxos) {
|
|
148
|
+
this.accounts.forEach(account => {
|
|
149
|
+
utxos = account.consumeUtxos(...utxos);
|
|
150
|
+
});
|
|
151
|
+
return utxos;
|
|
152
|
+
}
|
|
153
|
+
async getBalance() {
|
|
154
|
+
if (this._accounts.length > 0) {
|
|
155
|
+
return Promise
|
|
156
|
+
.all(this._accounts.map(async (acc) => {
|
|
157
|
+
const balance = await acc.getBalance();
|
|
158
|
+
// console.log(acc.index, acc.pkh, balance.unlocked);
|
|
159
|
+
return balance;
|
|
160
|
+
}))
|
|
161
|
+
.then((balances) => {
|
|
162
|
+
return balances.reduce((prev, curr) => {
|
|
163
|
+
// console.log("\nprev =>", prev.unlocked)
|
|
164
|
+
// console.log("curr =>", curr.unlocked)
|
|
165
|
+
return {
|
|
166
|
+
locked: prev.locked + curr.locked,
|
|
167
|
+
staked: prev.staked + curr.staked,
|
|
168
|
+
unlocked: prev.unlocked + curr.unlocked,
|
|
169
|
+
};
|
|
170
|
+
}, { locked: 0n, staked: 0n, unlocked: 0n });
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
return this.coinbase.getBalance();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async getDelegatees(order, leftJoin = true) {
|
|
178
|
+
const records = [];
|
|
179
|
+
records.push(...await this.coinbase.getDelegatees(order));
|
|
180
|
+
await Promise.all(this._accounts.map(account => account.getDelegatees(order, leftJoin).then(entries => records.push(...entries))));
|
|
181
|
+
if (order) {
|
|
182
|
+
const reverse = order?.reverse ? (+1) : (-1);
|
|
183
|
+
return records.sort((a, b) => {
|
|
184
|
+
switch (order.by) {
|
|
185
|
+
case types_1.StakesOrderBy.Coins: return ((a.value.coins < b.value.coins) ? 1 : ((a.value.coins > b.value.coins) ? -1 : 0)) * reverse;
|
|
186
|
+
case types_1.StakesOrderBy.Mining: return (b.value.epochs.mining - a.value.epochs.mining) * reverse;
|
|
187
|
+
case types_1.StakesOrderBy.Witnessing: return (b.value.epochs.witnessing - a.value.epochs.witnessing) * reverse;
|
|
188
|
+
case types_1.StakesOrderBy.Nonce: return (b.value.nonce - a.value.nonce) * reverse;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return records;
|
|
193
|
+
}
|
|
194
|
+
async getUtxos(reload) {
|
|
195
|
+
return Promise
|
|
196
|
+
.all(this.accounts.map(account => account.getUtxos(reload)))
|
|
197
|
+
.then(async (utxoss) => {
|
|
198
|
+
// utxoss.push(await this.coinbase.getUtxos(reload))
|
|
199
|
+
return utxoss.flat();
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async selectUtxos(specs) {
|
|
203
|
+
return this
|
|
204
|
+
.getUtxos(specs?.reload)
|
|
205
|
+
.then(utxos => utils.selectUtxos({ utxos, value: specs?.value, strategy: specs?.strategy || this.strategy }));
|
|
206
|
+
}
|
|
207
|
+
// ================================================================================================================
|
|
208
|
+
// --- IWallet ----------------------------------------------------------------------------------------------------
|
|
209
|
+
deriveAccounts(limit) {
|
|
210
|
+
if (limit > this._accounts.length) {
|
|
211
|
+
const startIndex = this._accounts.length > 0 ? this.accounts[this.accounts.length - 1].index + 1 : 0;
|
|
212
|
+
limit = limit - this._accounts.length;
|
|
213
|
+
for (let ix = 0; ix < limit; ix++) {
|
|
214
|
+
this._accounts.push(new account_1.Account(this.root, this.provider, startIndex + ix, this.strategy));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return this._accounts;
|
|
218
|
+
}
|
|
219
|
+
async exploreAccounts(limit = 0, gap = DEFAULT_GAP) {
|
|
220
|
+
if (limit === 0 || limit > this.accounts.length) {
|
|
221
|
+
const lastIndex = (x) => x.length > 0 ? x[x.length - 1].index + 1 : 0;
|
|
222
|
+
const startIndex = lastIndex(this.accounts);
|
|
223
|
+
for (let index = startIndex; index < lastIndex(this.accounts) + gap; index++) {
|
|
224
|
+
const account = new account_1.Account(this.root, this.provider, index, this.strategy);
|
|
225
|
+
if (utils.totalCoins(await account.getBalance()).pedros > 0n) {
|
|
226
|
+
this.accounts.push(account);
|
|
227
|
+
if (limit && this.accounts.length >= limit)
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return this._accounts;
|
|
233
|
+
}
|
|
234
|
+
getAccount(pkh, gap) {
|
|
235
|
+
let account = this._accounts.find(account => account.internal.pkh === pkh || account.pkh === pkh);
|
|
236
|
+
if (!account) {
|
|
237
|
+
for (let index = 0; index < (gap || DEFAULT_GAP); index++) {
|
|
238
|
+
account = new account_1.Account(this.root, this.provider, index, this.strategy);
|
|
239
|
+
if (account.pkh === pkh || account.internal.pkh === pkh) {
|
|
240
|
+
this._accounts.push(account);
|
|
241
|
+
return account;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
return account;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
getSigner(pkh, gap) {
|
|
251
|
+
if (!pkh)
|
|
252
|
+
return this.accounts[0]?.getSigner() || this.coinbase.getSigner(pkh);
|
|
253
|
+
const account = this.getAccount(pkh, gap);
|
|
254
|
+
return account?.getSigner(pkh) || this.coinbase.getSigner(pkh);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
exports.Wallet = Wallet;
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jcnlwdG8vd2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFnQztBQUVoQyxrREFBaUM7QUFDakMsb0RBQXNDO0FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBWSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLGdDQUF3QztBQUN4QyxvQ0FBd0Y7QUFDeEYsdUNBQW1DO0FBQ25DLHlDQUFxQztBQUVyQyxtQ0FBMkc7QUFFM0csTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBRXZCLE1BQWEsTUFBTTtJQVNmOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BeUJwQjtRQUNHLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUE7UUFDckQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFBO1FBQ2xGLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQUUsTUFBTSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtZQUN0RixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDekMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ2pCLElBQVksRUFDWixPQXFCQztRQUVELE1BQU0sRUFBRSxTQUFT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LENBQUM7Q0FDSjtBQWxURCx3QkFrVEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5pbXBvcnQgQklQMzJGYWN0b3J5IGZyb20gJ2JpcDMyJztcclxuaW1wb3J0ICogYXMgZWNjIGZyb20gJ3Rpbnktc2VjcDI1NmsxJztcclxuY29uc3QgYmlwMzIgPSBCSVAzMkZhY3RvcnkoZWNjKTtcclxuXHJcbmltcG9ydCB7IEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuLi9ycGNcIlxyXG5pbXBvcnQgeyBCYWxhbmNlLCBOZXR3b3JrLCBRdWVyeVN0YWtlc09yZGVyLCBTdGFrZUVudHJ5LCBTdGFrZXNPcmRlckJ5IH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gXCIuL2FjY291bnRcIlxyXG5pbXBvcnQgeyBDb2luYmFzZSB9IGZyb20gXCIuL2NvaW5iYXNlXCJcclxuaW1wb3J0IHsgSUFjY291bnQsIElCSVAzMiwgSUNvaW5iYXNlLCBJSnNvblJwY1Byb3ZpZGVyLCBJU2lnbmVyLCBJV2FsbGV0IH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiXHJcbmltcG9ydCB7IENvaW5zLCBQdWJsaWNLZXksIFB1YmxpY0tleUhhc2hTdHJpbmcsIFV0eG8sIFV0eG9DYWNoZUluZm8sIFV0eG9TZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gXCIuL3R5cGVzXCJcclxuXHJcbmNvbnN0IERFRkFVTFRfR0FQID0gMjA7XHJcblxyXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XHJcbiAgICBwcm90ZWN0ZWQgcm9vdDogSUJJUDMyO1xyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgX2FjY291bnRzOiBBcnJheTxJQWNjb3VudD4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29pbmJhc2U6IElDb2luYmFzZTtcclxuICAgIHB1YmxpYyByZWFkb25seSBwcm92aWRlcjogSUpzb25ScGNQcm92aWRlcjtcclxuICAgIHB1YmxpYyBzdHJhdGVneTogVXR4b1NlbGVjdGlvblN0cmF0ZWd5O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgV2FsbGV0IGJ5IHJlYWRpbmcgdGhlIFhQUlYgbWFzdGVyIGtleSBmcm9tIHRoZSBXSVRORVRfU0RLX1dBTExFVF9NQVNURVJfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlLlxyXG4gICAgICogQHBhcmFtIHNwZWNzIFdhbGxldCBjcmVhdGlvbiBwYXJhbWV0ZXJzLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgZnJvbUVudihvcHRpb25zOiB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgWFBSViBtYXN0ZXIga2V5IHJlYWQgZnJvbSBlbnZpcm9ubWVudCwgaW4gY2FzZSBpdCdzIGVuY3J5cHRlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBwYXNzd2Q/OiBzdHJpbmcsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGFjY291bnRzIHdpdGggbm8gZnVuZHMgYmVmb3JlIHN0b3BwaW5nIGRlcml2YXRpb24gb2YgbmV3IFdhbGxldCBhY2NvdW50cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBnYXA/OiBudW1iZXIsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgYWNjb3VudHMgdG8gZGVyaXZlLiBcclxuICAgICAgICAgKi9cclxuICAgICAgICBsaW1pdD86IG51bWJlcixcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpYyBXaXQvUlBDIHByb3ZpZGVyIHRvIHVzZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgV2l0bmV0IG5ldHdvcmsuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcHJvdmlkZXI/OiBJSnNvblJwY1Byb3ZpZGVyLCBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVVFhPIHNlbGVjdGlvbiBzdHJhdGVneSB3aGVuIGJ1aWxkaW5nIHRyYW5zYWN0aW9ucyBvdXQgb2YgdGhpcyB3YWxsZXQgKGRlZmF1bHQ6IFV0eG9TZWxlY3Rpb25TdHJhdGVneS5TbWFsbEZpcnN0KS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBzdHJhdGVneT86IFV0eG9TZWxlY3Rpb25TdHJhdGVneSwgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogT25seSBkZXJpdmUgYWNjb3VudHMgdGhhdCBob2xkIHNvbWUgdW5sb2NrZWQgYmFsYW5jZSBvZiAkV0lULlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9ubHlXaXRoRnVuZHM/OiBib29sZWFuLFxyXG4gICAgfSk6IFByb21pc2U8V2FsbGV0PiB7XHJcbiAgICAgICAgY29uc3QgeHBydiA9IHByb2Nlc3MuZW52LldJVE5FVF9TREtfV0FMTEVUX01BU1RFUl9LRVlcclxuICAgICAgICBpZiAoIXhwcnYpIHRocm93IEVycm9yKGBXSVRORVRfU0RLX1dBTExFVF9NQVNURVJfS0VZIG11c3QgYmUgc2V0IG9uIGVudmlyb25tZW50LmApXHJcbiAgICAgICAgaWYgKHhwcnYubGVuZ3RoID4gMTE3KSB7XHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wYXNzd2QpIHRocm93IEVycm9yKGBNaXNzaW5nIHBhc3N3b3JkIGZvciBXSVRORVRfU0RLX1dBTExFVF9NQVNURVJfS0VZLmApXHJcbiAgICAgICAgICAgIHJldHVybiBXYWxsZXQuZnJvbUVuY3J5cHRlZFhwcnYoeHBydiwgb3B0aW9ucz8ucGFzc3dkLCBvcHRpb25zKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBXYWxsZXQuZnJvbVhwcnYoeHBydiwgb3B0aW9ucylcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgV2FsbGV0IGJ5IHVzaW5nIHBhc3NlZCBYUFJWIG1hc3RlciBrZXkuXHJcbiAgICAgKiBAcGFyYW0geHBydiBEZWNyeXB0ZWQgWFBSViBtYXN0ZXIga2V5IHN0cmluZy5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFdhbGxldCBjcmVhdGlvbiBwYXJhbWV0ZXJzLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgZnJvbVhwcnYoXHJcbiAgICAgICAgeHBydjogc3RyaW5nLFxyXG4gICAgICAgIG9wdGlvbnM/OiB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgYWNjb3VudHMgd2l0aCBubyBmdW5kcyBiZWZvcmUgc3RvcHBpbmcgZGVyaXZhdGlvbiBvZiBuZXcgV2FsbGV0IGFjY291bnRzLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZ2FwPzogbnVtYmVyLFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgYWNjb3VudHMgdG8gZGVyaXZlLiBcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxpbWl0PzogbnVtYmVyLFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogU3BlY2lmaWMgV2l0L1JQQyBwcm92aWRlciB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIFdpdG5ldCBuZXR3b3JrLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgcHJvdmlkZXI/OiBJSnNvblJwY1Byb3ZpZGVyLCBcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFVUWE8gc2VsZWN0aW9uIHN0cmF0ZWd5IHdoZW4gYnVpbGRpbmcgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGlzIHdhbGxldCAoZGVmYXVsdDogVXR4b1NlbGVjdGlvblN0cmF0ZWd5LlNtYWxsRmlyc3QpLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgc3RyYXRlZ3k/OiBVdHhvU2VsZWN0aW9uU3RyYXRlZ3ksIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogT25seSBkZXJpdmUgYWNjb3VudHMgaG9sZGluZyBzb21lICRXSVQgZnVuZHMgKGVpdGhlciBsb2NrZWQsIHN0YWtlZCBvciB1bmxvY2tlZCkuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBvbmx5V2l0aEZ1bmRzPzogYm9vbGVhbixcclxuICAgICAgICB9XHJcbiAgICApOiBQcm9taXNlPFdhbGxldD4ge1xyXG4gICAgICAgIGNvbnN0IHsgY2hhaW5Db2RlLCBwcml2YXRlS2V5IH0gPSB1dGlscy5wYXJzZVhwcnYoeHBydik7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IGJpcDMyLmZyb21Qcml2YXRlS2V5KEJ1ZmZlci5mcm9tKHByaXZhdGVLZXkpLCBCdWZmZXIuZnJvbShjaGFpbkNvZGUpKTtcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IG9wdGlvbnM/LnByb3ZpZGVyIHx8IChhd2FpdCBKc29uUnBjUHJvdmlkZXIuZnJvbUVudigpKVxyXG4gICAgICAgIGF3YWl0IHByb3ZpZGVyLmNvbnN0YW50cygpXHJcbiAgICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChyb290LCBwcm92aWRlciwgb3B0aW9ucz8uc3RyYXRlZ3kpXHJcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm9ubHlXaXRoRnVuZHMpIHtcclxuICAgICAgICAgICAgYXdhaXQgd2FsbGV0LmV4cGxvcmVBY2NvdW50cyhvcHRpb25zPy5saW1pdCB8fCAwLCBvcHRpb25zPy5nYXApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2FsbGV0LmRlcml2ZUFjY291bnRzKG9wdGlvbnM/LmxpbWl0IHx8IDEpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGxvYWQgdXAgdXR4b3MgY2FjaGVcclxuICAgICAgICBhd2FpdCB3YWxsZXQuZ2V0VXR4b3ModHJ1ZSlcclxuICAgICAgICByZXR1cm4gd2FsbGV0XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBXYWxsZXQgYnkgdXNpbmcgcGFzc2VkIFhQUlYgbWFzdGVyIGtleS5cclxuICAgICAqIEBwYXJhbSB4cHJ2IEVuY3J5cHRlZCBYUFJWIG1hc3RlciBrZXkgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIHBhc3N3ZCBQYXNzd29yZCB0byBkZWNpcGhlciB0aGUgWFBSViBtYXN0ZXIga2V5LlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgV2FsbGV0IGNyZWF0aW9uIHBhcmFtZXRlcnMuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhc3luYyBmcm9tRW5jcnlwdGVkWHBydihcclxuICAgICAgICB4cHJ2OiBzdHJpbmcsXHJcbiAgICAgICAgcGFzc3dkOiBzdHJpbmcsXHJcbiAgICAgICAgb3B0aW9ucz86IHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIE51bWJlciBvZiBjb25zZWN1dGl2ZSBhY2NvdW50cyB3aXRoIG5vIGZ1bmRzIGJlZm9yZSBzdG9wcGluZyBkZXJpdmF0aW9uIG9mIG5ldyBXYWxsZXQgYWNjb3VudHMuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBnYXA/OiBudW1iZXIsXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBhY2NvdW50cyB0byBkZXJpdmUuIFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGltaXQ/OiBudW1iZXIsXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBTcGVjaWZpYyBXaXQvUlBDIHByb3ZpZGVyIHRvIHVzZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgV2l0bmV0IG5ldHdvcmsuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBwcm92aWRlcj86IElKc29uUnBjUHJvdmlkZXIsIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVVRYTyBzZWxlY3Rpb24gc3RyYXRlZ3kgd2hlbiBidWlsZGluZyB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoaXMgd2FsbGV0IChkZWZhdWx0OiBVdHhvU2VsZWN0aW9uU3RyYXRlZ3kuU21hbGxGaXJzdCkuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBzdHJhdGVneT86IFV0eG9TZWxlY3Rpb25TdHJhdGVneSwgXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBPbmx5IGRlcml2ZSBhY2NvdW50cyBob2xkaW5nIHNvbWUgJFdJVCBmdW5kcyAoZWl0aGVyIGxvY2tlZCwgc3Rha2VkIG9yIHVubG9ja2VkKS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIG9ubHlXaXRoRnVuZHM/OiBib29sZWFuLFxyXG4gICAgICAgIH1cclxuICAgICk6IFByb21pc2U8V2FsbGV0PiB7XHJcbiAgICAgICAgcmV0dXJuIFdhbGxldC5mcm9tWHBydih1dGlscy5kZWNpcGhlclhwcnYoeHBydiwgcGFzc3dkKSwgb3B0aW9ucylcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc3RydWN0b3Iocm9vdDogSUJJUDMyLCBwcm92aWRlcjogSUpzb25ScGNQcm92aWRlciwgc3RyYXRlZ3k/OiBVdHhvU2VsZWN0aW9uU3RyYXRlZ3kpIHtcclxuICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXJcclxuICAgICAgICB0aGlzLmNvaW5iYXNlID0gbmV3IENvaW5iYXNlKHJvb3QsIHByb3ZpZGVyLCBzdHJhdGVneSlcclxuICAgICAgICB0aGlzLnJvb3QgPSByb290XHJcbiAgICAgICAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5IHx8IFV0eG9TZWxlY3Rpb25TdHJhdGVneS5TbWFsbEZpcnN0XHJcbiAgICAgICAgdGhpcy5kZXJpdmVBY2NvdW50cygxKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgYWNjb3VudHMoKTogQXJyYXk8SUFjY291bnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNjb3VudHNcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNhY2hlSW5mbygpOiBVdHhvQ2FjaGVJbmZvIHtcclxuICAgICAgICBjb25zdCBpbmZvOiBVdHhvQ2FjaGVJbmZvID0geyBleHBlbmRhYmxlOiAwbiwgc2l6ZTogMCwgdGltZWxvY2s6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIH1cclxuICAgICAgICB0aGlzLmFjY291bnRzPy5mb3JFYWNoKGFjY291bnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhY2NvdW50SW5mbyA9IGFjY291bnQuY2FjaGVJbmZvXHJcbiAgICAgICAgICAgIGluZm8uZXhwZW5kYWJsZSArPSBhY2NvdW50SW5mby5leHBlbmRhYmxlXHJcbiAgICAgICAgICAgIGluZm8uc2l6ZSArPSBhY2NvdW50SW5mby5zaXplXHJcbiAgICAgICAgICAgIGlmIChhY2NvdW50SW5mby50aW1lbG9jayAhPT0gMCAmJiBhY2NvdW50SW5mby50aW1lbG9jayA8IGluZm8udGltZWxvY2spIHtcclxuICAgICAgICAgICAgICAgIGluZm8udGltZWxvY2sgPSBhY2NvdW50SW5mby50aW1lbG9ja1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZiAoaW5mby50aW1lbG9jayA9PT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIGluZm8udGltZWxvY2sgPSAwO1xyXG4gICAgICAgIHJldHVybiBpbmZvO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgY2hhbmdlUGtoKCk6IFB1YmxpY0tleUhhc2hTdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjY291bnRzLmxlbmd0aCA+IDAgPyB0aGlzLmFjY291bnRzWzBdLmNoYW5nZVBraCA6IHRoaXMuY29pbmJhc2UucGtoXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBuZXR3b3JrKCk6IE5ldHdvcmsgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLm5ldHdvcmtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHBraCgpOiBQdWJsaWNLZXlIYXNoU3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY2NvdW50cy5sZW5ndGggPiAwID8gdGhpcy5hY2NvdW50c1swXS5wa2ggOiB0aGlzLmNvaW5iYXNlLnBraFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcHVibGljS2V5KCk6IFB1YmxpY0tleSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjb3VudHMubGVuZ3RoID4gMCA/IHRoaXMuYWNjb3VudHNbMF0ucHVibGljS2V5IDogdGhpcy5jb2luYmFzZS5wdWJsaWNLZXlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkVXR4b3MoLi4udXR4b3M6IEFycmF5PFV0eG8+KTogeyBleGNsdWRlZDogQXJyYXk8VXR4bz4sIGluY2x1ZGVkOiBBcnJheTxVdHhvPiB9IHtcclxuICAgICAgICBjb25zdCBpbmNsdWRlZDogQXJyYXk8VXR4bz4gPSBbXVxyXG4gICAgICAgIHRoaXMuYWNjb3VudHMuZm9yRWFjaChhY2NvdW50ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgX3V0eG9zID0gYWNjb3VudC5hZGRVdHhvcyguLi51dHhvcylcclxuICAgICAgICAgICAgdXR4b3MgPSBfdXR4b3MuZXhjbHVkZWRcclxuICAgICAgICAgICAgaW5jbHVkZWQucHVzaCguLi5fdXR4b3MuaW5jbHVkZWQpXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBleGNsdWRlZDogdXR4b3MsXHJcbiAgICAgICAgICAgIGluY2x1ZGVkXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdW1lVXR4b3MoLi4udXR4b3M6IEFycmF5PFV0eG8+KTogQXJyYXk8VXR4bz4ge1xyXG4gICAgICAgIHRoaXMuYWNjb3VudHMuZm9yRWFjaChhY2NvdW50ID0+IHtcclxuICAgICAgICAgICAgdXR4b3MgPSBhY2NvdW50LmNvbnN1bWVVdHhvcyguLi51dHhvcylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiB1dHhvc1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRCYWxhbmNlKCk6IFByb21pc2U8QmFsYW5jZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9hY2NvdW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlXHJcbiAgICAgICAgICAgICAgICAuYWxsKHRoaXMuX2FjY291bnRzLm1hcChhc3luYyAoYWNjOiBJQWNjb3VudCkgPT4geyBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWxhbmNlID0gYXdhaXQgYWNjLmdldEJhbGFuY2UoKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGFjYy5pbmRleCwgYWNjLnBraCwgYmFsYW5jZS51bmxvY2tlZCk7IFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYWxhbmNlIH0pKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKGJhbGFuY2VzOiBBcnJheTxCYWxhbmNlPikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYWxhbmNlcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJcXG5wcmV2ID0+XCIsIHByZXYudW5sb2NrZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY3VyciA9PlwiLCBjdXJyLnVubG9ja2VkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkOiBwcmV2LmxvY2tlZCArIGN1cnIubG9ja2VkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rha2VkOiBwcmV2LnN0YWtlZCArIGN1cnIuc3Rha2VkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrZWQ6IHByZXYudW5sb2NrZWQgKyBjdXJyLnVubG9ja2VkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgeyBsb2NrZWQ6IDBuLCBzdGFrZWQ6IDBuLCB1bmxvY2tlZDogMG4gfSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29pbmJhc2UuZ2V0QmFsYW5jZSgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXREZWxlZ2F0ZWVzKG9yZGVyPzogUXVlcnlTdGFrZXNPcmRlciwgbGVmdEpvaW4gPSB0cnVlKTogUHJvbWlzZTxBcnJheTxTdGFrZUVudHJ5Pj4ge1xyXG4gICAgICAgIGNvbnN0IHJlY29yZHM6IEFycmF5PFN0YWtlRW50cnk+ID0gW11cclxuICAgICAgICByZWNvcmRzLnB1c2goLi4uYXdhaXQgdGhpcy5jb2luYmFzZS5nZXREZWxlZ2F0ZWVzKG9yZGVyKSlcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl9hY2NvdW50cy5tYXAoYWNjb3VudCA9PiBhY2NvdW50LmdldERlbGVnYXRlZXMob3JkZXIsIGxlZnRKb2luKS50aGVuKGVudHJpZXMgPT4gcmVjb3Jkcy5wdXNoKC4uLmVudHJpZXMpKSkpXHJcbiAgICAgICAgaWYgKG9yZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldmVyc2UgPSBvcmRlcj8ucmV2ZXJzZSA/ICgrMSkgOiAoLTEpXHJcbiAgICAgICAgICAgIHJldHVybiByZWNvcmRzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAob3JkZXIuYnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YWtlc09yZGVyQnkuQ29pbnM6IHJldHVybiAoKGEudmFsdWUuY29pbnMgPCBiLnZhbHVlLmNvaW5zKSA/IDEgOiAoKGEudmFsdWUuY29pbnMgPiBiLnZhbHVlLmNvaW5zKSA/IC0xIDogMCkpICogcmV2ZXJzZTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YWtlc09yZGVyQnkuTWluaW5nOiByZXR1cm4gKGIudmFsdWUuZXBvY2hzLm1pbmluZyAtIGEudmFsdWUuZXBvY2hzLm1pbmluZykgKiByZXZlcnNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3Rha2VzT3JkZXJCeS5XaXRuZXNzaW5nOiByZXR1cm4gKGIudmFsdWUuZXBvY2hzLndpdG5lc3NpbmcgLSBhLnZhbHVlLmVwb2Nocy53aXRuZXNzaW5nKSAqIHJldmVyc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdGFrZXNPcmRlckJ5Lk5vbmNlOiByZXR1cm4gKGIudmFsdWUubm9uY2UgLSBhLnZhbHVlLm5vbmNlKSAqIHJldmVyc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZWNvcmRzXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFV0eG9zKHJlbG9hZD86IGJvb2xlYW4pOiBQcm9taXNlPEFycmF5PFV0eG8+PiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2VcclxuICAgICAgICAgICAgLmFsbCh0aGlzLmFjY291bnRzLm1hcChhY2NvdW50ID0+IGFjY291bnQuZ2V0VXR4b3MocmVsb2FkKSkpXHJcbiAgICAgICAgICAgIC50aGVuKGFzeW5jICh1dHhvc3M6IEFycmF5PEFycmF5PFV0eG8+PikgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gdXR4b3NzLnB1c2goYXdhaXQgdGhpcy5jb2luYmFzZS5nZXRVdHhvcyhyZWxvYWQpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0eG9zcy5mbGF0KClcclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VsZWN0VXR4b3Moc3BlY3M/OiB7XHJcbiAgICAgICAgdmFsdWU/OiBDb2lucyxcclxuICAgICAgICByZWxvYWQ/OiBib29sZWFuXHJcbiAgICAgICAgc3RyYXRlZ3k/OiBVdHhvU2VsZWN0aW9uU3RyYXRlZ3lcclxuICAgIH0pOiBQcm9taXNlPEFycmF5PFV0eG8+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgICAgICAgICAgLmdldFV0eG9zKHNwZWNzPy5yZWxvYWQpXHJcbiAgICAgICAgICAgIC50aGVuKHV0eG9zID0+IHV0aWxzLnNlbGVjdFV0eG9zKHsgdXR4b3MsIHZhbHVlOiBzcGVjcz8udmFsdWUsIHN0cmF0ZWd5OiBzcGVjcz8uc3RyYXRlZ3kgfHwgdGhpcy5zdHJhdGVneSB9KSlcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyAtLS0gSVdhbGxldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgcHVibGljIGRlcml2ZUFjY291bnRzKGxpbWl0OiBudW1iZXIpOiBBcnJheTxJQWNjb3VudD4ge1xyXG4gICAgICAgIGlmIChsaW1pdCA+IHRoaXMuX2FjY291bnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5fYWNjb3VudHMubGVuZ3RoID4gMCA/IHRoaXMuYWNjb3VudHNbdGhpcy5hY2NvdW50cy5sZW5ndGggLSAxXS5pbmRleCArIDEgOiAwXHJcbiAgICAgICAgICAgIGxpbWl0ID0gbGltaXQgLSB0aGlzLl9hY2NvdW50cy5sZW5ndGhcclxuICAgICAgICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGxpbWl0OyBpeCArKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWNjb3VudHMucHVzaChuZXcgQWNjb3VudChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aWRlcixcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ICsgaXgsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJhdGVneVxyXG4gICAgICAgICAgICAgICAgKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNjb3VudHNcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZXhwbG9yZUFjY291bnRzKGxpbWl0ID0gMCwgZ2FwID0gREVGQVVMVF9HQVApOiBQcm9taXNlPEFycmF5PElBY2NvdW50Pj4ge1xyXG4gICAgICAgIGlmIChsaW1pdCA9PT0gMCB8fCBsaW1pdCA+IHRoaXMuYWNjb3VudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9ICh4OiBBcnJheTxJQWNjb3VudD4pID0+IHgubGVuZ3RoID4gMCA/IHhbeC5sZW5ndGggLSAxXS5pbmRleCArIDEgOiAwXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBsYXN0SW5kZXgodGhpcy5hY2NvdW50cylcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8IGxhc3RJbmRleCh0aGlzLmFjY291bnRzKSArIGdhcDsgaW5kZXggKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY291bnQgPSBuZXcgQWNjb3VudCh0aGlzLnJvb3QsIHRoaXMucHJvdmlkZXIsIGluZGV4LCB0aGlzLnN0cmF0ZWd5KVxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWxzLnRvdGFsQ29pbnMoYXdhaXQgYWNjb3VudC5nZXRCYWxhbmNlKCkpLnBlZHJvcyA+IDBuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50cy5wdXNoKGFjY291bnQpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbWl0ICYmIHRoaXMuYWNjb3VudHMubGVuZ3RoID49IGxpbWl0KSBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fYWNjb3VudHNcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWNjb3VudChwa2g6IFB1YmxpY0tleUhhc2hTdHJpbmcsIGdhcD86IG51bWJlcik6IElBY2NvdW50IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBsZXQgYWNjb3VudCA9IHRoaXMuX2FjY291bnRzLmZpbmQoYWNjb3VudCA9PiBhY2NvdW50LmludGVybmFsLnBraCA9PT0gcGtoIHx8IGFjY291bnQucGtoID09PSBwa2gpXHJcbiAgICAgICAgaWYgKCFhY2NvdW50KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAoZ2FwIHx8IERFRkFVTFRfR0FQKTsgaW5kZXggKyspIHtcclxuICAgICAgICAgICAgICAgIGFjY291bnQgPSBuZXcgQWNjb3VudCh0aGlzLnJvb3QsIHRoaXMucHJvdmlkZXIsIGluZGV4LCB0aGlzLnN0cmF0ZWd5KVxyXG4gICAgICAgICAgICAgICAgaWYgKGFjY291bnQucGtoID09PSBwa2ggfHwgYWNjb3VudC5pbnRlcm5hbC5wa2ggPT09IHBraCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjY291bnRzLnB1c2goYWNjb3VudClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjb3VudFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gYWNjb3VudFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2lnbmVyKHBraD86IFB1YmxpY0tleUhhc2hTdHJpbmcsIGdhcD86IG51bWJlcik6IElTaWduZXIgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICghcGtoKSByZXR1cm4gdGhpcy5hY2NvdW50c1swXT8uZ2V0U2lnbmVyKCkgfHwgdGhpcy5jb2luYmFzZS5nZXRTaWduZXIocGtoKTtcclxuICAgICAgICBjb25zdCBhY2NvdW50ID0gdGhpcy5nZXRBY2NvdW50KHBraCwgZ2FwKVxyXG4gICAgICAgIHJldHVybiBhY2NvdW50Py5nZXRTaWduZXIocGtoKSB8fCB0aGlzLmNvaW5iYXNlLmdldFNpZ25lcihwa2gpXHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAChC,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA"}
|