@bitgo-beta/sdk-coin-ton 1.0.1-beta.162 → 1.0.1-beta.1621

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 (108) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/jettonToken.d.ts +19 -0
  5. package/dist/src/jettonToken.d.ts.map +1 -0
  6. package/dist/src/jettonToken.js +52 -0
  7. package/dist/src/lib/constants.d.ts +9 -0
  8. package/dist/src/lib/constants.d.ts.map +1 -0
  9. package/dist/src/lib/constants.js +12 -0
  10. package/dist/src/lib/explainTransactionWasm.d.ts +22 -0
  11. package/dist/src/lib/explainTransactionWasm.d.ts.map +1 -0
  12. package/dist/src/lib/explainTransactionWasm.js +61 -0
  13. package/dist/src/lib/iface.d.ts +17 -0
  14. package/dist/src/lib/iface.d.ts.map +1 -1
  15. package/dist/src/lib/iface.js +1 -1
  16. package/dist/src/lib/index.d.ts +5 -0
  17. package/dist/src/lib/index.d.ts.map +1 -1
  18. package/dist/src/lib/index.js +29 -9
  19. package/dist/src/lib/keyPair.js +18 -8
  20. package/dist/src/lib/singleNominatorWithdrawBuilder.d.ts +17 -0
  21. package/dist/src/lib/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  22. package/dist/src/lib/singleNominatorWithdrawBuilder.js +38 -0
  23. package/dist/src/lib/tokenTransaction.d.ts +16 -0
  24. package/dist/src/lib/tokenTransaction.d.ts.map +1 -0
  25. package/dist/src/lib/tokenTransaction.js +97 -0
  26. package/dist/src/lib/tokenTransferBuilder.d.ts +20 -0
  27. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  28. package/dist/src/lib/tokenTransferBuilder.js +57 -0
  29. package/dist/src/lib/tonWhalesDepositBuilder.d.ts +12 -0
  30. package/dist/src/lib/tonWhalesDepositBuilder.d.ts.map +1 -0
  31. package/dist/src/lib/tonWhalesDepositBuilder.js +42 -0
  32. package/dist/src/lib/tonWhalesVestingDepositBuilder.d.ts +12 -0
  33. package/dist/src/lib/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  34. package/dist/src/lib/tonWhalesVestingDepositBuilder.js +37 -0
  35. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.d.ts +12 -0
  36. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  37. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.js +37 -0
  38. package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts +30 -0
  39. package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  40. package/dist/src/lib/tonWhalesWithdrawalBuilder.js +60 -0
  41. package/dist/src/lib/transaction.d.ts +20 -10
  42. package/dist/src/lib/transaction.d.ts.map +1 -1
  43. package/dist/src/lib/transaction.js +176 -45
  44. package/dist/src/lib/transactionBuilder.d.ts +27 -3
  45. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  46. package/dist/src/lib/transactionBuilder.js +52 -5
  47. package/dist/src/lib/transactionBuilderFactory.d.ts +19 -1
  48. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  49. package/dist/src/lib/transactionBuilderFactory.js +78 -4
  50. package/dist/src/lib/transactionExplanation.d.ts +14 -0
  51. package/dist/src/lib/transactionExplanation.d.ts.map +1 -0
  52. package/dist/src/lib/transactionExplanation.js +3 -0
  53. package/dist/src/lib/transferBuilder.d.ts +1 -1
  54. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  55. package/dist/src/lib/transferBuilder.js +4 -2
  56. package/dist/src/lib/utils.d.ts +22 -1
  57. package/dist/src/lib/utils.d.ts.map +1 -1
  58. package/dist/src/lib/utils.js +89 -4
  59. package/dist/src/register.d.ts.map +1 -1
  60. package/dist/src/register.js +5 -1
  61. package/dist/src/ton.d.ts +27 -2
  62. package/dist/src/ton.d.ts.map +1 -1
  63. package/dist/src/ton.js +360 -32
  64. package/dist/src/tton.js +1 -1
  65. package/dist/test/resources/ton.d.ts +184 -0
  66. package/dist/test/resources/ton.d.ts.map +1 -0
  67. package/dist/test/resources/ton.js +208 -0
  68. package/dist/test/unit/explainTransactionWasm.d.ts +2 -0
  69. package/dist/test/unit/explainTransactionWasm.d.ts.map +1 -0
  70. package/dist/test/unit/explainTransactionWasm.js +147 -0
  71. package/dist/test/unit/jettonToken.d.ts +2 -0
  72. package/dist/test/unit/jettonToken.d.ts.map +1 -0
  73. package/dist/test/unit/jettonToken.js +341 -0
  74. package/dist/test/unit/keyPair.d.ts +2 -0
  75. package/dist/test/unit/keyPair.d.ts.map +1 -0
  76. package/dist/test/unit/keyPair.js +55 -0
  77. package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts +2 -0
  78. package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  79. package/dist/test/unit/singleNominatorWithdrawBuilder.js +314 -0
  80. package/dist/test/unit/tokenTransferBuilder.d.ts +2 -0
  81. package/dist/test/unit/tokenTransferBuilder.d.ts.map +1 -0
  82. package/dist/test/unit/tokenTransferBuilder.js +262 -0
  83. package/dist/test/unit/ton.d.ts +2 -0
  84. package/dist/test/unit/ton.d.ts.map +1 -0
  85. package/dist/test/unit/ton.js +752 -0
  86. package/dist/test/unit/tonWhalesDepositBuilder.d.ts +2 -0
  87. package/dist/test/unit/tonWhalesDepositBuilder.d.ts.map +1 -0
  88. package/dist/test/unit/tonWhalesDepositBuilder.js +114 -0
  89. package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts +2 -0
  90. package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  91. package/dist/test/unit/tonWhalesVestingDepositBuilder.js +136 -0
  92. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts +2 -0
  93. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  94. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.js +136 -0
  95. package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts +2 -0
  96. package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  97. package/dist/test/unit/tonWhalesWithdrawalBuilder.js +130 -0
  98. package/dist/test/unit/transferBuilder.d.ts +2 -0
  99. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  100. package/dist/test/unit/transferBuilder.js +281 -0
  101. package/dist/test/unit/wasmCrossCompatibility.d.ts +2 -0
  102. package/dist/test/unit/wasmCrossCompatibility.d.ts.map +1 -0
  103. package/dist/test/unit/wasmCrossCompatibility.js +176 -0
  104. package/dist/tsconfig.tsbuildinfo +1 -0
  105. package/package.json +14 -10
  106. package/.eslintignore +0 -5
  107. package/.mocharc.yml +0 -8
  108. package/CHANGELOG.md +0 -399
@@ -4,13 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Transaction = void 0;
7
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
7
  const tonweb_1 = __importDefault(require("tonweb"));
9
8
  const bn_js_1 = require("bn.js");
10
- const WALLET_ID = 698983191;
9
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
+ const constants_1 = require("./constants");
11
11
  class Transaction extends sdk_core_1.BaseTransaction {
12
12
  constructor(coinConfig) {
13
13
  super(coinConfig);
14
+ this.bounceable = false;
15
+ this.fromAddressBounceable = true;
16
+ this.toAddressBounceable = true;
17
+ this.isV3ContractMessage = false;
14
18
  }
15
19
  canSign(key) {
16
20
  return false;
@@ -19,26 +23,43 @@ class Transaction extends sdk_core_1.BaseTransaction {
19
23
  return this.finalMessage;
20
24
  }
21
25
  toJson() {
22
- const non_bouncable = new tonweb_1.default.Address(this.recipient.address).toString(true, true, false);
26
+ const otherFormat = new tonweb_1.default.Address(this.recipient.address).toString(true, true, !new tonweb_1.default.Address(this.recipient.address).isBounceable);
23
27
  return {
24
28
  id: this._id,
25
29
  sender: this.sender,
26
30
  destination: this.recipient.address,
27
- destinationAlias: non_bouncable,
31
+ destinationAlias: otherFormat,
28
32
  amount: this.recipient.amount,
33
+ withdrawAmount: this.withdrawAmount,
29
34
  seqno: this.seqno,
35
+ sub_wallet_id: this.sub_wallet_id,
30
36
  expirationTime: this.expireTime,
31
37
  publicKey: this.publicKey,
32
38
  signature: this._signatures[0],
39
+ bounceable: this.bounceable,
33
40
  };
34
41
  }
35
42
  get signablePayload() {
36
43
  return Buffer.from(this.unsignedMessage, 'hex');
37
44
  }
45
+ /**
46
+ * Set the transaction type.
47
+ * @param {TransactionType} transactionType The transaction type to be set.
48
+ */
49
+ set transactionType(transactionType) {
50
+ this._type = transactionType;
51
+ }
38
52
  async build() {
39
- this._type = sdk_core_1.TransactionType.Send;
40
- const signingMessage = this.createSigningMessage(WALLET_ID, this.seqno, this.expireTime);
41
- const sendMode = 3;
53
+ if (!this.sub_wallet_id) {
54
+ if (this.isV3ContractMessage) {
55
+ this.sub_wallet_id = constants_1.VESTING_CONTRACT_WALLET_ID;
56
+ }
57
+ else {
58
+ this.sub_wallet_id = constants_1.WALLET_ID;
59
+ }
60
+ }
61
+ const signingMessage = this.createSigningMessage(this.sub_wallet_id, this.seqno, this.expireTime);
62
+ const sendMode = 3; // default sendMode
42
63
  signingMessage.bits.writeUint8(sendMode);
43
64
  const outMsg = this.createOutMsg(this.recipient.address, this.recipient.amount, this.message);
44
65
  signingMessage.refs.push(outMsg);
@@ -52,16 +73,12 @@ class Transaction extends sdk_core_1.BaseTransaction {
52
73
  createSigningMessage(walletId, seqno, expireAt) {
53
74
  const message = new tonweb_1.default.boc.Cell();
54
75
  message.bits.writeUint(walletId, 32);
55
- if (seqno === 0) {
56
- for (let i = 0; i < 32; i++) {
57
- message.bits.writeBit(1);
58
- }
59
- }
60
- else {
61
- message.bits.writeUint(expireAt, 32);
62
- }
76
+ // expireAt should be set as per the provided arg value, regardless of the seqno
77
+ message.bits.writeUint(expireAt, 32);
63
78
  message.bits.writeUint(seqno, 32);
64
- message.bits.writeUint(0, 8); // op
79
+ if (!this.isV3ContractMessage) {
80
+ message.bits.writeUint(0, 8); // op
81
+ }
65
82
  return message;
66
83
  }
67
84
  createOutMsg(address, amount, payload) {
@@ -73,15 +90,47 @@ class Transaction extends sdk_core_1.BaseTransaction {
73
90
  }
74
91
  else if (typeof payload === 'string') {
75
92
  if (payload.length > 0) {
76
- payloadCell.bits.writeUint(0, 32);
77
- payloadCell.bits.writeString(payload);
93
+ if (payload.length > 24 && payload.substring(0, 8) === constants_1.WITHDRAW_OPCODE) {
94
+ // payload is a withdraw txn message
95
+ const queryId = payload.substring(8, 24);
96
+ const withdrawAmount = payload.substring(24);
97
+ /* eslint-disable-next-line no-console */
98
+ console.log(`payload: ${payload}, queryId: ${queryId}, withdrawAmount: ${withdrawAmount}`);
99
+ payloadCell.bits.writeUint(parseInt(constants_1.WITHDRAW_OPCODE, 16), 32);
100
+ payloadCell.bits.writeUint(parseInt(queryId, 16), 64);
101
+ payloadCell.bits.writeCoins(new bn_js_1.BN(withdrawAmount));
102
+ }
103
+ else if (payload.length >= 26 && payload.substring(0, 10) === constants_1.TON_WHALES_DEPOSIT_OPCODE) {
104
+ const queryId = payload.substring(10, 26);
105
+ payloadCell.bits.writeUint(parseInt(constants_1.TON_WHALES_DEPOSIT_OPCODE, 10), 32);
106
+ payloadCell.bits.writeUint(parseInt(queryId, 16), 64);
107
+ // The Ton Whales protocol requires a specific 'gas limit' field in the payload
108
+ // structure (OpCode -> QueryId -> GasLimit -> Amount).
109
+ payloadCell.bits.writeCoins(tonweb_1.default.utils.toNano('1'));
110
+ }
111
+ else if (payload.length >= 26 && payload.substring(0, 10) === constants_1.TON_WHALES_WITHDRAW_OPCODE) {
112
+ const queryId = payload.substring(10, 26);
113
+ const amountStr = payload.substring(26);
114
+ payloadCell.bits.writeUint(parseInt(constants_1.TON_WHALES_WITHDRAW_OPCODE, 10), 32);
115
+ payloadCell.bits.writeUint(new bn_js_1.BN(queryId, 16), 64);
116
+ // The Ton Whales protocol requires a specific 'gas limit' field in the payload
117
+ // structure (OpCode -> QueryId -> GasLimit -> Amount).
118
+ // We hardcode 1 TON here to match the Deposit implementation and ensure
119
+ // sufficient gas for the pool to process the request.
120
+ payloadCell.bits.writeCoins(tonweb_1.default.utils.toNano('1'));
121
+ payloadCell.bits.writeCoins(new bn_js_1.BN(amountStr));
122
+ }
123
+ else {
124
+ payloadCell.bits.writeUint(0, 32);
125
+ payloadCell.bits.writeString(payload);
126
+ }
78
127
  }
79
128
  }
80
129
  else {
81
130
  payloadCell.bits.writeBytes(payload);
82
131
  }
83
132
  }
84
- const orderHeader = tonweb_1.default.Contract.createInternalMessageHeader(new tonweb_1.default.Address(address), new bn_js_1.BN(amount), true, false);
133
+ const orderHeader = tonweb_1.default.Contract.createInternalMessageHeader(new tonweb_1.default.Address(address), new bn_js_1.BN(amount), true, this.bounceable);
85
134
  return tonweb_1.default.Contract.createCommonMsgInfo(orderHeader, undefined, payloadCell);
86
135
  }
87
136
  async createExternalMessage(signingMessage, seqno, signature) {
@@ -89,7 +138,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
89
138
  body.bits.writeBytes(Buffer.from(signature, 'hex'));
90
139
  body.writeCell(signingMessage);
91
140
  let stateInit;
92
- if (seqno === 0) {
141
+ if (seqno === 0 && !this.isV3ContractMessage) {
93
142
  const WalletClass = tonweb_1.default.Wallets.all['v4R2'];
94
143
  const wallet = new WalletClass(new tonweb_1.default.HttpProvider(), {
95
144
  publicKey: tonweb_1.default.utils.hexToBytes(this.publicKey),
@@ -99,8 +148,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
99
148
  stateInit = deploy.stateInit;
100
149
  }
101
150
  const header = tonweb_1.default.Contract.createExternalMessageHeader(this.sender);
102
- const resultMessage = tonweb_1.default.Contract.createCommonMsgInfo(header, stateInit, body);
103
- return resultMessage;
151
+ return tonweb_1.default.Contract.createCommonMsgInfo(header, stateInit, body);
104
152
  }
105
153
  loadInputsAndOutputs() {
106
154
  const outputs = [];
@@ -121,17 +169,17 @@ class Transaction extends sdk_core_1.BaseTransaction {
121
169
  fromRawTransaction(rawTransaction) {
122
170
  try {
123
171
  const cell = tonweb_1.default.boc.Cell.oneFromBoc(tonweb_1.default.utils.base64ToBytes(rawTransaction));
124
- const parsed = this.parseTransfer(cell);
125
- parsed.value = parsed.value.toString();
126
- parsed.fromAddress = parsed.fromAddress.toString(true, true, true);
127
- parsed.toAddress = parsed.toAddress.toString(true, true, true);
172
+ const parsed = this.parseTransaction(cell);
128
173
  this.sender = parsed.fromAddress;
129
174
  this.recipient = { address: parsed.toAddress, amount: parsed.value };
175
+ this.withdrawAmount = parsed.withdrawAmount;
130
176
  this.seqno = parsed.seqno;
131
177
  this.publicKey = parsed.publicKey;
132
178
  this.expireTime = parsed.expireAt;
133
179
  this.message = parsed.payload;
134
180
  this._signatures.push(parsed.signature);
181
+ this.bounceable = parsed.bounce;
182
+ this.sub_wallet_id = parsed.walletId;
135
183
  }
136
184
  catch (e) {
137
185
  throw new Error('invalid raw transaction');
@@ -139,9 +187,10 @@ class Transaction extends sdk_core_1.BaseTransaction {
139
187
  }
140
188
  /** @inheritDoc */
141
189
  explainTransaction() {
142
- const displayOrder = ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee'];
190
+ const displayOrder = ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'withdrawAmount'];
143
191
  const outputs = [this.recipient];
144
192
  const outputAmount = this.recipient.amount;
193
+ const withdrawAmount = this.withdrawAmount;
145
194
  return {
146
195
  displayOrder,
147
196
  id: this.id,
@@ -150,9 +199,10 @@ class Transaction extends sdk_core_1.BaseTransaction {
150
199
  changeOutputs: [],
151
200
  changeAmount: '0',
152
201
  fee: { fee: 'UNKNOWN' },
202
+ withdrawAmount,
153
203
  };
154
204
  }
155
- parseTransfer(cell) {
205
+ parseTransaction(cell) {
156
206
  const slice = cell.beginParse();
157
207
  // header
158
208
  if (slice.loadUint(2).toNumber() !== 2)
@@ -175,7 +225,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
175
225
  if (seqno !== 0)
176
226
  throw new Error('invalid seqno');
177
227
  const walletId = data.loadUint(32).toNumber();
178
- if (walletId !== WALLET_ID)
228
+ if (walletId !== constants_1.WALLET_ID)
179
229
  throw new Error('invalid wallet id');
180
230
  const publicKeyBuf = new Uint8Array(32);
181
231
  for (let i = 0; i < publicKeyBuf.length; i++) {
@@ -187,25 +237,30 @@ class Transaction extends sdk_core_1.BaseTransaction {
187
237
  // body
188
238
  const bodySlice = slice.loadBit() ? slice.loadRef() : slice;
189
239
  return {
190
- fromAddress: externalDestAddress,
240
+ fromAddress: externalDestAddress.toString(true, true, this.fromAddressBounceable),
191
241
  publicKey,
192
- ...this.parseTransferBody(bodySlice),
242
+ ...this.parseTransactionBody(bodySlice),
193
243
  };
194
244
  }
195
- parseTransferBody(slice) {
245
+ parseTransactionBody(slice) {
196
246
  const signature = Buffer.from(slice.loadBits(512)).toString('hex');
197
247
  // signing message
198
248
  const walletId = slice.loadUint(32).toNumber();
199
- if (walletId !== WALLET_ID)
249
+ if (walletId !== constants_1.WALLET_ID && walletId !== constants_1.VESTING_CONTRACT_WALLET_ID)
200
250
  throw new Error('invalid walletId');
201
251
  const expireAt = slice.loadUint(32).toNumber();
202
252
  const seqno = slice.loadUint(32).toNumber();
203
253
  const op = slice.loadUint(8).toNumber();
204
- if (op !== 0)
205
- throw new Error('invalid op');
206
- const sendMode = slice.loadUint(8).toNumber();
207
- if (sendMode !== 3)
208
- throw new Error('invalid sendMode');
254
+ if (op !== 3) {
255
+ if (op !== 0)
256
+ throw new Error('invalid op');
257
+ const sendMode = slice.loadUint(8).toNumber();
258
+ if (sendMode !== 3)
259
+ throw new Error('invalid sendMode');
260
+ }
261
+ else {
262
+ this.isV3ContractMessage = true;
263
+ }
209
264
  let order = slice.loadRef();
210
265
  if (order.loadBit())
211
266
  throw Error('invalid internal header');
@@ -218,7 +273,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
218
273
  if (sourceAddress !== null)
219
274
  throw Error('invalid externalSourceAddress');
220
275
  const destAddress = order.loadAddress();
221
- const value = order.loadCoins();
276
+ const value = order.loadCoins().toString();
222
277
  if (order.loadBit())
223
278
  throw Error('invalid currencyCollection');
224
279
  const ihrFees = order.loadCoins();
@@ -239,21 +294,97 @@ class Transaction extends sdk_core_1.BaseTransaction {
239
294
  }
240
295
  // order body
241
296
  let payload;
297
+ let withdrawAmount;
298
+ this.transactionType = sdk_core_1.TransactionType.Send;
242
299
  if (order.getFreeBits() > 0) {
243
300
  if (order.loadBit()) {
244
301
  order = order.loadRef();
245
302
  }
246
303
  if (order.getFreeBits() > 32) {
247
- const op = order.loadUint(32);
248
- const payloadBytes = order.loadBits(order.getFreeBits());
249
- payload = op.eq(new bn_js_1.BN(0)) ? new TextDecoder().decode(payloadBytes) : '';
304
+ const opcode = order.loadUint(32).toNumber();
305
+ if (opcode === 0) {
306
+ const payloadBytes = order.loadBits(order.getFreeBits());
307
+ payload = new TextDecoder().decode(payloadBytes);
308
+ if (payload === 'Deposit') {
309
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesVestingDeposit;
310
+ }
311
+ else if (payload === 'Withdraw') {
312
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesVestingWithdrawal;
313
+ }
314
+ else if (payload === constants_1.SINGLE_NOMINATOR_WITHDRAW_ALL_COMMENT) {
315
+ this.transactionType = sdk_core_1.TransactionType.SingleNominatorWithdraw;
316
+ }
317
+ }
318
+ else if (opcode === 4096) {
319
+ const queryId = order.loadUint(64).toNumber();
320
+ withdrawAmount = order.loadCoins().toNumber().toString();
321
+ payload = constants_1.WITHDRAW_OPCODE + queryId.toString(16).padStart(16, '0') + withdrawAmount;
322
+ this.transactionType = sdk_core_1.TransactionType.SingleNominatorWithdraw;
323
+ }
324
+ else if (opcode === constants_1.JETTON_TRANSFER_OPCODE) {
325
+ this.transactionType = sdk_core_1.TransactionType.SendToken;
326
+ const queryId = order.loadUint(64).toNumber();
327
+ if (queryId !== 0)
328
+ throw new Error('invalid queryId for jetton transfer');
329
+ const jettonAmount = order.loadCoins();
330
+ if (!jettonAmount.gt(new bn_js_1.BN(0)))
331
+ throw new Error('invalid jettonAmount');
332
+ const jettonRecipient = order.loadAddress();
333
+ if (!jettonRecipient)
334
+ throw new Error('invalid jettonRecipient');
335
+ const forwarderAddress = order.loadAddress();
336
+ if (!forwarderAddress)
337
+ throw new Error('invalid forwarderAddress');
338
+ order.loadBit(); // skip bit
339
+ const forwardTonAmount = order.loadCoins();
340
+ if (!forwardTonAmount.gt(new bn_js_1.BN(0)))
341
+ throw new Error('invalid forwardTonAmount');
342
+ let message = '';
343
+ if (order.loadBit()) {
344
+ order = order.loadRef();
345
+ const messageOpcode = order.loadUint(32).toNumber();
346
+ if (messageOpcode !== 0)
347
+ throw new Error('invalid message opcode');
348
+ const messageBytes = order.loadBits(order.getFreeBits());
349
+ message = new TextDecoder().decode(messageBytes);
350
+ }
351
+ payload = {
352
+ jettonAmount: jettonAmount.toString(),
353
+ jettonRecipient: jettonRecipient.toString(true, true, this.toAddressBounceable),
354
+ forwarderAddress: forwarderAddress.toString(true, true, this.fromAddressBounceable),
355
+ forwardTonAmount: forwardTonAmount.toString(),
356
+ message: message,
357
+ };
358
+ }
359
+ else if (opcode === parseInt(constants_1.TON_WHALES_DEPOSIT_OPCODE, 10)) {
360
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesDeposit;
361
+ const queryId = order.loadUint(64).toNumber();
362
+ // This is the gas limit, which must be read to advance the cursor
363
+ // We do not need to store it
364
+ order.loadCoins();
365
+ payload = constants_1.TON_WHALES_DEPOSIT_OPCODE + queryId.toString(16).padStart(16, '0');
366
+ }
367
+ else if (opcode === parseInt(constants_1.TON_WHALES_WITHDRAW_OPCODE, 10)) {
368
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesWithdrawal;
369
+ const queryId = order.loadUint(64).toNumber();
370
+ order.loadCoins(); // Skip Gas (Hardcoded in builder)
371
+ const amount = order.loadCoins();
372
+ withdrawAmount = amount.toString(); // Decimal String
373
+ // Reconstruct Payload: Decimal Op + Hex Query + Decimal Amount
374
+ const queryHex = new bn_js_1.BN(queryId).toString(16).padStart(16, '0');
375
+ payload = constants_1.TON_WHALES_WITHDRAW_OPCODE + queryHex + withdrawAmount;
376
+ }
377
+ else {
378
+ payload = '';
379
+ }
250
380
  }
251
381
  }
252
382
  return {
253
- toAddress: destAddress,
383
+ toAddress: destAddress.toString(true, true, this.fromAddressBounceable),
254
384
  value,
255
385
  bounce,
256
386
  seqno,
387
+ withdrawAmount,
257
388
  expireAt,
258
389
  payload,
259
390
  signature,
@@ -269,7 +400,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
269
400
  if (seqno !== 0)
270
401
  throw new Error('invalid seqno');
271
402
  const walletId = data.loadUint(32).toNumber();
272
- if (walletId !== WALLET_ID)
403
+ if (walletId !== constants_1.WALLET_ID)
273
404
  throw new Error('invalid wallet id');
274
405
  const publicKey = new Uint8Array(32);
275
406
  for (let i = 0; i < publicKey.length; i++) {
@@ -281,4 +412,4 @@ class Transaction extends sdk_core_1.BaseTransaction {
281
412
  }
282
413
  }
283
414
  exports.Transaction = Transaction;
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVE4QjtBQUc5QixvREFBNEI7QUFDNUIsaUNBQTJCO0FBRzNCLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUU1QixNQUFhLFdBQVksU0FBUSwwQkFBZTtJQVU5QyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVk7UUFDbEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxhQUFhLEdBQUcsSUFBSSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdGLE9BQU87WUFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQWE7WUFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87WUFDbkMsZ0JBQWdCLEVBQUUsYUFBYTtZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLE1BQU0sQ0FBQyxJQUFJ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QUFDO0lBQ0osQ0FBQztDQUNGO0FBbFRELGtDQWtUQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIFJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgVG9uV2ViIGZyb20gJ3RvbndlYic7XG5pbXBvcnQgeyBCTiB9IGZyb20gJ2JuLmpzJztcbmltcG9ydCB7IENlbGwgfSBmcm9tICd0b253ZWIvZGlzdC90eXBlcy9ib2MvY2VsbCc7XG5cbmNvbnN0IFdBTExFVF9JRCA9IDY5ODk4MzE5MTtcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHVibGljIHJlY2lwaWVudDogUmVjaXBpZW50O1xuICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xuICBzZXFubzogbnVtYmVyO1xuICBleHBpcmVUaW1lOiBudW1iZXI7XG4gIHNlbmRlcjogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSB1bnNpZ25lZE1lc3NhZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSBmaW5hbE1lc3NhZ2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICB9XG5cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpbmFsTWVzc2FnZTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGNvbnN0IG5vbl9ib3VuY2FibGUgPSBuZXcgVG9uV2ViLkFkZHJlc3ModGhpcy5yZWNpcGllbnQuYWRkcmVzcykudG9TdHJpbmcodHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5faWQgYXMgc3RyaW5nLFxuICAgICAgc2VuZGVyOiB0aGlzLnNlbmRlcixcbiAgICAgIGRlc3RpbmF0aW9uOiB0aGlzLnJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgZGVzdGluYXRpb25BbGlhczogbm9uX2JvdW5jYWJsZSxcbiAgICAgIGFtb3VudDogdGhpcy5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgc2Vxbm86IHRoaXMuc2Vxbm8sXG4gICAgICBleHBpcmF0aW9uVGltZTogdGhpcy5leHBpcmVUaW1lLFxuICAgICAgcHVibGljS2V5OiB0aGlzLnB1YmxpY0tleSxcbiAgICAgIHNpZ25hdHVyZTogdGhpcy5fc2lnbmF0dXJlc1swXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLnVuc2lnbmVkTWVzc2FnZSwgJ2hleCcpO1xuICB9XG5cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fdHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIGNvbnN0IHNpZ25pbmdNZXNzYWdlID0gdGhpcy5jcmVhdGVTaWduaW5nTWVzc2FnZShXQUxMRVRfSUQsIHRoaXMuc2Vxbm8sIHRoaXMuZXhwaXJlVGltZSk7XG4gICAgY29uc3Qgc2VuZE1vZGUgPSAzO1xuICAgIHNpZ25pbmdNZXNzYWdlLmJpdHMud3JpdGVVaW50OChzZW5kTW9kZSk7XG4gICAgY29uc3Qgb3V0TXNnID0gdGhpcy5jcmVhdGVPdXRNc2codGhpcy5yZWNpcGllbnQuYWRkcmVzcywgdGhpcy5yZWNpcGllbnQuYW1vdW50LCB0aGlzLm1lc3NhZ2UpO1xuICAgIHNpZ25pbmdNZXNzYWdlLnJlZnMucHVzaChvdXRNc2cpO1xuICAgIHRoaXMudW5zaWduZWRNZXNzYWdlID0gQnVmZmVyLmZyb20oYXdhaXQgc2lnbmluZ01lc3NhZ2UuaGFzaCgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmUgPVxuICAgICAgdGhpcy5fc2lnbmF0dXJlcy5sZW5ndGggPiAwID8gdGhpcy5fc2lnbmF0dXJlc1swXSA6IEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KDY0KSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGZpbmFsTWVzc2FnZSA9IGF3YWl0IHRoaXMuY3JlYXRlRXh0ZXJuYWxNZXNzYWdlKHNpZ25pbmdNZXNzYWdlLCB0aGlzLnNlcW5vLCBzaWduYXR1cmUpO1xuXG4gICAgdGhpcy5maW5hbE1lc3NhZ2UgPSBUb25XZWIudXRpbHMuYnl0ZXNUb0Jhc2U2NChhd2FpdCBmaW5hbE1lc3NhZ2UudG9Cb2MoZmFsc2UpKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsVHhJZCA9IFRvbldlYi51dGlscy5ieXRlc1RvQmFzZTY0KGF3YWl0IGZpbmFsTWVzc2FnZS5oYXNoKCkpO1xuICAgIHRoaXMuX2lkID0gb3JpZ2luYWxUeElkLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoL1xcKy9nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaWduaW5nTWVzc2FnZSh3YWxsZXRJZCwgc2Vxbm8sIGV4cGlyZUF0KSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBUb25XZWIuYm9jLkNlbGwoKTtcbiAgICBtZXNzYWdlLmJpdHMud3JpdGVVaW50KHdhbGxldElkLCAzMik7XG4gICAgaWYgKHNlcW5vID09PSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgICAgbWVzc2FnZS5iaXRzLndyaXRlQml0KDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlLmJpdHMud3JpdGVVaW50KGV4cGlyZUF0LCAzMik7XG4gICAgfVxuICAgIG1lc3NhZ2UuYml0cy53cml0ZVVpbnQoc2Vxbm8sIDMyKTtcbiAgICBtZXNzYWdlLmJpdHMud3JpdGVVaW50KDAsIDgpOyAvLyBvcFxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPdXRNc2coYWRkcmVzcywgYW1vdW50LCBwYXlsb2FkKSB7XG4gICAgbGV0IHBheWxvYWRDZWxsID0gbmV3IFRvbldlYi5ib2MuQ2VsbCgpO1xuICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICBpZiAocGF5bG9hZC5yZWZzKSB7XG4gICAgICAgIC8vIGlzIENlbGxcbiAgICAgICAgcGF5bG9hZENlbGwgPSBwYXlsb2FkO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVVaW50KDAsIDMyKTtcbiAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlU3RyaW5nKHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlQnl0ZXMocGF5bG9hZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3JkZXJIZWFkZXIgPSBUb25XZWIuQ29udHJhY3QuY3JlYXRlSW50ZXJuYWxNZXNzYWdlSGVhZGVyKFxuICAgICAgbmV3IFRvbldlYi5BZGRyZXNzKGFkZHJlc3MpLFxuICAgICAgbmV3IEJOKGFtb3VudCksXG4gICAgICB0cnVlLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHJldHVybiBUb25XZWIuQ29udHJhY3QuY3JlYXRlQ29tbW9uTXNnSW5mbyhvcmRlckhlYWRlciwgdW5kZWZpbmVkLCBwYXlsb2FkQ2VsbCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVFeHRlcm5hbE1lc3NhZ2Uoc2lnbmluZ01lc3NhZ2U6IENlbGwsIHNlcW5vOiBudW1iZXIsIHNpZ25hdHVyZTogc3RyaW5nKTogUHJvbWlzZTxDZWxsPiB7XG4gICAgY29uc3QgYm9keSA9IG5ldyBUb25XZWIuYm9jLkNlbGwoKTtcblxuICAgIGJvZHkuYml0cy53cml0ZUJ5dGVzKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpKTtcbiAgICBib2R5LndyaXRlQ2VsbChzaWduaW5nTWVzc2FnZSk7XG5cbiAgICBsZXQgc3RhdGVJbml0O1xuICAgIGlmIChzZXFubyA9PT0gMCkge1xuICAgICAgY29uc3QgV2FsbGV0Q2xhc3MgPSBUb25XZWIuV2FsbGV0cy5hbGxbJ3Y0UjInXTtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXRDbGFzcyhuZXcgVG9uV2ViLkh0dHBQcm92aWRlcigpLCB7XG4gICAgICAgIHB1YmxpY0tleTogVG9uV2ViLnV0aWxzLmhleFRvQnl0ZXModGhpcy5wdWJsaWNLZXkpLFxuICAgICAgICB3YzogMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVwbG95ID0gYXdhaXQgd2FsbGV0LmNyZWF0ZVN0YXRlSW5pdCgpO1xuICAgICAgc3RhdGVJbml0ID0gZGVwbG95LnN0YXRlSW5pdDtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXIgPSBUb25XZWIuQ29udHJhY3QuY3JlYXRlRXh0ZXJuYWxNZXNzYWdlSGVhZGVyKHRoaXMuc2VuZGVyKTtcbiAgICBjb25zdCByZXN1bHRNZXNzYWdlID0gVG9uV2ViLkNvbnRyYWN0LmNyZWF0ZUNvbW1vbk1zZ0luZm8oaGVhZGVyLCBzdGF0ZUluaXQsIGJvZHkpO1xuICAgIHJldHVybiByZXN1bHRNZXNzYWdlO1xuICB9XG5cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuICAgIGlucHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IHRoaXMuc2VuZGVyLFxuICAgICAgdmFsdWU6IHRoaXMucmVjaXBpZW50LmFtb3VudCxcbiAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICB9KTtcbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgYWRkcmVzczogdGhpcy5yZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiB0aGlzLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gaW5wdXRzO1xuICB9XG5cbiAgZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2VsbCA9IFRvbldlYi5ib2MuQ2VsbC5vbmVGcm9tQm9jKFRvbldlYi51dGlscy5iYXNlNjRUb0J5dGVzKHJhd1RyYW5zYWN0aW9uKSk7XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VUcmFuc2ZlcihjZWxsKTtcbiAgICAgIHBhcnNlZC52YWx1ZSA9IHBhcnNlZC52YWx1ZS50b1N0cmluZygpO1xuICAgICAgcGFyc2VkLmZyb21BZGRyZXNzID0gcGFyc2VkLmZyb21BZGRyZXNzLnRvU3RyaW5nKHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgcGFyc2VkLnRvQWRkcmVzcyA9IHBhcnNlZC50b0FkZHJlc3MudG9TdHJpbmcodHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNlbmRlciA9IHBhcnNlZC5mcm9tQWRkcmVzcztcbiAgICAgIHRoaXMucmVjaXBpZW50ID0geyBhZGRyZXNzOiBwYXJzZWQudG9BZGRyZXNzLCBhbW91bnQ6IHBhcnNlZC52YWx1ZSB9O1xuICAgICAgdGhpcy5zZXFubyA9IHBhcnNlZC5zZXFubztcbiAgICAgIHRoaXMucHVibGljS2V5ID0gcGFyc2VkLnB1YmxpY0tleSBhcyBzdHJpbmc7XG4gICAgICB0aGlzLmV4cGlyZVRpbWUgPSBwYXJzZWQuZXhwaXJlQXQ7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBwYXJzZWQucGF5bG9hZDtcbiAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChwYXJzZWQuc2lnbmF0dXJlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ291dHB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZU91dHB1dHMnLCAnY2hhbmdlQW1vdW50JywgJ2ZlZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IFt0aGlzLnJlY2lwaWVudF07XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdGhpcy5yZWNpcGllbnQuYW1vdW50O1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgZmVlOiB7IGZlZTogJ1VOS05PV04nIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFuc2ZlcihjZWxsOiBDZWxsKTogYW55IHtcbiAgICBjb25zdCBzbGljZSA9IChjZWxsIGFzIGFueSkuYmVnaW5QYXJzZSgpO1xuXG4gICAgLy8gaGVhZGVyXG5cbiAgICBpZiAoc2xpY2UubG9hZFVpbnQoMikudG9OdW1iZXIoKSAhPT0gMikgdGhyb3cgRXJyb3IoJ2ludmFsaWQgaGVhZGVyJyk7XG5cbiAgICBjb25zdCBleHRlcm5hbFNvdXJjZUFkZHJlc3MgPSBzbGljZS5sb2FkQWRkcmVzcygpO1xuICAgIGlmIChleHRlcm5hbFNvdXJjZUFkZHJlc3MgIT09IG51bGwpIHRocm93IEVycm9yKCdpbnZhbGlkIGV4dGVybmFsU291cmNlQWRkcmVzcycpO1xuXG4gICAgY29uc3QgZXh0ZXJuYWxEZXN0QWRkcmVzcyA9IHNsaWNlLmxvYWRBZGRyZXNzKCk7XG5cbiAgICBjb25zdCBleHRlcm5hbEltcG9ydEZlZSA9IHNsaWNlLmxvYWRDb2lucygpO1xuICAgIGlmICghZXh0ZXJuYWxJbXBvcnRGZWUuZXEobmV3IEJOKDApKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGV4dGVybmFsSW1wb3J0RmVlJyk7XG5cbiAgICAvLyBzdGF0ZUluaXRcblxuICAgIGxldCBwdWJsaWNLZXk7XG4gICAgaWYgKHNsaWNlLmxvYWRCaXQoKSkge1xuICAgICAgaWYgKHNsaWNlLmxvYWRCaXQoKSkge1xuICAgICAgICBjb25zdCBzdGF0ZUluaXQgPSBzbGljZS5sb2FkUmVmKCk7XG4gICAgICAgIHN0YXRlSW5pdC5sb2FkUmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzdGF0ZUluaXQubG9hZFJlZigpO1xuICAgICAgICBjb25zdCBzZXFubyA9IGRhdGEubG9hZFVpbnQoMzIpLnRvTnVtYmVyKCk7XG4gICAgICAgIGlmIChzZXFubyAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlcW5vJyk7XG4gICAgICAgIGNvbnN0IHdhbGxldElkID0gZGF0YS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICAgICAgaWYgKHdhbGxldElkICE9PSBXQUxMRVRfSUQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXQgaWQnKTtcbiAgICAgICAgY29uc3QgcHVibGljS2V5QnVmID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHB1YmxpY0tleUJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHB1YmxpY0tleUJ1ZltpXSA9IGRhdGEubG9hZFVpbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljS2V5ID0gQnVmZmVyLmZyb20ocHVibGljS2V5QnVmKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYm9keVxuICAgIGNvbnN0IGJvZHlTbGljZSA9IHNsaWNlLmxvYWRCaXQoKSA/IHNsaWNlLmxvYWRSZWYoKSA6IHNsaWNlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb21BZGRyZXNzOiBleHRlcm5hbERlc3RBZGRyZXNzLFxuICAgICAgcHVibGljS2V5LFxuICAgICAgLi4udGhpcy5wYXJzZVRyYW5zZmVyQm9keShib2R5U2xpY2UpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVHJhbnNmZXJCb2R5KHNsaWNlOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKHNsaWNlLmxvYWRCaXRzKDUxMikpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBzaWduaW5nIG1lc3NhZ2VcblxuICAgIGNvbnN0IHdhbGxldElkID0gc2xpY2UubG9hZFVpbnQoMzIpLnRvTnVtYmVyKCk7XG4gICAgaWYgKHdhbGxldElkICE9PSBXQUxMRVRfSUQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXRJZCcpO1xuXG4gICAgY29uc3QgZXhwaXJlQXQgPSBzbGljZS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcblxuICAgIGNvbnN0IHNlcW5vID0gc2xpY2UubG9hZFVpbnQoMzIpLnRvTnVtYmVyKCk7XG5cbiAgICBjb25zdCBvcCA9IHNsaWNlLmxvYWRVaW50KDgpLnRvTnVtYmVyKCk7XG4gICAgaWYgKG9wICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgb3AnKTtcblxuICAgIGNvbnN0IHNlbmRNb2RlID0gc2xpY2UubG9hZFVpbnQoOCkudG9OdW1iZXIoKTtcbiAgICBpZiAoc2VuZE1vZGUgIT09IDMpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZW5kTW9kZScpO1xuXG4gICAgbGV0IG9yZGVyID0gc2xpY2UubG9hZFJlZigpO1xuXG4gICAgaWYgKG9yZGVyLmxvYWRCaXQoKSkgdGhyb3cgRXJyb3IoJ2ludmFsaWQgaW50ZXJuYWwgaGVhZGVyJyk7XG4gICAgaWYgKCFvcmRlci5sb2FkQml0KCkpIHRocm93IEVycm9yKCdpbnZhbGlkIGlockRpc2FibGVkJyk7XG4gICAgY29uc3QgYm91bmNlID0gb3JkZXIubG9hZEJpdCgpO1xuICAgIGlmIChvcmRlci5sb2FkQml0KCkpIHRocm93IEVycm9yKCdpbnZhbGlkIGJvdW5jZWQnKTtcbiAgICBjb25zdCBzb3VyY2VBZGRyZXNzID0gb3JkZXIubG9hZEFkZHJlc3MoKTtcbiAgICBpZiAoc291cmNlQWRkcmVzcyAhPT0gbnVsbCkgdGhyb3cgRXJyb3IoJ2ludmFsaWQgZXh0ZXJuYWxTb3VyY2VBZGRyZXNzJyk7XG4gICAgY29uc3QgZGVzdEFkZHJlc3MgPSBvcmRlci5sb2FkQWRkcmVzcygpO1xuICAgIGNvbnN0IHZhbHVlID0gb3JkZXIubG9hZENvaW5zKCk7XG5cbiAgICBpZiAob3JkZXIubG9hZEJpdCgpKSB0aHJvdyBFcnJvcignaW52YWxpZCBjdXJyZW5jeUNvbGxlY3Rpb24nKTtcbiAgICBjb25zdCBpaHJGZWVzID0gb3JkZXIubG9hZENvaW5zKCk7XG4gICAgaWYgKCFpaHJGZWVzLmVxKG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpaHJGZWVzJyk7XG4gICAgY29uc3QgZndkRmVlcyA9IG9yZGVyLmxvYWRDb2lucygpO1xuICAgIGlmICghZndkRmVlcy5lcShuZXcgQk4oMCkpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZndkRmVlcycpO1xuICAgIGNvbnN0IGNyZWF0ZWRMdCA9IG9yZGVyLmxvYWRVaW50KDY0KTtcbiAgICBpZiAoIWNyZWF0ZWRMdC5lcShuZXcgQk4oMCkpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY3JlYXRlZEx0Jyk7XG4gICAgY29uc3QgY3JlYXRlZEF0ID0gb3JkZXIubG9hZFVpbnQoMzIpO1xuICAgIGlmICghY3JlYXRlZEF0LmVxKG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjcmVhdGVkQXQnKTtcblxuICAgIC8vIG9yZGVyIHN0YXRlSW5pdFxuICAgIGlmIChvcmRlci5sb2FkQml0KCkpIHtcbiAgICAgIG9yZGVyLmxvYWRSZWYoKTsgLy8gZG9uJ3QgcGFyc2Ugc3RhdGVJbml0XG4gICAgfVxuXG4gICAgLy8gb3JkZXIgYm9keVxuICAgIGxldCBwYXlsb2FkO1xuXG4gICAgaWYgKG9yZGVyLmdldEZyZWVCaXRzKCkgPiAwKSB7XG4gICAgICBpZiAob3JkZXIubG9hZEJpdCgpKSB7XG4gICAgICAgIG9yZGVyID0gb3JkZXIubG9hZFJlZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3JkZXIuZ2V0RnJlZUJpdHMoKSA+IDMyKSB7XG4gICAgICAgIGNvbnN0IG9wID0gb3JkZXIubG9hZFVpbnQoMzIpO1xuICAgICAgICBjb25zdCBwYXlsb2FkQnl0ZXMgPSBvcmRlci5sb2FkQml0cyhvcmRlci5nZXRGcmVlQml0cygpKTtcbiAgICAgICAgcGF5bG9hZCA9IG9wLmVxKG5ldyBCTigwKSkgPyBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZEJ5dGVzKSA6ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdG9BZGRyZXNzOiBkZXN0QWRkcmVzcyxcbiAgICAgIHZhbHVlLFxuICAgICAgYm91bmNlLFxuICAgICAgc2Vxbm8sXG4gICAgICBleHBpcmVBdCxcbiAgICAgIHBheWxvYWQsXG4gICAgICBzaWduYXR1cmUsXG4gICAgICB3YWxsZXRJZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVRyYW5zZmVyU3RhdGVJbml0KHNsaWNlOiBhbnkpOiBhbnkge1xuICAgIGlmIChzbGljZSA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgIHNsaWNlLmxvYWRSZWYoKTtcbiAgICBjb25zdCBkYXRhID0gc2xpY2UubG9hZFJlZigpO1xuICAgIGNvbnN0IHNlcW5vID0gZGF0YS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICBpZiAoc2Vxbm8gIT09IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZXFubycpO1xuICAgIGNvbnN0IHdhbGxldElkID0gZGF0YS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICBpZiAod2FsbGV0SWQgIT09IFdBTExFVF9JRCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldCBpZCcpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHB1YmxpY0tleS5sZW5ndGg7IGkrKykge1xuICAgICAgcHVibGljS2V5W2ldID0gZGF0YS5sb2FkVWludCg4KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YmxpY0tleTogQnVmZmVyLmZyb20ocHVibGljS2V5KS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxufVxuIl19
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixpQ0FBMkI7QUFHM0IsbURBQXlIO0FBR3pILDJDQVFxQjtBQUVyQixNQUFhLFdBQVksU0FBUSwwQkFBZTtJQWdCOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFZO1FBQ2xCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sV0FBVyxHQUFHLElBQUksZ0JBQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQ3JFLElBQUksRUFDSixJQUFJLEVBQ0osQ0FBQyxJQUFJLGdCQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUN6RCxDQUFDO1FBQ0YsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBYTtZQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUNuQyxnQkFBZ0IsRUFBRSxXQUFXO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07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QUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPO1lBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUNsRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBemJELGtDQXliQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUb25XZWIgZnJvbSAndG9ud2ViJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHsgQ2VsbCB9IGZyb20gJ3RvbndlYi9kaXN0L3R5cGVzL2JvYy9jZWxsJztcblxuaW1wb3J0IHsgQmFzZUtleSwgQmFzZVRyYW5zYWN0aW9uLCBFbnRyeSwgUmVjaXBpZW50LCBUcmFuc2FjdGlvblJlY2lwaWVudCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBXSVRIRFJBV19PUENPREUsXG4gIFdBTExFVF9JRCxcbiAgSkVUVE9OX1RSQU5TRkVSX09QQ09ERSxcbiAgVkVTVElOR19DT05UUkFDVF9XQUxMRVRfSUQsXG4gIFRPTl9XSEFMRVNfREVQT1NJVF9PUENPREUsXG4gIFRPTl9XSEFMRVNfV0lUSERSQVdfT1BDT0RFLFxuICBTSU5HTEVfTk9NSU5BVE9SX1dJVEhEUkFXX0FMTF9DT01NRU5ULFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHB1YmxpYyByZWNpcGllbnQ6IFJlY2lwaWVudDtcbiAgcHVibGljIGJvdW5jZWFibGU6IGJvb2xlYW47XG4gIHB1YmxpYyBmcm9tQWRkcmVzc0JvdW5jZWFibGU6IGJvb2xlYW47XG4gIHB1YmxpYyB0b0FkZHJlc3NCb3VuY2VhYmxlOiBib29sZWFuO1xuICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xuICBwdWJsaWMgd2l0aGRyYXdBbW91bnQ6IHN0cmluZztcbiAgc2Vxbm86IG51bWJlcjtcbiAgZXhwaXJlVGltZTogbnVtYmVyO1xuICBzZW5kZXI6IHN0cmluZztcbiAgcHVibGljS2V5OiBzdHJpbmc7XG4gIGlzVjNDb250cmFjdE1lc3NhZ2U6IGJvb2xlYW47XG4gIHN1Yl93YWxsZXRfaWQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHVuc2lnbmVkTWVzc2FnZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZmluYWxNZXNzYWdlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLmJvdW5jZWFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmZyb21BZGRyZXNzQm91bmNlYWJsZSA9IHRydWU7XG4gICAgdGhpcy50b0FkZHJlc3NCb3VuY2VhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmlzVjNDb250cmFjdE1lc3NhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbE1lc3NhZ2U7XG4gIH1cblxuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBjb25zdCBvdGhlckZvcm1hdCA9IG5ldyBUb25XZWIuQWRkcmVzcyh0aGlzLnJlY2lwaWVudC5hZGRyZXNzKS50b1N0cmluZyhcbiAgICAgIHRydWUsXG4gICAgICB0cnVlLFxuICAgICAgIW5ldyBUb25XZWIuQWRkcmVzcyh0aGlzLnJlY2lwaWVudC5hZGRyZXNzKS5pc0JvdW5jZWFibGVcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5faWQgYXMgc3RyaW5nLFxuICAgICAgc2VuZGVyOiB0aGlzLnNlbmRlcixcbiAgICAgIGRlc3RpbmF0aW9uOiB0aGlzLnJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgZGVzdGluYXRpb25BbGlhczogb3RoZXJGb3JtYXQsXG4gICAgICBhbW91bnQ6IHRoaXMucmVjaXBpZW50LmFtb3VudCxcbiAgICAgIHdpdGhkcmF3QW1vdW50OiB0aGlzLndpdGhkcmF3QW1vdW50LFxuICAgICAgc2Vxbm86IHRoaXMuc2Vxbm8sXG4gICAgICBzdWJfd2FsbGV0X2lkOiB0aGlzLnN1Yl93YWxsZXRfaWQsXG4gICAgICBleHBpcmF0aW9uVGltZTogdGhpcy5leHBpcmVUaW1lLFxuICAgICAgcHVibGljS2V5OiB0aGlzLnB1YmxpY0tleSxcbiAgICAgIHNpZ25hdHVyZTogdGhpcy5fc2lnbmF0dXJlc1swXSxcbiAgICAgIGJvdW5jZWFibGU6IHRoaXMuYm91bmNlYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLnVuc2lnbmVkTWVzc2FnZSwgJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXQuXG4gICAqL1xuICBzZXQgdHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5zdWJfd2FsbGV0X2lkKSB7XG4gICAgICBpZiAodGhpcy5pc1YzQ29udHJhY3RNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc3ViX3dhbGxldF9pZCA9IFZFU1RJTkdfQ09OVFJBQ1RfV0FMTEVUX0lEO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdWJfd2FsbGV0X2lkID0gV0FMTEVUX0lEO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzaWduaW5nTWVzc2FnZSA9IHRoaXMuY3JlYXRlU2lnbmluZ01lc3NhZ2UodGhpcy5zdWJfd2FsbGV0X2lkLCB0aGlzLnNlcW5vLCB0aGlzLmV4cGlyZVRpbWUpO1xuICAgIGNvbnN0IHNlbmRNb2RlID0gMzsgLy8gZGVmYXVsdCBzZW5kTW9kZVxuICAgIHNpZ25pbmdNZXNzYWdlLmJpdHMud3JpdGVVaW50OChzZW5kTW9kZSk7XG4gICAgY29uc3Qgb3V0TXNnID0gdGhpcy5jcmVhdGVPdXRNc2codGhpcy5yZWNpcGllbnQuYWRkcmVzcywgdGhpcy5yZWNpcGllbnQuYW1vdW50LCB0aGlzLm1lc3NhZ2UpO1xuICAgIHNpZ25pbmdNZXNzYWdlLnJlZnMucHVzaChvdXRNc2cpO1xuICAgIHRoaXMudW5zaWduZWRNZXNzYWdlID0gQnVmZmVyLmZyb20oYXdhaXQgc2lnbmluZ01lc3NhZ2UuaGFzaCgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmUgPVxuICAgICAgdGhpcy5fc2lnbmF0dXJlcy5sZW5ndGggPiAwID8gdGhpcy5fc2lnbmF0dXJlc1swXSA6IEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KDY0KSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGZpbmFsTWVzc2FnZSA9IGF3YWl0IHRoaXMuY3JlYXRlRXh0ZXJuYWxNZXNzYWdlKHNpZ25pbmdNZXNzYWdlLCB0aGlzLnNlcW5vLCBzaWduYXR1cmUpO1xuXG4gICAgdGhpcy5maW5hbE1lc3NhZ2UgPSBUb25XZWIudXRpbHMuYnl0ZXNUb0Jhc2U2NChhd2FpdCBmaW5hbE1lc3NhZ2UudG9Cb2MoZmFsc2UpKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsVHhJZCA9IFRvbldlYi51dGlscy5ieXRlc1RvQmFzZTY0KGF3YWl0IGZpbmFsTWVzc2FnZS5oYXNoKCkpO1xuICAgIHRoaXMuX2lkID0gb3JpZ2luYWxUeElkLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoL1xcKy9nLCAnLScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVNpZ25pbmdNZXNzYWdlKHdhbGxldElkLCBzZXFubywgZXhwaXJlQXQpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IFRvbldlYi5ib2MuQ2VsbCgpO1xuICAgIG1lc3NhZ2UuYml0cy53cml0ZVVpbnQod2FsbGV0SWQsIDMyKTtcbiAgICAvLyBleHBpcmVBdCBzaG91bGQgYmUgc2V0IGFzIHBlciB0aGUgcHJvdmlkZWQgYXJnIHZhbHVlLCByZWdhcmRsZXNzIG9mIHRoZSBzZXFub1xuICAgIG1lc3NhZ2UuYml0cy53cml0ZVVpbnQoZXhwaXJlQXQsIDMyKTtcbiAgICBtZXNzYWdlLmJpdHMud3JpdGVVaW50KHNlcW5vLCAzMik7XG4gICAgaWYgKCF0aGlzLmlzVjNDb250cmFjdE1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2UuYml0cy53cml0ZVVpbnQoMCwgOCk7IC8vIG9wXG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZU91dE1zZyhhZGRyZXNzLCBhbW91bnQsIHBheWxvYWQpIHtcbiAgICBsZXQgcGF5bG9hZENlbGwgPSBuZXcgVG9uV2ViLmJvYy5DZWxsKCk7XG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIGlmIChwYXlsb2FkLnJlZnMpIHtcbiAgICAgICAgLy8gaXMgQ2VsbFxuICAgICAgICBwYXlsb2FkQ2VsbCA9IHBheWxvYWQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAocGF5bG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID4gMjQgJiYgcGF5bG9hZC5zdWJzdHJpbmcoMCwgOCkgPT09IFdJVEhEUkFXX09QQ09ERSkge1xuICAgICAgICAgICAgLy8gcGF5bG9hZCBpcyBhIHdpdGhkcmF3IHR4biBtZXNzYWdlXG4gICAgICAgICAgICBjb25zdCBxdWVyeUlkID0gcGF5bG9hZC5zdWJzdHJpbmcoOCwgMjQpO1xuICAgICAgICAgICAgY29uc3Qgd2l0aGRyYXdBbW91bnQgPSBwYXlsb2FkLnN1YnN0cmluZygyNCk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHBheWxvYWQ6ICR7cGF5bG9hZH0sIHF1ZXJ5SWQ6ICR7cXVlcnlJZH0sIHdpdGhkcmF3QW1vdW50OiAke3dpdGhkcmF3QW1vdW50fWApO1xuICAgICAgICAgICAgcGF5bG9hZENlbGwuYml0cy53cml0ZVVpbnQocGFyc2VJbnQoV0lUSERSQVdfT1BDT0RFLCAxNiksIDMyKTtcbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVVaW50KHBhcnNlSW50KHF1ZXJ5SWQsIDE2KSwgNjQpO1xuICAgICAgICAgICAgcGF5bG9hZENlbGwuYml0cy53cml0ZUNvaW5zKG5ldyBCTih3aXRoZHJhd0Ftb3VudCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPj0gMjYgJiYgcGF5bG9hZC5zdWJzdHJpbmcoMCwgMTApID09PSBUT05fV0hBTEVTX0RFUE9TSVRfT1BDT0RFKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUlkID0gcGF5bG9hZC5zdWJzdHJpbmcoMTAsIDI2KTtcbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVVaW50KHBhcnNlSW50KFRPTl9XSEFMRVNfREVQT1NJVF9PUENPREUsIDEwKSwgMzIpO1xuICAgICAgICAgICAgcGF5bG9hZENlbGwuYml0cy53cml0ZVVpbnQocGFyc2VJbnQocXVlcnlJZCwgMTYpLCA2NCk7XG4gICAgICAgICAgICAvLyBUaGUgVG9uIFdoYWxlcyBwcm90b2NvbCByZXF1aXJlcyBhIHNwZWNpZmljICdnYXMgbGltaXQnIGZpZWxkIGluIHRoZSBwYXlsb2FkXG4gICAgICAgICAgICAvLyBzdHJ1Y3R1cmUgKE9wQ29kZSAtPiBRdWVyeUlkIC0+IEdhc0xpbWl0IC0+IEFtb3VudCkuXG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlQ29pbnMoVG9uV2ViLnV0aWxzLnRvTmFubygnMScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWQubGVuZ3RoID49IDI2ICYmIHBheWxvYWQuc3Vic3RyaW5nKDAsIDEwKSA9PT0gVE9OX1dIQUxFU19XSVRIRFJBV19PUENPREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5SWQgPSBwYXlsb2FkLnN1YnN0cmluZygxMCwgMjYpO1xuICAgICAgICAgICAgY29uc3QgYW1vdW50U3RyID0gcGF5bG9hZC5zdWJzdHJpbmcoMjYpO1xuXG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlVWludChwYXJzZUludChUT05fV0hBTEVTX1dJVEhEUkFXX09QQ09ERSwgMTApLCAzMik7XG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlVWludChuZXcgQk4ocXVlcnlJZCwgMTYpLCA2NCk7XG4gICAgICAgICAgICAvLyBUaGUgVG9uIFdoYWxlcyBwcm90b2NvbCByZXF1aXJlcyBhIHNwZWNpZmljICdnYXMgbGltaXQnIGZpZWxkIGluIHRoZSBwYXlsb2FkXG4gICAgICAgICAgICAvLyBzdHJ1Y3R1cmUgKE9wQ29kZSAtPiBRdWVyeUlkIC0+IEdhc0xpbWl0IC0+IEFtb3VudCkuXG4gICAgICAgICAgICAvLyBXZSBoYXJkY29kZSAxIFRPTiBoZXJlIHRvIG1hdGNoIHRoZSBEZXBvc2l0IGltcGxlbWVudGF0aW9uIGFuZCBlbnN1cmVcbiAgICAgICAgICAgIC8vIHN1ZmZpY2llbnQgZ2FzIGZvciB0aGUgcG9vbCB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LlxuICAgICAgICAgICAgcGF5bG9hZENlbGwuYml0cy53cml0ZUNvaW5zKFRvbldlYi51dGlscy50b05hbm8oJzEnKSk7XG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlQ29pbnMobmV3IEJOKGFtb3VudFN0cikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlVWludCgwLCAzMik7XG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlU3RyaW5nKHBheWxvYWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF5bG9hZENlbGwuYml0cy53cml0ZUJ5dGVzKHBheWxvYWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9yZGVySGVhZGVyID0gVG9uV2ViLkNvbnRyYWN0LmNyZWF0ZUludGVybmFsTWVzc2FnZUhlYWRlcihcbiAgICAgIG5ldyBUb25XZWIuQWRkcmVzcyhhZGRyZXNzKSxcbiAgICAgIG5ldyBCTihhbW91bnQpLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuYm91bmNlYWJsZVxuICAgICk7XG4gICAgcmV0dXJuIFRvbldlYi5Db250cmFjdC5jcmVhdGVDb21tb25Nc2dJbmZvKG9yZGVySGVhZGVyLCB1bmRlZmluZWQsIHBheWxvYWRDZWxsKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUV4dGVybmFsTWVzc2FnZShzaWduaW5nTWVzc2FnZTogQ2VsbCwgc2Vxbm86IG51bWJlciwgc2lnbmF0dXJlOiBzdHJpbmcpOiBQcm9taXNlPENlbGw+IHtcbiAgICBjb25zdCBib2R5ID0gbmV3IFRvbldlYi5ib2MuQ2VsbCgpO1xuXG4gICAgYm9keS5iaXRzLndyaXRlQnl0ZXMoQnVmZmVyLmZyb20oc2lnbmF0dXJlLCAnaGV4JykpO1xuICAgIGJvZHkud3JpdGVDZWxsKHNpZ25pbmdNZXNzYWdlKTtcblxuICAgIGxldCBzdGF0ZUluaXQ7XG4gICAgaWYgKHNlcW5vID09PSAwICYmICF0aGlzLmlzVjNDb250cmFjdE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IFdhbGxldENsYXNzID0gVG9uV2ViLldhbGxldHMuYWxsWyd2NFIyJ107XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0Q2xhc3MobmV3IFRvbldlYi5IdHRwUHJvdmlkZXIoKSwge1xuICAgICAgICBwdWJsaWNLZXk6IFRvbldlYi51dGlscy5oZXhUb0J5dGVzKHRoaXMucHVibGljS2V5KSxcbiAgICAgICAgd2M6IDAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlcGxveSA9IGF3YWl0IHdhbGxldC5jcmVhdGVTdGF0ZUluaXQoKTtcbiAgICAgIHN0YXRlSW5pdCA9IGRlcGxveS5zdGF0ZUluaXQ7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyID0gVG9uV2ViLkNvbnRyYWN0LmNyZWF0ZUV4dGVybmFsTWVzc2FnZUhlYWRlcih0aGlzLnNlbmRlcik7XG4gICAgcmV0dXJuIFRvbldlYi5Db250cmFjdC5jcmVhdGVDb21tb25Nc2dJbmZvKGhlYWRlciwgc3RhdGVJbml0LCBib2R5KTtcbiAgfVxuXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IG91dHB1dHM6IEVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBpbnB1dHM6IEVudHJ5W10gPSBbXTtcbiAgICBpbnB1dHMucHVzaCh7XG4gICAgICBhZGRyZXNzOiB0aGlzLnNlbmRlcixcbiAgICAgIHZhbHVlOiB0aGlzLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSk7XG4gICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IHRoaXMucmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICB2YWx1ZTogdGhpcy5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuX291dHB1dHMgPSBvdXRwdXRzO1xuICAgIHRoaXMuX2lucHV0cyA9IGlucHV0cztcbiAgfVxuXG4gIGZyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNlbGwgPSBUb25XZWIuYm9jLkNlbGwub25lRnJvbUJvYyhUb25XZWIudXRpbHMuYmFzZTY0VG9CeXRlcyhyYXdUcmFuc2FjdGlvbikpO1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVRyYW5zYWN0aW9uKGNlbGwpO1xuXG4gICAgICB0aGlzLnNlbmRlciA9IHBhcnNlZC5mcm9tQWRkcmVzcztcbiAgICAgIHRoaXMucmVjaXBpZW50ID0geyBhZGRyZXNzOiBwYXJzZWQudG9BZGRyZXNzLCBhbW91bnQ6IHBhcnNlZC52YWx1ZSB9O1xuICAgICAgdGhpcy53aXRoZHJhd0Ftb3VudCA9IHBhcnNlZC53aXRoZHJhd0Ftb3VudDtcbiAgICAgIHRoaXMuc2Vxbm8gPSBwYXJzZWQuc2Vxbm87XG4gICAgICB0aGlzLnB1YmxpY0tleSA9IHBhcnNlZC5wdWJsaWNLZXkgYXMgc3RyaW5nO1xuICAgICAgdGhpcy5leHBpcmVUaW1lID0gcGFyc2VkLmV4cGlyZUF0O1xuICAgICAgdGhpcy5tZXNzYWdlID0gcGFyc2VkLnBheWxvYWQ7XG4gICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2gocGFyc2VkLnNpZ25hdHVyZSk7XG4gICAgICB0aGlzLmJvdW5jZWFibGUgPSBwYXJzZWQuYm91bmNlO1xuICAgICAgdGhpcy5zdWJfd2FsbGV0X2lkID0gcGFyc2VkLndhbGxldElkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3dpdGhkcmF3QW1vdW50J107XG5cbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW3RoaXMucmVjaXBpZW50XTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0aGlzLnJlY2lwaWVudC5hbW91bnQ7XG4gICAgY29uc3Qgd2l0aGRyYXdBbW91bnQgPSB0aGlzLndpdGhkcmF3QW1vdW50O1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgZmVlOiB7IGZlZTogJ1VOS05PV04nIH0sXG4gICAgICB3aXRoZHJhd0Ftb3VudCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlVHJhbnNhY3Rpb24oY2VsbDogQ2VsbCk6IGFueSB7XG4gICAgY29uc3Qgc2xpY2UgPSAoY2VsbCBhcyBhbnkpLmJlZ2luUGFyc2UoKTtcblxuICAgIC8vIGhlYWRlclxuXG4gICAgaWYgKHNsaWNlLmxvYWRVaW50KDIpLnRvTnVtYmVyKCkgIT09IDIpIHRocm93IEVycm9yKCdpbnZhbGlkIGhlYWRlcicpO1xuXG4gICAgY29uc3QgZXh0ZXJuYWxTb3VyY2VBZGRyZXNzID0gc2xpY2UubG9hZEFkZHJlc3MoKTtcbiAgICBpZiAoZXh0ZXJuYWxTb3VyY2VBZGRyZXNzICE9PSBudWxsKSB0aHJvdyBFcnJvcignaW52YWxpZCBleHRlcm5hbFNvdXJjZUFkZHJlc3MnKTtcblxuICAgIGNvbnN0IGV4dGVybmFsRGVzdEFkZHJlc3MgPSBzbGljZS5sb2FkQWRkcmVzcygpO1xuXG4gICAgY29uc3QgZXh0ZXJuYWxJbXBvcnRGZWUgPSBzbGljZS5sb2FkQ29pbnMoKTtcbiAgICBpZiAoIWV4dGVybmFsSW1wb3J0RmVlLmVxKG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBleHRlcm5hbEltcG9ydEZlZScpO1xuXG4gICAgLy8gc3RhdGVJbml0XG5cbiAgICBsZXQgcHVibGljS2V5O1xuICAgIGlmIChzbGljZS5sb2FkQml0KCkpIHtcbiAgICAgIGlmIChzbGljZS5sb2FkQml0KCkpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVJbml0ID0gc2xpY2UubG9hZFJlZigpO1xuICAgICAgICBzdGF0ZUluaXQubG9hZFJlZigpO1xuICAgICAgICBjb25zdCBkYXRhID0gc3RhdGVJbml0LmxvYWRSZWYoKTtcbiAgICAgICAgY29uc3Qgc2Vxbm8gPSBkYXRhLmxvYWRVaW50KDMyKS50b051bWJlcigpO1xuICAgICAgICBpZiAoc2Vxbm8gIT09IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZXFubycpO1xuICAgICAgICBjb25zdCB3YWxsZXRJZCA9IGRhdGEubG9hZFVpbnQoMzIpLnRvTnVtYmVyKCk7XG4gICAgICAgIGlmICh3YWxsZXRJZCAhPT0gV0FMTEVUX0lEKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0IGlkJyk7XG4gICAgICAgIGNvbnN0IHB1YmxpY0tleUJ1ZiA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwdWJsaWNLZXlCdWYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBwdWJsaWNLZXlCdWZbaV0gPSBkYXRhLmxvYWRVaW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHB1YmxpY0tleUJ1ZikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGJvZHlcbiAgICBjb25zdCBib2R5U2xpY2UgPSBzbGljZS5sb2FkQml0KCkgPyBzbGljZS5sb2FkUmVmKCkgOiBzbGljZTtcblxuICAgIHJldHVybiB7XG4gICAgICBmcm9tQWRkcmVzczogZXh0ZXJuYWxEZXN0QWRkcmVzcy50b1N0cmluZyh0cnVlLCB0cnVlLCB0aGlzLmZyb21BZGRyZXNzQm91bmNlYWJsZSksXG4gICAgICBwdWJsaWNLZXksXG4gICAgICAuLi50aGlzLnBhcnNlVHJhbnNhY3Rpb25Cb2R5KGJvZHlTbGljZSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFuc2FjdGlvbkJvZHkoc2xpY2U6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20oc2xpY2UubG9hZEJpdHMoNTEyKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIHNpZ25pbmcgbWVzc2FnZVxuXG4gICAgY29uc3Qgd2FsbGV0SWQgPSBzbGljZS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICBpZiAod2FsbGV0SWQgIT09IFdBTExFVF9JRCAmJiB3YWxsZXRJZCAhPT0gVkVTVElOR19DT05UUkFDVF9XQUxMRVRfSUQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXRJZCcpO1xuXG4gICAgY29uc3QgZXhwaXJlQXQgPSBzbGljZS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcblxuICAgIGNvbnN0IHNlcW5vID0gc2xpY2UubG9hZFVpbnQoMzIpLnRvTnVtYmVyKCk7XG5cbiAgICBjb25zdCBvcCA9IHNsaWNlLmxvYWRVaW50KDgpLnRvTnVtYmVyKCk7XG4gICAgaWYgKG9wICE9PSAzKSB7XG4gICAgICBpZiAob3AgIT09IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBvcCcpO1xuXG4gICAgICBjb25zdCBzZW5kTW9kZSA9IHNsaWNlLmxvYWRVaW50KDgpLnRvTnVtYmVyKCk7XG4gICAgICBpZiAoc2VuZE1vZGUgIT09IDMpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZW5kTW9kZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzVjNDb250cmFjdE1lc3NhZ2UgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBvcmRlciA9IHNsaWNlLmxvYWRSZWYoKTtcblxuICAgIGlmIChvcmRlci5sb2FkQml0KCkpIHRocm93IEVycm9yKCdpbnZhbGlkIGludGVybmFsIGhlYWRlcicpO1xuICAgIGlmICghb3JkZXIubG9hZEJpdCgpKSB0aHJvdyBFcnJvcignaW52YWxpZCBpaHJEaXNhYmxlZCcpO1xuICAgIGNvbnN0IGJvdW5jZSA9IG9yZGVyLmxvYWRCaXQoKTtcbiAgICBpZiAob3JkZXIubG9hZEJpdCgpKSB0aHJvdyBFcnJvcignaW52YWxpZCBib3VuY2VkJyk7XG4gICAgY29uc3Qgc291cmNlQWRkcmVzcyA9IG9yZGVyLmxvYWRBZGRyZXNzKCk7XG4gICAgaWYgKHNvdXJjZUFkZHJlc3MgIT09IG51bGwpIHRocm93IEVycm9yKCdpbnZhbGlkIGV4dGVybmFsU291cmNlQWRkcmVzcycpO1xuICAgIGNvbnN0IGRlc3RBZGRyZXNzID0gb3JkZXIubG9hZEFkZHJlc3MoKTtcbiAgICBjb25zdCB2YWx1ZSA9IG9yZGVyLmxvYWRDb2lucygpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAob3JkZXIubG9hZEJpdCgpKSB0aHJvdyBFcnJvcignaW52YWxpZCBjdXJyZW5jeUNvbGxlY3Rpb24nKTtcbiAgICBjb25zdCBpaHJGZWVzID0gb3JkZXIubG9hZENvaW5zKCk7XG4gICAgaWYgKCFpaHJGZWVzLmVxKG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpaHJGZWVzJyk7XG4gICAgY29uc3QgZndkRmVlcyA9IG9yZGVyLmxvYWRDb2lucygpO1xuICAgIGlmICghZndkRmVlcy5lcShuZXcgQk4oMCkpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZndkRmVlcycpO1xuICAgIGNvbnN0IGNyZWF0ZWRMdCA9IG9yZGVyLmxvYWRVaW50KDY0KTtcbiAgICBpZiAoIWNyZWF0ZWRMdC5lcShuZXcgQk4oMCkpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY3JlYXRlZEx0Jyk7XG4gICAgY29uc3QgY3JlYXRlZEF0ID0gb3JkZXIubG9hZFVpbnQoMzIpO1xuICAgIGlmICghY3JlYXRlZEF0LmVxKG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjcmVhdGVkQXQnKTtcblxuICAgIC8vIG9yZGVyIHN0YXRlSW5pdFxuICAgIGlmIChvcmRlci5sb2FkQml0KCkpIHtcbiAgICAgIG9yZGVyLmxvYWRSZWYoKTsgLy8gZG9uJ3QgcGFyc2Ugc3RhdGVJbml0XG4gICAgfVxuXG4gICAgLy8gb3JkZXIgYm9keVxuICAgIGxldCBwYXlsb2FkO1xuICAgIGxldCB3aXRoZHJhd0Ftb3VudDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIGlmIChvcmRlci5nZXRGcmVlQml0cygpID4gMCkge1xuICAgICAgaWYgKG9yZGVyLmxvYWRCaXQoKSkge1xuICAgICAgICBvcmRlciA9IG9yZGVyLmxvYWRSZWYoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9yZGVyLmdldEZyZWVCaXRzKCkgPiAzMikge1xuICAgICAgICBjb25zdCBvcGNvZGUgPSBvcmRlci5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICAgICAgaWYgKG9wY29kZSA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHBheWxvYWRCeXRlcyA9IG9yZGVyLmxvYWRCaXRzKG9yZGVyLmdldEZyZWVCaXRzKCkpO1xuICAgICAgICAgIHBheWxvYWQgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZEJ5dGVzKTtcbiAgICAgICAgICBpZiAocGF5bG9hZCA9PT0gJ0RlcG9zaXQnKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5Ub25XaGFsZXNWZXN0aW5nRGVwb3NpdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWQgPT09ICdXaXRoZHJhdycpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLlRvbldoYWxlc1Zlc3RpbmdXaXRoZHJhd2FsO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCA9PT0gU0lOR0xFX05PTUlOQVRPUl9XSVRIRFJBV19BTExfQ09NTUVOVCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2luZ2xlTm9taW5hdG9yV2l0aGRyYXc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wY29kZSA9PT0gNDA5Nikge1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5SWQgPSBvcmRlci5sb2FkVWludCg2NCkudG9OdW1iZXIoKTtcbiAgICAgICAgICB3aXRoZHJhd0Ftb3VudCA9IG9yZGVyLmxvYWRDb2lucygpLnRvTnVtYmVyKCkudG9TdHJpbmcoKTtcbiAgICAgICAgICBwYXlsb2FkID0gV0lUSERSQVdfT1BDT0RFICsgcXVlcnlJZC50b1N0cmluZygxNikucGFkU3RhcnQoMTYsICcwJykgKyB3aXRoZHJhd0Ftb3VudDtcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVOb21pbmF0b3JXaXRoZHJhdztcbiAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IEpFVFRPTl9UUkFOU0ZFUl9PUENPREUpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW47XG4gICAgICAgICAgY29uc3QgcXVlcnlJZCA9IG9yZGVyLmxvYWRVaW50KDY0KS50b051bWJlcigpO1xuICAgICAgICAgIGlmIChxdWVyeUlkICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcXVlcnlJZCBmb3IgamV0dG9uIHRyYW5zZmVyJyk7XG5cbiAgICAgICAgICBjb25zdCBqZXR0b25BbW91bnQgPSBvcmRlci5sb2FkQ29pbnMoKTtcbiAgICAgICAgICBpZiAoIWpldHRvbkFtb3VudC5ndChuZXcgQk4oMCkpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgamV0dG9uQW1vdW50Jyk7XG5cbiAgICAgICAgICBjb25zdCBqZXR0b25SZWNpcGllbnQgPSBvcmRlci5sb2FkQWRkcmVzcygpO1xuICAgICAgICAgIGlmICghamV0dG9uUmVjaXBpZW50KSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgamV0dG9uUmVjaXBpZW50Jyk7XG5cbiAgICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gb3JkZXIubG9hZEFkZHJlc3MoKTtcbiAgICAgICAgICBpZiAoIWZvcndhcmRlckFkZHJlc3MpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmb3J3YXJkZXJBZGRyZXNzJyk7XG5cbiAgICAgICAgICBvcmRlci5sb2FkQml0KCk7IC8vIHNraXAgYml0XG5cbiAgICAgICAgICBjb25zdCBmb3J3YXJkVG9uQW1vdW50ID0gb3JkZXIubG9hZENvaW5zKCk7XG4gICAgICAgICAgaWYgKCFmb3J3YXJkVG9uQW1vdW50Lmd0KG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmb3J3YXJkVG9uQW1vdW50Jyk7XG5cbiAgICAgICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgICAgIGlmIChvcmRlci5sb2FkQml0KCkpIHtcbiAgICAgICAgICAgIG9yZGVyID0gb3JkZXIubG9hZFJlZigpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZU9wY29kZSA9IG9yZGVyLmxvYWRVaW50KDMyKS50b051bWJlcigpO1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2VPcGNvZGUgIT09IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtZXNzYWdlIG9wY29kZScpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUJ5dGVzID0gb3JkZXIubG9hZEJpdHMob3JkZXIuZ2V0RnJlZUJpdHMoKSk7XG4gICAgICAgICAgICBtZXNzYWdlID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG1lc3NhZ2VCeXRlcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGpldHRvbkFtb3VudDogamV0dG9uQW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBqZXR0b25SZWNpcGllbnQ6IGpldHRvblJlY2lwaWVudC50b1N0cmluZyh0cnVlLCB0cnVlLCB0aGlzLnRvQWRkcmVzc0JvdW5jZWFibGUpLFxuICAgICAgICAgICAgZm9yd2FyZGVyQWRkcmVzczogZm9yd2FyZGVyQWRkcmVzcy50b1N0cmluZyh0cnVlLCB0cnVlLCB0aGlzLmZyb21BZGRyZXNzQm91bmNlYWJsZSksXG4gICAgICAgICAgICBmb3J3YXJkVG9uQW1vdW50OiBmb3J3YXJkVG9uQW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09PSBwYXJzZUludChUT05fV0hBTEVTX0RFUE9TSVRfT1BDT0RFLCAxMCkpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5Ub25XaGFsZXNEZXBvc2l0O1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5SWQgPSBvcmRlci5sb2FkVWludCg2NCkudG9OdW1iZXIoKTtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBnYXMgbGltaXQsIHdoaWNoIG11c3QgYmUgcmVhZCB0byBhZHZhbmNlIHRoZSBjdXJzb3JcbiAgICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0byBzdG9yZSBpdFxuICAgICAgICAgIG9yZGVyLmxvYWRDb2lucygpO1xuICAgICAgICAgIHBheWxvYWQgPSBUT05fV0hBTEVTX0RFUE9TSVRfT1BDT0RFICsgcXVlcnlJZC50b1N0cmluZygxNikucGFkU3RhcnQoMTYsICcwJyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09PSBwYXJzZUludChUT05fV0hBTEVTX1dJVEhEUkFXX09QQ09ERSwgMTApKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuVG9uV2hhbGVzV2l0aGRyYXdhbDtcblxuICAgICAgICAgIGNvbnN0IHF1ZXJ5SWQgPSBvcmRlci5sb2FkVWludCg2NCkudG9OdW1iZXIoKTtcbiAgICAgICAgICBvcmRlci5sb2FkQ29pbnMoKTsgLy8gU2tpcCBHYXMgKEhhcmRjb2RlZCBpbiBidWlsZGVyKVxuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IG9yZGVyLmxvYWRDb2lucygpO1xuXG4gICAgICAgICAgd2l0aGRyYXdBbW91bnQgPSBhbW91bnQudG9TdHJpbmcoKTsgLy8gRGVjaW1hbCBTdHJpbmdcblxuICAgICAgICAgIC8vIFJlY29uc3RydWN0IFBheWxvYWQ6IERlY2ltYWwgT3AgKyBIZXggUXVlcnkgKyBEZWNpbWFsIEFtb3VudFxuICAgICAgICAgIGNvbnN0IHF1ZXJ5SGV4ID0gbmV3IEJOKHF1ZXJ5SWQpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgxNiwgJzAnKTtcbiAgICAgICAgICBwYXlsb2FkID0gVE9OX1dIQUxFU19XSVRIRFJBV19PUENPREUgKyBxdWVyeUhleCArIHdpdGhkcmF3QW1vdW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBheWxvYWQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdG9BZGRyZXNzOiBkZXN0QWRkcmVzcy50b1N0cmluZyh0cnVlLCB0cnVlLCB0aGlzLmZyb21BZGRyZXNzQm91bmNlYWJsZSksXG4gICAgICB2YWx1ZSxcbiAgICAgIGJvdW5jZSxcbiAgICAgIHNlcW5vLFxuICAgICAgd2l0aGRyYXdBbW91bnQsXG4gICAgICBleHBpcmVBdCxcbiAgICAgIHBheWxvYWQsXG4gICAgICBzaWduYXR1cmUsXG4gICAgICB3YWxsZXRJZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVRyYW5zZmVyU3RhdGVJbml0KHNsaWNlOiBhbnkpOiBhbnkge1xuICAgIGlmIChzbGljZSA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgIHNsaWNlLmxvYWRSZWYoKTtcbiAgICBjb25zdCBkYXRhID0gc2xpY2UubG9hZFJlZigpO1xuICAgIGNvbnN0IHNlcW5vID0gZGF0YS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICBpZiAoc2Vxbm8gIT09IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZXFubycpO1xuICAgIGNvbnN0IHdhbGxldElkID0gZGF0YS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICBpZiAod2FsbGV0SWQgIT09IFdBTExFVF9JRCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldCBpZCcpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHB1YmxpY0tleS5sZW5ndGg7IGkrKykge1xuICAgICAgcHVibGljS2V5W2ldID0gZGF0YS5sb2FkVWludCg4KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YmxpY0tleTogQnVmZmVyLmZyb20ocHVibGljS2V5KS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,8 +1,8 @@
1
- /// <reference types="node" />
2
- import { BaseAddress, BaseKey, BaseTransactionBuilder, FeeOptions, PublicKey as BasePublicKey, TransactionType } from '@bitgo-beta/sdk-core';
3
- import { Transaction } from './transaction';
4
1
  import BigNumber from 'bignumber.js';
5
2
  import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { BaseAddress, BaseKey, BaseTransactionBuilder, FeeOptions, PublicKey as BasePublicKey, TransactionType } from '@bitgo-beta/sdk-core';
4
+ import { Transaction } from './transaction';
5
+ export declare const WITHDRAW_OPCODE = "00001000";
6
6
  export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
7
7
  protected _transaction: Transaction;
8
8
  private _signatures;
@@ -27,6 +27,27 @@ export declare abstract class TransactionBuilder extends BaseTransactionBuilder
27
27
  * @returns {TransactionBuilder} This transaction builder
28
28
  */
29
29
  sender(senderAddress: string): this;
30
+ /**
31
+ * Sets the transaction to be bounceable or not.
32
+ *
33
+ * @param {string} bounceable whether the transaction can be bounced
34
+ * @returns {TransactionBuilder} This transaction builder
35
+ */
36
+ bounceable(bounceable: boolean): this;
37
+ /**
38
+ * Sets the fromAddress to be in bounceable format or not.
39
+ *
40
+ * @param {string} bounceable whether the address format is bounceable
41
+ * @returns {TransactionBuilder} This transaction builder
42
+ */
43
+ fromAddressBounceable(bounceable: boolean): this;
44
+ /**
45
+ * Sets the toAddress to be in bounceable format or not.
46
+ *
47
+ * @param {string} bounceable whether the address format is bounceable
48
+ * @returns {TransactionBuilder} This transaction builder
49
+ */
50
+ toAddressBounceable(bounceable: boolean): this;
30
51
  fee(feeOptions: FeeOptions): this;
31
52
  /** @inheritdoc */
32
53
  protected fromImplementation(rawTransaction: string): Transaction;
@@ -43,8 +64,11 @@ export declare abstract class TransactionBuilder extends BaseTransactionBuilder
43
64
  /** @inheritdoc */
44
65
  validateValue(value: BigNumber): void;
45
66
  setMessage(msg: string): TransactionBuilder;
67
+ setWithdrawMessage(): TransactionBuilder;
46
68
  sequenceNumber(number: number): TransactionBuilder;
47
69
  expireTime(number: number): TransactionBuilder;
48
70
  publicKey(key: string): TransactionBuilder;
71
+ isV3ContractMessage(bool: boolean): TransactionBuilder;
72
+ subWalletId(id: number): TransactionBuilder;
49
73
  }
50
74
  //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAEtB,UAAU,EACV,SAAS,IAAI,aAAa,EAE1B,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,OAAO,CAAC,WAAW,CAAmB;gBAE1B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM5C;;OAEG;IACH,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAIvD,kBAAkB;IAClB,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/D;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAKnC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIjC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAKjE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAO3D,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAQpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAK3C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAKlD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAK9C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;CAI3C"}
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAEtB,UAAU,EACV,SAAS,IAAI,aAAa,EAE1B,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,OAAO,CAAC,WAAW,CAAmB;gBAE1B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C;;OAEG;IACH,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAIvD,kBAAkB;IAClB,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/D;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAKnC;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAKrC;;;;;OAKG;IACH,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAMhD;;;;;OAKG;IACH,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAU9C,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIjC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAMjE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAQ3D,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAQpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAK3C,kBAAkB,IAAI,kBAAkB;IAMxC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAKlD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAK9C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAK1C,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB;IAItD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB;CAI5C"}