@bitgo/sdk-coin-stx 1.1.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +11 -0
- package/LICENSE +191 -0
- package/README.md +30 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +30 -0
- package/dist/src/lib/abstractContractBuilder.d.ts +19 -0
- package/dist/src/lib/abstractContractBuilder.d.ts.map +1 -0
- package/dist/src/lib/abstractContractBuilder.js +70 -0
- package/dist/src/lib/constants.d.ts +8 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +19 -0
- package/dist/src/lib/contractBuilder.d.ts +33 -0
- package/dist/src/lib/contractBuilder.d.ts.map +1 -0
- package/dist/src/lib/contractBuilder.js +116 -0
- package/dist/src/lib/iface.d.ts +48 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +3 -0
- package/dist/src/lib/index.d.ts +6 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +33 -0
- package/dist/src/lib/keyPair.d.ts +55 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +140 -0
- package/dist/src/lib/sendmanyBuilder.d.ts +23 -0
- package/dist/src/lib/sendmanyBuilder.d.ts.map +1 -0
- package/dist/src/lib/sendmanyBuilder.js +75 -0
- package/dist/src/lib/transaction.d.ts +49 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +225 -0
- package/dist/src/lib/transactionBuilder.d.ts +86 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +263 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +30 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +81 -0
- package/dist/src/lib/transferBuilder.d.ts +30 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +99 -0
- package/dist/src/lib/utils.d.ts +207 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +503 -0
- package/dist/src/stx.d.ts +56 -0
- package/dist/src/stx.d.ts.map +1 -0
- package/dist/src/stx.js +196 -0
- package/dist/src/tstx.d.ts +16 -0
- package/dist/src/tstx.d.ts.map +1 -0
- package/dist/src/tstx.js +24 -0
- package/dist/src/types.d.ts +34 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/package.json +62 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TransactionBuilder = void 0;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const bn_js_1 = __importDefault(require("bn.js"));
|
|
9
|
+
const statics_1 = require("@bitgo/statics");
|
|
10
|
+
const transactions_1 = require("@stacks/transactions");
|
|
11
|
+
const network_1 = require("@stacks/network");
|
|
12
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
13
|
+
const transaction_1 = require("./transaction");
|
|
14
|
+
const keyPair_1 = require("./keyPair");
|
|
15
|
+
const utils_1 = require("./utils");
|
|
16
|
+
const constants_1 = require("./constants");
|
|
17
|
+
class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
18
|
+
constructor(_coinConfig) {
|
|
19
|
+
super(_coinConfig);
|
|
20
|
+
this.getSignature = (_, index) => this._signatures.find((s) => s.index === index);
|
|
21
|
+
this.getPrivateKey = (pubKey, _) => this._multiSignerKeyPairs.find((kp) => kp.getKeys(true).pub === pubKey || kp.getKeys().pub === pubKey);
|
|
22
|
+
this._anchorMode = constants_1.ANCHOR_MODE;
|
|
23
|
+
this._multiSignerKeyPairs = [];
|
|
24
|
+
this._fromPubKeys = [];
|
|
25
|
+
this._signatures = [];
|
|
26
|
+
this._numberSignatures = constants_1.DEFAULT_MULTISIG_SIG_NUMBER;
|
|
27
|
+
this._network = _coinConfig.network.type === statics_1.NetworkType.MAINNET ? new network_1.StacksMainnet() : new network_1.StacksTestnet();
|
|
28
|
+
this._transaction = new transaction_1.Transaction(_coinConfig);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize the transaction builder fields using the decoded transaction data
|
|
32
|
+
*
|
|
33
|
+
* @param {Transaction} tx the transaction data
|
|
34
|
+
*/
|
|
35
|
+
initBuilder(tx) {
|
|
36
|
+
this.transaction = tx;
|
|
37
|
+
// check if it is signed or unsigned tx
|
|
38
|
+
if (tx.stxTransaction.auth.spendingCondition === undefined) {
|
|
39
|
+
throw new sdk_core_1.InvalidTransactionError('spending condition cannot be undefined');
|
|
40
|
+
}
|
|
41
|
+
const txData = tx.toJson();
|
|
42
|
+
this.fee({ fee: txData.fee.toString() });
|
|
43
|
+
this.nonce(txData.nonce);
|
|
44
|
+
let sigHash = tx.stxTransaction.verifyBegin();
|
|
45
|
+
const authType = tx.stxTransaction.auth.authType ? tx.stxTransaction.auth.authType : transactions_1.AuthType.Standard;
|
|
46
|
+
if (transactions_1.isSingleSig(tx.stxTransaction.auth.spendingCondition)) {
|
|
47
|
+
this._numberSignatures = 1;
|
|
48
|
+
if (tx.stxTransaction.auth.spendingCondition.signature.data !== transactions_1.emptyMessageSignature().data) {
|
|
49
|
+
const signature = tx.stxTransaction.auth.spendingCondition.signature;
|
|
50
|
+
sigHash = transactions_1.makeSigHashPreSign(sigHash, authType, new bn_js_1.default(this._fee.fee), new bn_js_1.default(this._nonce));
|
|
51
|
+
this._signatures.push({ ...signature, index: 0, sigHash });
|
|
52
|
+
this._fromPubKeys = [transactions_1.publicKeyFromSignature(sigHash, signature)];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this._numberSignatures = tx.stxTransaction.auth.spendingCondition.signaturesRequired;
|
|
57
|
+
tx.stxTransaction.auth.spendingCondition.fields.forEach((field, index) => {
|
|
58
|
+
if (field.contents.type === transactions_1.StacksMessageType.MessageSignature) {
|
|
59
|
+
const signature = field.contents;
|
|
60
|
+
const nextVerify = transactions_1.nextVerification(sigHash, authType, new bn_js_1.default(this._fee.fee), new bn_js_1.default(this._nonce), transactions_1.PubKeyEncoding.Compressed, // useless param as Compressed is hardcoded in stacks lib
|
|
61
|
+
signature);
|
|
62
|
+
sigHash = nextVerify.nextSigHash;
|
|
63
|
+
this._signatures.push({ ...signature, index, sigHash });
|
|
64
|
+
this._fromPubKeys.push(nextVerify.pubKey.data.toString('hex'));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this._fromPubKeys.push(field.contents.data.toString('hex'));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** @inheritdoc */
|
|
73
|
+
fromImplementation(rawTransaction) {
|
|
74
|
+
const tx = new transaction_1.Transaction(this._coinConfig);
|
|
75
|
+
this.validateRawTransaction(rawTransaction);
|
|
76
|
+
const stackstransaction = transactions_1.deserializeTransaction(transactions_1.BufferReader.fromBuffer(Buffer.from(utils_1.removeHexPrefix(rawTransaction), 'hex')));
|
|
77
|
+
tx.stxTransaction = stackstransaction;
|
|
78
|
+
this.initBuilder(tx);
|
|
79
|
+
return this.transaction;
|
|
80
|
+
}
|
|
81
|
+
// region Base Builder
|
|
82
|
+
/** @inheritdoc */
|
|
83
|
+
async buildImplementation() {
|
|
84
|
+
const isMultiSig = this._fromPubKeys.length > 1;
|
|
85
|
+
this._transaction.stxTransaction.setFee(new bn_js_1.default(this._fee.fee));
|
|
86
|
+
this._transaction.stxTransaction.setNonce(new bn_js_1.default(this._nonce));
|
|
87
|
+
for (let index = 0; index < this._fromPubKeys.length; index++) {
|
|
88
|
+
const pubKey = this._fromPubKeys[index];
|
|
89
|
+
const signature = this.getSignature(pubKey, index);
|
|
90
|
+
if (signature) {
|
|
91
|
+
await this.transaction.signWithSignatures(signature, isMultiSig);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const prvKey = this.getPrivateKey(pubKey, index);
|
|
95
|
+
if (prvKey) {
|
|
96
|
+
await this.transaction.sign(prvKey);
|
|
97
|
+
}
|
|
98
|
+
else if (isMultiSig) {
|
|
99
|
+
await this.transaction.appendOrigin(pubKey);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
this._transaction.loadInputsAndOutputs();
|
|
104
|
+
return this._transaction;
|
|
105
|
+
}
|
|
106
|
+
/** @inheritdoc */
|
|
107
|
+
signImplementation(key) {
|
|
108
|
+
this.checkDuplicatedKeys(key);
|
|
109
|
+
let prv = key.key;
|
|
110
|
+
if (prv.startsWith('xprv')) {
|
|
111
|
+
const rawPrv = sdk_core_1.xprvToRawPrv(prv);
|
|
112
|
+
prv = new keyPair_1.KeyPair({ prv: rawPrv }).getKeys(true).prv;
|
|
113
|
+
}
|
|
114
|
+
const signer = new keyPair_1.KeyPair({ prv: prv });
|
|
115
|
+
// Signing the transaction is an operation that relies on all the data being set,
|
|
116
|
+
// so we set the source here and leave the actual signing for the build step
|
|
117
|
+
this._multiSignerKeyPairs.push(signer);
|
|
118
|
+
const publicKey = signer.getKeys(signer.getCompressed()).pub;
|
|
119
|
+
if (!this._fromPubKeys.includes(publicKey)) {
|
|
120
|
+
this._fromPubKeys.push(publicKey);
|
|
121
|
+
}
|
|
122
|
+
return this.transaction;
|
|
123
|
+
}
|
|
124
|
+
/** @inheritdoc */
|
|
125
|
+
get transaction() {
|
|
126
|
+
return this._transaction;
|
|
127
|
+
}
|
|
128
|
+
/** @inheritdoc */
|
|
129
|
+
set transaction(transaction) {
|
|
130
|
+
this._transaction = transaction;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Validates that the given key is not already in this._multiSignerKeyPairs
|
|
134
|
+
*
|
|
135
|
+
* @param {BaseKey} key - The key to check
|
|
136
|
+
*/
|
|
137
|
+
checkDuplicatedKeys(key) {
|
|
138
|
+
this._multiSignerKeyPairs.forEach((_sourceKeyPair) => {
|
|
139
|
+
if (_sourceKeyPair.getKeys().prv === key.key) {
|
|
140
|
+
throw new sdk_core_1.SigningError('Repeated sign: ' + key.key);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Set the transaction fees
|
|
146
|
+
*
|
|
147
|
+
* @param {BaseFee} fee The maximum gas to pay
|
|
148
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
149
|
+
*/
|
|
150
|
+
fee(fee) {
|
|
151
|
+
this.validateValue(new bignumber_js_1.default(fee.fee));
|
|
152
|
+
this._fee = fee;
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
nonce(n) {
|
|
156
|
+
this._nonce = n;
|
|
157
|
+
return this;
|
|
158
|
+
}
|
|
159
|
+
fromPubKey(senderPubKey) {
|
|
160
|
+
const pubKeys = senderPubKey instanceof Array ? senderPubKey : [senderPubKey];
|
|
161
|
+
this._fromPubKeys = [];
|
|
162
|
+
pubKeys.forEach((key) => {
|
|
163
|
+
if (utils_1.isValidPublicKey(key)) {
|
|
164
|
+
this._fromPubKeys.push(key);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid public key');
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Set the memo
|
|
174
|
+
*
|
|
175
|
+
* @param {string} memo
|
|
176
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
177
|
+
*/
|
|
178
|
+
memo(memo) {
|
|
179
|
+
if (!utils_1.isValidMemo(memo)) {
|
|
180
|
+
throw new sdk_core_1.BuildTransactionError('Memo is too long');
|
|
181
|
+
}
|
|
182
|
+
this._memo = memo;
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Set the number of signatures for multi-sig
|
|
187
|
+
*
|
|
188
|
+
* @param {number} numSigns
|
|
189
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
190
|
+
*/
|
|
191
|
+
numberSignatures(numSigns) {
|
|
192
|
+
this.validateValue(new bignumber_js_1.default(numSigns));
|
|
193
|
+
this._numberSignatures = numSigns;
|
|
194
|
+
return this;
|
|
195
|
+
}
|
|
196
|
+
// region Validators
|
|
197
|
+
/** @inheritdoc */
|
|
198
|
+
validateAddress(address, addressFormat) {
|
|
199
|
+
if (!utils_1.isValidAddress(address.address)) {
|
|
200
|
+
throw new sdk_core_1.BuildTransactionError('Invalid address ' + address.address);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** @inheritdoc */
|
|
204
|
+
validateKey(key) {
|
|
205
|
+
const keyPair = new keyPair_1.KeyPair({ prv: key.key });
|
|
206
|
+
if (!keyPair.getKeys().prv) {
|
|
207
|
+
throw new sdk_core_1.BuildTransactionError('Invalid key');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** @inheritdoc */
|
|
211
|
+
validateRawTransaction(rawTransaction) {
|
|
212
|
+
if (!rawTransaction) {
|
|
213
|
+
throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
transactions_1.deserializeTransaction(transactions_1.BufferReader.fromBuffer(Buffer.from(utils_1.removeHexPrefix(rawTransaction), 'hex')));
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
throw new sdk_core_1.ParseTransactionError('There was an error parsing the raw transaction');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** @inheritdoc */
|
|
223
|
+
validateTransaction(transaction) {
|
|
224
|
+
this.validateFee();
|
|
225
|
+
this.validateNonce();
|
|
226
|
+
}
|
|
227
|
+
/** @inheritdoc */
|
|
228
|
+
validateValue(value) {
|
|
229
|
+
if (value.isLessThan(0)) {
|
|
230
|
+
throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Validates that the fee field is defined
|
|
235
|
+
*/
|
|
236
|
+
validateFee() {
|
|
237
|
+
if (this._fee === undefined) {
|
|
238
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing fee');
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
this.validateValue(new bignumber_js_1.default(this._fee.fee));
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
throw new sdk_core_1.BuildTransactionError('Invalid fee');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Validates that nonce is defined
|
|
249
|
+
*/
|
|
250
|
+
validateNonce() {
|
|
251
|
+
if (this._nonce === undefined) {
|
|
252
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing nonce');
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
this.validateValue(new bignumber_js_1.default(this._nonce));
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
throw new sdk_core_1.BuildTransactionError(`Invalid nonce ${this._nonce}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.TransactionBuilder = TransactionBuilder;
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQXFDO0FBQ3JDLGtEQUEyQjtBQUMzQiw0Q0FBcUU7QUFDckUsdURBVzhCO0FBQzlCLDZDQUE4RTtBQUM5RSw4Q0FXeUI7QUFDekIsK0NBQTRDO0FBQzVDLHVDQUFvQztBQUVwQyxtQ0FBeUY7QUFDekYsMkNBQXVFO0FBRXZFLE1BQXNCLGtCQUFtQixTQUFRLGlDQUFzQjtJQVlyRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQWdHYixpQkFBWSxHQUFHLENBQUMsQ0FBUyxFQUFFLEtBQWEsRUFBNkIsRUFBRSxDQUM3RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQztRQUMxQyxrQkFBYSxHQUFHLENBQUMsTUFBYyxFQUFFLENBQVMsRUFBdUIsRUFBRSxDQUN6RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxNQUFNLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQWxHdkcsSUFBSSxDQUFDLFdBQVcsR0FBRyx1QkFBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLHVDQUEyQixDQUFDO1FB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QU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlCQUFpQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7Q0FDRjtBQXpSRCxnREF5UkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgQmlnTnVtIGZyb20gJ2JuLmpzJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcsIE5ldHdvcmtUeXBlIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQXV0aFR5cGUsXG4gIEJ1ZmZlclJlYWRlcixcbiAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbixcbiAgZW1wdHlNZXNzYWdlU2lnbmF0dXJlLFxuICBpc1NpbmdsZVNpZyxcbiAgbWFrZVNpZ0hhc2hQcmVTaWduLFxuICBuZXh0VmVyaWZpY2F0aW9uLFxuICBwdWJsaWNLZXlGcm9tU2lnbmF0dXJlLFxuICBTdGFja3NNZXNzYWdlVHlwZSxcbiAgUHViS2V5RW5jb2RpbmcsXG59IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IFN0YWNrc05ldHdvcmssIFN0YWNrc1Rlc3RuZXQsIFN0YWNrc01haW5uZXQgfSBmcm9tICdAc3RhY2tzL25ldHdvcmsnO1xuaW1wb3J0IHtcbiAgQmFzZUFkZHJlc3MsXG4gIEJhc2VGZWUsXG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgeHBydlRvUmF3UHJ2LFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgU2lnbmF0dXJlRGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgaXNWYWxpZEFkZHJlc3MsIHJlbW92ZUhleFByZWZpeCwgaXNWYWxpZE1lbW8sIGlzVmFsaWRQdWJsaWNLZXkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEFOQ0hPUl9NT0RFLCBERUZBVUxUX01VTFRJU0lHX1NJR19OVU1CRVIgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgX2FuY2hvck1vZGU6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9mZWU6IEJhc2VGZWU7XG4gIHByb3RlY3RlZCBfbm9uY2U6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9tZW1vOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfbnVtYmVyU2lnbmF0dXJlczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX211bHRpU2lnbmVyS2V5UGFpcnM6IEtleVBhaXJbXTtcbiAgcHJvdGVjdGVkIF9zaWduYXR1cmVzOiBTaWduYXR1cmVEYXRhW107XG4gIHByb3RlY3RlZCBfbmV0d29yazogU3RhY2tzTmV0d29yaztcbiAgcHJvdGVjdGVkIF9mcm9tUHViS2V5czogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2FuY2hvck1vZGUgPSBBTkNIT1JfTU9ERTtcbiAgICB0aGlzLl9tdWx0aVNpZ25lcktleVBhaXJzID0gW107XG4gICAgdGhpcy5fZnJvbVB1YktleXMgPSBbXTtcbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW107XG4gICAgdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyA9IERFRkFVTFRfTVVMVElTSUdfU0lHX05VTUJFUjtcbiAgICB0aGlzLl9uZXR3b3JrID0gX2NvaW5Db25maWcubmV0d29yay50eXBlID09PSBOZXR3b3JrVHlwZS5NQUlOTkVUID8gbmV3IFN0YWNrc01haW5uZXQoKSA6IG5ldyBTdGFja3NUZXN0bmV0KCk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmllbGRzIHVzaW5nIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHggdGhlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0eDtcbiAgICAvLyBjaGVjayBpZiBpdCBpcyBzaWduZWQgb3IgdW5zaWduZWQgdHhcbiAgICBpZiAodHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3NwZW5kaW5nIGNvbmRpdGlvbiBjYW5ub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIHRoaXMuZmVlKHsgZmVlOiB0eERhdGEuZmVlLnRvU3RyaW5nKCkgfSk7XG4gICAgdGhpcy5ub25jZSh0eERhdGEubm9uY2UpO1xuICAgIGxldCBzaWdIYXNoID0gdHguc3R4VHJhbnNhY3Rpb24udmVyaWZ5QmVnaW4oKTtcblxuICAgIGNvbnN0IGF1dGhUeXBlID0gdHguc3R4VHJhbnNhY3Rpb24uYXV0aC5hdXRoVHlwZSA/IHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguYXV0aFR5cGUgOiBBdXRoVHlwZS5TdGFuZGFyZDtcbiAgICBpZiAoaXNTaW5nbGVTaWcodHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbikpIHtcbiAgICAgIHRoaXMuX251bWJlclNpZ25hdHVyZXMgPSAxO1xuICAgICAgaWYgKHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24uc2lnbmF0dXJlLmRhdGEgIT09IGVtcHR5TWVzc2FnZVNpZ25hdHVyZSgpLmRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5zaWduYXR1cmU7XG4gICAgICAgIHNpZ0hhc2ggPSBtYWtlU2lnSGFzaFByZVNpZ24oc2lnSGFzaCwgYXV0aFR5cGUsIG5ldyBCaWdOdW0odGhpcy5fZmVlLmZlZSksIG5ldyBCaWdOdW0odGhpcy5fbm9uY2UpKTtcbiAgICAgICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHsgLi4uc2lnbmF0dXJlLCBpbmRleDogMCwgc2lnSGFzaCB9KTtcbiAgICAgICAgdGhpcy5fZnJvbVB1YktleXMgPSBbcHVibGljS2V5RnJvbVNpZ25hdHVyZShzaWdIYXNoLCBzaWduYXR1cmUpXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyA9IHR4LnN0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24uc2lnbmF0dXJlc1JlcXVpcmVkO1xuICAgICAgdHguc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChmaWVsZC5jb250ZW50cy50eXBlID09PSBTdGFja3NNZXNzYWdlVHlwZS5NZXNzYWdlU2lnbmF0dXJlKSB7XG4gICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZmllbGQuY29udGVudHM7XG4gICAgICAgICAgY29uc3QgbmV4dFZlcmlmeSA9IG5leHRWZXJpZmljYXRpb24oXG4gICAgICAgICAgICBzaWdIYXNoLFxuICAgICAgICAgICAgYXV0aFR5cGUsXG4gICAgICAgICAgICBuZXcgQmlnTnVtKHRoaXMuX2ZlZS5mZWUpLFxuICAgICAgICAgICAgbmV3IEJpZ051bSh0aGlzLl9ub25jZSksXG4gICAgICAgICAgICBQdWJLZXlFbmNvZGluZy5Db21wcmVzc2VkLCAvLyB1c2VsZXNzIHBhcmFtIGFzIENvbXByZXNzZWQgaXMgaGFyZGNvZGVkIGluIHN0YWNrcyBsaWJcbiAgICAgICAgICAgIHNpZ25hdHVyZVxuICAgICAgICAgICk7XG4gICAgICAgICAgc2lnSGFzaCA9IG5leHRWZXJpZnkubmV4dFNpZ0hhc2g7XG4gICAgICAgICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHsgLi4uc2lnbmF0dXJlLCBpbmRleCwgc2lnSGFzaCB9KTtcbiAgICAgICAgICB0aGlzLl9mcm9tUHViS2V5cy5wdXNoKG5leHRWZXJpZnkucHViS2V5LmRhdGEudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9mcm9tUHViS2V5cy5wdXNoKGZpZWxkLmNvbnRlbnRzLmRhdGEudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnKTtcbiAgICB0aGlzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IHN0YWNrc3RyYW5zYWN0aW9uID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbihcbiAgICAgIEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbiksICdoZXgnKSlcbiAgICApO1xuICAgIHR4LnN0eFRyYW5zYWN0aW9uID0gc3RhY2tzdHJhbnNhY3Rpb247XG4gICAgdGhpcy5pbml0QnVpbGRlcih0eCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvLyByZWdpb24gQmFzZSBCdWlsZGVyXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXNNdWx0aVNpZzogYm9vbGVhbiA9IHRoaXMuX2Zyb21QdWJLZXlzLmxlbmd0aCA+IDE7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc3R4VHJhbnNhY3Rpb24uc2V0RmVlKG5ldyBCaWdOdW0odGhpcy5fZmVlLmZlZSkpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnN0eFRyYW5zYWN0aW9uLnNldE5vbmNlKG5ldyBCaWdOdW0odGhpcy5fbm9uY2UpKTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9mcm9tUHViS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHB1YktleSA9IHRoaXMuX2Zyb21QdWJLZXlzW2luZGV4XTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuZ2V0U2lnbmF0dXJlKHB1YktleSwgaW5kZXgpO1xuICAgICAgaWYgKHNpZ25hdHVyZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ25XaXRoU2lnbmF0dXJlcyhzaWduYXR1cmUsIGlzTXVsdGlTaWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJ2S2V5ID0gdGhpcy5nZXRQcml2YXRlS2V5KHB1YktleSwgaW5kZXgpO1xuICAgICAgICBpZiAocHJ2S2V5KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduKHBydktleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNNdWx0aVNpZykge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb24uYXBwZW5kT3JpZ2luKHB1YktleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbi5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2lnbmF0dXJlID0gKF86IHN0cmluZywgaW5kZXg6IG51bWJlcik6IFNpZ25hdHVyZURhdGEgfCB1bmRlZmluZWQgPT5cbiAgICB0aGlzLl9zaWduYXR1cmVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGluZGV4KTtcbiAgcHJpdmF0ZSBnZXRQcml2YXRlS2V5ID0gKHB1YktleTogc3RyaW5nLCBfOiBudW1iZXIpOiBLZXlQYWlyIHwgdW5kZWZpbmVkID0+XG4gICAgdGhpcy5fbXVsdGlTaWduZXJLZXlQYWlycy5maW5kKChrcCkgPT4ga3AuZ2V0S2V5cyh0cnVlKS5wdWIgPT09IHB1YktleSB8fCBrcC5nZXRLZXlzKCkucHViID09PSBwdWJLZXkpO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKGtleTogQmFzZUtleSk6IFRyYW5zYWN0aW9uIHtcbiAgICB0aGlzLmNoZWNrRHVwbGljYXRlZEtleXMoa2V5KTtcbiAgICBsZXQgcHJ2ID0ga2V5LmtleTtcbiAgICBpZiAocHJ2LnN0YXJ0c1dpdGgoJ3hwcnYnKSkge1xuICAgICAgY29uc3QgcmF3UHJ2ID0geHBydlRvUmF3UHJ2KHBydik7XG4gICAgICBwcnYgPSBuZXcgS2V5UGFpcih7IHBydjogcmF3UHJ2IH0pLmdldEtleXModHJ1ZSkucHJ2O1xuICAgIH1cbiAgICBjb25zdCBzaWduZXIgPSBuZXcgS2V5UGFpcih7IHBydjogcHJ2IH0pO1xuXG4gICAgLy8gU2lnbmluZyB0aGUgdHJhbnNhY3Rpb24gaXMgYW4gb3BlcmF0aW9uIHRoYXQgcmVsaWVzIG9uIGFsbCB0aGUgZGF0YSBiZWluZyBzZXQsXG4gICAgLy8gc28gd2Ugc2V0IHRoZSBzb3VyY2UgaGVyZSBhbmQgbGVhdmUgdGhlIGFjdHVhbCBzaWduaW5nIGZvciB0aGUgYnVpbGQgc3RlcFxuICAgIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMucHVzaChzaWduZXIpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNpZ25lci5nZXRLZXlzKHNpZ25lci5nZXRDb21wcmVzc2VkKCkpLnB1YjtcbiAgICBpZiAoIXRoaXMuX2Zyb21QdWJLZXlzLmluY2x1ZGVzKHB1YmxpY0tleSkpIHtcbiAgICAgIHRoaXMuX2Zyb21QdWJLZXlzLnB1c2gocHVibGljS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBhbHJlYWR5IGluIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnNcbiAgICpcbiAgICogQHBhcmFtIHtCYXNlS2V5fSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRHVwbGljYXRlZEtleXMoa2V5OiBCYXNlS2V5KSB7XG4gICAgdGhpcy5fbXVsdGlTaWduZXJLZXlQYWlycy5mb3JFYWNoKChfc291cmNlS2V5UGFpcikgPT4ge1xuICAgICAgaWYgKF9zb3VyY2VLZXlQYWlyLmdldEtleXMoKS5wcnYgPT09IGtleS5rZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignUmVwZWF0ZWQgc2lnbjogJyArIGtleS5rZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gZmVlc1xuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VGZWV9IGZlZSBUaGUgbWF4aW11bSBnYXMgdG8gcGF5XG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgZmVlKGZlZTogQmFzZUZlZSk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKGZlZS5mZWUpKTtcbiAgICB0aGlzLl9mZWUgPSBmZWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBub25jZShuOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9ub25jZSA9IG47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmcm9tUHViS2V5KHNlbmRlclB1YktleTogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBwdWJLZXlzID0gc2VuZGVyUHViS2V5IGluc3RhbmNlb2YgQXJyYXkgPyBzZW5kZXJQdWJLZXkgOiBbc2VuZGVyUHViS2V5XTtcbiAgICB0aGlzLl9mcm9tUHViS2V5cyA9IFtdO1xuICAgIHB1YktleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoaXNWYWxpZFB1YmxpY0tleShrZXkpKSB7XG4gICAgICAgIHRoaXMuX2Zyb21QdWJLZXlzLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBwdWJsaWMga2V5Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgbWVtb1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtb1xuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIG1lbW8obWVtbzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkTWVtbyhtZW1vKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWVtbyBpcyB0b28gbG9uZycpO1xuICAgIH1cbiAgICB0aGlzLl9tZW1vID0gbWVtbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2V0IHRoZSBudW1iZXIgb2Ygc2lnbmF0dXJlcyBmb3IgbXVsdGktc2lnXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1TaWduc1xuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIG51bWJlclNpZ25hdHVyZXMobnVtU2lnbnM6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKG51bVNpZ25zKSk7XG4gICAgdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyA9IG51bVNpZ25zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcywgYWRkcmVzc0Zvcm1hdD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzICcgKyBhZGRyZXNzLmFkZHJlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUtleShrZXk6IEJhc2VLZXkpOiB2b2lkIHtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IGtleS5rZXkgfSk7XG4gICAgaWYgKCFrZXlQYWlyLmdldEtleXMoKS5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQga2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbiksICdoZXgnKSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nIHRoZSByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUZlZSgpO1xuICAgIHRoaXMudmFsaWRhdGVOb25jZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVmFsdWUodmFsdWU6IEJpZ051bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuKDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGZlZSBmaWVsZCBpcyBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9mZWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBmZWUnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHRoaXMuX2ZlZS5mZWUpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGZlZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBub25jZSBpcyBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTm9uY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX25vbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHRoaXMuX25vbmNlKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBub25jZSAke3RoaXMuX25vbmNlfWApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
+
import { BaseTransactionBuilderFactory } from '@bitgo/sdk-core';
|
|
3
|
+
import { TransferBuilder } from './transferBuilder';
|
|
4
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
5
|
+
import { Transaction } from './transaction';
|
|
6
|
+
import { ContractBuilder } from './contractBuilder';
|
|
7
|
+
import { SendmanyBuilder } from './sendmanyBuilder';
|
|
8
|
+
export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
|
|
9
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
10
|
+
/** @inheritdoc */
|
|
11
|
+
from(raw: string): TransactionBuilder;
|
|
12
|
+
private parseTransaction;
|
|
13
|
+
/** @inheritdoc */
|
|
14
|
+
getWalletInitializationBuilder(tx?: Transaction): void;
|
|
15
|
+
/** @inheritdoc */
|
|
16
|
+
getTransferBuilder(tx?: Transaction): TransferBuilder;
|
|
17
|
+
getContractBuilder(tx?: Transaction): ContractBuilder;
|
|
18
|
+
getSendmanyBuilder(tx?: Transaction): SendmanyBuilder;
|
|
19
|
+
/**
|
|
20
|
+
* Initialize the builder with the given transaction
|
|
21
|
+
*
|
|
22
|
+
* @param {Transaction | undefined} tx - the transaction used to initialize the builder
|
|
23
|
+
* @param {TransactionBuilder} builder - the builder to be initialized
|
|
24
|
+
* @returns {TransactionBuilder} the builder initialized
|
|
25
|
+
*/
|
|
26
|
+
private static initializeBuilder;
|
|
27
|
+
/** @inheritdoc */
|
|
28
|
+
validateRawTransaction(rawTransaction: unknown): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=transactionBuilderFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EACL,6BAA6B,EAI9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,yBAA0B,SAAQ,6BAA6B;gBAC9D,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAqBrC,OAAO,CAAC,gBAAgB;IASxB,kBAAkB;IAClB,8BAA8B,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,IAAI;IAItD,kBAAkB;IAClB,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAOhC,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI;CAQtD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionBuilderFactory = void 0;
|
|
4
|
+
const transactions_1 = require("@stacks/transactions");
|
|
5
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
6
|
+
const transferBuilder_1 = require("./transferBuilder");
|
|
7
|
+
const transaction_1 = require("./transaction");
|
|
8
|
+
const contractBuilder_1 = require("./contractBuilder");
|
|
9
|
+
const _1 = require(".");
|
|
10
|
+
const sendmanyBuilder_1 = require("./sendmanyBuilder");
|
|
11
|
+
class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
|
|
12
|
+
constructor(_coinConfig) {
|
|
13
|
+
super(_coinConfig);
|
|
14
|
+
}
|
|
15
|
+
/** @inheritdoc */
|
|
16
|
+
from(raw) {
|
|
17
|
+
this.validateRawTransaction(raw);
|
|
18
|
+
try {
|
|
19
|
+
const tx = this.parseTransaction(raw);
|
|
20
|
+
switch (tx.stxTransaction.payload.payloadType) {
|
|
21
|
+
case transactions_1.PayloadType.TokenTransfer:
|
|
22
|
+
return this.getTransferBuilder(tx);
|
|
23
|
+
case transactions_1.PayloadType.ContractCall:
|
|
24
|
+
if (sendmanyBuilder_1.SendmanyBuilder.isValidContractCall(this._coinConfig, tx.stxTransaction.payload)) {
|
|
25
|
+
return this.getSendmanyBuilder(tx);
|
|
26
|
+
}
|
|
27
|
+
return this.getContractBuilder(tx);
|
|
28
|
+
default:
|
|
29
|
+
throw new sdk_core_1.InvalidTransactionError('Invalid transaction');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.error(e);
|
|
34
|
+
throw new sdk_core_1.ParseTransactionError('There was an error parsing the raw transaction');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
parseTransaction(rawTransaction) {
|
|
38
|
+
const tx = new transaction_1.Transaction(this._coinConfig);
|
|
39
|
+
const stackstransaction = transactions_1.deserializeTransaction(transactions_1.BufferReader.fromBuffer(Buffer.from(_1.Utils.removeHexPrefix(rawTransaction), 'hex')));
|
|
40
|
+
tx.stxTransaction = stackstransaction;
|
|
41
|
+
return tx;
|
|
42
|
+
}
|
|
43
|
+
/** @inheritdoc */
|
|
44
|
+
getWalletInitializationBuilder(tx) {
|
|
45
|
+
throw new sdk_core_1.NotImplementedError('method not implemented');
|
|
46
|
+
}
|
|
47
|
+
/** @inheritdoc */
|
|
48
|
+
getTransferBuilder(tx) {
|
|
49
|
+
return TransactionBuilderFactory.initializeBuilder(new transferBuilder_1.TransferBuilder(this._coinConfig), tx);
|
|
50
|
+
}
|
|
51
|
+
getContractBuilder(tx) {
|
|
52
|
+
return TransactionBuilderFactory.initializeBuilder(new contractBuilder_1.ContractBuilder(this._coinConfig), tx);
|
|
53
|
+
}
|
|
54
|
+
getSendmanyBuilder(tx) {
|
|
55
|
+
return TransactionBuilderFactory.initializeBuilder(new sendmanyBuilder_1.SendmanyBuilder(this._coinConfig), tx);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Initialize the builder with the given transaction
|
|
59
|
+
*
|
|
60
|
+
* @param {Transaction | undefined} tx - the transaction used to initialize the builder
|
|
61
|
+
* @param {TransactionBuilder} builder - the builder to be initialized
|
|
62
|
+
* @returns {TransactionBuilder} the builder initialized
|
|
63
|
+
*/
|
|
64
|
+
static initializeBuilder(builder, tx) {
|
|
65
|
+
if (tx) {
|
|
66
|
+
builder.initBuilder(tx);
|
|
67
|
+
}
|
|
68
|
+
return builder;
|
|
69
|
+
}
|
|
70
|
+
/** @inheritdoc */
|
|
71
|
+
validateRawTransaction(rawTransaction) {
|
|
72
|
+
if (!rawTransaction) {
|
|
73
|
+
throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
|
|
74
|
+
}
|
|
75
|
+
if (!_1.Utils.isValidRawTransaction(rawTransaction)) {
|
|
76
|
+
throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.TransactionBuilderFactory = TransactionBuilderFactory;
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1REFBeUY7QUFDekYsOENBS3lCO0FBQ3pCLHVEQUFvRDtBQUVwRCwrQ0FBNEM7QUFDNUMsdURBQW9EO0FBQ3BELHdCQUEwQjtBQUMxQix1REFBb0Q7QUFFcEQsTUFBYSx5QkFBMEIsU0FBUSx3Q0FBNkI7SUFDMUUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLENBQUMsR0FBVztRQUNkLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJO1lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUM3QyxLQUFLLDBCQUFXLENBQUMsYUFBYTtvQkFDNUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssMEJBQVcsQ0FBQyxZQUFZO29CQUMzQixJQUFJLGlDQUFlLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNwRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDcEM7b0JBQ0QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDO29CQUNFLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2FBQzVEO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDbkY7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsY0FBc0I7UUFDN0MsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLGlCQUFpQixHQUFHLHFDQUFzQixDQUM5QywyQkFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQUssQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FDbkYsQ0FBQztRQUNGLEVBQUUsQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7UUFDdEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLDhCQUE4QixDQUFDLEVBQWdCO1FBQzdDLE1BQU0sSUFBSSw4QkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsa0JBQWtCLENBQUMsRUFBZ0I7UUFDakMsT0FBTyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLGlDQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFnQjtRQUNqQyxPQUFPLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLElBQUksaUNBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQWdCO1FBQ2pDLE9BQU8seUJBQXlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxpQ0FBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLGlCQUFpQixDQUErQixPQUFVLEVBQUUsRUFBMkI7UUFDcEcsSUFBSSxFQUFFLEVBQUU7WUFDTixPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixzQkFBc0IsQ0FBQyxjQUF1QjtRQUM1QyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxDQUFDLFFBQUssQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNoRCxNQUFNLElBQUksZ0NBQXFCLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7Q0FDRjtBQTdFRCw4REE2RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVmZmVyUmVhZGVyLCBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uLCBQYXlsb2FkVHlwZSB9IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7XG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IENvbnRyYWN0QnVpbGRlciB9IGZyb20gJy4vY29udHJhY3RCdWlsZGVyJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBTZW5kbWFueUJ1aWxkZXIgfSBmcm9tICcuL3NlbmRtYW55QnVpbGRlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZnJvbShyYXc6IHN0cmluZyk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhdyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4ID0gdGhpcy5wYXJzZVRyYW5zYWN0aW9uKHJhdyk7XG4gICAgICBzd2l0Y2ggKHR4LnN0eFRyYW5zYWN0aW9uLnBheWxvYWQucGF5bG9hZFR5cGUpIHtcbiAgICAgICAgY2FzZSBQYXlsb2FkVHlwZS5Ub2tlblRyYW5zZmVyOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zZmVyQnVpbGRlcih0eCk7XG4gICAgICAgIGNhc2UgUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsOlxuICAgICAgICAgIGlmIChTZW5kbWFueUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbCh0aGlzLl9jb2luQ29uZmlnLCB0eC5zdHhUcmFuc2FjdGlvbi5wYXlsb2FkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VuZG1hbnlCdWlsZGVyKHR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udHJhY3RCdWlsZGVyKHR4KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgdGhlIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIGNvbnN0IHN0YWNrc3RyYW5zYWN0aW9uID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbihcbiAgICAgIEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKFV0aWxzLnJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbiksICdoZXgnKSlcbiAgICApO1xuICAgIHR4LnN0eFRyYW5zYWN0aW9uID0gc3RhY2tzdHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcih0eD86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ21ldGhvZCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXRUcmFuc2ZlckJ1aWxkZXIodHg/OiBUcmFuc2FjdGlvbik6IFRyYW5zZmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkuaW5pdGlhbGl6ZUJ1aWxkZXIobmV3IFRyYW5zZmVyQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKSwgdHgpO1xuICB9XG5cbiAgZ2V0Q29udHJhY3RCdWlsZGVyKHR4PzogVHJhbnNhY3Rpb24pOiBDb250cmFjdEJ1aWxkZXIge1xuICAgIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LmluaXRpYWxpemVCdWlsZGVyKG5ldyBDb250cmFjdEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyksIHR4KTtcbiAgfVxuXG4gIGdldFNlbmRtYW55QnVpbGRlcih0eD86IFRyYW5zYWN0aW9uKTogU2VuZG1hbnlCdWlsZGVyIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5pbml0aWFsaXplQnVpbGRlcihuZXcgU2VuZG1hbnlCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpLCB0eCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYnVpbGRlciB3aXRoIHRoZSBnaXZlbiB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uIHwgdW5kZWZpbmVkfSB0eCAtIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGJ1aWxkZXJcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IGJ1aWxkZXIgLSB0aGUgYnVpbGRlciB0byBiZSBpbml0aWFsaXplZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSB0aGUgYnVpbGRlciBpbml0aWFsaXplZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdGlhbGl6ZUJ1aWxkZXI8VCBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlcj4oYnVpbGRlcjogVCwgdHg6IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkKTogVCB7XG4gICAgaWYgKHR4KSB7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlmICghVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
+
import BigNum from 'bn.js';
|
|
3
|
+
import { Transaction } from './transaction';
|
|
4
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
5
|
+
export declare class TransferBuilder extends TransactionBuilder {
|
|
6
|
+
private _options;
|
|
7
|
+
protected _toAddress: string;
|
|
8
|
+
protected _amount: BigNum;
|
|
9
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
10
|
+
initBuilder(tx: Transaction): void;
|
|
11
|
+
/** @inheritdoc */
|
|
12
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
13
|
+
private buildTokenTransferOptions;
|
|
14
|
+
/**
|
|
15
|
+
* Set the destination address where the funds will be sent,
|
|
16
|
+
* it may take the format `'<shard>.<realm>.<account>'` or `'<account>'`
|
|
17
|
+
*
|
|
18
|
+
* @param {string} address the address to transfer funds to
|
|
19
|
+
* @returns {TransferBuilder} the builder with the new parameter set
|
|
20
|
+
*/
|
|
21
|
+
to(address: string): this;
|
|
22
|
+
/**
|
|
23
|
+
* Set the amount to be transferred
|
|
24
|
+
*
|
|
25
|
+
* @param {string} amount amount to transfer in tinyBars (there are 100,000,000 tinyBars in one Hbar)
|
|
26
|
+
* @returns {TransferBuilder} the builder with the new parameter set
|
|
27
|
+
*/
|
|
28
|
+
amount(amount: string): this;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=transferBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,MAAM,MAAM,OAAO,CAAC;AAc3B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,OAAO,CAAC,QAAQ,CAAsE;IACtF,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAiBlC,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAO3D,OAAO,CAAC,yBAAyB;IA6BjC;;;;;;OAMG;IACH,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQzB;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAO7B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TransferBuilder = void 0;
|
|
7
|
+
const bn_js_1 = __importDefault(require("bn.js"));
|
|
8
|
+
const transactions_1 = require("@stacks/transactions");
|
|
9
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
10
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
class TransferBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
13
|
+
constructor(_coinConfig) {
|
|
14
|
+
super(_coinConfig);
|
|
15
|
+
}
|
|
16
|
+
initBuilder(tx) {
|
|
17
|
+
const txData = tx.toJson();
|
|
18
|
+
if (txData.payload === undefined) {
|
|
19
|
+
throw new sdk_core_1.InvalidTransactionError('payload must not be undefined');
|
|
20
|
+
}
|
|
21
|
+
if (txData.payload.payloadType === transactions_1.PayloadType.TokenTransfer) {
|
|
22
|
+
this.to(txData.payload.to);
|
|
23
|
+
this.amount(txData.payload.amount);
|
|
24
|
+
if (txData.payload.memo) {
|
|
25
|
+
this.memo(txData.payload.memo);
|
|
26
|
+
}
|
|
27
|
+
super.initBuilder(tx);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
throw new sdk_core_1.BuildTransactionError('Transaction should be transfer');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** @inheritdoc */
|
|
34
|
+
async buildImplementation() {
|
|
35
|
+
this._options = this.buildTokenTransferOptions();
|
|
36
|
+
this.transaction.setTransactionType(sdk_core_1.TransactionType.Send);
|
|
37
|
+
this.transaction.stxTransaction = await transactions_1.makeUnsignedSTXTokenTransfer(this._options);
|
|
38
|
+
return await super.buildImplementation();
|
|
39
|
+
}
|
|
40
|
+
buildTokenTransferOptions() {
|
|
41
|
+
const defaultOpts = {
|
|
42
|
+
recipient: this._toAddress,
|
|
43
|
+
amount: this._amount,
|
|
44
|
+
memo: this._memo,
|
|
45
|
+
anchorMode: this._anchorMode,
|
|
46
|
+
network: this._network,
|
|
47
|
+
fee: new bn_js_1.default(this._fee.fee),
|
|
48
|
+
nonce: new bn_js_1.default(this._nonce),
|
|
49
|
+
};
|
|
50
|
+
if (this._fromPubKeys.length > 0) {
|
|
51
|
+
if (this._fromPubKeys.length === 1) {
|
|
52
|
+
return {
|
|
53
|
+
...defaultOpts,
|
|
54
|
+
publicKey: this._fromPubKeys[0],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return {
|
|
59
|
+
...defaultOpts,
|
|
60
|
+
publicKeys: this._fromPubKeys,
|
|
61
|
+
numSignatures: this._numberSignatures,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new sdk_core_1.InvalidParameterValueError('supply at least 1 public key');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// region Transfer fields
|
|
70
|
+
/**
|
|
71
|
+
* Set the destination address where the funds will be sent,
|
|
72
|
+
* it may take the format `'<shard>.<realm>.<account>'` or `'<account>'`
|
|
73
|
+
*
|
|
74
|
+
* @param {string} address the address to transfer funds to
|
|
75
|
+
* @returns {TransferBuilder} the builder with the new parameter set
|
|
76
|
+
*/
|
|
77
|
+
to(address) {
|
|
78
|
+
if (!utils_1.isValidAddress(address)) {
|
|
79
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid address');
|
|
80
|
+
}
|
|
81
|
+
this._toAddress = address;
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Set the amount to be transferred
|
|
86
|
+
*
|
|
87
|
+
* @param {string} amount amount to transfer in tinyBars (there are 100,000,000 tinyBars in one Hbar)
|
|
88
|
+
* @returns {TransferBuilder} the builder with the new parameter set
|
|
89
|
+
*/
|
|
90
|
+
amount(amount) {
|
|
91
|
+
if (!utils_1.isValidAmount(amount)) {
|
|
92
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid amount');
|
|
93
|
+
}
|
|
94
|
+
this._amount = new bn_js_1.default(amount);
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.TransferBuilder = TransferBuilder;
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esa0RBQTJCO0FBQzNCLHVEQU04QjtBQUM5Qiw4Q0FLeUI7QUFFekIsNkRBQTBEO0FBQzFELG1DQUF3RDtBQUV4RCxNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBS3JELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBZTtRQUN6QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksa0NBQXVCLENBQUMsK0JBQStCLENBQUMsQ0FBQztTQUNwRTtRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssMEJBQVcsQ0FBQyxhQUFhLEVBQUU7WUFDNUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7WUFDRCxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZCO2FBQU07WUFDTCxNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDUixLQUFLLENBQUMsbUJBQW1CO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLE1BQU0sMkNBQTRCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLE1BQU0sV0FBVyxHQUF5QjtZQUN4QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztZQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3RCLEdBQUcsRUFBRSxJQUFJLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUM5QixLQUFLLEVBQUUsSUFBSSxlQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMvQixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2xDLE9BQU87b0JBQ0wsR0FBRyxXQUFXO29CQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztpQkFDaEMsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE9BQU87b0JBQ0wsR0FBRyxXQUFXO29CQUNkLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7aUJBQ3RDLENBQUM7YUFDSDtTQUNGO2FBQU07WUFDTCxNQUFNLElBQUkscUNBQTBCLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUN0RTtJQUNILENBQUM7SUFFRCx5QkFBeUI7SUFDekI7Ozs7OztPQU1HO0lBQ0gsRUFBRSxDQUFDLE9BQWU7UUFDaEIsSUFBSSxDQUFDLHNCQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxJQUFJLHFDQUEwQixDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxNQUFjO1FBQ25CLElBQUksQ0FBQyxxQkFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxxQ0FBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQTNGRCwwQ0EyRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IEJpZ051bSBmcm9tICdibi5qcyc7XG5pbXBvcnQge1xuICBtYWtlVW5zaWduZWRTVFhUb2tlblRyYW5zZmVyLFxuICBQYXlsb2FkVHlwZSxcbiAgVW5zaWduZWRUb2tlblRyYW5zZmVyT3B0aW9ucyxcbiAgVG9rZW5UcmFuc2Zlck9wdGlvbnMsXG4gIFVuc2lnbmVkTXVsdGlTaWdUb2tlblRyYW5zZmVyT3B0aW9ucyxcbn0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBpc1ZhbGlkQWRkcmVzcywgaXNWYWxpZEFtb3VudCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfb3B0aW9uczogVW5zaWduZWRUb2tlblRyYW5zZmVyT3B0aW9ucyB8IFVuc2lnbmVkTXVsdGlTaWdUb2tlblRyYW5zZmVyT3B0aW9ucztcbiAgcHJvdGVjdGVkIF90b0FkZHJlc3M6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hbW91bnQ6IEJpZ051bTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICBpZiAodHhEYXRhLnBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdwYXlsb2FkIG11c3Qgbm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICBpZiAodHhEYXRhLnBheWxvYWQucGF5bG9hZFR5cGUgPT09IFBheWxvYWRUeXBlLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgIHRoaXMudG8odHhEYXRhLnBheWxvYWQudG8pO1xuICAgICAgdGhpcy5hbW91bnQodHhEYXRhLnBheWxvYWQuYW1vdW50KTtcbiAgICAgIGlmICh0eERhdGEucGF5bG9hZC5tZW1vKSB7XG4gICAgICAgIHRoaXMubWVtbyh0eERhdGEucGF5bG9hZC5tZW1vKTtcbiAgICAgIH1cbiAgICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gc2hvdWxkIGJlIHRyYW5zZmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLl9vcHRpb25zID0gdGhpcy5idWlsZFRva2VuVHJhbnNmZXJPcHRpb25zKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc3R4VHJhbnNhY3Rpb24gPSBhd2FpdCBtYWtlVW5zaWduZWRTVFhUb2tlblRyYW5zZmVyKHRoaXMuX29wdGlvbnMpO1xuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVG9rZW5UcmFuc2Zlck9wdGlvbnMoKTogVW5zaWduZWRUb2tlblRyYW5zZmVyT3B0aW9ucyB8IFVuc2lnbmVkTXVsdGlTaWdUb2tlblRyYW5zZmVyT3B0aW9ucyB7XG4gICAgY29uc3QgZGVmYXVsdE9wdHM6IFRva2VuVHJhbnNmZXJPcHRpb25zID0ge1xuICAgICAgcmVjaXBpZW50OiB0aGlzLl90b0FkZHJlc3MsXG4gICAgICBhbW91bnQ6IHRoaXMuX2Ftb3VudCxcbiAgICAgIG1lbW86IHRoaXMuX21lbW8sXG4gICAgICBhbmNob3JNb2RlOiB0aGlzLl9hbmNob3JNb2RlLFxuICAgICAgbmV0d29yazogdGhpcy5fbmV0d29yayxcbiAgICAgIGZlZTogbmV3IEJpZ051bSh0aGlzLl9mZWUuZmVlKSxcbiAgICAgIG5vbmNlOiBuZXcgQmlnTnVtKHRoaXMuX25vbmNlKSxcbiAgICB9O1xuICAgIGlmICh0aGlzLl9mcm9tUHViS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5fZnJvbVB1YktleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdHMsXG4gICAgICAgICAgcHVibGljS2V5OiB0aGlzLl9mcm9tUHViS2V5c1swXSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdHMsXG4gICAgICAgICAgcHVibGljS2V5czogdGhpcy5fZnJvbVB1YktleXMsXG4gICAgICAgICAgbnVtU2lnbmF0dXJlczogdGhpcy5fbnVtYmVyU2lnbmF0dXJlcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdzdXBwbHkgYXQgbGVhc3QgMSBwdWJsaWMga2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVnaW9uIFRyYW5zZmVyIGZpZWxkc1xuICAvKipcbiAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdoZXJlIHRoZSBmdW5kcyB3aWxsIGJlIHNlbnQsXG4gICAqIGl0IG1heSB0YWtlIHRoZSBmb3JtYXQgYCc8c2hhcmQ+LjxyZWFsbT4uPGFjY291bnQ+J2Agb3IgYCc8YWNjb3VudD4nYFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyB0aGUgYWRkcmVzcyB0byB0cmFuc2ZlciBmdW5kcyB0b1xuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgdG8oYWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgdGhpcy5fdG9BZGRyZXNzID0gYWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IGFtb3VudCB0byB0cmFuc2ZlciBpbiB0aW55QmFycyAodGhlcmUgYXJlIDEwMCwwMDAsMDAwIHRpbnlCYXJzIGluIG9uZSBIYmFyKVxuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgYW1vdW50KGFtb3VudDogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkQW1vdW50KGFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBhbW91bnQnKTtcbiAgICB9XG4gICAgdGhpcy5fYW1vdW50ID0gbmV3IEJpZ051bShhbW91bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=
|