@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.
Files changed (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/package.json +72 -0
  4. package/dist/src/bin/helpers.d.ts +91 -0
  5. package/dist/src/bin/helpers.d.ts.map +1 -0
  6. package/dist/src/bin/helpers.js +816 -0
  7. package/dist/src/index.d.ts +5 -0
  8. package/dist/src/index.d.ts.map +1 -0
  9. package/dist/src/index.js +47 -0
  10. package/dist/src/lib/crypto/account.d.ts +32 -0
  11. package/dist/src/lib/crypto/account.d.ts.map +1 -0
  12. package/dist/src/lib/crypto/account.js +106 -0
  13. package/dist/src/lib/crypto/coinbase.d.ts +10 -0
  14. package/dist/src/lib/crypto/coinbase.d.ts.map +1 -0
  15. package/dist/src/lib/crypto/coinbase.js +28 -0
  16. package/dist/src/lib/crypto/index.d.ts +8 -0
  17. package/dist/src/lib/crypto/index.d.ts.map +1 -0
  18. package/dist/src/lib/crypto/index.js +30 -0
  19. package/dist/src/lib/crypto/interfaces.d.ts +85 -0
  20. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -0
  21. package/dist/src/lib/crypto/interfaces.js +3 -0
  22. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +55 -0
  23. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
  24. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +339 -0
  25. package/dist/src/lib/crypto/payloads/StakePayload.d.ts +28 -0
  26. package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
  27. package/dist/src/lib/crypto/payloads/StakePayload.js +142 -0
  28. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +36 -0
  29. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
  30. package/dist/src/lib/crypto/payloads/UnstakePayload.js +154 -0
  31. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +25 -0
  32. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
  33. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +128 -0
  34. package/dist/src/lib/crypto/payloads.d.ts +57 -0
  35. package/dist/src/lib/crypto/payloads.d.ts.map +1 -0
  36. package/dist/src/lib/crypto/payloads.js +170 -0
  37. package/dist/src/lib/crypto/signer.d.ts +33 -0
  38. package/dist/src/lib/crypto/signer.d.ts.map +1 -0
  39. package/dist/src/lib/crypto/signer.js +194 -0
  40. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +15 -0
  41. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
  42. package/dist/src/lib/crypto/transmitters/DataRequests.js +23 -0
  43. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +12 -0
  44. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
  45. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +17 -0
  46. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +18 -0
  47. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
  48. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +53 -0
  49. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +11 -0
  50. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
  51. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +16 -0
  52. package/dist/src/lib/crypto/transmitters.d.ts +47 -0
  53. package/dist/src/lib/crypto/transmitters.d.ts.map +1 -0
  54. package/dist/src/lib/crypto/transmitters.js +416 -0
  55. package/dist/src/lib/crypto/types.d.ts +161 -0
  56. package/dist/src/lib/crypto/types.d.ts.map +1 -0
  57. package/dist/src/lib/crypto/types.js +273 -0
  58. package/dist/src/lib/crypto/utils.d.ts +21 -0
  59. package/dist/src/lib/crypto/utils.d.ts.map +1 -0
  60. package/dist/src/lib/crypto/utils.js +156 -0
  61. package/dist/src/lib/crypto/wallet.d.ts +120 -0
  62. package/dist/src/lib/crypto/wallet.d.ts.map +1 -0
  63. package/dist/src/lib/crypto/wallet.js +258 -0
  64. package/dist/src/lib/index.d.ts +5 -0
  65. package/dist/src/lib/index.d.ts.map +1 -0
  66. package/dist/src/lib/index.js +44 -0
  67. package/dist/src/lib/radon/ccdr/eth.d.ts +160 -0
  68. package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -0
  69. package/dist/src/lib/radon/ccdr/eth.js +272 -0
  70. package/dist/src/lib/radon/ccdr/index.d.ts +14 -0
  71. package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -0
  72. package/dist/src/lib/radon/ccdr/index.js +39 -0
  73. package/dist/src/lib/radon/ccdr/wit.d.ts +23 -0
  74. package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -0
  75. package/dist/src/lib/radon/ccdr/wit.js +35 -0
  76. package/dist/src/lib/radon/filters.d.ts +14 -0
  77. package/dist/src/lib/radon/filters.d.ts.map +1 -0
  78. package/dist/src/lib/radon/filters.js +45 -0
  79. package/dist/src/lib/radon/index.d.ts +296 -0
  80. package/dist/src/lib/radon/index.d.ts.map +1 -0
  81. package/dist/src/lib/radon/index.js +707 -0
  82. package/dist/src/lib/radon/reducers.d.ts +29 -0
  83. package/dist/src/lib/radon/reducers.d.ts.map +1 -0
  84. package/dist/src/lib/radon/reducers.js +66 -0
  85. package/dist/src/lib/radon/types.d.ts +521 -0
  86. package/dist/src/lib/radon/types.d.ts.map +1 -0
  87. package/dist/src/lib/radon/types.js +936 -0
  88. package/dist/src/lib/radon/utils.d.ts +53 -0
  89. package/dist/src/lib/radon/utils.d.ts.map +1 -0
  90. package/dist/src/lib/radon/utils.js +153 -0
  91. package/dist/src/lib/rpc/index.d.ts +3 -0
  92. package/dist/src/lib/rpc/index.d.ts.map +1 -0
  93. package/dist/src/lib/rpc/index.js +19 -0
  94. package/dist/src/lib/rpc/nodes.d.ts +40 -0
  95. package/dist/src/lib/rpc/nodes.d.ts.map +1 -0
  96. package/dist/src/lib/rpc/nodes.js +293 -0
  97. package/dist/src/lib/rpc/provider.d.ts +88 -0
  98. package/dist/src/lib/rpc/provider.d.ts.map +1 -0
  99. package/dist/src/lib/rpc/provider.js +336 -0
  100. package/dist/src/lib/rpc/reporter.d.ts +18 -0
  101. package/dist/src/lib/rpc/reporter.d.ts.map +1 -0
  102. package/dist/src/lib/rpc/reporter.js +30 -0
  103. package/dist/src/lib/rpc/types.d.ts +409 -0
  104. package/dist/src/lib/rpc/types.d.ts.map +1 -0
  105. package/dist/src/lib/rpc/types.js +81 -0
  106. package/dist/src/lib/types.d.ts +18 -0
  107. package/dist/src/lib/types.d.ts.map +1 -0
  108. package/dist/src/lib/types.js +7 -0
  109. package/dist/src/lib/utils.d.ts +13 -0
  110. package/dist/src/lib/utils.d.ts.map +1 -0
  111. package/dist/src/lib/utils.js +97 -0
  112. package/dist/witnet/assets/index.d.ts +30 -0
  113. package/dist/witnet/assets/index.d.ts.map +1 -0
  114. package/dist/witnet/assets/index.js +6 -0
  115. package/dist/witnet/assets/modals/index.d.ts +18 -0
  116. package/dist/witnet/assets/modals/index.d.ts.map +1 -0
  117. package/dist/witnet/assets/modals/index.js +21 -0
  118. package/dist/witnet/assets/modals/web3/eth.d.ts +5 -0
  119. package/dist/witnet/assets/modals/web3/eth.d.ts.map +1 -0
  120. package/dist/witnet/assets/modals/web3/eth.js +26 -0
  121. package/dist/witnet/assets/modals/web3/wit.d.ts +4 -0
  122. package/dist/witnet/assets/modals/web3/wit.d.ts.map +1 -0
  123. package/dist/witnet/assets/modals/web3/wit.js +20 -0
  124. package/dist/witnet/assets/requests.d.ts +11 -0
  125. package/dist/witnet/assets/requests.d.ts.map +1 -0
  126. package/dist/witnet/assets/requests.js +88 -0
  127. package/dist/witnet/witnet.proto.json +1325 -0
  128. package/package.json +72 -0
  129. package/src/bin/cli/history.js +31 -0
  130. package/src/bin/cli/inspect.js +359 -0
  131. package/src/bin/cli/network.js +592 -0
  132. package/src/bin/cli/nodes.js +364 -0
  133. package/src/bin/cli/radon.js +814 -0
  134. package/src/bin/cli/wallet.js +1000 -0
  135. package/src/bin/helpers.js +829 -0
  136. package/src/bin/postinstall.js +9 -0
  137. package/src/bin/toolkit.js +294 -0
  138. package/witnet/assets/_index.js +8 -0
  139. package/witnet/assets/_requests.js +25 -0
  140. package/witnet/assets/_sources.js +36 -0
  141. package/witnet/assets/_templates.js +36 -0
  142. package/witnet/assets/index.js +4 -0
  143. package/witnet/assets/modals/index.js +25 -0
  144. package/witnet/assets/modals/web3/btc.js +0 -0
  145. package/witnet/assets/modals/web3/eth.js +29 -0
  146. package/witnet/assets/modals/web3/sol.js +0 -0
  147. package/witnet/assets/modals/web3/wit.js +23 -0
  148. package/witnet/assets/requests.js +94 -0
  149. 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,5 @@
1
+ export * from "./crypto";
2
+ export * as Radon from "./radon";
3
+ export * from "./rpc";
4
+ export * from "./types";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}