@bitgo/sdk-coin-sui 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +20 -0
- package/LICENSE +191 -0
- package/README.md +30 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +16 -0
- package/dist/src/lib/iface.d.ts +22 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +3 -0
- package/dist/src/lib/index.d.ts +9 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +37 -0
- package/dist/src/lib/keyPair.d.ts +12 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +24 -0
- package/dist/src/lib/transaction.d.ts +65 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +289 -0
- package/dist/src/lib/transactionBuilder.d.ts +72 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +221 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +29 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +64 -0
- package/dist/src/lib/transferBuilder.d.ts +8 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +15 -0
- package/dist/src/lib/utils.d.ts +60 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +127 -0
- package/dist/src/sui.d.ts +28 -0
- package/dist/src/sui.d.ts.map +1 -0
- package/dist/src/sui.js +118 -0
- package/dist/src/tsui.d.ts +22 -0
- package/dist/src/tsui.d.ts.map +1 -0
- package/dist/src/tsui.js +30 -0
- package/package.json +56 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.Transaction = exports.TYPE_TAG = void 0;
|
|
26
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
27
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
28
|
+
const bcs_1 = require("@mysten/bcs");
|
|
29
|
+
const sha3 = __importStar(require("js-sha3"));
|
|
30
|
+
bcs_1.bcs
|
|
31
|
+
.registerVectorType('vector<u8>', 'u8')
|
|
32
|
+
.registerVectorType('vector<u64>', 'u64')
|
|
33
|
+
.registerVectorType('vector<u128>', 'u128')
|
|
34
|
+
.registerVectorType('vector<vector<u8>>', 'vector<u8>')
|
|
35
|
+
.registerAddressType('ObjectID', 20)
|
|
36
|
+
.registerAddressType('SuiAddress', 20)
|
|
37
|
+
.registerAddressType('address', 20)
|
|
38
|
+
.registerType('utf8string', (writer, str) => {
|
|
39
|
+
const bytes = Array.from(Buffer.from(str));
|
|
40
|
+
return writer.writeVec(bytes, (writer, el) => writer.write8(el));
|
|
41
|
+
}, (reader) => {
|
|
42
|
+
const bytes = reader.readVec((reader) => reader.read8());
|
|
43
|
+
return Buffer.from(bytes).toString('utf-8');
|
|
44
|
+
})
|
|
45
|
+
.registerType('ObjectDigest', (writer, str) => {
|
|
46
|
+
const bytes = Array.from(bcs_1.decodeStr(str, 'base64'));
|
|
47
|
+
return writer.writeVec(bytes, (writer, el) => writer.write8(el));
|
|
48
|
+
}, (reader) => {
|
|
49
|
+
const bytes = reader.readVec((reader) => reader.read8());
|
|
50
|
+
return bcs_1.encodeStr(new Uint8Array(bytes), 'base64');
|
|
51
|
+
});
|
|
52
|
+
bcs_1.bcs.registerStructType('SuiObjectRef', {
|
|
53
|
+
objectId: 'ObjectID',
|
|
54
|
+
version: 'u64',
|
|
55
|
+
digest: 'ObjectDigest',
|
|
56
|
+
});
|
|
57
|
+
bcs_1.bcs
|
|
58
|
+
.registerVectorType('vector<SuiAddress>', 'SuiAddress')
|
|
59
|
+
.registerVectorType('vector<SuiObjectRef>', 'SuiObjectRef')
|
|
60
|
+
.registerStructType('PayTx', {
|
|
61
|
+
coins: 'vector<SuiObjectRef>',
|
|
62
|
+
recipients: 'vector<SuiAddress>',
|
|
63
|
+
amounts: 'vector<u64>',
|
|
64
|
+
});
|
|
65
|
+
bcs_1.bcs.registerEnumType('Transaction', {
|
|
66
|
+
TransferObject: 'TransferObjectTx',
|
|
67
|
+
Publish: 'PublishTx',
|
|
68
|
+
Call: 'MoveCallTx',
|
|
69
|
+
TransferSui: 'TransferSuiTx',
|
|
70
|
+
Pay: 'PayTx',
|
|
71
|
+
});
|
|
72
|
+
bcs_1.bcs.registerVectorType('vector<Transaction>', 'Transaction').registerEnumType('TransactionKind', {
|
|
73
|
+
Single: 'Transaction',
|
|
74
|
+
Batch: 'vector<Transaction>',
|
|
75
|
+
});
|
|
76
|
+
bcs_1.bcs.registerStructType('TransactionData', {
|
|
77
|
+
kind: 'TransactionKind',
|
|
78
|
+
sender: 'SuiAddress',
|
|
79
|
+
gasPayment: 'SuiObjectRef',
|
|
80
|
+
gasPrice: 'u64',
|
|
81
|
+
gasBudget: 'u64',
|
|
82
|
+
});
|
|
83
|
+
bcs_1.bcs.registerStructType('SenderSignedData', {
|
|
84
|
+
data: 'TransactionData',
|
|
85
|
+
txSignature: 'vector<u8>',
|
|
86
|
+
});
|
|
87
|
+
const UNAVAILABLE_TEXT = 'UNAVAILABLE';
|
|
88
|
+
exports.TYPE_TAG = Array.from('TransactionData::').map((e) => e.charCodeAt(0));
|
|
89
|
+
class Transaction extends sdk_core_1.BaseTransaction {
|
|
90
|
+
constructor(_coinConfig) {
|
|
91
|
+
super(_coinConfig);
|
|
92
|
+
}
|
|
93
|
+
get suiTransaction() {
|
|
94
|
+
return this._suiTransaction;
|
|
95
|
+
}
|
|
96
|
+
setSuiTransaction(value) {
|
|
97
|
+
this._suiTransaction = value;
|
|
98
|
+
}
|
|
99
|
+
/** @inheritDoc **/
|
|
100
|
+
get id() {
|
|
101
|
+
return this._id || UNAVAILABLE_TEXT;
|
|
102
|
+
}
|
|
103
|
+
getInputCoins() {
|
|
104
|
+
return this.suiTransaction.payTx.coins;
|
|
105
|
+
}
|
|
106
|
+
/** @inheritdoc */
|
|
107
|
+
canSign(key) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
/** @inheritdoc */
|
|
111
|
+
toBroadcastFormat() {
|
|
112
|
+
if (!this._suiTransaction) {
|
|
113
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
114
|
+
}
|
|
115
|
+
return this.serialize();
|
|
116
|
+
}
|
|
117
|
+
/** @inheritdoc */
|
|
118
|
+
toJson() {
|
|
119
|
+
if (!this._suiTransaction) {
|
|
120
|
+
throw new sdk_core_1.ParseTransactionError('Empty transaction');
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
id: this._id,
|
|
124
|
+
gasBudget: this._suiTransaction.gasBudget,
|
|
125
|
+
gasPrice: this._suiTransaction.gasPrice,
|
|
126
|
+
payTx: this._suiTransaction.payTx,
|
|
127
|
+
sender: this._suiTransaction.sender,
|
|
128
|
+
gasPayment: this._suiTransaction.gasPayment,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** @inheritDoc */
|
|
132
|
+
explainTransaction() {
|
|
133
|
+
const result = this.toJson();
|
|
134
|
+
const displayOrder = ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'];
|
|
135
|
+
const outputs = [];
|
|
136
|
+
const explanationResult = {
|
|
137
|
+
displayOrder,
|
|
138
|
+
id: this.id,
|
|
139
|
+
outputs,
|
|
140
|
+
outputAmount: '0',
|
|
141
|
+
changeOutputs: [],
|
|
142
|
+
changeAmount: '0',
|
|
143
|
+
fee: { fee: this.suiTransaction.gasBudget.toString() },
|
|
144
|
+
type: this.type,
|
|
145
|
+
};
|
|
146
|
+
switch (this.type) {
|
|
147
|
+
case sdk_core_1.TransactionType.Send:
|
|
148
|
+
return this.explainTransferTransaction(result, explanationResult);
|
|
149
|
+
default:
|
|
150
|
+
throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Set the transaction type.
|
|
155
|
+
*
|
|
156
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
157
|
+
*/
|
|
158
|
+
transactionType(transactionType) {
|
|
159
|
+
this._type = transactionType;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Load the input and output data on this transaction.
|
|
163
|
+
*/
|
|
164
|
+
loadInputsAndOutputs() {
|
|
165
|
+
if (!this.suiTransaction) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const tx = this.suiTransaction;
|
|
169
|
+
const payTx = tx.payTx;
|
|
170
|
+
const recipients = payTx.recipients;
|
|
171
|
+
const amounts = payTx.amounts;
|
|
172
|
+
if (recipients.length !== amounts.length) {
|
|
173
|
+
throw new Error('The length of recipients does not equal to the length of amounts');
|
|
174
|
+
}
|
|
175
|
+
const outputs = recipients.map((recipient, index) => ({
|
|
176
|
+
address: recipient,
|
|
177
|
+
value: amounts[index].toString(),
|
|
178
|
+
coin: this._coinConfig.name,
|
|
179
|
+
}));
|
|
180
|
+
const totalAmount = amounts.reduce((accumulator, current) => accumulator + current, 0);
|
|
181
|
+
this._inputs = [
|
|
182
|
+
{
|
|
183
|
+
address: tx.sender,
|
|
184
|
+
value: totalAmount.toString(),
|
|
185
|
+
coin: this._coinConfig.name,
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
this._outputs = outputs;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Sets this transaction payload
|
|
192
|
+
*
|
|
193
|
+
* @param rawTransaction
|
|
194
|
+
*/
|
|
195
|
+
fromRawTransaction(rawTransaction) {
|
|
196
|
+
try {
|
|
197
|
+
utils_1.default.isValidRawTransaction(rawTransaction);
|
|
198
|
+
this._suiTransaction = Transaction.deserializeSuiTransaction(rawTransaction);
|
|
199
|
+
this._type = sdk_core_1.TransactionType.Send;
|
|
200
|
+
this.loadInputsAndOutputs();
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
throw e;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
serialize() {
|
|
207
|
+
const suiTx = this._suiTransaction;
|
|
208
|
+
const txData = {
|
|
209
|
+
kind: { Single: { Pay: suiTx.payTx } },
|
|
210
|
+
gasPayment: suiTx.gasPayment,
|
|
211
|
+
gasPrice: suiTx.gasPrice,
|
|
212
|
+
gasBudget: suiTx.gasBudget,
|
|
213
|
+
sender: suiTx.sender,
|
|
214
|
+
};
|
|
215
|
+
const dataBytes = bcs_1.bcs.ser('TransactionData', txData).toBytes();
|
|
216
|
+
const serialized = new Uint8Array(exports.TYPE_TAG.length + dataBytes.length);
|
|
217
|
+
serialized.set(exports.TYPE_TAG);
|
|
218
|
+
serialized.set(dataBytes, exports.TYPE_TAG.length);
|
|
219
|
+
if (this.signature.length > 0) {
|
|
220
|
+
const scheme = new Uint8Array([0x00]);
|
|
221
|
+
const signatureBuffer = Buffer.concat([
|
|
222
|
+
scheme,
|
|
223
|
+
Buffer.from(this._signature, 'hex'),
|
|
224
|
+
Buffer.from(this._publicKey, 'hex'),
|
|
225
|
+
]);
|
|
226
|
+
const signedTx = {
|
|
227
|
+
data: txData,
|
|
228
|
+
txSignature: signatureBuffer,
|
|
229
|
+
};
|
|
230
|
+
const serialized = bcs_1.bcs.ser('SenderSignedData', signedTx).toBytes();
|
|
231
|
+
const typeTag = Array.from('SenderSignedData::').map((e) => e.charCodeAt(0));
|
|
232
|
+
const serializedFinal = new Uint8Array(typeTag.length + serialized.length);
|
|
233
|
+
serializedFinal.set(typeTag);
|
|
234
|
+
serializedFinal.set(serialized, typeTag.length);
|
|
235
|
+
this._id = Buffer.from(sha3.sha3_256(serializedFinal), 'hex').toString('base64');
|
|
236
|
+
}
|
|
237
|
+
return Buffer.from(serialized).toString('hex');
|
|
238
|
+
}
|
|
239
|
+
static deserializeSuiTransaction(serializedHex) {
|
|
240
|
+
const data = Buffer.from(serializedHex, 'hex');
|
|
241
|
+
const trimmedData = new Uint8Array(data.subarray(exports.TYPE_TAG.length));
|
|
242
|
+
const k = bcs_1.bcs.de('TransactionData', trimmedData);
|
|
243
|
+
this.updateProperTransactionData(k);
|
|
244
|
+
return {
|
|
245
|
+
sender: k.sender,
|
|
246
|
+
payTx: k.kind.Single.Pay,
|
|
247
|
+
gasBudget: k.gasBudget.toNumber(),
|
|
248
|
+
gasPrice: k.gasPrice.toNumber(),
|
|
249
|
+
gasPayment: k.gasPayment,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
static updateProperTransactionData(k) {
|
|
253
|
+
// bcs deserialized number into Big Number and removed '0x' prefix from addresses, needs to convert them back
|
|
254
|
+
k.kind.Single.Pay.amounts = k.kind.Single.Pay.amounts.map((amount) => amount.toNumber());
|
|
255
|
+
k.kind.Single.Pay.coins = k.kind.Single.Pay.coins.map((coin) => {
|
|
256
|
+
return {
|
|
257
|
+
objectId: utils_1.default.normalizeHexId(coin.objectId),
|
|
258
|
+
version: coin.version.toNumber(),
|
|
259
|
+
digest: coin.digest,
|
|
260
|
+
};
|
|
261
|
+
});
|
|
262
|
+
k.kind.Single.Pay.recipients = k.kind.Single.Pay.recipients.map((recipient) => utils_1.default.normalizeHexId(recipient));
|
|
263
|
+
k.gasPayment.objectId = utils_1.default.normalizeHexId(k.gasPayment.objectId);
|
|
264
|
+
k.gasPayment.version = k.gasPayment.version.toNumber();
|
|
265
|
+
k.sender = utils_1.default.normalizeHexId(k.sender);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Returns a complete explanation for a transfer transaction
|
|
269
|
+
* @param {TxData} json The transaction data in json format
|
|
270
|
+
* @param {TransactionExplanation} explanationResult The transaction explanation to be completed
|
|
271
|
+
* @returns {TransactionExplanation}
|
|
272
|
+
*/
|
|
273
|
+
explainTransferTransaction(json, explanationResult) {
|
|
274
|
+
const recipients = this.suiTransaction.payTx.recipients;
|
|
275
|
+
const amounts = this.suiTransaction.payTx.amounts;
|
|
276
|
+
const outputs = recipients.map((recipient, index) => ({
|
|
277
|
+
address: recipient,
|
|
278
|
+
amount: amounts[index].toString(),
|
|
279
|
+
}));
|
|
280
|
+
const outputAmount = amounts.reduce((accumulator, current) => accumulator + current, 0);
|
|
281
|
+
return {
|
|
282
|
+
...explanationResult,
|
|
283
|
+
outputAmount,
|
|
284
|
+
outputs,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
exports.Transaction = Transaction;
|
|
289
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FReUI7QUFHekIsb0RBQTRCO0FBQzVCLHFDQUF3RDtBQUN4RCw4Q0FBZ0M7QUFFaEMsU0FBRztLQUNBLGtCQUFrQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7S0FDdEMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztLQUN4QyxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO0tBQzFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQztLQUN0RCxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO0tBQ25DLG1CQUFtQixDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7S0FDckMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztLQUNsQyxZQUFZLENBQ1gsWUFBWSxFQUNaLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0lBQ2QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNuRSxDQUFDLEVBQ0QsQ0FBQyxNQUFNLEVBQUUsRUFBRTtJQUNULE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMs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QyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2RCxDQUFDLENBQUMsTUFBTSxHQUFHLGVBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILDBCQUEwQixDQUFDLElBQVksRUFBRSxpQkFBeUM7UUFDaEYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUVsRCxNQUFNLE9BQU8sR0FBMkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUUsT0FBTyxFQUFFLFNBQVM7WUFDbEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUU7U0FDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV4RixPQUFPO1lBQ0wsR0FBRyxpQkFBaUI7WUFDcEIsWUFBWTtZQUNaLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBbE9ELGtDQWtPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBQYXlUeCwgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgYmNzLCBkZWNvZGVTdHIsIGVuY29kZVN0ciB9IGZyb20gJ0BteXN0ZW4vYmNzJztcbmltcG9ydCAqIGFzIHNoYTMgZnJvbSAnanMtc2hhMyc7XG5cbmJjc1xuICAucmVnaXN0ZXJWZWN0b3JUeXBlKCd2ZWN0b3I8dTg+JywgJ3U4JylcbiAgLnJlZ2lzdGVyVmVjdG9yVHlwZSgndmVjdG9yPHU2ND4nLCAndTY0JylcbiAgLnJlZ2lzdGVyVmVjdG9yVHlwZSgndmVjdG9yPHUxMjg+JywgJ3UxMjgnKVxuICAucmVnaXN0ZXJWZWN0b3JUeXBlKCd2ZWN0b3I8dmVjdG9yPHU4Pj4nLCAndmVjdG9yPHU4PicpXG4gIC5yZWdpc3RlckFkZHJlc3NUeXBlKCdPYmplY3RJRCcsIDIwKVxuICAucmVnaXN0ZXJBZGRyZXNzVHlwZSgnU3VpQWRkcmVzcycsIDIwKVxuICAucmVnaXN0ZXJBZGRyZXNzVHlwZSgnYWRkcmVzcycsIDIwKVxuICAucmVnaXN0ZXJUeXBlKFxuICAgICd1dGY4c3RyaW5nJyxcbiAgICAod3JpdGVyLCBzdHIpID0+IHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gQXJyYXkuZnJvbShCdWZmZXIuZnJvbShzdHIpKTtcbiAgICAgIHJldHVybiB3cml0ZXIud3JpdGVWZWMoYnl0ZXMsICh3cml0ZXIsIGVsKSA9PiB3cml0ZXIud3JpdGU4KGVsKSk7XG4gICAgfSxcbiAgICAocmVhZGVyKSA9PiB7XG4gICAgICBjb25zdCBieXRlcyA9IHJlYWRlci5yZWFkVmVjKChyZWFkZXIpID0+IHJlYWRlci5yZWFkOCgpKTtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShieXRlcykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgfVxuICApXG4gIC5yZWdpc3RlclR5cGUoXG4gICAgJ09iamVjdERpZ2VzdCcsXG4gICAgKHdyaXRlciwgc3RyKSA9PiB7XG4gICAgICBjb25zdCBieXRlcyA9IEFycmF5LmZyb20oZGVjb2RlU3RyKHN0ciwgJ2Jhc2U2NCcpKTtcbiAgICAgIHJldHVybiB3cml0ZXIud3JpdGVWZWMoYnl0ZXMsICh3cml0ZXIsIGVsKSA9PiB3cml0ZXIud3JpdGU4KGVsKSk7XG4gICAgfSxcbiAgICAocmVhZGVyKSA9PiB7XG4gICAgICBjb25zdCBieXRlcyA9IHJlYWRlci5yZWFkVmVjKChyZWFkZXIpID0+IHJlYWRlci5yZWFkOCgpKTtcbiAgICAgIHJldHVybiBlbmNvZGVTdHIobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpLCAnYmFzZTY0Jyk7XG4gICAgfVxuICApO1xuXG5iY3MucmVnaXN0ZXJTdHJ1Y3RUeXBlKCdTdWlPYmplY3RSZWYnLCB7XG4gIG9iamVjdElkOiAnT2JqZWN0SUQnLFxuICB2ZXJzaW9uOiAndTY0JyxcbiAgZGlnZXN0OiAnT2JqZWN0RGlnZXN0Jyxcbn0pO1xuXG5iY3NcbiAgLnJlZ2lzdGVyVmVjdG9yVHlwZSgndmVjdG9yPFN1aUFkZHJlc3M+JywgJ1N1aUFkZHJlc3MnKVxuICAucmVnaXN0ZXJWZWN0b3JUeXBlKCd2ZWN0b3I8U3VpT2JqZWN0UmVmPicsICdTdWlPYmplY3RSZWYnKVxuICAucmVnaXN0ZXJTdHJ1Y3RUeXBlKCdQYXlUeCcsIHtcbiAgICBjb2luczogJ3ZlY3RvcjxTdWlPYmplY3RSZWY+JyxcbiAgICByZWNpcGllbnRzOiAndmVjdG9yPFN1aUFkZHJlc3M+JyxcbiAgICBhbW91bnRzOiAndmVjdG9yPHU2ND4nLFxuICB9KTtcblxuYmNzLnJlZ2lzdGVyRW51bVR5cGUoJ1RyYW5zYWN0aW9uJywge1xuICBUcmFuc2Zlck9iamVjdDogJ1RyYW5zZmVyT2JqZWN0VHgnLFxuICBQdWJsaXNoOiAnUHVibGlzaFR4JyxcbiAgQ2FsbDogJ01vdmVDYWxsVHgnLFxuICBUcmFuc2ZlclN1aTogJ1RyYW5zZmVyU3VpVHgnLFxuICBQYXk6ICdQYXlUeCcsXG59KTtcblxuYmNzLnJlZ2lzdGVyVmVjdG9yVHlwZSgndmVjdG9yPFRyYW5zYWN0aW9uPicsICdUcmFuc2FjdGlvbicpLnJlZ2lzdGVyRW51bVR5cGUoJ1RyYW5zYWN0aW9uS2luZCcsIHtcbiAgU2luZ2xlOiAnVHJhbnNhY3Rpb24nLFxuICBCYXRjaDogJ3ZlY3RvcjxUcmFuc2FjdGlvbj4nLFxufSk7XG5cbmJjcy5yZWdpc3RlclN0cnVjdFR5cGUoJ1RyYW5zYWN0aW9uRGF0YScsIHtcbiAga2luZDogJ1RyYW5zYWN0aW9uS2luZCcsXG4gIHNlbmRlcjogJ1N1aUFkZHJlc3MnLFxuICBnYXNQYXltZW50OiAnU3VpT2JqZWN0UmVmJyxcbiAgZ2FzUHJpY2U6ICd1NjQnLFxuICBnYXNCdWRnZXQ6ICd1NjQnLFxufSk7XG5cbmJjcy5yZWdpc3RlclN0cnVjdFR5cGUoJ1NlbmRlclNpZ25lZERhdGEnLCB7XG4gIGRhdGE6ICdUcmFuc2FjdGlvbkRhdGEnLFxuICB0eFNpZ25hdHVyZTogJ3ZlY3Rvcjx1OD4nLFxufSk7XG5cbmNvbnN0IFVOQVZBSUxBQkxFX1RFWFQgPSAnVU5BVkFJTEFCTEUnO1xuZXhwb3J0IGNvbnN0IFRZUEVfVEFHID0gQXJyYXkuZnJvbSgnVHJhbnNhY3Rpb25EYXRhOjonKS5tYXAoKGUpID0+IGUuY2hhckNvZGVBdCgwKSk7XG5cbmV4cG9ydCB0eXBlIFN1aU9iamVjdFJlZiA9IHtcbiAgLyoqIEhleCBjb2RlIGFzIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9iamVjdCBpZCAqL1xuICBvYmplY3RJZDogc3RyaW5nO1xuICAvKiogT2JqZWN0IHZlcnNpb24gKi9cbiAgdmVyc2lvbjogbnVtYmVyO1xuICAvKiogQmFzZTY0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9iamVjdCBkaWdlc3QgKi9cbiAgZGlnZXN0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTdWlUcmFuc2FjdGlvbiA9IHtcbiAgc2VuZGVyOiBzdHJpbmc7XG4gIHBheVR4OiBQYXlUeDtcbiAgZ2FzQnVkZ2V0OiBudW1iZXI7XG4gIGdhc1ByaWNlOiBudW1iZXI7XG4gIGdhc1BheW1lbnQ6IFN1aU9iamVjdFJlZjtcbn07XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX3N1aVRyYW5zYWN0aW9uOiBTdWlUcmFuc2FjdGlvbjtcbiAgcHJpdmF0ZSBfc2lnbmF0dXJlO1xuICBwcml2YXRlIF9wdWJsaWNLZXk7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHN1aVRyYW5zYWN0aW9uKCk6IFN1aVRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc3VpVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXRTdWlUcmFuc2FjdGlvbih2YWx1ZTogU3VpVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9zdWlUcmFuc2FjdGlvbiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICoqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQgfHwgVU5BVkFJTEFCTEVfVEVYVDtcbiAgfVxuXG4gIGdldElucHV0Q29pbnMoKTogU3VpT2JqZWN0UmVmW10ge1xuICAgIHJldHVybiB0aGlzLnN1aVRyYW5zYWN0aW9uLnBheVR4LmNvaW5zO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3N1aVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5fc3VpVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgIGdhc0J1ZGdldDogdGhpcy5fc3VpVHJhbnNhY3Rpb24uZ2FzQnVkZ2V0LFxuICAgICAgZ2FzUHJpY2U6IHRoaXMuX3N1aVRyYW5zYWN0aW9uLmdhc1ByaWNlLFxuICAgICAgcGF5VHg6IHRoaXMuX3N1aVRyYW5zYWN0aW9uLnBheVR4LFxuICAgICAgc2VuZGVyOiB0aGlzLl9zdWlUcmFuc2FjdGlvbi5zZW5kZXIsXG4gICAgICBnYXNQYXltZW50OiB0aGlzLl9zdWlUcmFuc2FjdGlvbi5nYXNQYXltZW50LFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvdXRwdXRzLFxuICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgZmVlOiB7IGZlZTogdGhpcy5zdWlUcmFuc2FjdGlvbi5nYXNCdWRnZXQudG9TdHJpbmcoKSB9LFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblRyYW5zZmVyVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0LlxuICAgKi9cbiAgdHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdWlUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHR4ID0gdGhpcy5zdWlUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBwYXlUeCA9IHR4LnBheVR4O1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBwYXlUeC5yZWNpcGllbnRzO1xuICAgIGNvbnN0IGFtb3VudHMgPSBwYXlUeC5hbW91bnRzO1xuICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCAhPT0gYW1vdW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGxlbmd0aCBvZiByZWNpcGllbnRzIGRvZXMgbm90IGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgYW1vdW50cycpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHM6IEVudHJ5W10gPSByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50LCBpbmRleCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHJlY2lwaWVudCxcbiAgICAgIHZhbHVlOiBhbW91bnRzW2luZGV4XS50b1N0cmluZygpLFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHRvdGFsQW1vdW50ID0gYW1vdW50cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvciArIGN1cnJlbnQsIDApO1xuICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdHguc2VuZGVyLFxuICAgICAgICB2YWx1ZTogdG90YWxBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICAgIHRoaXMuX291dHB1dHMgPSBvdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhpcyB0cmFuc2FjdGlvbiBwYXlsb2FkXG4gICAqXG4gICAqIEBwYXJhbSByYXdUcmFuc2FjdGlvblxuICAgKi9cbiAgZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICAgIHRoaXMuX3N1aVRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb24uZGVzZXJpYWxpemVTdWlUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICB0aGlzLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWlUeCA9IHRoaXMuX3N1aVRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHR4RGF0YSA9IHtcbiAgICAgIGtpbmQ6IHsgU2luZ2xlOiB7IFBheTogc3VpVHgucGF5VHggfSB9LFxuICAgICAgZ2FzUGF5bWVudDogc3VpVHguZ2FzUGF5bWVudCxcbiAgICAgIGdhc1ByaWNlOiBzdWlUeC5nYXNQcmljZSxcbiAgICAgIGdhc0J1ZGdldDogc3VpVHguZ2FzQnVkZ2V0LFxuICAgICAgc2VuZGVyOiBzdWlUeC5zZW5kZXIsXG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGFCeXRlcyA9IGJjcy5zZXIoJ1RyYW5zYWN0aW9uRGF0YScsIHR4RGF0YSkudG9CeXRlcygpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBuZXcgVWludDhBcnJheShUWVBFX1RBRy5sZW5ndGggKyBkYXRhQnl0ZXMubGVuZ3RoKTtcbiAgICBzZXJpYWxpemVkLnNldChUWVBFX1RBRyk7XG4gICAgc2VyaWFsaXplZC5zZXQoZGF0YUJ5dGVzLCBUWVBFX1RBRy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnNpZ25hdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzY2hlbWUgPSBuZXcgVWludDhBcnJheShbMHgwMF0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgIHNjaGVtZSxcbiAgICAgICAgQnVmZmVyLmZyb20odGhpcy5fc2lnbmF0dXJlLCAnaGV4JyksXG4gICAgICAgIEJ1ZmZlci5mcm9tKHRoaXMuX3B1YmxpY0tleSwgJ2hleCcpLFxuICAgICAgXSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IHtcbiAgICAgICAgZGF0YTogdHhEYXRhLFxuICAgICAgICB0eFNpZ25hdHVyZTogc2lnbmF0dXJlQnVmZmVyLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBiY3Muc2VyKCdTZW5kZXJTaWduZWREYXRhJywgc2lnbmVkVHgpLnRvQnl0ZXMoKTtcbiAgICAgIGNvbnN0IHR5cGVUYWcgPSBBcnJheS5mcm9tKCdTZW5kZXJTaWduZWREYXRhOjonKS5tYXAoKGUpID0+IGUuY2hhckNvZGVBdCgwKSk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkRmluYWwgPSBuZXcgVWludDhBcnJheSh0eXBlVGFnLmxlbmd0aCArIHNlcmlhbGl6ZWQubGVuZ3RoKTtcbiAgICAgIHNlcmlhbGl6ZWRGaW5hbC5zZXQodHlwZVRhZyk7XG4gICAgICBzZXJpYWxpemVkRmluYWwuc2V0KHNlcmlhbGl6ZWQsIHR5cGVUYWcubGVuZ3RoKTtcbiAgICAgIHRoaXMuX2lkID0gQnVmZmVyLmZyb20oc2hhMy5zaGEzXzI1NihzZXJpYWxpemVkRmluYWwpLCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc2VyaWFsaXplZCkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgc3RhdGljIGRlc2VyaWFsaXplU3VpVHJhbnNhY3Rpb24oc2VyaWFsaXplZEhleDogc3RyaW5nKTogU3VpVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkSGV4LCAnaGV4Jyk7XG4gICAgY29uc3QgdHJpbW1lZERhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLnN1YmFycmF5KFRZUEVfVEFHLmxlbmd0aCkpO1xuICAgIGNvbnN0IGsgPSBiY3MuZGUoJ1RyYW5zYWN0aW9uRGF0YScsIHRyaW1tZWREYXRhKTtcbiAgICB0aGlzLnVwZGF0ZVByb3BlclRyYW5zYWN0aW9uRGF0YShrKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXI6IGsuc2VuZGVyLFxuICAgICAgcGF5VHg6IGsua2luZC5TaW5nbGUuUGF5LFxuICAgICAgZ2FzQnVkZ2V0OiBrLmdhc0J1ZGdldC50b051bWJlcigpLFxuICAgICAgZ2FzUHJpY2U6IGsuZ2FzUHJpY2UudG9OdW1iZXIoKSxcbiAgICAgIGdhc1BheW1lbnQ6IGsuZ2FzUGF5bWVudCxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHVwZGF0ZVByb3BlclRyYW5zYWN0aW9uRGF0YShrOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBiY3MgZGVzZXJpYWxpemVkIG51bWJlciBpbnRvIEJpZyBOdW1iZXIgYW5kIHJlbW92ZWQgJzB4JyBwcmVmaXggZnJvbSBhZGRyZXNzZXMsIG5lZWRzIHRvIGNvbnZlcnQgdGhlbSBiYWNrXG4gICAgay5raW5kLlNpbmdsZS5QYXkuYW1vdW50cyA9IGsua2luZC5TaW5nbGUuUGF5LmFtb3VudHMubWFwKChhbW91bnQpID0+IGFtb3VudC50b051bWJlcigpKTtcbiAgICBrLmtpbmQuU2luZ2xlLlBheS5jb2lucyA9IGsua2luZC5TaW5nbGUuUGF5LmNvaW5zLm1hcCgoY29pbik6IFN1aU9iamVjdFJlZiA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvYmplY3RJZDogdXRpbHMubm9ybWFsaXplSGV4SWQoY29pbi5vYmplY3RJZCksXG4gICAgICAgIHZlcnNpb246IGNvaW4udmVyc2lvbi50b051bWJlcigpLFxuICAgICAgICBkaWdlc3Q6IGNvaW4uZGlnZXN0LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBrLmtpbmQuU2luZ2xlLlBheS5yZWNpcGllbnRzID0gay5raW5kLlNpbmdsZS5QYXkucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gdXRpbHMubm9ybWFsaXplSGV4SWQocmVjaXBpZW50KSk7XG4gICAgay5nYXNQYXltZW50Lm9iamVjdElkID0gdXRpbHMubm9ybWFsaXplSGV4SWQoay5nYXNQYXltZW50Lm9iamVjdElkKTtcbiAgICBrLmdhc1BheW1lbnQudmVyc2lvbiA9IGsuZ2FzUGF5bWVudC52ZXJzaW9uLnRvTnVtYmVyKCk7XG4gICAgay5zZW5kZXIgPSB1dGlscy5ub3JtYWxpemVIZXhJZChrLnNlbmRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uIGZvciBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHhEYXRhfSBqc29uIFRoZSB0cmFuc2FjdGlvbiBkYXRhIGluIGpzb24gZm9ybWF0XG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gZXhwbGFuYXRpb25SZXN1bHQgVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHRvIGJlIGNvbXBsZXRlZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn1cbiAgICovXG4gIGV4cGxhaW5UcmFuc2ZlclRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCByZWNpcGllbnRzID0gdGhpcy5zdWlUcmFuc2FjdGlvbi5wYXlUeC5yZWNpcGllbnRzO1xuICAgIGNvbnN0IGFtb3VudHMgPSB0aGlzLnN1aVRyYW5zYWN0aW9uLnBheVR4LmFtb3VudHM7XG5cbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCwgaW5kZXgpID0+ICh7XG4gICAgICBhZGRyZXNzOiByZWNpcGllbnQsXG4gICAgICBhbW91bnQ6IGFtb3VudHNbaW5kZXhdLnRvU3RyaW5nKCksXG4gICAgfSkpO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IGFtb3VudHMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IgKyBjdXJyZW50LCAwKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5leHBsYW5hdGlvblJlc3VsdCxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIG91dHB1dHMsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { BaseAddress, BaseKey, BaseTransactionBuilder, PublicKey as BasePublicKey, TransactionType } from '@bitgo/sdk-core';
|
|
3
|
+
import { SuiObjectRef, SuiTransaction, Transaction } from './transaction';
|
|
4
|
+
import BigNumber from 'bignumber.js';
|
|
5
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
6
|
+
import { PayTx } from './iface';
|
|
7
|
+
export declare const SUI_GAS_PRICE = 1;
|
|
8
|
+
export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
|
|
9
|
+
protected _transaction: Transaction;
|
|
10
|
+
private _signatures;
|
|
11
|
+
protected _sender: string;
|
|
12
|
+
protected _gasBudget: number;
|
|
13
|
+
protected _gasPrice: number;
|
|
14
|
+
protected _payTx: PayTx;
|
|
15
|
+
protected _gasPayment: SuiObjectRef;
|
|
16
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
17
|
+
/**
|
|
18
|
+
* The transaction type.
|
|
19
|
+
*/
|
|
20
|
+
protected abstract get transactionType(): TransactionType;
|
|
21
|
+
/** @inheritdoc */
|
|
22
|
+
protected get transaction(): Transaction;
|
|
23
|
+
/** @inheritdoc */
|
|
24
|
+
protected set transaction(transaction: Transaction);
|
|
25
|
+
/** @inheritdoc */
|
|
26
|
+
protected signImplementation(key: BaseKey): Transaction;
|
|
27
|
+
/** @inheritDoc */
|
|
28
|
+
addSignature(publicKey: BasePublicKey, signature: Buffer): void;
|
|
29
|
+
/**
|
|
30
|
+
* Sets the sender of this transaction.
|
|
31
|
+
* This account will be responsible for paying transaction fees.
|
|
32
|
+
*
|
|
33
|
+
* @param {string} senderAddress the account that is sending this transaction
|
|
34
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
35
|
+
*/
|
|
36
|
+
sender(senderAddress: string): this;
|
|
37
|
+
gasBudget(gasBudget: number): this;
|
|
38
|
+
gasPrice(gasPrice: number): this;
|
|
39
|
+
payTx(payTx: PayTx): this;
|
|
40
|
+
gasPayment(gasPayment: SuiObjectRef): this;
|
|
41
|
+
/**
|
|
42
|
+
* Initialize the transaction builder fields using the decoded transaction data
|
|
43
|
+
*
|
|
44
|
+
* @param {Transaction} tx the transaction data
|
|
45
|
+
*/
|
|
46
|
+
initBuilder(tx: Transaction): void;
|
|
47
|
+
/** @inheritdoc */
|
|
48
|
+
protected fromImplementation(rawTransaction: string): Transaction;
|
|
49
|
+
/** @inheritdoc */
|
|
50
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
51
|
+
protected buildSuiTransaction(): SuiTransaction;
|
|
52
|
+
/** @inheritdoc */
|
|
53
|
+
validateAddress(address: BaseAddress, addressFormat?: string): void;
|
|
54
|
+
validateGasBudget(gasBudget: number): void;
|
|
55
|
+
validateGasPrice(gasPrice: number): void;
|
|
56
|
+
validateTxPay(payTx: PayTx): void;
|
|
57
|
+
validateGasPayment(gasPayment: SuiObjectRef): void;
|
|
58
|
+
validateSuiObjectRef(suiObjectRef: SuiObjectRef, field: string): void;
|
|
59
|
+
/** @inheritdoc */
|
|
60
|
+
validateKey(key: BaseKey): void;
|
|
61
|
+
/** @inheritdoc */
|
|
62
|
+
validateRawTransaction(rawTransaction: string): void;
|
|
63
|
+
/** @inheritdoc */
|
|
64
|
+
validateTransaction(transaction: Transaction): void;
|
|
65
|
+
/**
|
|
66
|
+
* Validates all fields are defined
|
|
67
|
+
*/
|
|
68
|
+
private validateTransactionFields;
|
|
69
|
+
/** @inheritdoc */
|
|
70
|
+
validateValue(value: BigNumber): void;
|
|
71
|
+
}
|
|
72
|
+
//# 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,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAGtB,SAAS,IAAI,aAAa,EAE1B,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,OAAO,CAAC,WAAW,CAAmB;IAEtC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,SAAS,SAAiB;IACpC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;IACxB,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;gBAExB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C;;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;IAMnC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMlC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMhC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMzB,UAAU,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI;IAM1C;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAUlC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAQjE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAO3D,SAAS,CAAC,mBAAmB,IAAI,cAAc;IAiB/C,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMxC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IA6BjC,kBAAkB,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI;IAOlD,oBAAoB,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAYrE,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IASpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAOnD;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAyBjC,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;CAMtC"}
|