@bitgo/sdk-coin-stx 3.5.7 → 3.6.1
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/CHANGELOG.md +15 -0
- package/dist/src/lib/iface.d.ts +50 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/stx.d.ts +140 -3
- package/dist/src/stx.d.ts.map +1 -1
- package/dist/src/stx.js +372 -5
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,21 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.6.1](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-coin-stx@3.6.0...@bitgo/sdk-coin-stx@3.6.1) (2025-05-20)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @bitgo/sdk-coin-stx
|
|
9
|
+
|
|
10
|
+
# [3.6.0](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-coin-stx@3.5.7...@bitgo/sdk-coin-stx@3.6.0) (2025-05-07)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- **sdk-coin-stx:** bug fix in recoverable amount calculation for sip10 ([8b72846](https://github.com/BitGo/BitGoJS/commit/8b72846d84f46ce4306dbb47cc87f2c6bd6fa371))
|
|
15
|
+
- **sdk-coin-stx:** return required fields for unsigned sweep ([8a50ff8](https://github.com/BitGo/BitGoJS/commit/8a50ff884931a806357e29b3e1b2053048781398))
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
- **sdk-coin-stx:** added recover method for wrw to support stx & sip10 token ([1ff6572](https://github.com/BitGo/BitGoJS/commit/1ff6572f8aa93b6c487efe17018fc730aaffef44))
|
|
20
|
+
|
|
6
21
|
## [3.5.7](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-coin-stx@3.5.6...@bitgo/sdk-coin-stx@3.5.7) (2025-04-29)
|
|
7
22
|
|
|
8
23
|
**Note:** Version bump only for package @bitgo/sdk-coin-stx
|
package/dist/src/lib/iface.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ClarityValue, PayloadType } from '@stacks/transactions';
|
|
2
|
+
import { TransactionExplanation as BaseTransactionExplanation } from '@bitgo/sdk-core';
|
|
2
3
|
export interface TxData {
|
|
3
4
|
id: string;
|
|
4
5
|
from: string;
|
|
@@ -51,4 +52,53 @@ export interface TokenTransferParams {
|
|
|
51
52
|
amount: string;
|
|
52
53
|
memo?: string;
|
|
53
54
|
}
|
|
55
|
+
export interface TokenBalanceData {
|
|
56
|
+
balance: string;
|
|
57
|
+
total_sent: string;
|
|
58
|
+
total_received: string;
|
|
59
|
+
}
|
|
60
|
+
export interface NativeStxBalance {
|
|
61
|
+
balance: string;
|
|
62
|
+
total_miner_rewards_received: string;
|
|
63
|
+
lock_tx_id: string;
|
|
64
|
+
locked: string;
|
|
65
|
+
lock_height: number;
|
|
66
|
+
burnchain_lock_height: number;
|
|
67
|
+
burnchain_unlock_height: number;
|
|
68
|
+
}
|
|
69
|
+
export interface SingleFungibleTokenBalance {
|
|
70
|
+
balance: string;
|
|
71
|
+
}
|
|
72
|
+
export interface StxNonceResponse {
|
|
73
|
+
last_mempool_tx_nonce?: number;
|
|
74
|
+
last_executed_tx_nonce?: number;
|
|
75
|
+
possible_next_nonce: number;
|
|
76
|
+
detected_missing_nonces?: number[];
|
|
77
|
+
detected_mempool_nonces?: number[];
|
|
78
|
+
}
|
|
79
|
+
export interface StxTxnFeeEstimationResponse {
|
|
80
|
+
estimations: {
|
|
81
|
+
feeRate: number;
|
|
82
|
+
fee: number;
|
|
83
|
+
}[];
|
|
84
|
+
}
|
|
85
|
+
export interface RecoveryOptions {
|
|
86
|
+
backupKey: string;
|
|
87
|
+
userKey: string;
|
|
88
|
+
rootAddress: string;
|
|
89
|
+
recoveryDestination: string;
|
|
90
|
+
bitgoKey?: string;
|
|
91
|
+
walletPassphrase?: string;
|
|
92
|
+
contractId?: string;
|
|
93
|
+
}
|
|
94
|
+
export interface RecoveryInfo extends BaseTransactionExplanation {
|
|
95
|
+
txHex: string;
|
|
96
|
+
feeInfo?: {
|
|
97
|
+
fee: string;
|
|
98
|
+
};
|
|
99
|
+
coin?: string;
|
|
100
|
+
}
|
|
101
|
+
export interface RecoveryTransaction {
|
|
102
|
+
txHex: string;
|
|
103
|
+
}
|
|
54
104
|
//# sourceMappingURL=iface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iface.d.ts","sourceRoot":"","sources":["../../../src/lib/iface.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"iface.d.ts","sourceRoot":"","sources":["../../../src/lib/iface.ts"],"names":[],"mappings":"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"}
|
package/dist/src/lib/iface.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2lmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBDbGFyaXR5VmFsdWUsIFBheWxvYWRUeXBlIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHhEYXRhIHtcbiAgaWQ6IHN0cmluZztcbiAgZnJvbTogc3RyaW5nO1xuICBmZWU6IHN0cmluZztcbiAgbm9uY2U6IG51bWJlcjtcbiAgcGF5bG9hZDogU3RhY2tzVHJhbnNhY3Rpb25QYXlsb2FkIHwgU3RhY2tzQ29udHJhY3RQYXlsb2FkO1xufVxuZXhwb3J0IGludGVyZmFjZSBTaWduYXR1cmVEYXRhIHtcbiAgdHlwZTogbnVtYmVyO1xuICBkYXRhOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHNpZ0hhc2g6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja3NUcmFuc2FjdGlvblBheWxvYWQge1xuICByZWFkb25seSBwYXlsb2FkVHlwZTogUGF5bG9hZFR5cGUuVG9rZW5UcmFuc2ZlcjtcbiAgbWVtbz86IHN0cmluZztcbiAgdG86IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tzQ29udHJhY3RQYXlsb2FkIHtcbiAgcmVhZG9ubHkgcGF5bG9hZFR5cGU6IFBheWxvYWRUeXBlLkNvbnRyYWN0Q2FsbDtcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb25BcmdzOiBDbGFyaXR5VmFsdWVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGFyaXR5VmFsdWVKc29uIHtcbiAgdHlwZTogc3RyaW5nO1xuICB2YWw/OiBhbnkgfCBUdXBsZURhdGFbXSB8IENsYXJpdHlWYWx1ZUpzb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVwbGVEYXRhIGV4dGVuZHMgQ2xhcml0eVZhbHVlSnNvbiB7XG4gIGtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25SZXNwb25zZSB7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xuICByZWNpZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEZXRhaWxzIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBtZW1vSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZFBhcmFtcyB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmc7XG4gIG1lbW8/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5UcmFuc2ZlclBhcmFtcyB7XG4gIHNlbmRlcjogc3RyaW5nO1xuICByZWNpcGllbnQ6IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmc7XG4gIG1lbW8/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5CYWxhbmNlRGF0YSB7XG4gIGJhbGFuY2U6IHN0cmluZztcbiAgdG90YWxfc2VudDogc3RyaW5nO1xuICB0b3RhbF9yZWNlaXZlZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZVN0eEJhbGFuY2Uge1xuICBiYWxhbmNlOiBzdHJpbmc7XG4gIHRvdGFsX21pbmVyX3Jld2FyZHNfcmVjZWl2ZWQ6IHN0cmluZztcbiAgbG9ja190eF9pZDogc3RyaW5nO1xuICBsb2NrZWQ6IHN0cmluZztcbiAgbG9ja19oZWlnaHQ6IG51bWJlcjtcbiAgYnVybmNoYWluX2xvY2tfaGVpZ2h0OiBudW1iZXI7XG4gIGJ1cm5jaGFpbl91bmxvY2tfaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlRnVuZ2libGVUb2tlbkJhbGFuY2Uge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3R4Tm9uY2VSZXNwb25zZSB7XG4gIGxhc3RfbWVtcG9vbF90eF9ub25jZT86IG51bWJlcjtcbiAgbGFzdF9leGVjdXRlZF90eF9ub25jZT86IG51bWJlcjtcbiAgcG9zc2libGVfbmV4dF9ub25jZTogbnVtYmVyO1xuICBkZXRlY3RlZF9taXNzaW5nX25vbmNlcz86IG51bWJlcltdO1xuICBkZXRlY3RlZF9tZW1wb29sX25vbmNlcz86IG51bWJlcltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0eFR4bkZlZUVzdGltYXRpb25SZXNwb25zZSB7XG4gIGVzdGltYXRpb25zOiB7XG4gICAgZmVlUmF0ZTogbnVtYmVyO1xuICAgIGZlZTogbnVtYmVyO1xuICB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlcnlPcHRpb25zIHtcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgcm9vdEFkZHJlc3M6IHN0cmluZztcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICBiaXRnb0tleT86IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgY29udHJhY3RJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyeUluZm8gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIGZlZUluZm8/OiB7XG4gICAgZmVlOiBzdHJpbmc7XG4gIH07XG4gIGNvaW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlcnlUcmFuc2FjdGlvbiB7XG4gIHR4SGV4OiBzdHJpbmc7XG59XG4iXX0=
|
package/dist/src/stx.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { BaseCoin, BitGoBase, KeyPair, MultisigType, SignedTransaction, VerifyAddressOptions, VerifyTransactionOptions } from '@bitgo/sdk-core';
|
|
1
|
+
import { BaseCoin, BaseTransaction, BitGoBase, KeyPair, MultisigType, SignedTransaction, VerifyAddressOptions, VerifyTransactionOptions } from '@bitgo/sdk-core';
|
|
2
2
|
import { BaseCoin as StaticsBaseCoin, CoinFamily } from '@bitgo/statics';
|
|
3
3
|
import { ExplainTransactionOptions, StxSignTransactionOptions, StxTransactionExplanation } from './types';
|
|
4
4
|
import { TransactionBuilder } from './lib/transactionBuilder';
|
|
5
|
+
import { AddressDetails, NativeStxBalance, RecoveryInfo, RecoveryOptions, RecoveryTransaction, SingleFungibleTokenBalance, StxNonceResponse } from './lib/iface';
|
|
6
|
+
import { TransferBuilder } from './lib/transferBuilder';
|
|
7
|
+
import { FungibleTokenTransferBuilder } from './lib/fungibleTokenTransferBuilder';
|
|
5
8
|
export declare class Stx extends BaseCoin {
|
|
6
9
|
protected readonly _staticsCoin: Readonly<StaticsBaseCoin>;
|
|
7
10
|
constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
|
|
@@ -11,8 +14,6 @@ export declare class Stx extends BaseCoin {
|
|
|
11
14
|
getFullName(): string;
|
|
12
15
|
getBaseFactor(): string | number;
|
|
13
16
|
getTransaction(coinConfig: Readonly<StaticsBaseCoin>): TransactionBuilder;
|
|
14
|
-
/** {@inheritDoc } **/
|
|
15
|
-
supportsMultisig(): boolean;
|
|
16
17
|
/** inherited doc */
|
|
17
18
|
getDefaultMultisigType(): MultisigType;
|
|
18
19
|
verifyTransaction(params: VerifyTransactionOptions): Promise<boolean>;
|
|
@@ -57,5 +58,141 @@ export declare class Stx extends BaseCoin {
|
|
|
57
58
|
* @param params
|
|
58
59
|
*/
|
|
59
60
|
explainTransaction(params: ExplainTransactionOptions): Promise<StxTransactionExplanation | undefined>;
|
|
61
|
+
/**
|
|
62
|
+
* Get URLs of some active public nodes
|
|
63
|
+
* @returns {String} node url
|
|
64
|
+
*/
|
|
65
|
+
getPublicNodeUrl(): string;
|
|
66
|
+
/**
|
|
67
|
+
* Get native stacks balance for an account
|
|
68
|
+
* @param {String} address - stacks address
|
|
69
|
+
* @returns {Promise<NativeStxBalance>}
|
|
70
|
+
*/
|
|
71
|
+
protected getNativeStxBalanceFromNode({ address }: {
|
|
72
|
+
address: string;
|
|
73
|
+
}): Promise<NativeStxBalance>;
|
|
74
|
+
/**
|
|
75
|
+
* Get single fungible token balance for an account
|
|
76
|
+
* @param {String} address - stacks address
|
|
77
|
+
* @param {String} assetId - fungible token asset id
|
|
78
|
+
* @returns {Promise<SingleFungibleTokenBalance>}
|
|
79
|
+
*/
|
|
80
|
+
protected getSingleFungibleTokenBalanceFromNode({ address, assetId, }: {
|
|
81
|
+
address: string;
|
|
82
|
+
assetId: string;
|
|
83
|
+
}): Promise<SingleFungibleTokenBalance>;
|
|
84
|
+
/**
|
|
85
|
+
* Get nonce data specific to an account from a public node
|
|
86
|
+
* @param {String} address - stacks address
|
|
87
|
+
* @returns {Promise<StxNonceResponse>}
|
|
88
|
+
*/
|
|
89
|
+
protected getAccountNonceFromNode({ address }: {
|
|
90
|
+
address: string;
|
|
91
|
+
}): Promise<StxNonceResponse>;
|
|
92
|
+
/**
|
|
93
|
+
* Get stacks transaction estimated fee
|
|
94
|
+
* @param {String} txHex - hex of stacks transaction payload
|
|
95
|
+
* @param {Number} txHexLength - length of built serialized transaction
|
|
96
|
+
* @returns {Promise<Number>} - fee estimate (taking the lowest)
|
|
97
|
+
*/
|
|
98
|
+
protected getTransactionFeeEstimation({ txHex, txHexLength, }: {
|
|
99
|
+
txHex: string;
|
|
100
|
+
txHexLength: number;
|
|
101
|
+
}): Promise<number>;
|
|
102
|
+
/**
|
|
103
|
+
* Format for offline vault signing
|
|
104
|
+
* @param {BaseTransaction} tx - base transaction
|
|
105
|
+
* @returns {Promise<RecoveryInfo>}
|
|
106
|
+
*/
|
|
107
|
+
protected formatForOfflineVault(tx: BaseTransaction): Promise<RecoveryInfo>;
|
|
108
|
+
/**
|
|
109
|
+
* Get the recoverable amount & fee after subtracting the txn fee
|
|
110
|
+
* @param {String} serializedHex - serialized txn hex
|
|
111
|
+
* @param {Number} txHexLength - deserialized txn length
|
|
112
|
+
* @param {String} balance - total account balance
|
|
113
|
+
* @param {String} tokenBalance - total token balance
|
|
114
|
+
* @returns {Promise<Record<string, string>>}
|
|
115
|
+
*/
|
|
116
|
+
protected getRecoverableAmountAndFee(serializedHex: string, txHexLength: number, balance: string, tokenBalance?: string): Promise<Record<string, string>>;
|
|
117
|
+
/**
|
|
118
|
+
* Method to find the right builder for token or native coin transfer
|
|
119
|
+
* @param {String} contractAddress - token contract address
|
|
120
|
+
* @param {String} contractName - token contract name
|
|
121
|
+
* @returns {TransferBuilder|FungibleTokenTransferBuilder}
|
|
122
|
+
*/
|
|
123
|
+
protected getTokenOrNativeTransferBuilder(contractAddress?: string, contractName?: string): TransferBuilder | FungibleTokenTransferBuilder;
|
|
124
|
+
/**
|
|
125
|
+
* Method to build fungible token transfer transaction
|
|
126
|
+
* @param {FungibleTokenTransferBuilder} builder - fungible token transfer builder
|
|
127
|
+
* @param {String} contractAddress - token contract address
|
|
128
|
+
* @param {String} contractName - token contract name
|
|
129
|
+
* @param {String[]} pubs - account public keys
|
|
130
|
+
* @param {Number} nonce - account nonce
|
|
131
|
+
* @param {AddressDetails} rootAddressDetails - root address details
|
|
132
|
+
* @param {AddressDetails} destinationAddressDetails - receive address details
|
|
133
|
+
* @param {String} stxBalance - native stx balance
|
|
134
|
+
* @returns {Promise<BaseTransaction>} - built transaction
|
|
135
|
+
*/
|
|
136
|
+
protected buildTokenTransferTransaction({ builder, contractAddress, contractName, pubs, nonce, rootAddressDetails, destinationAddressDetails, stxBalance, }: {
|
|
137
|
+
builder: FungibleTokenTransferBuilder;
|
|
138
|
+
contractAddress: string;
|
|
139
|
+
contractName: string;
|
|
140
|
+
pubs: string[];
|
|
141
|
+
nonce: number;
|
|
142
|
+
rootAddressDetails: AddressDetails;
|
|
143
|
+
destinationAddressDetails: AddressDetails;
|
|
144
|
+
stxBalance: string;
|
|
145
|
+
}): Promise<BaseTransaction>;
|
|
146
|
+
/**
|
|
147
|
+
* Method to build native transfer transaction
|
|
148
|
+
* @param {TransferBuilder} builder - transfer builder
|
|
149
|
+
* @param {String[]} pubs - account public keys
|
|
150
|
+
* @param {Number} nonce - account nonce
|
|
151
|
+
* @param {AddressDetails} destinationAddressDetails - receive address details
|
|
152
|
+
* @param {String} stxBalance - native stx balance
|
|
153
|
+
* @returns {Promise<BaseTransaction>} - built transaction
|
|
154
|
+
*/
|
|
155
|
+
protected buildNativeTransferTransaction({ builder, pubs, nonce, destinationAddressDetails, stxBalance, }: {
|
|
156
|
+
builder: TransferBuilder;
|
|
157
|
+
pubs: string[];
|
|
158
|
+
nonce: number;
|
|
159
|
+
destinationAddressDetails: AddressDetails;
|
|
160
|
+
stxBalance: string;
|
|
161
|
+
}): Promise<BaseTransaction>;
|
|
162
|
+
/**
|
|
163
|
+
* Method that uses appropriate builder and builds transaction depending on token or native coin
|
|
164
|
+
* @param {String[]} pubs - public keys
|
|
165
|
+
* @param {AddressDetails} rootAddressDetails - sender address detail
|
|
166
|
+
* @param {AddressDetails} destinationAddressDetails - receiver address detail
|
|
167
|
+
* @param {Number} nonce - wallet nonce
|
|
168
|
+
* @param {String} balance - wallet balance
|
|
169
|
+
* @param {String | undefined} contractAddress - token contract address
|
|
170
|
+
* @param {String | undefined} contractName - token contract name
|
|
171
|
+
* @returns {Promise<BaseTransaction>} built transaction
|
|
172
|
+
*/
|
|
173
|
+
protected getNativeOrTokenTransaction({ pubs, rootAddressDetails, destinationAddressDetails, nonce, stxBalance, contractAddressInput, contractName, }: {
|
|
174
|
+
pubs: string[];
|
|
175
|
+
rootAddressDetails: AddressDetails;
|
|
176
|
+
destinationAddressDetails: AddressDetails;
|
|
177
|
+
nonce: number;
|
|
178
|
+
stxBalance: string;
|
|
179
|
+
contractAddressInput?: string;
|
|
180
|
+
contractName?: string;
|
|
181
|
+
}): Promise<{
|
|
182
|
+
tx: BaseTransaction;
|
|
183
|
+
builder: TransferBuilder | FungibleTokenTransferBuilder;
|
|
184
|
+
}>;
|
|
185
|
+
/**
|
|
186
|
+
* Method to recover native stx or sip10 tokens from bitgo hot & cold wallets
|
|
187
|
+
* @param {String} params.backupKey - encrypted wallet backup key (public or private)
|
|
188
|
+
* @param {String} params.userKey - encrypted wallet user key (public or private)
|
|
189
|
+
* @param {String} params.rootAddress - wallet root address
|
|
190
|
+
* @param {String} params.recoveryDestination - receive address
|
|
191
|
+
* @param {String} params.bitgoKey - encrypted bitgo public key
|
|
192
|
+
* @param {String} params.walletPassphrase - wallet password
|
|
193
|
+
* @param {String} params.contractId - contract id of the token (mandatory for token recovery)
|
|
194
|
+
* @returns {Promise<RecoveryInfo|RecoveryTransaction>} RecoveryTransaction.txHex - hex of serialized transaction (signed or unsigned)
|
|
195
|
+
*/
|
|
196
|
+
recover(params: RecoveryOptions): Promise<RecoveryInfo | RecoveryTransaction>;
|
|
60
197
|
}
|
|
61
198
|
//# sourceMappingURL=stx.d.ts.map
|
package/dist/src/stx.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stx.d.ts","sourceRoot":"","sources":["../../src/stx.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,SAAS,
|
|
1
|
+
{"version":3,"file":"stx.d.ts","sourceRoot":"","sources":["../../src/stx.ts"],"names":[],"mappings":"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"}
|
package/dist/src/stx.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.Stx = void 0;
|
|
4
7
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
5
8
|
const statics_1 = require("@bitgo/statics");
|
|
6
9
|
const transactions_1 = require("@stacks/transactions");
|
|
10
|
+
const payload_1 = require("@stacks/transactions/dist/payload");
|
|
11
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
7
12
|
const _1 = require(".");
|
|
8
13
|
const lib_1 = require("./lib");
|
|
9
14
|
const utils_1 = require("./lib/utils");
|
|
@@ -33,10 +38,6 @@ class Stx extends sdk_core_1.BaseCoin {
|
|
|
33
38
|
getTransaction(coinConfig) {
|
|
34
39
|
return new lib_1.TransactionBuilderFactory(coinConfig).getTransferBuilder();
|
|
35
40
|
}
|
|
36
|
-
/** {@inheritDoc } **/
|
|
37
|
-
supportsMultisig() {
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
41
|
/** inherited doc */
|
|
41
42
|
getDefaultMultisigType() {
|
|
42
43
|
return sdk_core_1.multisigTypes.onchain;
|
|
@@ -229,6 +230,372 @@ class Stx extends sdk_core_1.BaseCoin {
|
|
|
229
230
|
};
|
|
230
231
|
}
|
|
231
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Get URLs of some active public nodes
|
|
235
|
+
* @returns {String} node url
|
|
236
|
+
*/
|
|
237
|
+
getPublicNodeUrl() {
|
|
238
|
+
return sdk_core_1.Environments[this.bitgo.getEnv()].stxNodeUrl;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get native stacks balance for an account
|
|
242
|
+
* @param {String} address - stacks address
|
|
243
|
+
* @returns {Promise<NativeStxBalance>}
|
|
244
|
+
*/
|
|
245
|
+
async getNativeStxBalanceFromNode({ address }) {
|
|
246
|
+
const endpoint = `${this.getPublicNodeUrl()}/extended/v2/addresses/${address}/balances/stx`;
|
|
247
|
+
try {
|
|
248
|
+
const response = await this.bitgo.get(endpoint);
|
|
249
|
+
if (response.statusCode !== 200) {
|
|
250
|
+
throw new Error(`request failed with status ${response.statusCode}`);
|
|
251
|
+
}
|
|
252
|
+
const body = response.body;
|
|
253
|
+
return body;
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
throw new Error(`unable to get native stx balance from node: ${e.message}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get single fungible token balance for an account
|
|
261
|
+
* @param {String} address - stacks address
|
|
262
|
+
* @param {String} assetId - fungible token asset id
|
|
263
|
+
* @returns {Promise<SingleFungibleTokenBalance>}
|
|
264
|
+
*/
|
|
265
|
+
async getSingleFungibleTokenBalanceFromNode({ address, assetId, }) {
|
|
266
|
+
const endpoint = `${this.getPublicNodeUrl()}/extended/v2/addresses/${address}/balances/ft/${assetId}`;
|
|
267
|
+
try {
|
|
268
|
+
const response = await this.bitgo.get(endpoint);
|
|
269
|
+
if (response.statusCode !== 200) {
|
|
270
|
+
throw new Error(`request failed with status ${response.statusCode}`);
|
|
271
|
+
}
|
|
272
|
+
const body = response.body;
|
|
273
|
+
return body;
|
|
274
|
+
}
|
|
275
|
+
catch (e) {
|
|
276
|
+
throw new Error(`unable to get native stx balance from node: ${e.message}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get nonce data specific to an account from a public node
|
|
281
|
+
* @param {String} address - stacks address
|
|
282
|
+
* @returns {Promise<StxNonceResponse>}
|
|
283
|
+
*/
|
|
284
|
+
async getAccountNonceFromNode({ address }) {
|
|
285
|
+
const endpoint = `${this.getPublicNodeUrl()}/extended/v1/address/${address}/nonces`;
|
|
286
|
+
try {
|
|
287
|
+
const response = await this.bitgo.get(endpoint);
|
|
288
|
+
if (response.statusCode !== 200) {
|
|
289
|
+
throw new Error(`request failed with status ${response.statusCode}`);
|
|
290
|
+
}
|
|
291
|
+
const body = response.body;
|
|
292
|
+
return body;
|
|
293
|
+
}
|
|
294
|
+
catch (e) {
|
|
295
|
+
throw new Error(`unable to get account nonce from node: ${e.message}`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Get stacks transaction estimated fee
|
|
300
|
+
* @param {String} txHex - hex of stacks transaction payload
|
|
301
|
+
* @param {Number} txHexLength - length of built serialized transaction
|
|
302
|
+
* @returns {Promise<Number>} - fee estimate (taking the lowest)
|
|
303
|
+
*/
|
|
304
|
+
async getTransactionFeeEstimation({ txHex, txHexLength, }) {
|
|
305
|
+
const endpoint = `${this.getPublicNodeUrl()}/v2/fees/transaction`;
|
|
306
|
+
const requestBody = {
|
|
307
|
+
transaction_payload: txHex,
|
|
308
|
+
estimated_len: txHexLength,
|
|
309
|
+
};
|
|
310
|
+
try {
|
|
311
|
+
const response = await this.bitgo.post(endpoint).send(requestBody);
|
|
312
|
+
if (response.statusCode !== 200) {
|
|
313
|
+
throw new Error(`request failed with status ${response.statusCode}`);
|
|
314
|
+
}
|
|
315
|
+
const body = response.body;
|
|
316
|
+
if (body.estimations.length !== 3) {
|
|
317
|
+
throw new Error('Invalid response estimation length');
|
|
318
|
+
}
|
|
319
|
+
return body.estimations[0].fee;
|
|
320
|
+
}
|
|
321
|
+
catch (e) {
|
|
322
|
+
throw new Error(`unable to get transaction fee estimation: ${e.message}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Format for offline vault signing
|
|
327
|
+
* @param {BaseTransaction} tx - base transaction
|
|
328
|
+
* @returns {Promise<RecoveryInfo>}
|
|
329
|
+
*/
|
|
330
|
+
async formatForOfflineVault(tx) {
|
|
331
|
+
const txJson = tx.toJson();
|
|
332
|
+
const transactionExplanation = (await this.explainTransaction({
|
|
333
|
+
txHex: tx.toBroadcastFormat(),
|
|
334
|
+
feeInfo: { fee: txJson.fee },
|
|
335
|
+
}));
|
|
336
|
+
transactionExplanation.coin = this.getChain();
|
|
337
|
+
transactionExplanation.feeInfo = { fee: txJson.fee };
|
|
338
|
+
transactionExplanation.txHex = tx.toBroadcastFormat();
|
|
339
|
+
return transactionExplanation;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Get the recoverable amount & fee after subtracting the txn fee
|
|
343
|
+
* @param {String} serializedHex - serialized txn hex
|
|
344
|
+
* @param {Number} txHexLength - deserialized txn length
|
|
345
|
+
* @param {String} balance - total account balance
|
|
346
|
+
* @param {String} tokenBalance - total token balance
|
|
347
|
+
* @returns {Promise<Record<string, string>>}
|
|
348
|
+
*/
|
|
349
|
+
async getRecoverableAmountAndFee(serializedHex, txHexLength, balance, tokenBalance) {
|
|
350
|
+
const estimatedFee = await this.getTransactionFeeEstimation({
|
|
351
|
+
txHex: serializedHex,
|
|
352
|
+
txHexLength: txHexLength,
|
|
353
|
+
});
|
|
354
|
+
const balanceBN = new bignumber_js_1.default(balance);
|
|
355
|
+
const feeBN = new bignumber_js_1.default(estimatedFee);
|
|
356
|
+
if (balanceBN.isLessThan(feeBN)) {
|
|
357
|
+
throw new Error('insufficient balance to build the transaction');
|
|
358
|
+
}
|
|
359
|
+
return {
|
|
360
|
+
recoverableAmount: tokenBalance ?? balanceBN.minus(feeBN).toString(),
|
|
361
|
+
fee: feeBN.toString(),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Method to find the right builder for token or native coin transfer
|
|
366
|
+
* @param {String} contractAddress - token contract address
|
|
367
|
+
* @param {String} contractName - token contract name
|
|
368
|
+
* @returns {TransferBuilder|FungibleTokenTransferBuilder}
|
|
369
|
+
*/
|
|
370
|
+
getTokenOrNativeTransferBuilder(contractAddress, contractName) {
|
|
371
|
+
const isToken = !!contractAddress && !!contractName;
|
|
372
|
+
let factory;
|
|
373
|
+
if (isToken) {
|
|
374
|
+
const tokenName = (0, utils_1.findTokenNameByContract)(contractAddress, contractName);
|
|
375
|
+
if (!tokenName) {
|
|
376
|
+
throw new Error('invalid contract address or contract name, not supported');
|
|
377
|
+
}
|
|
378
|
+
factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get(tokenName));
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
|
|
382
|
+
}
|
|
383
|
+
let builder;
|
|
384
|
+
if (isToken) {
|
|
385
|
+
builder = factory.getFungibleTokenTransferBuilder();
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
builder = factory.getTransferBuilder();
|
|
389
|
+
}
|
|
390
|
+
return builder;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Method to build fungible token transfer transaction
|
|
394
|
+
* @param {FungibleTokenTransferBuilder} builder - fungible token transfer builder
|
|
395
|
+
* @param {String} contractAddress - token contract address
|
|
396
|
+
* @param {String} contractName - token contract name
|
|
397
|
+
* @param {String[]} pubs - account public keys
|
|
398
|
+
* @param {Number} nonce - account nonce
|
|
399
|
+
* @param {AddressDetails} rootAddressDetails - root address details
|
|
400
|
+
* @param {AddressDetails} destinationAddressDetails - receive address details
|
|
401
|
+
* @param {String} stxBalance - native stx balance
|
|
402
|
+
* @returns {Promise<BaseTransaction>} - built transaction
|
|
403
|
+
*/
|
|
404
|
+
async buildTokenTransferTransaction({ builder, contractAddress, contractName, pubs, nonce, rootAddressDetails, destinationAddressDetails, stxBalance, }) {
|
|
405
|
+
const txBuilder = builder;
|
|
406
|
+
const contractTokenName = (0, utils_1.findContractTokenNameUsingContract)(contractAddress, contractName);
|
|
407
|
+
if (!contractTokenName) {
|
|
408
|
+
throw new Error('invalid contract address or contract name, not supported');
|
|
409
|
+
}
|
|
410
|
+
const assetId = `${contractAddress}.${contractName}::${contractTokenName}`;
|
|
411
|
+
// fetch the token balance
|
|
412
|
+
const tokenBalanceData = await this.getSingleFungibleTokenBalanceFromNode({
|
|
413
|
+
address: rootAddressDetails.address,
|
|
414
|
+
assetId,
|
|
415
|
+
});
|
|
416
|
+
const tokenBalance = tokenBalanceData?.balance;
|
|
417
|
+
if (!Number(tokenBalance) || isNaN(Number(tokenBalance))) {
|
|
418
|
+
throw new Error(`no token balance found to recover for address: ${rootAddressDetails.address}, token: ${assetId}`);
|
|
419
|
+
}
|
|
420
|
+
txBuilder.fee({ fee: '200' });
|
|
421
|
+
txBuilder.numberSignatures(2);
|
|
422
|
+
txBuilder.fromPubKey(pubs);
|
|
423
|
+
txBuilder.nonce(nonce);
|
|
424
|
+
txBuilder.contractAddress(contractAddress);
|
|
425
|
+
txBuilder.contractName(contractName);
|
|
426
|
+
if (contractTokenName) {
|
|
427
|
+
txBuilder.tokenName(contractTokenName);
|
|
428
|
+
}
|
|
429
|
+
txBuilder.functionName('transfer');
|
|
430
|
+
const functionArgs = [
|
|
431
|
+
(0, transactions_1.uintCV)(tokenBalance),
|
|
432
|
+
(0, transactions_1.standardPrincipalCV)(rootAddressDetails.address),
|
|
433
|
+
(0, transactions_1.standardPrincipalCV)(destinationAddressDetails.address),
|
|
434
|
+
];
|
|
435
|
+
if (destinationAddressDetails.memoId) {
|
|
436
|
+
functionArgs.push((0, transactions_1.someCV)((0, transactions_1.bufferCVFromString)(destinationAddressDetails.memoId)));
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
functionArgs.push((0, transactions_1.noneCV)());
|
|
440
|
+
}
|
|
441
|
+
txBuilder.functionArgs(functionArgs);
|
|
442
|
+
const baseTxn = await txBuilder.build();
|
|
443
|
+
const txBroadcastFormat = baseTxn.toBroadcastFormat();
|
|
444
|
+
const txDeserialized = (0, transactions_1.deserializeTransaction)(txBroadcastFormat);
|
|
445
|
+
const serializedHex = (0, payload_1.serializePayload)(txDeserialized.payload).toString('hex');
|
|
446
|
+
const { recoverableAmount, fee } = await this.getRecoverableAmountAndFee(serializedHex, txBroadcastFormat.length, stxBalance, tokenBalance);
|
|
447
|
+
functionArgs[0] = (0, transactions_1.uintCV)(recoverableAmount);
|
|
448
|
+
txBuilder.functionArgs(functionArgs);
|
|
449
|
+
txBuilder.fee({ fee: fee });
|
|
450
|
+
return await txBuilder.build();
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Method to build native transfer transaction
|
|
454
|
+
* @param {TransferBuilder} builder - transfer builder
|
|
455
|
+
* @param {String[]} pubs - account public keys
|
|
456
|
+
* @param {Number} nonce - account nonce
|
|
457
|
+
* @param {AddressDetails} destinationAddressDetails - receive address details
|
|
458
|
+
* @param {String} stxBalance - native stx balance
|
|
459
|
+
* @returns {Promise<BaseTransaction>} - built transaction
|
|
460
|
+
*/
|
|
461
|
+
async buildNativeTransferTransaction({ builder, pubs, nonce, destinationAddressDetails, stxBalance, }) {
|
|
462
|
+
const txBuilder = builder;
|
|
463
|
+
txBuilder.fee({ fee: '200' });
|
|
464
|
+
txBuilder.numberSignatures(2);
|
|
465
|
+
txBuilder.fromPubKey(pubs);
|
|
466
|
+
txBuilder.nonce(nonce);
|
|
467
|
+
txBuilder.to(destinationAddressDetails.address);
|
|
468
|
+
txBuilder.amount(stxBalance);
|
|
469
|
+
if (destinationAddressDetails.memoId) {
|
|
470
|
+
txBuilder.memo(destinationAddressDetails.memoId);
|
|
471
|
+
}
|
|
472
|
+
const baseTxn = await txBuilder.build();
|
|
473
|
+
const txBroadcastFormat = baseTxn.toBroadcastFormat();
|
|
474
|
+
const txDeserialized = (0, transactions_1.deserializeTransaction)(txBroadcastFormat);
|
|
475
|
+
const serializedHex = (0, payload_1.serializePayload)(txDeserialized.payload).toString('hex');
|
|
476
|
+
const { recoverableAmount, fee } = await this.getRecoverableAmountAndFee(serializedHex, txBroadcastFormat.length, stxBalance);
|
|
477
|
+
txBuilder.amount(recoverableAmount);
|
|
478
|
+
txBuilder.fee({ fee: fee });
|
|
479
|
+
return await txBuilder.build();
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Method that uses appropriate builder and builds transaction depending on token or native coin
|
|
483
|
+
* @param {String[]} pubs - public keys
|
|
484
|
+
* @param {AddressDetails} rootAddressDetails - sender address detail
|
|
485
|
+
* @param {AddressDetails} destinationAddressDetails - receiver address detail
|
|
486
|
+
* @param {Number} nonce - wallet nonce
|
|
487
|
+
* @param {String} balance - wallet balance
|
|
488
|
+
* @param {String | undefined} contractAddress - token contract address
|
|
489
|
+
* @param {String | undefined} contractName - token contract name
|
|
490
|
+
* @returns {Promise<BaseTransaction>} built transaction
|
|
491
|
+
*/
|
|
492
|
+
async getNativeOrTokenTransaction({ pubs, rootAddressDetails, destinationAddressDetails, nonce, stxBalance, contractAddressInput, contractName, }) {
|
|
493
|
+
const builder = this.getTokenOrNativeTransferBuilder(contractAddressInput, contractName);
|
|
494
|
+
const contractAddress = contractAddressInput?.toUpperCase();
|
|
495
|
+
const isToken = !!contractAddress && !!contractName;
|
|
496
|
+
let finalTx;
|
|
497
|
+
if (isToken) {
|
|
498
|
+
finalTx = await this.buildTokenTransferTransaction({
|
|
499
|
+
builder: builder,
|
|
500
|
+
contractAddress,
|
|
501
|
+
contractName,
|
|
502
|
+
pubs,
|
|
503
|
+
nonce,
|
|
504
|
+
rootAddressDetails,
|
|
505
|
+
destinationAddressDetails,
|
|
506
|
+
stxBalance,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
finalTx = await this.buildNativeTransferTransaction({
|
|
511
|
+
builder: builder,
|
|
512
|
+
pubs,
|
|
513
|
+
nonce,
|
|
514
|
+
destinationAddressDetails,
|
|
515
|
+
stxBalance,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
return {
|
|
519
|
+
tx: finalTx,
|
|
520
|
+
builder: builder,
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Method to recover native stx or sip10 tokens from bitgo hot & cold wallets
|
|
525
|
+
* @param {String} params.backupKey - encrypted wallet backup key (public or private)
|
|
526
|
+
* @param {String} params.userKey - encrypted wallet user key (public or private)
|
|
527
|
+
* @param {String} params.rootAddress - wallet root address
|
|
528
|
+
* @param {String} params.recoveryDestination - receive address
|
|
529
|
+
* @param {String} params.bitgoKey - encrypted bitgo public key
|
|
530
|
+
* @param {String} params.walletPassphrase - wallet password
|
|
531
|
+
* @param {String} params.contractId - contract id of the token (mandatory for token recovery)
|
|
532
|
+
* @returns {Promise<RecoveryInfo|RecoveryTransaction>} RecoveryTransaction.txHex - hex of serialized transaction (signed or unsigned)
|
|
533
|
+
*/
|
|
534
|
+
async recover(params) {
|
|
535
|
+
if (!this.isValidAddress(params.rootAddress)) {
|
|
536
|
+
throw new Error('invalid root address!');
|
|
537
|
+
}
|
|
538
|
+
if (!this.isValidAddress(params.recoveryDestination)) {
|
|
539
|
+
throw new Error('invalid destination address!');
|
|
540
|
+
}
|
|
541
|
+
let contractAddress;
|
|
542
|
+
let contractName;
|
|
543
|
+
if (params.contractId) {
|
|
544
|
+
[contractAddress, contractName] = params.contractId.split('.');
|
|
545
|
+
if ((contractAddress && !contractName) || (contractName && !contractAddress)) {
|
|
546
|
+
throw new Error('invalid contract id, please provide it in the form (contractAddress.contractName)');
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
const isUnsignedSweep = (0, sdk_core_1.getIsUnsignedSweep)(params);
|
|
550
|
+
const keys = (0, sdk_core_1.getBip32Keys)(this.bitgo, params, { requireBitGoXpub: true });
|
|
551
|
+
const rootAddressDetails = (0, utils_1.getAddressDetails)(params.rootAddress);
|
|
552
|
+
const [accountBalanceData, accountNonceData] = await Promise.all([
|
|
553
|
+
this.getNativeStxBalanceFromNode({ address: rootAddressDetails.address }),
|
|
554
|
+
this.getAccountNonceFromNode({ address: rootAddressDetails.address }),
|
|
555
|
+
]);
|
|
556
|
+
const balance = Number(accountBalanceData.balance);
|
|
557
|
+
if (!balance || isNaN(balance)) {
|
|
558
|
+
throw new Error('could not find any balance to recover for ' + params.rootAddress);
|
|
559
|
+
}
|
|
560
|
+
const userPub = (0, transactions_1.publicKeyFromBuffer)(keys[0].publicKey);
|
|
561
|
+
const backupPub = (0, transactions_1.publicKeyFromBuffer)(keys[1].publicKey);
|
|
562
|
+
const bitgoPubKey = (0, transactions_1.publicKeyFromBuffer)(keys[2].publicKey);
|
|
563
|
+
const pubs = [(0, transactions_1.publicKeyToString)(userPub), (0, transactions_1.publicKeyToString)(backupPub), (0, transactions_1.publicKeyToString)(bitgoPubKey)];
|
|
564
|
+
const destinationAddressDetails = (0, utils_1.getAddressDetails)(params.recoveryDestination);
|
|
565
|
+
const nonce = typeof accountNonceData?.last_executed_tx_nonce === 'number' ? accountNonceData.last_executed_tx_nonce + 1 : 0;
|
|
566
|
+
const { tx, builder } = await this.getNativeOrTokenTransaction({
|
|
567
|
+
pubs,
|
|
568
|
+
rootAddressDetails,
|
|
569
|
+
destinationAddressDetails,
|
|
570
|
+
nonce,
|
|
571
|
+
stxBalance: accountBalanceData.balance,
|
|
572
|
+
contractAddressInput: contractAddress,
|
|
573
|
+
contractName: contractName,
|
|
574
|
+
});
|
|
575
|
+
if (isUnsignedSweep) {
|
|
576
|
+
return await this.formatForOfflineVault(tx);
|
|
577
|
+
}
|
|
578
|
+
// check the private key & sign
|
|
579
|
+
if (!keys[0].privateKey) {
|
|
580
|
+
throw new Error(`userKey is not a private key`);
|
|
581
|
+
}
|
|
582
|
+
const userKey = (0, transactions_1.createStacksPrivateKey)(keys[0].privateKey);
|
|
583
|
+
builder.sign({ key: (0, transactions_1.privateKeyToString)(userKey) });
|
|
584
|
+
const halfSignedTx = await builder.build();
|
|
585
|
+
const txHexHalfSigned = halfSignedTx.toBroadcastFormat();
|
|
586
|
+
const builder2 = this.getTokenOrNativeTransferBuilder(contractAddress, contractName);
|
|
587
|
+
builder2.from(txHexHalfSigned);
|
|
588
|
+
if (!keys[1].privateKey) {
|
|
589
|
+
throw new Error(`backupKey is not a private key`);
|
|
590
|
+
}
|
|
591
|
+
const backupKey = (0, transactions_1.createStacksPrivateKey)(keys[1].privateKey);
|
|
592
|
+
builder2.sign({ key: (0, transactions_1.privateKeyToString)(backupKey) });
|
|
593
|
+
const fullySignedTx = await builder2.build();
|
|
594
|
+
const fullySignedTxHex = fullySignedTx.toBroadcastFormat();
|
|
595
|
+
return {
|
|
596
|
+
txHex: fullySignedTxHex,
|
|
597
|
+
};
|
|
598
|
+
}
|
|
232
599
|
}
|
|
233
600
|
exports.Stx = Stx;
|
|
234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FXeUI7QUFDekIsNENBQWdGO0FBQ2hGLHVEQUEwRTtBQUcxRSx3QkFBMkI7QUFDM0IsK0JBQWtEO0FBRWxELHVDQUFzRDtBQUV0RCxNQUFhLEdBQUksU0FBUSxtQkFBUTtJQUcvQixZQUFZLEtBQWdCLEVBQUUsV0FBdUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsY0FBYyxDQUFDLFVBQXFDO1FBQ2xELE9BQU8sSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsZ0JBQWdCO1FBQ2Qs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LE1BQU0sQ0FBQyxHQUFHO2dCQUNmLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtnQkFDYixlQUFlLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlO2dCQUMvQyxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZO2dCQUN6QyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVk7Z0JBQzdDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWTthQUNsRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTdQRCxrQkE2UEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBLZXlQYWlyLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBDb2luRmFtaWx5LCBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IENsYXJpdHlUeXBlLCBjdlRvU3RyaW5nLCBjdlRvVmFsdWUgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5cbmltcG9ydCB7IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMsIFN0eFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsIFN0eFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFN0eExpYiB9IGZyb20gJy4nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vbGliJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBmaW5kVG9rZW5OYW1lQnlDb250cmFjdCB9IGZyb20gJy4vbGliL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFN0eCBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBTdHgoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogQ29pbkZhbWlseSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZ1bGxOYW1lO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBnZXRUcmFuc2FjdGlvbihjb2luQ29uZmlnOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZykuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gIH1cblxuICAvKioge0Bpbmhlcml0RG9jIH0gKiovXG4gIHN1cHBvcnRzTXVsdGlzaWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMub25jaGFpbjtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHR4UGFyYW1zLnJlY2lwaWVudHMpICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHt0aGlzLmdldENoYWluKCl9IGRvZXNuJ3Qgc3VwcG9ydCBzZW5kaW5nIHRvIG1vcmUgdGhhbiAxIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBUcnkgYWdhaW4sIHVzaW5nIG9ubHkgYSBzaW5nbGUgcmVjaXBpZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgaXMgdmFsaWQsIHRoZW4gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIGJhc2UgYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtWZXJpZnlBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBhZGRyZXNzIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmJhc2VBZGRyZXNzIC0gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB3YWxsZXRcbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBrZXljaGFpbnMgfSA9IHBhcmFtcztcbiAgICBpZiAoIWtleWNoYWlucyB8fCBrZXljaGFpbnMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5Y2hhaW5zJyk7XG4gICAgfVxuICAgIGNvbnN0IHB1YnMgPSBrZXljaGFpbnMubWFwKChrZXljaGFpbikgPT4gU3R4TGliLlV0aWxzLnhwdWJUb1NUWFB1YmtleShrZXljaGFpbi5wdWIpKTtcbiAgICBjb25zdCBhZGRyZXNzVmVyc2lvbiA9IFN0eExpYi5VdGlscy5nZXRBZGRyZXNzVmVyc2lvbihhZGRyZXNzKTtcbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IFN0eExpYi5VdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHVicywgYWRkcmVzc1ZlcnNpb24pLmFkZHJlc3M7XG4gICAgcmV0dXJuIFN0eExpYi5VdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzLCBiYXNlQWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgU3RhY2tzIGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzZWVkIC0gU2VlZCBmcm9tIHdoaWNoIHRoZSBuZXcga2V5cGFpciBzaG91bGQgYmUgZ2VuZXJhdGVkLCBvdGhlcndpc2UgYSByYW5kb20gc2VlZCBpcyB1c2VkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIgYW5kIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBTdHhMaWIuS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgU3R4TGliLktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKTtcblxuICAgIGlmICgha2V5cy54cHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgeHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnhwdWIsXG4gICAgICBwcnY6IGtleXMueHBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHViIHRoZSBwcnYgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFN0eExpYi5VdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHJpdmF0ZSBrZXkgZm9yIHRoZSBjb2luXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcnYgdGhlIHBydiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFBydihwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU3R4TGliLlV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KHBydik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU3R4TGliLlV0aWxzLmlzVmFsaWRBZGRyZXNzV2l0aFBheW1lbnRJZChhZGRyZXNzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHN0YWNrcyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTdHhTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbShwYXJhbXMudHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgcHJ2S2V5cyA9IHBhcmFtcy5wcnYgaW5zdGFuY2VvZiBBcnJheSA/IHBhcmFtcy5wcnYgOiBbcGFyYW1zLnBydl07XG4gICAgcHJ2S2V5cy5mb3JFYWNoKChwcnYpID0+IHR4QnVpbGRlci5zaWduKHsga2V5OiBwcnYgfSkpO1xuICAgIGlmIChwYXJhbXMucHViS2V5cykgdHhCdWlsZGVyLmZyb21QdWJLZXkocGFyYW1zLnB1YktleXMpO1xuICAgIC8vIGlmIChwYXJhbXMubnVtYmVyU2lnbmF0dXJlKSB0eEJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcyhwYXJhbXMubnVtYmVyU2lnbmF0dXJlKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lc3NhZ2UgcGFzc2VkIHRvIHNpZ25NZXNzYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhIZXggPSB7XG4gICAgICB0eEhleDogdHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGggPj0gMiA/IHR4SGV4IDogeyBoYWxmU2lnbmVkOiB0eEhleCB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gYSBTdGFja3MgdHJhbnNhY3Rpb24gZnJvbSB0eEhleFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTdHhUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgdHhIZXggPSBwYXJhbXMudHhIZXggfHwgKHBhcmFtcy5oYWxmU2lnbmVkICYmIHBhcmFtcy5oYWxmU2lnbmVkLnR4SGV4KTtcbiAgICBpZiAoIXR4SGV4IHx8ICFwYXJhbXMuZmVlSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGV4cGxhaW4gdHggcGFyYW1ldGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eEhleCk7XG5cbiAgICBpZiAocGFyYW1zLnB1YmxpY0tleXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHhCdWlsZGVyLmZyb21QdWJLZXkocGFyYW1zLnB1YmxpY0tleXMpO1xuICAgICAgaWYgKHBhcmFtcy5wdWJsaWNLZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBkZWZpbml0ZWx5IGEgc2luZ2xlIHNpZyB0eFxuICAgICAgICB0eEJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgaWYgKHR4LnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKSB7XG4gICAgICAvLyBjaGVjayBpZiBpdCBpcyBhIHRva2VuIHRyYW5zYWN0aW9uIG9yIG5hdGl2ZSBjb2luIHRyYW5zYWN0aW9uXG4gICAgICBsZXQgdHJhbnNhY3Rpb25SZWNpcGllbnQ6IFRyYW5zYWN0aW9uUmVjaXBpZW50O1xuICAgICAgbGV0IG91dHB1dEFtb3VudDogc3RyaW5nO1xuICAgICAgbGV0IG1lbW86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eEpzb24ucGF5bG9hZC5jb250cmFjdEFkZHJlc3MgJiYgdHhKc29uLnBheWxvYWQuZnVuY3Rpb25BcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIG91dHB1dEFtb3VudCA9IGN2VG9WYWx1ZSh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0pLnRvU3RyaW5nKCk7XG4gICAgICAgIHRyYW5zYWN0aW9uUmVjaXBpZW50ID0ge1xuICAgICAgICAgIGFkZHJlc3M6IGN2VG9TdHJpbmcodHhKc29uLnBheWxvYWQuZnVuY3Rpb25BcmdzWzJdKSxcbiAgICAgICAgICBhbW91bnQ6IG91dHB1dEFtb3VudCxcbiAgICAgICAgICB0b2tlbk5hbWU6IGZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0KHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0QWRkcmVzcywgdHhKc29uLnBheWxvYWQuY29udHJhY3ROYW1lKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uQXJncy5sZW5ndGggPT09IDQgJiZcbiAgICAgICAgICB0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3NbM10udHlwZSA9PT0gQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lXG4gICAgICAgICkge1xuICAgICAgICAgIG1lbW8gPSBCdWZmZXIuZnJvbSh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3NbM10udmFsdWUuYnVmZmVyKS50b1N0cmluZygpO1xuICAgICAgICAgIHRyYW5zYWN0aW9uUmVjaXBpZW50WydtZW1vJ10gPSBtZW1vO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRBbW91bnQgPSB0eEpzb24ucGF5bG9hZC5hbW91bnQ7XG4gICAgICAgIG1lbW8gPSB0eEpzb24ucGF5bG9hZC5tZW1vO1xuICAgICAgICB0cmFuc2FjdGlvblJlY2lwaWVudCA9IHtcbiAgICAgICAgICBhZGRyZXNzOiB0eEpzb24ucGF5bG9hZC50byxcbiAgICAgICAgICBhbW91bnQ6IG91dHB1dEFtb3VudCxcbiAgICAgICAgICBtZW1vOiBtZW1vLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IFt0cmFuc2FjdGlvblJlY2lwaWVudF07XG5cbiAgICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ21lbW8nLCAndHlwZSddO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgICBvdXRwdXRBbW91bnQ6IG91dHB1dEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGZlZTogdHhKc29uLmZlZSxcbiAgICAgICAgbWVtbzogbWVtbyxcbiAgICAgICAgdHlwZTogdHgudHlwZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHR4LnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFtcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2ZlZScsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ2NvbnRyYWN0QWRkcmVzcycsXG4gICAgICAgICdjb250cmFjdE5hbWUnLFxuICAgICAgICAnY29udHJhY3RGdW5jdGlvbicsXG4gICAgICAgICdjb250cmFjdEZ1bmN0aW9uQXJncycsXG4gICAgICBdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnJyxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHR4SnNvbi5mZWUsXG4gICAgICAgIHR5cGU6IHR4LnR5cGUsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogdHhKc29uLnBheWxvYWQuY29udHJhY3RBZGRyZXNzLFxuICAgICAgICBjb250cmFjdE5hbWU6IHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0TmFtZSxcbiAgICAgICAgY29udHJhY3RGdW5jdGlvbjogdHhKc29uLnBheWxvYWQuZnVuY3Rpb25OYW1lLFxuICAgICAgICBjb250cmFjdEZ1bmN0aW9uQXJnczogdHhKc29uLnBheWxvYWQuZnVuY3Rpb25BcmdzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
601
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FleUI7QUFDekIsNENBQWdGO0FBQ2hGLHVEQWU4QjtBQUM5QiwrREFBcUU7QUFDckUsZ0VBQXFDO0FBR3JDLHdCQUEyQjtBQUMzQiwrQkFBa0Q7QUFFbEQsdUNBQTZHO0FBZTdHLE1BQWEsR0FBSSxTQUFRLG1CQUFRO0lBRy9CLFlBQVksS0FBZ0IsRUFBRSxXQUF1QztRQUNuRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxjQUFjLENBQUMsVUFBcUM7UUFDbEQsT0FBTyxJQUFJLCtCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDeEUsQ0FBQztJ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ZSxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUEscUNBQXNCLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBQSxpQ0FBa0IsRUFBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsS0FBSyxFQUFFLGdCQUFnQjtTQUN4QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBL3JCRCxrQkErckJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZUNvaW4sXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgQml0R29CYXNlLFxuICBFbnZpcm9ubWVudHMsXG4gIGdldEJpcDMyS2V5cyxcbiAgZ2V0SXNVbnNpZ25lZFN3ZWVwLFxuICBLZXlQYWlyLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBDb2luRmFtaWx5LCBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7XG4gIGJ1ZmZlckNWRnJvbVN0cmluZyxcbiAgQ2xhcml0eVR5cGUsXG4gIENsYXJpdHlWYWx1ZSxcbiAgY3JlYXRlU3RhY2tzUHJpdmF0ZUtleSxcbiAgY3ZUb1N0cmluZyxcbiAgY3ZUb1ZhbHVlLFxuICBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uLFxuICBub25lQ1YsXG4gIHByaXZhdGVLZXlUb1N0cmluZyxcbiAgcHVibGljS2V5RnJvbUJ1ZmZlcixcbiAgcHVibGljS2V5VG9TdHJpbmcsXG4gIHNvbWVDVixcbiAgc3RhbmRhcmRQcmluY2lwYWxDVixcbiAgdWludENWLFxufSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBzZXJpYWxpemVQYXlsb2FkIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMvZGlzdC9wYXlsb2FkJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuaW1wb3J0IHsgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucywgU3R4U2lnblRyYW5zYWN0aW9uT3B0aW9ucywgU3R4VHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU3R4TGliIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9saWIvdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IGZpbmRDb250cmFjdFRva2VuTmFtZVVzaW5nQ29udHJhY3QsIGZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0LCBnZXRBZGRyZXNzRGV0YWlscyB9IGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7XG4gIEFkZHJlc3NEZXRhaWxzLFxuICBOYXRpdmVTdHhCYWxhbmNlLFxuICBSZWNvdmVyeUluZm8sXG4gIFJlY292ZXJ5T3B0aW9ucyxcbiAgUmVjb3ZlcnlUcmFuc2FjdGlvbixcbiAgU2luZ2xlRnVuZ2libGVUb2tlbkJhbGFuY2UsXG4gIFN0eE5vbmNlUmVzcG9uc2UsXG4gIFN0eFR4bkZlZUVzdGltYXRpb25SZXNwb25zZSxcbiAgVHhEYXRhLFxufSBmcm9tICcuL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL2xpYi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgRnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4vbGliL2Z1bmdpYmxlVG9rZW5UcmFuc2ZlckJ1aWxkZXInO1xuXG5leHBvcnQgY2xhc3MgU3R4IGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IFN0eChiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIGdldFRyYW5zYWN0aW9uKGNvaW5Db25maWc6IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy5vbmNoYWluO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHhQYXJhbXMucmVjaXBpZW50cykgJiYgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke3RoaXMuZ2V0Q2hhaW4oKX0gZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcgdG8gbW9yZSB0aGFuIDEgZGVzdGluYXRpb24gYWRkcmVzcyB3aXRoaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uIFRyeSBhZ2FpbiwgdXNpbmcgb25seSBhIHNpbmdsZSByZWNpcGllbnQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWRkcmVzcyBpcyB2YWxpZCwgdGhlbiBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgYmFzZSBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlcmlmeUFkZHJlc3NPcHRpb25zfSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzIC0gdGhlIGFkZHJlc3MgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYmFzZUFkZHJlc3MgLSB0aGUgYmFzZSBhZGRyZXNzIGZyb20gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGFkZHJlc3MsIGtleWNoYWlucyB9ID0gcGFyYW1zO1xuICAgIGlmICgha2V5Y2hhaW5zIHx8IGtleWNoYWlucy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXljaGFpbnMnKTtcbiAgICB9XG4gICAgY29uc3QgcHVicyA9IGtleWNoYWlucy5tYXAoKGtleWNoYWluKSA9PiBTdHhMaWIuVXRpbHMueHB1YlRvU1RYUHVia2V5KGtleWNoYWluLnB1YikpO1xuICAgIGNvbnN0IGFkZHJlc3NWZXJzaW9uID0gU3R4TGliLlV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKGFkZHJlc3MpO1xuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gU3R4TGliLlV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJzLCBhZGRyZXNzVmVyc2lvbikuYWRkcmVzcztcbiAgICByZXR1cm4gU3R4TGliLlV0aWxzLmlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3MsIGJhc2VBZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBTdGFja3Mga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNlZWQgLSBTZWVkIGZyb20gd2hpY2ggdGhlIG5ldyBrZXlwYWlyIHNob3VsZCBiZSBnZW5lcmF0ZWQsIG90aGVyd2lzZSBhIHJhbmRvbSBzZWVkIGlzIHVzZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiBhbmQgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IFN0eExpYi5LZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBTdHhMaWIuS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpO1xuXG4gICAgaWYgKCFrZXlzLnhwcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB4cHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMueHB1YixcbiAgICAgIHBydjoga2V5cy54cHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWIgdGhlIHBydiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU3R4TGliLlV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwcml2YXRlIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBydiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHJ2KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBTdHhMaWIuVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkocHJ2KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBTdHhMaWIuVXRpbHMuaXNWYWxpZEFkZHJlc3NXaXRoUGF5bWVudElkKGFkZHJlc3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgc3RhY2tzIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFN0eFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCBwcnZLZXlzID0gcGFyYW1zLnBydiBpbnN0YW5jZW9mIEFycmF5ID8gcGFyYW1zLnBydiA6IFtwYXJhbXMucHJ2XTtcbiAgICBwcnZLZXlzLmZvckVhY2goKHBydikgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHBydiB9KSk7XG4gICAgaWYgKHBhcmFtcy5wdWJLZXlzKSB0eEJ1aWxkZXIuZnJvbVB1YktleShwYXJhbXMucHViS2V5cyk7XG4gICAgLy8gaWYgKHBhcmFtcy5udW1iZXJTaWduYXR1cmUpIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKHBhcmFtcy5udW1iZXJTaWduYXR1cmUpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWVzc2FnZSBwYXNzZWQgdG8gc2lnbk1lc3NhZ2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eEhleCA9IHtcbiAgICAgIHR4SGV4OiB0cmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA+PSAyID8gdHhIZXggOiB7IGhhbGZTaWduZWQ6IHR4SGV4IH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbiBhIFN0YWNrcyB0cmFuc2FjdGlvbiBmcm9tIHR4SGV4XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFN0eFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB0eEhleCA9IHBhcmFtcy50eEhleCB8fCAocGFyYW1zLmhhbGZTaWduZWQgJiYgcGFyYW1zLmhhbGZTaWduZWQudHhIZXgpO1xuICAgIGlmICghdHhIZXggfHwgIXBhcmFtcy5mZWVJbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgZXhwbGFpbiB0eCBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcblxuICAgIGlmIChwYXJhbXMucHVibGljS2V5cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0eEJ1aWxkZXIuZnJvbVB1YktleShwYXJhbXMucHVibGljS2V5cyk7XG4gICAgICBpZiAocGFyYW1zLnB1YmxpY0tleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIGRlZmluaXRlbHkgYSBzaW5nbGUgc2lnIHR4XG4gICAgICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICBpZiAodHgudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGEgdG9rZW4gdHJhbnNhY3Rpb24gb3IgbmF0aXZlIGNvaW4gdHJhbnNhY3Rpb25cbiAgICAgIGxldCB0cmFuc2FjdGlvblJlY2lwaWVudDogVHJhbnNhY3Rpb25SZWNpcGllbnQ7XG4gICAgICBsZXQgb3V0cHV0QW1vdW50OiBzdHJpbmc7XG4gICAgICBsZXQgbWVtbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR4SnNvbi5wYXlsb2FkLmNvbnRyYWN0QWRkcmVzcyAmJiB0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgb3V0cHV0QW1vdW50ID0gY3ZUb1ZhbHVlKHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uQXJnc1swXSkudG9TdHJpbmcoKTtcbiAgICAgICAgdHJhbnNhY3Rpb25SZWNpcGllbnQgPSB7XG4gICAgICAgICAgYWRkcmVzczogY3ZUb1N0cmluZyh0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3NbMl0pLFxuICAgICAgICAgIGFtb3VudDogb3V0cHV0QW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogZmluZFRva2VuTmFtZUJ5Q29udHJhY3QodHhKc29uLnBheWxvYWQuY29udHJhY3RBZGRyZXNzLCB0eEpzb24ucGF5bG9hZC5jb250cmFjdE5hbWUpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHhKc29uLnBheWxvYWQuZnVuY3Rpb25BcmdzLmxlbmd0aCA9PT0gNCAmJlxuICAgICAgICAgIHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS50eXBlID09PSBDbGFyaXR5VHlwZS5PcHRpb25hbFNvbWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgbWVtbyA9IEJ1ZmZlci5mcm9tKHR4SnNvbi5wYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS52YWx1ZS5idWZmZXIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgdHJhbnNhY3Rpb25SZWNpcGllbnRbJ21lbW8nXSA9IG1lbW87XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dEFtb3VudCA9IHR4SnNvbi5wYXlsb2FkLmFtb3VudDtcbiAgICAgICAgbWVtbyA9IHR4SnNvbi5wYXlsb2FkLm1lbW87XG4gICAgICAgIHRyYW5zYWN0aW9uUmVjaXBpZW50ID0ge1xuICAgICAgICAgIGFkZHJlc3M6IHR4SnNvbi5wYXlsb2FkLnRvLFxuICAgICAgICAgIGFtb3VudDogb3V0cHV0QW1vdW50LFxuICAgICAgICAgIG1lbW86IG1lbW8sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW3RyYW5zYWN0aW9uUmVjaXBpZW50XTtcblxuICAgICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAnbWVtbycsICd0eXBlJ107XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB0eEpzb24uZmVlLFxuICAgICAgICBtZW1vOiBtZW1vLFxuICAgICAgICB0eXBlOiB0eC50eXBlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodHgudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCkge1xuICAgICAgY29uc3QgZGlzcGxheU9yZGVyID0gW1xuICAgICAgICAnaWQnLFxuICAgICAgICAnZmVlJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAnY29udHJhY3RBZGRyZXNzJyxcbiAgICAgICAgJ2NvbnRyYWN0TmFtZScsXG4gICAgICAgICdjb250cmFjdEZ1bmN0aW9uJyxcbiAgICAgICAgJ2NvbnRyYWN0RnVuY3Rpb25BcmdzJyxcbiAgICAgIF07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcnLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGZlZTogdHhKc29uLmZlZSxcbiAgICAgICAgdHlwZTogdHgudHlwZSxcbiAgICAgICAgY29udHJhY3RBZGRyZXNzOiB0eEpzb24ucGF5bG9hZC5jb250cmFjdEFkZHJlc3MsXG4gICAgICAgIGNvbnRyYWN0TmFtZTogdHhKc29uLnBheWxvYWQuY29udHJhY3ROYW1lLFxuICAgICAgICBjb250cmFjdEZ1bmN0aW9uOiB0eEpzb24ucGF5bG9hZC5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGNvbnRyYWN0RnVuY3Rpb25BcmdzOiB0eEpzb24ucGF5bG9hZC5mdW5jdGlvbkFyZ3MsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgVVJMcyBvZiBzb21lIGFjdGl2ZSBwdWJsaWMgbm9kZXNcbiAgICogQHJldHVybnMge1N0cmluZ30gbm9kZSB1cmxcbiAgICovXG4gIGdldFB1YmxpY05vZGVVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLnN0eE5vZGVVcmw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5hdGl2ZSBzdGFja3MgYmFsYW5jZSBmb3IgYW4gYWNjb3VudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzcyAtIHN0YWNrcyBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE5hdGl2ZVN0eEJhbGFuY2U+fVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldE5hdGl2ZVN0eEJhbGFuY2VGcm9tTm9kZSh7IGFkZHJlc3MgfTogeyBhZGRyZXNzOiBzdHJpbmcgfSk6IFByb21pc2U8TmF0aXZlU3R4QmFsYW5jZT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5nZXRQdWJsaWNOb2RlVXJsKCl9L2V4dGVuZGVkL3YyL2FkZHJlc3Nlcy8ke2FkZHJlc3N9L2JhbGFuY2VzL3N0eGA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQoZW5kcG9pbnQpO1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHk6IE5hdGl2ZVN0eEJhbGFuY2UgPSByZXNwb25zZS5ib2R5O1xuICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmFibGUgdG8gZ2V0IG5hdGl2ZSBzdHggYmFsYW5jZSBmcm9tIG5vZGU6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGZ1bmdpYmxlIHRva2VuIGJhbGFuY2UgZm9yIGFuIGFjY291bnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFkZHJlc3MgLSBzdGFja3MgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gYXNzZXRJZCAtIGZ1bmdpYmxlIHRva2VuIGFzc2V0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNpbmdsZUZ1bmdpYmxlVG9rZW5CYWxhbmNlPn1cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRTaW5nbGVGdW5naWJsZVRva2VuQmFsYW5jZUZyb21Ob2RlKHtcbiAgICBhZGRyZXNzLFxuICAgIGFzc2V0SWQsXG4gIH06IHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYXNzZXRJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTaW5nbGVGdW5naWJsZVRva2VuQmFsYW5jZT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5nZXRQdWJsaWNOb2RlVXJsKCl9L2V4dGVuZGVkL3YyL2FkZHJlc3Nlcy8ke2FkZHJlc3N9L2JhbGFuY2VzL2Z0LyR7YXNzZXRJZH1gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KGVuZHBvaW50KTtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5OiBTaW5nbGVGdW5naWJsZVRva2VuQmFsYW5jZSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICByZXR1cm4gYm9keTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuYWJsZSB0byBnZXQgbmF0aXZlIHN0eCBiYWxhbmNlIGZyb20gbm9kZTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBub25jZSBkYXRhIHNwZWNpZmljIHRvIGFuIGFjY291bnQgZnJvbSBhIHB1YmxpYyBub2RlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhZGRyZXNzIC0gc3RhY2tzIGFkZHJlc3NcbiAgICogQHJldHVybnMge1Byb21pc2U8U3R4Tm9uY2VSZXNwb25zZT59XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0QWNjb3VudE5vbmNlRnJvbU5vZGUoeyBhZGRyZXNzIH06IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPFN0eE5vbmNlUmVzcG9uc2U+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMuZ2V0UHVibGljTm9kZVVybCgpfS9leHRlbmRlZC92MS9hZGRyZXNzLyR7YWRkcmVzc30vbm9uY2VzYDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldChlbmRwb2ludCk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXNDb2RlfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keTogU3R4Tm9uY2VSZXNwb25zZSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICByZXR1cm4gYm9keTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuYWJsZSB0byBnZXQgYWNjb3VudCBub25jZSBmcm9tIG5vZGU6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RhY2tzIHRyYW5zYWN0aW9uIGVzdGltYXRlZCBmZWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR4SGV4IC0gaGV4IG9mIHN0YWNrcyB0cmFuc2FjdGlvbiBwYXlsb2FkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0eEhleExlbmd0aCAtIGxlbmd0aCBvZiBidWlsdCBzZXJpYWxpemVkIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE51bWJlcj59IC0gZmVlIGVzdGltYXRlICh0YWtpbmcgdGhlIGxvd2VzdClcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRUcmFuc2FjdGlvbkZlZUVzdGltYXRpb24oe1xuICAgIHR4SGV4LFxuICAgIHR4SGV4TGVuZ3RoLFxuICB9OiB7XG4gICAgdHhIZXg6IHN0cmluZztcbiAgICB0eEhleExlbmd0aDogbnVtYmVyO1xuICB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMuZ2V0UHVibGljTm9kZVVybCgpfS92Mi9mZWVzL3RyYW5zYWN0aW9uYDtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHRyYW5zYWN0aW9uX3BheWxvYWQ6IHR4SGV4LFxuICAgICAgZXN0aW1hdGVkX2xlbjogdHhIZXhMZW5ndGgsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QoZW5kcG9pbnQpLnNlbmQocmVxdWVzdEJvZHkpO1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHk6IFN0eFR4bkZlZUVzdGltYXRpb25SZXNwb25zZSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICBpZiAoYm9keS5lc3RpbWF0aW9ucy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGVzdGltYXRpb24gbGVuZ3RoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYm9keS5lc3RpbWF0aW9uc1swXS5mZWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmFibGUgdG8gZ2V0IHRyYW5zYWN0aW9uIGZlZSBlc3RpbWF0aW9uOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGZvciBvZmZsaW5lIHZhdWx0IHNpZ25pbmdcbiAgICogQHBhcmFtIHtCYXNlVHJhbnNhY3Rpb259IHR4IC0gYmFzZSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvdmVyeUluZm8+fVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZvcm1hdEZvck9mZmxpbmVWYXVsdCh0eDogQmFzZVRyYW5zYWN0aW9uKTogUHJvbWlzZTxSZWNvdmVyeUluZm8+IHtcbiAgICBjb25zdCB0eEpzb246IFR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uRXhwbGFuYXRpb246IFJlY292ZXJ5SW5mbyA9IChhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiB0eEpzb24uZmVlIH0sXG4gICAgfSkpIGFzIFJlY292ZXJ5SW5mbztcbiAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLmNvaW4gPSB0aGlzLmdldENoYWluKCk7XG4gICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5mZWVJbmZvID0geyBmZWU6IHR4SnNvbi5mZWUgfTtcbiAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLnR4SGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHJlY292ZXJhYmxlIGFtb3VudCAmIGZlZSBhZnRlciBzdWJ0cmFjdGluZyB0aGUgdHhuIGZlZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VyaWFsaXplZEhleCAtIHNlcmlhbGl6ZWQgdHhuIGhleFxuICAgKiBAcGFyYW0ge051bWJlcn0gdHhIZXhMZW5ndGggLSBkZXNlcmlhbGl6ZWQgdHhuIGxlbmd0aFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYmFsYW5jZSAtIHRvdGFsIGFjY291bnQgYmFsYW5jZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdG9rZW5CYWxhbmNlIC0gdG90YWwgdG9rZW4gYmFsYW5jZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn1cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRSZWNvdmVyYWJsZUFtb3VudEFuZEZlZShcbiAgICBzZXJpYWxpemVkSGV4OiBzdHJpbmcsXG4gICAgdHhIZXhMZW5ndGg6IG51bWJlcixcbiAgICBiYWxhbmNlOiBzdHJpbmcsXG4gICAgdG9rZW5CYWxhbmNlPzogc3RyaW5nXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGVzdGltYXRlZEZlZSA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25GZWVFc3RpbWF0aW9uKHtcbiAgICAgIHR4SGV4OiBzZXJpYWxpemVkSGV4LFxuICAgICAgdHhIZXhMZW5ndGg6IHR4SGV4TGVuZ3RoLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhbGFuY2VCTiA9IG5ldyBCaWdOdW1iZXIoYmFsYW5jZSk7XG4gICAgY29uc3QgZmVlQk4gPSBuZXcgQmlnTnVtYmVyKGVzdGltYXRlZEZlZSk7XG4gICAgaWYgKGJhbGFuY2VCTi5pc0xlc3NUaGFuKGZlZUJOKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnN1ZmZpY2llbnQgYmFsYW5jZSB0byBidWlsZCB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY292ZXJhYmxlQW1vdW50OiB0b2tlbkJhbGFuY2UgPz8gYmFsYW5jZUJOLm1pbnVzKGZlZUJOKS50b1N0cmluZygpLFxuICAgICAgZmVlOiBmZWVCTi50b1N0cmluZygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGZpbmQgdGhlIHJpZ2h0IGJ1aWxkZXIgZm9yIHRva2VuIG9yIG5hdGl2ZSBjb2luIHRyYW5zZmVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb250cmFjdEFkZHJlc3MgLSB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb250cmFjdE5hbWUgLSB0b2tlbiBjb250cmFjdCBuYW1lXG4gICAqIEByZXR1cm5zIHtUcmFuc2ZlckJ1aWxkZXJ8RnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlcn1cbiAgICovXG4gIHByb3RlY3RlZCBnZXRUb2tlbk9yTmF0aXZlVHJhbnNmZXJCdWlsZGVyKFxuICAgIGNvbnRyYWN0QWRkcmVzcz86IHN0cmluZyxcbiAgICBjb250cmFjdE5hbWU/OiBzdHJpbmdcbiAgKTogVHJhbnNmZXJCdWlsZGVyIHwgRnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlciB7XG4gICAgY29uc3QgaXNUb2tlbiA9ICEhY29udHJhY3RBZGRyZXNzICYmICEhY29udHJhY3ROYW1lO1xuICAgIGxldCBmYWN0b3J5OiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5O1xuICAgIGlmIChpc1Rva2VuKSB7XG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lQnlDb250cmFjdChjb250cmFjdEFkZHJlc3MsIGNvbnRyYWN0TmFtZSk7XG4gICAgICBpZiAoIXRva2VuTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udHJhY3QgYWRkcmVzcyBvciBjb250cmFjdCBuYW1lLCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICB9XG4gICAgICBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRva2VuTmFtZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICAgIH1cbiAgICBsZXQgYnVpbGRlcjogVHJhbnNmZXJCdWlsZGVyIHwgRnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlcjtcbiAgICBpZiAoaXNUb2tlbikge1xuICAgICAgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGJ1aWxkIGZ1bmdpYmxlIHRva2VuIHRyYW5zZmVyIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlcn0gYnVpbGRlciAtIGZ1bmdpYmxlIHRva2VuIHRyYW5zZmVyIGJ1aWxkZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRyYWN0QWRkcmVzcyAtIHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRyYWN0TmFtZSAtIHRva2VuIGNvbnRyYWN0IG5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmdbXX0gcHVicyAtIGFjY291bnQgcHVibGljIGtleXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG5vbmNlIC0gYWNjb3VudCBub25jZVxuICAgKiBAcGFyYW0ge0FkZHJlc3NEZXRhaWxzfSByb290QWRkcmVzc0RldGFpbHMgLSByb290IGFkZHJlc3MgZGV0YWlsc1xuICAgKiBAcGFyYW0ge0FkZHJlc3NEZXRhaWxzfSBkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzIC0gcmVjZWl2ZSBhZGRyZXNzIGRldGFpbHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0eEJhbGFuY2UgLSBuYXRpdmUgc3R4IGJhbGFuY2VcbiAgICogQHJldHVybnMge1Byb21pc2U8QmFzZVRyYW5zYWN0aW9uPn0gLSBidWlsdCB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKHtcbiAgICBidWlsZGVyLFxuICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICBjb250cmFjdE5hbWUsXG4gICAgcHVicyxcbiAgICBub25jZSxcbiAgICByb290QWRkcmVzc0RldGFpbHMsXG4gICAgZGVzdGluYXRpb25BZGRyZXNzRGV0YWlscyxcbiAgICBzdHhCYWxhbmNlLFxuICB9OiB7XG4gICAgYnVpbGRlcjogRnVuZ2libGVUb2tlblRyYW5zZmVyQnVpbGRlcjtcbiAgICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgICBjb250cmFjdE5hbWU6IHN0cmluZztcbiAgICBwdWJzOiBzdHJpbmdbXTtcbiAgICBub25jZTogbnVtYmVyO1xuICAgIHJvb3RBZGRyZXNzRGV0YWlsczogQWRkcmVzc0RldGFpbHM7XG4gICAgZGVzdGluYXRpb25BZGRyZXNzRGV0YWlsczogQWRkcmVzc0RldGFpbHM7XG4gICAgc3R4QmFsYW5jZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBidWlsZGVyIGFzIEZ1bmdpYmxlVG9rZW5UcmFuc2ZlckJ1aWxkZXI7XG4gICAgY29uc3QgY29udHJhY3RUb2tlbk5hbWUgPSBmaW5kQ29udHJhY3RUb2tlbk5hbWVVc2luZ0NvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcywgY29udHJhY3ROYW1lKTtcbiAgICBpZiAoIWNvbnRyYWN0VG9rZW5OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udHJhY3QgYWRkcmVzcyBvciBjb250cmFjdCBuYW1lLCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IGFzc2V0SWQgPSBgJHtjb250cmFjdEFkZHJlc3N9LiR7Y29udHJhY3ROYW1lfTo6JHtjb250cmFjdFRva2VuTmFtZX1gO1xuICAgIC8vIGZldGNoIHRoZSB0b2tlbiBiYWxhbmNlXG4gICAgY29uc3QgdG9rZW5CYWxhbmNlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0U2luZ2xlRnVuZ2libGVUb2tlbkJhbGFuY2VGcm9tTm9kZSh7XG4gICAgICBhZGRyZXNzOiByb290QWRkcmVzc0RldGFpbHMuYWRkcmVzcyxcbiAgICAgIGFzc2V0SWQsXG4gICAgfSk7XG4gICAgY29uc3QgdG9rZW5CYWxhbmNlID0gdG9rZW5CYWxhbmNlRGF0YT8uYmFsYW5jZTtcbiAgICBpZiAoIU51bWJlcih0b2tlbkJhbGFuY2UpIHx8IGlzTmFOKE51bWJlcih0b2tlbkJhbGFuY2UpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbm8gdG9rZW4gYmFsYW5jZSBmb3VuZCB0byByZWNvdmVyIGZvciBhZGRyZXNzOiAke3Jvb3RBZGRyZXNzRGV0YWlscy5hZGRyZXNzfSwgdG9rZW46ICR7YXNzZXRJZH1gXG4gICAgICApO1xuICAgIH1cbiAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMjAwJyB9KTtcbiAgICB0eEJ1aWxkZXIubnVtYmVyU2lnbmF0dXJlcygyKTtcbiAgICB0eEJ1aWxkZXIuZnJvbVB1YktleShwdWJzKTtcbiAgICB0eEJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgIHR4QnVpbGRlci5jb250cmFjdEFkZHJlc3MoY29udHJhY3RBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuY29udHJhY3ROYW1lKGNvbnRyYWN0TmFtZSk7XG4gICAgaWYgKGNvbnRyYWN0VG9rZW5OYW1lKSB7XG4gICAgICB0eEJ1aWxkZXIudG9rZW5OYW1lKGNvbnRyYWN0VG9rZW5OYW1lKTtcbiAgICB9XG4gICAgdHhCdWlsZGVyLmZ1bmN0aW9uTmFtZSgndHJhbnNmZXInKTtcbiAgICBjb25zdCBmdW5jdGlvbkFyZ3M6IENsYXJpdHlWYWx1ZVtdID0gW1xuICAgICAgdWludENWKHRva2VuQmFsYW5jZSksXG4gICAgICBzdGFuZGFyZFByaW5jaXBhbENWKHJvb3RBZGRyZXNzRGV0YWlscy5hZGRyZXNzKSxcbiAgICAgIHN0YW5kYXJkUHJpbmNpcGFsQ1YoZGVzdGluYXRpb25BZGRyZXNzRGV0YWlscy5hZGRyZXNzKSxcbiAgICBdO1xuICAgIGlmIChkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzLm1lbW9JZCkge1xuICAgICAgZnVuY3Rpb25BcmdzLnB1c2goc29tZUNWKGJ1ZmZlckNWRnJvbVN0cmluZyhkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzLm1lbW9JZCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVuY3Rpb25BcmdzLnB1c2gobm9uZUNWKCkpO1xuICAgIH1cbiAgICB0eEJ1aWxkZXIuZnVuY3Rpb25BcmdzKGZ1bmN0aW9uQXJncyk7XG4gICAgY29uc3QgYmFzZVR4biA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4QnJvYWRjYXN0Rm9ybWF0ID0gYmFzZVR4bi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHR4RGVzZXJpYWxpemVkID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbih0eEJyb2FkY2FzdEZvcm1hdCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEhleCA9IHNlcmlhbGl6ZVBheWxvYWQodHhEZXNlcmlhbGl6ZWQucGF5bG9hZCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHsgcmVjb3ZlcmFibGVBbW91bnQsIGZlZSB9ID0gYXdhaXQgdGhpcy5nZXRSZWNvdmVyYWJsZUFtb3VudEFuZEZlZShcbiAgICAgIHNlcmlhbGl6ZWRIZXgsXG4gICAgICB0eEJyb2FkY2FzdEZvcm1hdC5sZW5ndGgsXG4gICAgICBzdHhCYWxhbmNlLFxuICAgICAgdG9rZW5CYWxhbmNlXG4gICAgKTtcbiAgICBmdW5jdGlvbkFyZ3NbMF0gPSB1aW50Q1YocmVjb3ZlcmFibGVBbW91bnQpO1xuICAgIHR4QnVpbGRlci5mdW5jdGlvbkFyZ3MoZnVuY3Rpb25BcmdzKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiBmZWUgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBidWlsZCBuYXRpdmUgdHJhbnNmZXIgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUcmFuc2ZlckJ1aWxkZXJ9IGJ1aWxkZXIgLSB0cmFuc2ZlciBidWlsZGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nW119IHB1YnMgLSBhY2NvdW50IHB1YmxpYyBrZXlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBub25jZSAtIGFjY291bnQgbm9uY2VcbiAgICogQHBhcmFtIHtBZGRyZXNzRGV0YWlsc30gZGVzdGluYXRpb25BZGRyZXNzRGV0YWlscyAtIHJlY2VpdmUgYWRkcmVzcyBkZXRhaWxzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHhCYWxhbmNlIC0gbmF0aXZlIHN0eCBiYWxhbmNlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJhc2VUcmFuc2FjdGlvbj59IC0gYnVpbHQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZE5hdGl2ZVRyYW5zZmVyVHJhbnNhY3Rpb24oe1xuICAgIGJ1aWxkZXIsXG4gICAgcHVicyxcbiAgICBub25jZSxcbiAgICBkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzLFxuICAgIHN0eEJhbGFuY2UsXG4gIH06IHtcbiAgICBidWlsZGVyOiBUcmFuc2ZlckJ1aWxkZXI7XG4gICAgcHViczogc3RyaW5nW107XG4gICAgbm9uY2U6IG51bWJlcjtcbiAgICBkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzOiBBZGRyZXNzRGV0YWlscztcbiAgICBzdHhCYWxhbmNlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEJhc2VUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGJ1aWxkZXIgYXMgVHJhbnNmZXJCdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcyMDAnIH0pO1xuICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KHB1YnMpO1xuICAgIHR4QnVpbGRlci5ub25jZShub25jZSk7XG4gICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uQWRkcmVzc0RldGFpbHMuYWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLmFtb3VudChzdHhCYWxhbmNlKTtcbiAgICBpZiAoZGVzdGluYXRpb25BZGRyZXNzRGV0YWlscy5tZW1vSWQpIHtcbiAgICAgIHR4QnVpbGRlci5tZW1vKGRlc3RpbmF0aW9uQWRkcmVzc0RldGFpbHMubWVtb0lkKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZVR4biA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4QnJvYWRjYXN0Rm9ybWF0ID0gYmFzZVR4bi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHR4RGVzZXJpYWxpemVkID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbih0eEJyb2FkY2FzdEZvcm1hdCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEhleCA9IHNlcmlhbGl6ZVBheWxvYWQodHhEZXNlcmlhbGl6ZWQucGF5bG9hZCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHsgcmVjb3ZlcmFibGVBbW91bnQsIGZlZSB9ID0gYXdhaXQgdGhpcy5nZXRSZWNvdmVyYWJsZUFtb3VudEFuZEZlZShcbiAgICAgIHNlcmlhbGl6ZWRIZXgsXG4gICAgICB0eEJyb2FkY2FzdEZvcm1hdC5sZW5ndGgsXG4gICAgICBzdHhCYWxhbmNlXG4gICAgKTtcbiAgICB0eEJ1aWxkZXIuYW1vdW50KHJlY292ZXJhYmxlQW1vdW50KTtcbiAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiBmZWUgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0aGF0IHVzZXMgYXBwcm9wcmlhdGUgYnVpbGRlciBhbmQgYnVpbGRzIHRyYW5zYWN0aW9uIGRlcGVuZGluZyBvbiB0b2tlbiBvciBuYXRpdmUgY29pblxuICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBwdWJzIC0gcHVibGljIGtleXNcbiAgICogQHBhcmFtIHtBZGRyZXNzRGV0YWlsc30gcm9vdEFkZHJlc3NEZXRhaWxzIC0gc2VuZGVyIGFkZHJlc3MgZGV0YWlsXG4gICAqIEBwYXJhbSB7QWRkcmVzc0RldGFpbHN9IGRlc3RpbmF0aW9uQWRkcmVzc0RldGFpbHMgLSByZWNlaXZlciBhZGRyZXNzIGRldGFpbFxuICAgKiBAcGFyYW0ge051bWJlcn0gbm9uY2UgLSB3YWxsZXQgbm9uY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJhbGFuY2UgLSB3YWxsZXQgYmFsYW5jZVxuICAgKiBAcGFyYW0ge1N0cmluZyB8IHVuZGVmaW5lZH0gY29udHJhY3RBZGRyZXNzIC0gdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZyB8IHVuZGVmaW5lZH0gY29udHJhY3ROYW1lIC0gdG9rZW4gY29udHJhY3QgbmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+fSBidWlsdCB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldE5hdGl2ZU9yVG9rZW5UcmFuc2FjdGlvbih7XG4gICAgcHVicyxcbiAgICByb290QWRkcmVzc0RldGFpbHMsXG4gICAgZGVzdGluYXRpb25BZGRyZXNzRGV0YWlscyxcbiAgICBub25jZSxcbiAgICBzdHhCYWxhbmNlLFxuICAgIGNvbnRyYWN0QWRkcmVzc0lucHV0LFxuICAgIGNvbnRyYWN0TmFtZSxcbiAgfToge1xuICAgIHB1YnM6IHN0cmluZ1tdO1xuICAgIHJvb3RBZGRyZXNzRGV0YWlsczogQWRkcmVzc0RldGFpbHM7XG4gICAgZGVzdGluYXRpb25BZGRyZXNzRGV0YWlsczogQWRkcmVzc0RldGFpbHM7XG4gICAgbm9uY2U6IG51bWJlcjtcbiAgICBzdHhCYWxhbmNlOiBzdHJpbmc7XG4gICAgY29udHJhY3RBZGRyZXNzSW5wdXQ/OiBzdHJpbmc7XG4gICAgY29udHJhY3ROYW1lPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7IHR4OiBCYXNlVHJhbnNhY3Rpb247IGJ1aWxkZXI6IFRyYW5zZmVyQnVpbGRlciB8IEZ1bmdpYmxlVG9rZW5UcmFuc2ZlckJ1aWxkZXIgfT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmdldFRva2VuT3JOYXRpdmVUcmFuc2ZlckJ1aWxkZXIoY29udHJhY3RBZGRyZXNzSW5wdXQsIGNvbnRyYWN0TmFtZSk7XG4gICAgY29uc3QgY29udHJhY3RBZGRyZXNzID0gY29udHJhY3RBZGRyZXNzSW5wdXQ/LnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgaXNUb2tlbiA9ICEhY29udHJhY3RBZGRyZXNzICYmICEhY29udHJhY3ROYW1lO1xuICAgIGxldCBmaW5hbFR4OiBCYXNlVHJhbnNhY3Rpb247XG4gICAgaWYgKGlzVG9rZW4pIHtcbiAgICAgIGZpbmFsVHggPSBhd2FpdCB0aGlzLmJ1aWxkVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKHtcbiAgICAgICAgYnVpbGRlcjogYnVpbGRlciBhcyBGdW5naWJsZVRva2VuVHJhbnNmZXJCdWlsZGVyLFxuICAgICAgICBjb250cmFjdEFkZHJlc3MsXG4gICAgICAgIGNvbnRyYWN0TmFtZSxcbiAgICAgICAgcHVicyxcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIHJvb3RBZGRyZXNzRGV0YWlscyxcbiAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzRGV0YWlscyxcbiAgICAgICAgc3R4QmFsYW5jZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbFR4ID0gYXdhaXQgdGhpcy5idWlsZE5hdGl2ZVRyYW5zZmVyVHJhbnNhY3Rpb24oe1xuICAgICAgICBidWlsZGVyOiBidWlsZGVyIGFzIFRyYW5zZmVyQnVpbGRlcixcbiAgICAgICAgcHVicyxcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzc0RldGFpbHMsXG4gICAgICAgIHN0eEJhbGFuY2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4OiBmaW5hbFR4LFxuICAgICAgYnVpbGRlcjogYnVpbGRlcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZWNvdmVyIG5hdGl2ZSBzdHggb3Igc2lwMTAgdG9rZW5zIGZyb20gYml0Z28gaG90ICYgY29sZCB3YWxsZXRzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYmFja3VwS2V5IC0gZW5jcnlwdGVkIHdhbGxldCBiYWNrdXAga2V5IChwdWJsaWMgb3IgcHJpdmF0ZSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy51c2VyS2V5IC0gZW5jcnlwdGVkIHdhbGxldCB1c2VyIGtleSAocHVibGljIG9yIHByaXZhdGUpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucm9vdEFkZHJlc3MgLSB3YWxsZXQgcm9vdCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiAtIHJlY2VpdmUgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmJpdGdvS2V5IC0gZW5jcnlwdGVkIGJpdGdvIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gd2FsbGV0IHBhc3N3b3JkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY29udHJhY3RJZCAtIGNvbnRyYWN0IGlkIG9mIHRoZSB0b2tlbiAobWFuZGF0b3J5IGZvciB0b2tlbiByZWNvdmVyeSlcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3ZlcnlJbmZvfFJlY292ZXJ5VHJhbnNhY3Rpb24+fSBSZWNvdmVyeVRyYW5zYWN0aW9uLnR4SGV4IC0gaGV4IG9mIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gKHNpZ25lZCBvciB1bnNpZ25lZClcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IFJlY292ZXJ5VHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJvb3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJvb3QgYWRkcmVzcyEnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MhJyk7XG4gICAgfVxuICAgIGxldCBjb250cmFjdEFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY29udHJhY3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmFtcy5jb250cmFjdElkKSB7XG4gICAgICBbY29udHJhY3RBZGRyZXNzLCBjb250cmFjdE5hbWVdID0gcGFyYW1zLmNvbnRyYWN0SWQuc3BsaXQoJy4nKTtcbiAgICAgIGlmICgoY29udHJhY3RBZGRyZXNzICYmICFjb250cmFjdE5hbWUpIHx8IChjb250cmFjdE5hbWUgJiYgIWNvbnRyYWN0QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNvbnRyYWN0IGlkLCBwbGVhc2UgcHJvdmlkZSBpdCBpbiB0aGUgZm9ybSAoY29udHJhY3RBZGRyZXNzLmNvbnRyYWN0TmFtZSknKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gZ2V0SXNVbnNpZ25lZFN3ZWVwKHBhcmFtcyk7XG4gICAgY29uc3Qga2V5cyA9IGdldEJpcDMyS2V5cyh0aGlzLmJpdGdvLCBwYXJhbXMsIHsgcmVxdWlyZUJpdEdvWHB1YjogdHJ1ZSB9KTtcbiAgICBjb25zdCByb290QWRkcmVzc0RldGFpbHMgPSBnZXRBZGRyZXNzRGV0YWlscyhwYXJhbXMucm9vdEFkZHJlc3MpO1xuICAgIGNvbnN0IFthY2NvdW50QmFsYW5jZURhdGEsIGFjY291bnROb25jZURhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXROYXRpdmVTdHhCYWxhbmNlRnJvbU5vZGUoeyBhZGRyZXNzOiByb290QWRkcmVzc0RldGFpbHMuYWRkcmVzcyB9KSxcbiAgICAgIHRoaXMuZ2V0QWNjb3VudE5vbmNlRnJvbU5vZGUoeyBhZGRyZXNzOiByb290QWRkcmVzc0RldGFpbHMuYWRkcmVzcyB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBiYWxhbmNlID0gTnVtYmVyKGFjY291bnRCYWxhbmNlRGF0YS5iYWxhbmNlKTtcbiAgICBpZiAoIWJhbGFuY2UgfHwgaXNOYU4oYmFsYW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgYW55IGJhbGFuY2UgdG8gcmVjb3ZlciBmb3IgJyArIHBhcmFtcy5yb290QWRkcmVzcyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJQdWIgPSBwdWJsaWNLZXlGcm9tQnVmZmVyKGtleXNbMF0ucHVibGljS2V5KTtcbiAgICBjb25zdCBiYWNrdXBQdWIgPSBwdWJsaWNLZXlGcm9tQnVmZmVyKGtleXNbMV0ucHVibGljS2V5KTtcbiAgICBjb25zdCBiaXRnb1B1YktleSA9IHB1YmxpY0tleUZyb21CdWZmZXIoa2V5c1syXS5wdWJsaWNLZXkpO1xuICAgIGNvbnN0IHB1YnMgPSBbcHVibGljS2V5VG9TdHJpbmcodXNlclB1YiksIHB1YmxpY0tleVRvU3RyaW5nKGJhY2t1cFB1YiksIHB1YmxpY0tleVRvU3RyaW5nKGJpdGdvUHViS2V5KV07XG5cbiAgICBjb25zdCBkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzID0gZ2V0QWRkcmVzc0RldGFpbHMocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgIGNvbnN0IG5vbmNlID1cbiAgICAgIHR5cGVvZiBhY2NvdW50Tm9uY2VEYXRhPy5sYXN0X2V4ZWN1dGVkX3R4X25vbmNlID09PSAnbnVtYmVyJyA/IGFjY291bnROb25jZURhdGEubGFzdF9leGVjdXRlZF90eF9ub25jZSArIDEgOiAwO1xuXG4gICAgY29uc3QgeyB0eCwgYnVpbGRlciB9ID0gYXdhaXQgdGhpcy5nZXROYXRpdmVPclRva2VuVHJhbnNhY3Rpb24oe1xuICAgICAgcHVicyxcbiAgICAgIHJvb3RBZGRyZXNzRGV0YWlscyxcbiAgICAgIGRlc3RpbmF0aW9uQWRkcmVzc0RldGFpbHMsXG4gICAgICBub25jZSxcbiAgICAgIHN0eEJhbGFuY2U6IGFjY291bnRCYWxhbmNlRGF0YS5iYWxhbmNlLFxuICAgICAgY29udHJhY3RBZGRyZXNzSW5wdXQ6IGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIGNvbnRyYWN0TmFtZTogY29udHJhY3ROYW1lLFxuICAgIH0pO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9ybWF0Rm9yT2ZmbGluZVZhdWx0KHR4KTtcbiAgICB9XG4gICAgLy8gY2hlY2sgdGhlIHByaXZhdGUga2V5ICYgc2lnblxuICAgIGlmICgha2V5c1swXS5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXJLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG4gICAgY29uc3QgdXNlcktleSA9IGNyZWF0ZVN0YWNrc1ByaXZhdGVLZXkoa2V5c1swXS5wcml2YXRlS2V5KTtcbiAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHByaXZhdGVLZXlUb1N0cmluZyh1c2VyS2V5KSB9KTtcblxuICAgIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCB0eEhleEhhbGZTaWduZWQgPSBoYWxmU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBidWlsZGVyMiA9IHRoaXMuZ2V0VG9rZW5Pck5hdGl2ZVRyYW5zZmVyQnVpbGRlcihjb250cmFjdEFkZHJlc3MsIGNvbnRyYWN0TmFtZSk7XG4gICAgYnVpbGRlcjIuZnJvbSh0eEhleEhhbGZTaWduZWQpO1xuXG4gICAgaWYgKCFrZXlzWzFdLnByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYmFja3VwS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgfVxuICAgIGNvbnN0IGJhY2t1cEtleSA9IGNyZWF0ZVN0YWNrc1ByaXZhdGVLZXkoa2V5c1sxXS5wcml2YXRlS2V5KTtcbiAgICBidWlsZGVyMi5zaWduKHsga2V5OiBwcml2YXRlS2V5VG9TdHJpbmcoYmFja3VwS2V5KSB9KTtcblxuICAgIGNvbnN0IGZ1bGx5U2lnbmVkVHggPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgIGNvbnN0IGZ1bGx5U2lnbmVkVHhIZXggPSBmdWxseVNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhIZXg6IGZ1bGx5U2lnbmVkVHhIZXgsXG4gICAgfTtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo/sdk-coin-stx",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.1",
|
|
4
4
|
"description": "BitGo SDK coin library for Stacks",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
]
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@bitgo/sdk-core": "^
|
|
43
|
+
"@bitgo/sdk-core": "^34.0.0",
|
|
44
44
|
"@bitgo/secp256k1": "^1.3.3",
|
|
45
|
-
"@bitgo/statics": "^
|
|
45
|
+
"@bitgo/statics": "^53.0.0",
|
|
46
46
|
"@noble/curves": "1.8.1",
|
|
47
47
|
"@stacks/network": "^4.3.0",
|
|
48
48
|
"@stacks/transactions": "2.0.1",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
"lodash": "^4.17.15"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@bitgo/sdk-api": "^1.
|
|
56
|
-
"@bitgo/sdk-test": "^8.0.
|
|
55
|
+
"@bitgo/sdk-api": "^1.63.0",
|
|
56
|
+
"@bitgo/sdk-test": "^8.0.85"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "f53286120d0683a7ced2399a48c032e5f810bbb5"
|
|
59
59
|
}
|