@bitgo-beta/sdk-coin-cspr 1.2.19-beta.1221 → 1.2.19-beta.1223

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/src/cspr.d.ts +107 -0
  2. package/dist/src/cspr.d.ts.map +1 -0
  3. package/dist/src/cspr.js +314 -0
  4. package/dist/src/index.d.ts +5 -0
  5. package/dist/src/index.d.ts.map +1 -0
  6. package/dist/src/index.js +44 -0
  7. package/dist/src/lib/constants.d.ts +19 -0
  8. package/dist/src/lib/constants.d.ts.map +1 -0
  9. package/dist/src/lib/constants.js +28 -0
  10. package/dist/src/lib/delegateBuilder.d.ts +49 -0
  11. package/dist/src/lib/delegateBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/delegateBuilder.js +111 -0
  13. package/dist/src/lib/ifaces.d.ts +69 -0
  14. package/dist/src/lib/ifaces.d.ts.map +1 -0
  15. package/dist/src/lib/ifaces.js +3 -0
  16. package/dist/src/lib/index.d.ts +6 -0
  17. package/dist/src/lib/index.d.ts.map +1 -0
  18. package/dist/src/lib/index.js +45 -0
  19. package/dist/src/lib/keyPair.d.ts +18 -0
  20. package/dist/src/lib/keyPair.d.ts.map +1 -0
  21. package/dist/src/lib/keyPair.js +55 -0
  22. package/dist/src/lib/transaction.d.ts +55 -0
  23. package/dist/src/lib/transaction.d.ts.map +1 -0
  24. package/dist/src/lib/transaction.js +240 -0
  25. package/dist/src/lib/transactionBuilder.d.ts +124 -0
  26. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/transactionBuilder.js +312 -0
  28. package/dist/src/lib/transactionBuilderFactory.d.ts +46 -0
  29. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  30. package/dist/src/lib/transactionBuilderFactory.js +98 -0
  31. package/dist/src/lib/transferBuilder.d.ts +39 -0
  32. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/transferBuilder.js +106 -0
  34. package/dist/src/lib/undelegateBuilder.d.ts +49 -0
  35. package/dist/src/lib/undelegateBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/undelegateBuilder.js +111 -0
  37. package/dist/src/lib/utils.d.ts +188 -0
  38. package/dist/src/lib/utils.d.ts.map +1 -0
  39. package/dist/src/lib/utils.js +490 -0
  40. package/dist/src/lib/walletInitializationBuilder.d.ts +27 -0
  41. package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/walletInitializationBuilder.js +95 -0
  43. package/dist/src/register.d.ts +3 -0
  44. package/dist/src/register.d.ts.map +1 -0
  45. package/dist/src/register.js +11 -0
  46. package/dist/src/tcspr.d.ts +11 -0
  47. package/dist/src/tcspr.d.ts.map +1 -0
  48. package/dist/src/tcspr.js +24 -0
  49. package/package.json +6 -6
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Transaction = void 0;
37
+ const _ = __importStar(require("lodash"));
38
+ const casper_js_sdk_1 = require("casper-js-sdk");
39
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
40
+ const keyPair_1 = require("./keyPair");
41
+ const constants_1 = require("./constants");
42
+ const utils_1 = require("./utils");
43
+ class Transaction extends sdk_core_1.BaseTransaction {
44
+ constructor(_coinConfig) {
45
+ super(_coinConfig);
46
+ }
47
+ /** @inheritdoc */
48
+ canSign(key) {
49
+ return true;
50
+ }
51
+ sign(keyPair) {
52
+ const keys = keyPair.getKeys();
53
+ if (!keys.prv) {
54
+ throw new sdk_core_1.SigningError('Missing private key');
55
+ }
56
+ if (this._deploy.approvals.some((ap) => !ap.signer.startsWith(constants_1.SECP256K1_PREFIX) || !(0, utils_1.isValidPublicKey)((0, utils_1.removeAlgoPrefixFromHexValue)(ap.signer)))) {
57
+ throw new sdk_core_1.SigningError('Invalid deploy. Already signed with an invalid key');
58
+ }
59
+ const secpKeys = new casper_js_sdk_1.Keys.Secp256K1(Uint8Array.from(Buffer.from(keys.pub, 'hex')), Uint8Array.from(Buffer.from(keys.prv, 'hex')));
60
+ const signedDeploy = casper_js_sdk_1.DeployUtil.signDeploy(this._deploy, secpKeys);
61
+ this._signatures.push(signedDeploy.approvals[signedDeploy.approvals.length - 1].signature);
62
+ }
63
+ /**
64
+ * Add a signature to this transaction and to and its deploy
65
+ *
66
+ * @param {string} signature The signature to add, in string hex format
67
+ * @param {KeyPair} keyPair The key pair that created the signature
68
+ */
69
+ addSignature(signature, keyPair) {
70
+ const pub = keyPair.getKeys().pub;
71
+ const signatureBuffer = Uint8Array.from(Buffer.from(signature, 'hex'));
72
+ const pubKeyBuffer = Uint8Array.from(Buffer.from(pub, 'hex'));
73
+ const parsedPublicKey = casper_js_sdk_1.Keys.Secp256K1.parsePublicKey(pubKeyBuffer, 'raw');
74
+ const pubKeyHex = casper_js_sdk_1.Keys.Secp256K1.accountHex(parsedPublicKey);
75
+ if ((0, utils_1.removeAlgoPrefixFromHexValue)(pubKeyHex) !== pub) {
76
+ throw new sdk_core_1.SigningError('Signer does not match signature');
77
+ }
78
+ const signedDeploy = casper_js_sdk_1.DeployUtil.setSignature(this._deploy, signatureBuffer, casper_js_sdk_1.CLPublicKey.fromSecp256K1(parsedPublicKey));
79
+ const approval = _.last(signedDeploy.approvals);
80
+ if ((0, utils_1.removeAlgoPrefixFromHexValue)(approval.signature) !== signature) {
81
+ throw new sdk_core_1.SigningError('Invalid signature');
82
+ }
83
+ this._signatures.push(signature);
84
+ }
85
+ /** @inheritdoc */
86
+ toBroadcastFormat() {
87
+ if (!this.casperTx) {
88
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
89
+ }
90
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
+ const txJson = casper_js_sdk_1.DeployUtil.deployToJson(this.casperTx);
92
+ // The new casper lib is converting the TTL from miliseconds to another date format, in this case 1 day
93
+ // we need to leave it as ms for the HSM to be able to parse it
94
+ txJson.deploy.header.ttl = `${this.casperTx.header.ttl}ms`;
95
+ this.setOwnersInJson(txJson);
96
+ this.setTransfersFieldsInJson(txJson);
97
+ this.setDelegateFieldsInJson(txJson);
98
+ return JSON.stringify(txJson);
99
+ }
100
+ /** @inheritdoc */
101
+ toJson() {
102
+ const deployPayment = this._deploy.payment.asModuleBytes()?.getArgByName('amount');
103
+ if (!deployPayment) {
104
+ throw new sdk_core_1.InvalidTransactionError('Undefined fee');
105
+ }
106
+ const owner1Index = 0;
107
+ const owner2Index = 1;
108
+ const owner3Index = 2;
109
+ const sourcePublicKey = Buffer.from(this._deploy.header.account.value()).toString('hex');
110
+ const sourceAddress = new keyPair_1.KeyPair({ pub: sourcePublicKey }).getAddress();
111
+ const result = {
112
+ hash: Buffer.from(this._deploy.hash).toString('hex'),
113
+ fee: { gasLimit: deployPayment.value().toString(), gasPrice: this._deploy.header.gasPrice.toString() },
114
+ from: sourceAddress,
115
+ startTime: new Date(this._deploy.header.timestamp).toISOString(),
116
+ expiration: this._deploy.header.ttl,
117
+ deployType: this._deploy.session.getArgByName(constants_1.TRANSACTION_TYPE).value(),
118
+ };
119
+ const transactionType = (0, utils_1.getDeployType)(this._deploy.session);
120
+ switch (transactionType) {
121
+ case sdk_core_1.TransactionType.Send:
122
+ result.to = (0, utils_1.getTransferDestinationAddress)(this._deploy.session);
123
+ result.amount = (0, utils_1.getTransferAmount)(this._deploy.session);
124
+ result.transferId = (0, utils_1.getTransferId)(this._deploy.session);
125
+ break;
126
+ case sdk_core_1.TransactionType.WalletInitialization:
127
+ result.owner1 = this.casperTx.session.getArgByName(constants_1.OWNER_PREFIX + owner1Index).value();
128
+ result.owner2 = this.casperTx.session.getArgByName(constants_1.OWNER_PREFIX + owner2Index).value();
129
+ result.owner3 = this.casperTx.session.getArgByName(constants_1.OWNER_PREFIX + owner3Index).value();
130
+ break;
131
+ case sdk_core_1.TransactionType.StakingLock:
132
+ result.fromDelegate = (0, utils_1.getDelegatorAddress)(this.casperTx.session);
133
+ result.validator = (0, utils_1.getValidatorAddress)(this.casperTx.session);
134
+ result.amount = (0, utils_1.getDelegateAmount)(this.casperTx.session);
135
+ break;
136
+ case sdk_core_1.TransactionType.StakingUnlock:
137
+ result.fromDelegate = (0, utils_1.getDelegatorAddress)(this.casperTx.session);
138
+ result.validator = (0, utils_1.getValidatorAddress)(this.casperTx.session);
139
+ result.amount = (0, utils_1.getDelegateAmount)(this.casperTx.session);
140
+ break;
141
+ }
142
+ return result;
143
+ }
144
+ /**
145
+ * Set the transaction type
146
+ *
147
+ * @param {TransactionType} transactionType The transaction type to be set
148
+ */
149
+ setTransactionType(transactionType) {
150
+ this._type = transactionType;
151
+ }
152
+ /**
153
+ * Retrieve signatures from the deploy instance and load them into the signatures list
154
+ */
155
+ loadPreviousSignatures() {
156
+ if (this._deploy.approvals && this._deploy.approvals.length > 0) {
157
+ this._deploy.approvals.forEach((approval) => {
158
+ this._signatures.push(approval.signature);
159
+ });
160
+ }
161
+ }
162
+ /**
163
+ * Set owners inside a json representing a wallet initialization tx.
164
+ *
165
+ * @param {Record<string, any>} txJson json to modify
166
+ */
167
+ setOwnersInJson(txJson) {
168
+ if ((0, utils_1.getDeployType)(this.casperTx.session) === sdk_core_1.TransactionType.WalletInitialization) {
169
+ const argName = 0;
170
+ const argValue = 1;
171
+ const owner0 = 0;
172
+ const owner1 = 1;
173
+ const owner2 = 2;
174
+ const ownersValues = new Map();
175
+ ownersValues.set(constants_1.TRANSACTION_TYPE, this.casperTx.session.getArgByName(constants_1.TRANSACTION_TYPE).value());
176
+ [owner0, owner1, owner2].forEach((index) => {
177
+ ownersValues.set(constants_1.OWNER_PREFIX + index, this.casperTx.session.getArgByName(constants_1.OWNER_PREFIX + index).value());
178
+ });
179
+ txJson['deploy']['session']['ModuleBytes']['args'].forEach((arg) => {
180
+ if (ownersValues.has(arg[argName])) {
181
+ arg[argValue]['parsed'] = ownersValues.get(arg[argName]);
182
+ }
183
+ });
184
+ }
185
+ }
186
+ /**
187
+ * Set transfer fields inside a json representing a transfer tx.
188
+ *
189
+ * @param {Record<string, any>} txJson json to modify
190
+ */
191
+ setTransfersFieldsInJson(txJson) {
192
+ if ((0, utils_1.getDeployType)(this.casperTx.session) === sdk_core_1.TransactionType.Send) {
193
+ const argName = 0;
194
+ const argValue = 1;
195
+ const transferValues = new Map();
196
+ transferValues.set(constants_1.TRANSACTION_TYPE, this.casperTx.session.getArgByName(constants_1.TRANSACTION_TYPE).value());
197
+ transferValues.set('amount', (0, utils_1.getTransferAmount)(this.casperTx.session));
198
+ transferValues.set('to_address', (0, utils_1.getTransferDestinationAddress)(this.casperTx.session));
199
+ const transferId = (0, utils_1.getTransferId)(this.casperTx.session);
200
+ if (transferId !== undefined) {
201
+ transferValues.set('id', transferId.toString());
202
+ }
203
+ txJson['deploy']['session']['Transfer']['args'].forEach((arg) => {
204
+ if (transferValues.has(arg[argName])) {
205
+ arg[argValue]['parsed'] = transferValues.get(arg[argName]);
206
+ }
207
+ });
208
+ }
209
+ }
210
+ /**
211
+ * Set delegate / undelegate fields inside a json representing the tx.
212
+ *
213
+ * @param {Record<string, any>} txJson json to modify
214
+ */
215
+ setDelegateFieldsInJson(txJson) {
216
+ if ((0, utils_1.getDeployType)(this.casperTx.session) === sdk_core_1.TransactionType.StakingLock ||
217
+ (0, utils_1.getDeployType)(this.casperTx.session) === sdk_core_1.TransactionType.StakingUnlock) {
218
+ const argName = 0;
219
+ const argValue = 1;
220
+ const delegateValues = new Map();
221
+ delegateValues.set(constants_1.TRANSACTION_TYPE, this.casperTx.session.getArgByName(constants_1.TRANSACTION_TYPE).value());
222
+ delegateValues.set('amount', (0, utils_1.getDelegateAmount)(this.casperTx.session));
223
+ delegateValues.set(constants_1.DELEGATE_FROM_ADDRESS, (0, utils_1.getDelegatorAddress)(this.casperTx.session));
224
+ delegateValues.set(constants_1.DELEGATE_VALIDATOR, (0, utils_1.getValidatorAddress)(this.casperTx.session));
225
+ txJson.deploy.session.ModuleBytes.args.forEach((arg) => {
226
+ if (delegateValues.has(arg[argName])) {
227
+ arg[argValue]['parsed'] = delegateValues.get(arg[argName]);
228
+ }
229
+ });
230
+ }
231
+ }
232
+ get casperTx() {
233
+ return this._deploy;
234
+ }
235
+ set casperTx(deploy) {
236
+ this._deploy = deploy;
237
+ }
238
+ }
239
+ exports.Transaction = Transaction;
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUE0QjtBQUU1QixpREFBNkY7QUFDN0YsbURBQXdIO0FBQ3hILHVDQUFvQztBQUVwQywyQ0FNcUI7QUFDckIsbUNBVWlCO0FBRWpCLE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBSTlDLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWdCO1FBQ25CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLHVCQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFDRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3pCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLDRCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFBLHdCQUFnQixFQUFDLElBQUEsb0NBQTRCLEVBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQzlHLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSx1QkFBWSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksb0JBQUksQ0FBQyxTQUFTLENBQ2pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJ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LENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNyRCxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzdELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUF5QjtRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0NBR0Y7QUFoUEQsa0NBZ1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQ0xQdWJsaWNLZXkgYXMgUHVibGljS2V5LCBEZXBsb3lVdGlsLCBLZXlzLCBDTFN0cmluZywgQ0xVNTEyIH0gZnJvbSAnY2FzcGVyLWpzLXNkayc7XG5pbXBvcnQgeyBCYXNlS2V5LCBCYXNlVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSwgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIFNpZ25pbmdFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgQ2FzcGVyVHJhbnNhY3Rpb24gfSBmcm9tICcuL2lmYWNlcyc7XG5pbXBvcnQge1xuICBERUxFR0FURV9GUk9NX0FERFJFU1MsXG4gIERFTEVHQVRFX1ZBTElEQVRPUixcbiAgT1dORVJfUFJFRklYLFxuICBTRUNQMjU2SzFfUFJFRklYLFxuICBUUkFOU0FDVElPTl9UWVBFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBnZXRUcmFuc2ZlckFtb3VudCxcbiAgZ2V0VHJhbnNmZXJEZXN0aW5hdGlvbkFkZHJlc3MsXG4gIGdldFRyYW5zZmVySWQsXG4gIGlzVmFsaWRQdWJsaWNLZXksXG4gIHJlbW92ZUFsZ29QcmVmaXhGcm9tSGV4VmFsdWUsXG4gIGdldERlcGxveVR5cGUsXG4gIGdldERlbGVnYXRvckFkZHJlc3MsXG4gIGdldFZhbGlkYXRvckFkZHJlc3MsXG4gIGdldERlbGVnYXRlQW1vdW50LFxufSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIHByb3RlY3RlZCBfZGVwbG95OiBEZXBsb3lVdGlsLkRlcGxveTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IHZvaWQge1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuX2RlcGxveS5hcHByb3ZhbHMuc29tZShcbiAgICAgICAgKGFwKSA9PiAhYXAuc2lnbmVyLnN0YXJ0c1dpdGgoU0VDUDI1NksxX1BSRUZJWCkgfHwgIWlzVmFsaWRQdWJsaWNLZXkocmVtb3ZlQWxnb1ByZWZpeEZyb21IZXhWYWx1ZShhcC5zaWduZXIpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignSW52YWxpZCBkZXBsb3kuIEFscmVhZHkgc2lnbmVkIHdpdGggYW4gaW52YWxpZCBrZXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcEtleXMgPSBuZXcgS2V5cy5TZWNwMjU2SzEoXG4gICAgICBVaW50OEFycmF5LmZyb20oQnVmZmVyLmZyb20oa2V5cy5wdWIsICdoZXgnKSksXG4gICAgICBVaW50OEFycmF5LmZyb20oQnVmZmVyLmZyb20oa2V5cy5wcnYsICdoZXgnKSlcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZERlcGxveSA9IERlcGxveVV0aWwuc2lnbkRlcGxveSh0aGlzLl9kZXBsb3ksIHNlY3BLZXlzKTtcbiAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmVkRGVwbG95LmFwcHJvdmFsc1tzaWduZWREZXBsb3kuYXBwcm92YWxzLmxlbmd0aCAtIDFdLnNpZ25hdHVyZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc2lnbmF0dXJlIHRvIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHRvIGFuZCBpdHMgZGVwbG95XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgVGhlIHNpZ25hdHVyZSB0byBhZGQsIGluIHN0cmluZyBoZXggZm9ybWF0XG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciBUaGUga2V5IHBhaXIgdGhhdCBjcmVhdGVkIHRoZSBzaWduYXR1cmVcbiAgICovXG4gIGFkZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZywga2V5UGFpcjogS2V5UGFpcik6IHZvaWQge1xuICAgIGNvbnN0IHB1YiA9IGtleVBhaXIuZ2V0S2V5cygpLnB1YjtcbiAgICBjb25zdCBzaWduYXR1cmVCdWZmZXIgPSBVaW50OEFycmF5LmZyb20oQnVmZmVyLmZyb20oc2lnbmF0dXJlLCAnaGV4JykpO1xuICAgIGNvbnN0IHB1YktleUJ1ZmZlciA9IFVpbnQ4QXJyYXkuZnJvbShCdWZmZXIuZnJvbShwdWIsICdoZXgnKSk7XG4gICAgY29uc3QgcGFyc2VkUHVibGljS2V5ID0gS2V5cy5TZWNwMjU2SzEucGFyc2VQdWJsaWNLZXkocHViS2V5QnVmZmVyLCAncmF3Jyk7XG4gICAgY29uc3QgcHViS2V5SGV4ID0gS2V5cy5TZWNwMjU2SzEuYWNjb3VudEhleChwYXJzZWRQdWJsaWNLZXkpO1xuICAgIGlmIChyZW1vdmVBbGdvUHJlZml4RnJvbUhleFZhbHVlKHB1YktleUhleCkgIT09IHB1Yikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignU2lnbmVyIGRvZXMgbm90IG1hdGNoIHNpZ25hdHVyZScpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZWREZXBsb3kgPSBEZXBsb3lVdGlsLnNldFNpZ25hdHVyZShcbiAgICAgIHRoaXMuX2RlcGxveSxcbiAgICAgIHNpZ25hdHVyZUJ1ZmZlcixcbiAgICAgIFB1YmxpY0tleS5mcm9tU2VjcDI1NksxKHBhcnNlZFB1YmxpY0tleSlcbiAgICApO1xuICAgIGNvbnN0IGFwcHJvdmFsID0gXy5sYXN0KHNpZ25lZERlcGxveS5hcHByb3ZhbHMpIGFzIERlcGxveVV0aWwuQXBwcm92YWw7XG4gICAgaWYgKHJlbW92ZUFsZ29QcmVmaXhGcm9tSGV4VmFsdWUoYXBwcm92YWwuc2lnbmF0dXJlKSAhPT0gc2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgIH1cbiAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jYXNwZXJUeCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHR4SnNvbjogYW55ID0gRGVwbG95VXRpbC5kZXBsb3lUb0pzb24odGhpcy5jYXNwZXJUeCk7XG4gICAgLy8gVGhlIG5ldyBjYXNwZXIgbGliIGlzIGNvbnZlcnRpbmcgdGhlIFRUTCBmcm9tIG1pbGlzZWNvbmRzIHRvIGFub3RoZXIgZGF0ZSBmb3JtYXQsIGluIHRoaXMgY2FzZSAxIGRheVxuICAgIC8vIHdlIG5lZWQgdG8gbGVhdmUgaXQgYXMgbXMgZm9yIHRoZSBIU00gdG8gYmUgYWJsZSB0byBwYXJzZSBpdFxuICAgIHR4SnNvbi5kZXBsb3kuaGVhZGVyLnR0bCA9IGAke3RoaXMuY2FzcGVyVHguaGVhZGVyLnR0bH1tc2A7XG4gICAgdGhpcy5zZXRPd25lcnNJbkpzb24odHhKc29uKTtcbiAgICB0aGlzLnNldFRyYW5zZmVyc0ZpZWxkc0luSnNvbih0eEpzb24pO1xuICAgIHRoaXMuc2V0RGVsZWdhdGVGaWVsZHNJbkpzb24odHhKc29uKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodHhKc29uKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKTogQ2FzcGVyVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGRlcGxveVBheW1lbnQgPSB0aGlzLl9kZXBsb3kucGF5bWVudC5hc01vZHVsZUJ5dGVzKCk/LmdldEFyZ0J5TmFtZSgnYW1vdW50JykgYXMgQ0xVNTEyO1xuICAgIGlmICghZGVwbG95UGF5bWVudCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdVbmRlZmluZWQgZmVlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZXIxSW5kZXggPSAwO1xuICAgIGNvbnN0IG93bmVyMkluZGV4ID0gMTtcbiAgICBjb25zdCBvd25lcjNJbmRleCA9IDI7XG4gICAgY29uc3Qgc291cmNlUHVibGljS2V5ID0gQnVmZmVyLmZyb20odGhpcy5fZGVwbG95LmhlYWRlci5hY2NvdW50LnZhbHVlKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzb3VyY2VBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHNvdXJjZVB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IENhc3BlclRyYW5zYWN0aW9uID0ge1xuICAgICAgaGFzaDogQnVmZmVyLmZyb20odGhpcy5fZGVwbG95Lmhhc2gpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGZlZTogeyBnYXNMaW1pdDogZGVwbG95UGF5bWVudC52YWx1ZSgpLnRvU3RyaW5nKCksIGdhc1ByaWNlOiB0aGlzLl9kZXBsb3kuaGVhZGVyLmdhc1ByaWNlLnRvU3RyaW5nKCkgfSxcbiAgICAgIGZyb206IHNvdXJjZUFkZHJlc3MsXG4gICAgICBzdGFydFRpbWU6IG5ldyBEYXRlKHRoaXMuX2RlcGxveS5oZWFkZXIudGltZXN0YW1wKS50b0lTT1N0cmluZygpLFxuICAgICAgZXhwaXJhdGlvbjogdGhpcy5fZGVwbG95LmhlYWRlci50dGwsXG4gICAgICBkZXBsb3lUeXBlOiAodGhpcy5fZGVwbG95LnNlc3Npb24uZ2V0QXJnQnlOYW1lKFRSQU5TQUNUSU9OX1RZUEUpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgIH07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSBnZXREZXBsb3lUeXBlKHRoaXMuX2RlcGxveS5zZXNzaW9uKTtcblxuICAgIHN3aXRjaCAodHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICByZXN1bHQudG8gPSBnZXRUcmFuc2ZlckRlc3RpbmF0aW9uQWRkcmVzcyh0aGlzLl9kZXBsb3kuc2Vzc2lvbik7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSBnZXRUcmFuc2ZlckFtb3VudCh0aGlzLl9kZXBsb3kuc2Vzc2lvbik7XG4gICAgICAgIHJlc3VsdC50cmFuc2ZlcklkID0gZ2V0VHJhbnNmZXJJZCh0aGlzLl9kZXBsb3kuc2Vzc2lvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICAgIHJlc3VsdC5vd25lcjEgPSAodGhpcy5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZShPV05FUl9QUkVGSVggKyBvd25lcjFJbmRleCkgYXMgQ0xTdHJpbmcpLnZhbHVlKCk7XG4gICAgICAgIHJlc3VsdC5vd25lcjIgPSAodGhpcy5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZShPV05FUl9QUkVGSVggKyBvd25lcjJJbmRleCkgYXMgQ0xTdHJpbmcpLnZhbHVlKCk7XG4gICAgICAgIHJlc3VsdC5vd25lcjMgPSAodGhpcy5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZShPV05FUl9QUkVGSVggKyBvd25lcjNJbmRleCkgYXMgQ0xTdHJpbmcpLnZhbHVlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2s6XG4gICAgICAgIHJlc3VsdC5mcm9tRGVsZWdhdGUgPSBnZXREZWxlZ2F0b3JBZGRyZXNzKHRoaXMuY2FzcGVyVHguc2Vzc2lvbik7XG4gICAgICAgIHJlc3VsdC52YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3JBZGRyZXNzKHRoaXMuY2FzcGVyVHguc2Vzc2lvbik7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSBnZXREZWxlZ2F0ZUFtb3VudCh0aGlzLmNhc3BlclR4LnNlc3Npb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2s6XG4gICAgICAgIHJlc3VsdC5mcm9tRGVsZWdhdGUgPSBnZXREZWxlZ2F0b3JBZGRyZXNzKHRoaXMuY2FzcGVyVHguc2Vzc2lvbik7XG4gICAgICAgIHJlc3VsdC52YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3JBZGRyZXNzKHRoaXMuY2FzcGVyVHguc2Vzc2lvbik7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSBnZXREZWxlZ2F0ZUFtb3VudCh0aGlzLmNhc3BlclR4LnNlc3Npb24pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgc2lnbmF0dXJlcyBmcm9tIHRoZSBkZXBsb3kgaW5zdGFuY2UgYW5kIGxvYWQgdGhlbSBpbnRvIHRoZSBzaWduYXR1cmVzIGxpc3RcbiAgICovXG4gIGxvYWRQcmV2aW91c1NpZ25hdHVyZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlcGxveS5hcHByb3ZhbHMgJiYgdGhpcy5fZGVwbG95LmFwcHJvdmFscy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9kZXBsb3kuYXBwcm92YWxzLmZvckVhY2goKGFwcHJvdmFsKSA9PiB7XG4gICAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChhcHByb3ZhbC5zaWduYXR1cmUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBvd25lcnMgaW5zaWRlIGEganNvbiByZXByZXNlbnRpbmcgYSB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHguXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHhKc29uIGpzb24gdG8gbW9kaWZ5XG4gICAqL1xuICBzZXRPd25lcnNJbkpzb24odHhKc29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgaWYgKGdldERlcGxveVR5cGUodGhpcy5jYXNwZXJUeC5zZXNzaW9uKSA9PT0gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICBjb25zdCBhcmdOYW1lID0gMDtcbiAgICAgIGNvbnN0IGFyZ1ZhbHVlID0gMTtcbiAgICAgIGNvbnN0IG93bmVyMCA9IDA7XG4gICAgICBjb25zdCBvd25lcjEgPSAxO1xuICAgICAgY29uc3Qgb3duZXIyID0gMjtcblxuICAgICAgY29uc3Qgb3duZXJzVmFsdWVzID0gbmV3IE1hcCgpO1xuXG4gICAgICBvd25lcnNWYWx1ZXMuc2V0KFRSQU5TQUNUSU9OX1RZUEUsICh0aGlzLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKFRSQU5TQUNUSU9OX1RZUEUpIGFzIENMU3RyaW5nKS52YWx1ZSgpKTtcblxuICAgICAgW293bmVyMCwgb3duZXIxLCBvd25lcjJdLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgIG93bmVyc1ZhbHVlcy5zZXQoXG4gICAgICAgICAgT1dORVJfUFJFRklYICsgaW5kZXgsXG4gICAgICAgICAgKHRoaXMuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoT1dORVJfUFJFRklYICsgaW5kZXgpIGFzIENMU3RyaW5nKS52YWx1ZSgpXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgdHhKc29uWydkZXBsb3knXVsnc2Vzc2lvbiddWydNb2R1bGVCeXRlcyddWydhcmdzJ10uZm9yRWFjaCgoYXJnKSA9PiB7XG4gICAgICAgIGlmIChvd25lcnNWYWx1ZXMuaGFzKGFyZ1thcmdOYW1lXSkpIHtcbiAgICAgICAgICBhcmdbYXJnVmFsdWVdWydwYXJzZWQnXSA9IG93bmVyc1ZhbHVlcy5nZXQoYXJnW2FyZ05hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2ZlciBmaWVsZHMgaW5zaWRlIGEganNvbiByZXByZXNlbnRpbmcgYSB0cmFuc2ZlciB0eC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0eEpzb24ganNvbiB0byBtb2RpZnlcbiAgICovXG4gIHNldFRyYW5zZmVyc0ZpZWxkc0luSnNvbih0eEpzb246IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBpZiAoZ2V0RGVwbG95VHlwZSh0aGlzLmNhc3BlclR4LnNlc3Npb24pID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgY29uc3QgYXJnTmFtZSA9IDA7XG4gICAgICBjb25zdCBhcmdWYWx1ZSA9IDE7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyVmFsdWVzID0gbmV3IE1hcCgpO1xuICAgICAgdHJhbnNmZXJWYWx1ZXMuc2V0KFRSQU5TQUNUSU9OX1RZUEUsICh0aGlzLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKFRSQU5TQUNUSU9OX1RZUEUpIGFzIENMU3RyaW5nKS52YWx1ZSgpKTtcbiAgICAgIHRyYW5zZmVyVmFsdWVzLnNldCgnYW1vdW50JywgZ2V0VHJhbnNmZXJBbW91bnQodGhpcy5jYXNwZXJUeC5zZXNzaW9uKSk7XG4gICAgICB0cmFuc2ZlclZhbHVlcy5zZXQoJ3RvX2FkZHJlc3MnLCBnZXRUcmFuc2ZlckRlc3RpbmF0aW9uQWRkcmVzcyh0aGlzLmNhc3BlclR4LnNlc3Npb24pKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVySWQgPSBnZXRUcmFuc2ZlcklkKHRoaXMuY2FzcGVyVHguc2Vzc2lvbik7XG4gICAgICBpZiAodHJhbnNmZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyYW5zZmVyVmFsdWVzLnNldCgnaWQnLCB0cmFuc2ZlcklkLnRvU3RyaW5nKCkpO1xuICAgICAgfVxuXG4gICAgICB0eEpzb25bJ2RlcGxveSddWydzZXNzaW9uJ11bJ1RyYW5zZmVyJ11bJ2FyZ3MnXS5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgaWYgKHRyYW5zZmVyVmFsdWVzLmhhcyhhcmdbYXJnTmFtZV0pKSB7XG4gICAgICAgICAgYXJnW2FyZ1ZhbHVlXVsncGFyc2VkJ10gPSB0cmFuc2ZlclZhbHVlcy5nZXQoYXJnW2FyZ05hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWxlZ2F0ZSAvIHVuZGVsZWdhdGUgZmllbGRzIGluc2lkZSBhIGpzb24gcmVwcmVzZW50aW5nIHRoZSB0eC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0eEpzb24ganNvbiB0byBtb2RpZnlcbiAgICovXG4gIHNldERlbGVnYXRlRmllbGRzSW5Kc29uKHR4SnNvbjogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIGdldERlcGxveVR5cGUodGhpcy5jYXNwZXJUeC5zZXNzaW9uKSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdMb2NrIHx8XG4gICAgICBnZXREZXBsb3lUeXBlKHRoaXMuY2FzcGVyVHguc2Vzc2lvbikgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrXG4gICAgKSB7XG4gICAgICBjb25zdCBhcmdOYW1lID0gMDtcbiAgICAgIGNvbnN0IGFyZ1ZhbHVlID0gMTtcblxuICAgICAgY29uc3QgZGVsZWdhdGVWYWx1ZXMgPSBuZXcgTWFwKCk7XG4gICAgICBkZWxlZ2F0ZVZhbHVlcy5zZXQoVFJBTlNBQ1RJT05fVFlQRSwgKHRoaXMuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoVFJBTlNBQ1RJT05fVFlQRSkgYXMgQ0xTdHJpbmcpLnZhbHVlKCkpO1xuICAgICAgZGVsZWdhdGVWYWx1ZXMuc2V0KCdhbW91bnQnLCBnZXREZWxlZ2F0ZUFtb3VudCh0aGlzLmNhc3BlclR4LnNlc3Npb24pKTtcbiAgICAgIGRlbGVnYXRlVmFsdWVzLnNldChERUxFR0FURV9GUk9NX0FERFJFU1MsIGdldERlbGVnYXRvckFkZHJlc3ModGhpcy5jYXNwZXJUeC5zZXNzaW9uKSk7XG4gICAgICBkZWxlZ2F0ZVZhbHVlcy5zZXQoREVMRUdBVEVfVkFMSURBVE9SLCBnZXRWYWxpZGF0b3JBZGRyZXNzKHRoaXMuY2FzcGVyVHguc2Vzc2lvbikpO1xuXG4gICAgICB0eEpzb24uZGVwbG95LnNlc3Npb24uTW9kdWxlQnl0ZXMuYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgaWYgKGRlbGVnYXRlVmFsdWVzLmhhcyhhcmdbYXJnTmFtZV0pKSB7XG4gICAgICAgICAgYXJnW2FyZ1ZhbHVlXVsncGFyc2VkJ10gPSBkZWxlZ2F0ZVZhbHVlcy5nZXQoYXJnW2FyZ05hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNhc3BlclR4KCk6IERlcGxveVV0aWwuRGVwbG95IHtcbiAgICByZXR1cm4gdGhpcy5fZGVwbG95O1xuICB9XG5cbiAgc2V0IGNhc3BlclR4KGRlcGxveTogRGVwbG95VXRpbC5EZXBsb3kpIHtcbiAgICB0aGlzLl9kZXBsb3kgPSBkZXBsb3k7XG4gIH1cblxuICAvLyBlbmRyZWdpb25cbn1cbiJdfQ==
@@ -0,0 +1,124 @@
1
+ import BigNumber from 'bignumber.js';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { BaseAddress, BaseKey, BaseTransactionBuilder } from '@bitgo-beta/sdk-core';
4
+ import { Transaction } from './transaction';
5
+ import { KeyPair } from './keyPair';
6
+ import { Fee, CasperModuleBytesTransaction, CasperTransferTransaction, CasperDelegateTransaction, SignatureData } from './ifaces';
7
+ export declare const DEFAULT_M = 3;
8
+ export declare const DEFAULT_N = 2;
9
+ export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
10
+ protected _source: BaseAddress;
11
+ protected _fee: Fee;
12
+ private _transaction;
13
+ protected _session: CasperTransferTransaction | CasperModuleBytesTransaction | CasperDelegateTransaction;
14
+ protected _expiration: number;
15
+ protected _multiSignerKeyPairs: KeyPair[];
16
+ protected _signatures: SignatureData[];
17
+ protected _chainName: string;
18
+ constructor(_coinConfig: Readonly<CoinConfig>);
19
+ /** @inheritdoc */
20
+ protected buildImplementation(): Promise<Transaction>;
21
+ /** @inheritdoc */
22
+ protected fromImplementation(rawTransaction: string): Transaction;
23
+ /** @inheritdoc */
24
+ protected signImplementation(key: BaseKey): Transaction;
25
+ /**
26
+ * Initialize the transaction builder fields using the decoded transaction data
27
+ *
28
+ * @param {Transaction} tx the transaction data
29
+ */
30
+ initBuilder(tx: Transaction): void;
31
+ /**
32
+ * Set the transaction fees
33
+ *
34
+ * @param {BaseFee} fee The maximum gas to pay
35
+ * @returns {TransactionBuilder} This transaction builder
36
+ */
37
+ fee(fee: Fee): this;
38
+ /**
39
+ * Set the transaction source
40
+ *
41
+ * @param {BaseAddress} address The source account
42
+ * @returns {TransactionBuilder} This transaction builder
43
+ */
44
+ source(address: BaseAddress): this;
45
+ /**
46
+ * Set the transaction expirationTime
47
+ *
48
+ * @param {string} expirationTime The transaction expirationTime
49
+ * @returns {TransactionBuilder} This transaction builder
50
+ */
51
+ expiration(expirationTime: number): this;
52
+ /**
53
+ * Set an external transaction signature
54
+ *
55
+ * @param {string} signature Hex encoded signature string
56
+ * @param {KeyPair} keyPair The public key keypair that was used to create the signature
57
+ * @returns {TransactionBuilder} This transaction builder
58
+ */
59
+ signature(signature: string, keyPair: KeyPair): this;
60
+ nodeChainName(chainName: string): this;
61
+ /** @inheritdoc */
62
+ validateAddress(address: BaseAddress): void;
63
+ /** @inheritdoc */
64
+ validateKey(key: BaseKey): void;
65
+ /** @inheritdoc */
66
+ validateRawTransaction(rawTransaction: string): void;
67
+ /** @inheritdoc */
68
+ validateTransaction(transaction?: Transaction): void;
69
+ /** @inheritdoc */
70
+ validateValue(value: BigNumber): void;
71
+ /**
72
+ * Validates that the mandatory fields are defined
73
+ */
74
+ validateMandatoryFields(): void;
75
+ /**
76
+ * Validates that the fee field is defined
77
+ */
78
+ private validateFee;
79
+ /**
80
+ * Validates that the source field is defined
81
+ */
82
+ private validateSource;
83
+ /**
84
+ * Validates that the given key is not already in this._multiSignerKeyPairs
85
+ *
86
+ * @param {BaseKey} key - The key to check
87
+ */
88
+ private checkDuplicatedKeys;
89
+ /** @inheritdoc */
90
+ protected get transaction(): Transaction;
91
+ /** @inheritdoc */
92
+ protected set transaction(transaction: Transaction);
93
+ /**
94
+ * Get the chain name for the coin environment
95
+ */
96
+ get chainName(): string;
97
+ /**
98
+ * Generate a DeployParams instance with the transaction data
99
+ *
100
+ * @returns {DeployUtil.DeployParams}
101
+ */
102
+ private getDeployParams;
103
+ /**
104
+ * Generate the session for the Deploy according to the transactionType.
105
+ *
106
+ * @returns {DeployUtil.ExecutableDeployItem}
107
+ */
108
+ private getSession;
109
+ /**
110
+ * Checks whether the transaction has the owner signature
111
+ *
112
+ * @param {string} pub - public key of the signer
113
+ * @returns {boolean} true if the pub key already signed th transaction
114
+ * @private
115
+ */
116
+ private isTransactionSignedByPub;
117
+ /**
118
+ * Add signatures to the transaction
119
+ *
120
+ * @private
121
+ */
122
+ private processSigning;
123
+ }
124
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAMvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,GAAG,EACH,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,EACd,MAAM,UAAU,CAAC;AAIlB,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC;IACpB,OAAO,CAAC,YAAY,CAAc;IAClC,SAAS,CAAC,QAAQ,EAAE,yBAAyB,GAAG,4BAA4B,GAAG,yBAAyB,CAAC;IACzG,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;IAC1C,SAAS,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;IACvC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAS7C,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAwB3D,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAQjE,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAUvD;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAalC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAMnB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAMlC;;;;;OAKG;IACH,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAUxC;;;;;;OAMG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAcpD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQtC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAM3C,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAM/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAWpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC;;OAEG;IACH,uBAAuB,IAAI,IAAI;IAK/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAqB3B,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED;;OAEG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAID;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA2BlB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;;OAIG;IACH,OAAO,CAAC,cAAc;CAevB"}