@bitgo-beta/sdk-coin-xrp 1.3.3-alpha.43 → 1.3.3-alpha.430
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/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +10 -4
- package/dist/src/lib/accountSetBuilder.d.ts +18 -0
- package/dist/src/lib/accountSetBuilder.d.ts.map +1 -0
- package/dist/src/lib/accountSetBuilder.js +63 -0
- package/dist/src/lib/constants.d.ts +8 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +30 -0
- package/dist/src/lib/iface.d.ts +109 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +11 -0
- package/dist/src/lib/index.d.ts +14 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +43 -0
- package/dist/src/lib/keyPair.d.ts +33 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +118 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +29 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +91 -0
- package/dist/src/lib/transaction.d.ts +62 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +381 -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 +263 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +39 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +97 -0
- package/dist/src/lib/transferBuilder.d.ts +28 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +82 -0
- package/dist/src/lib/trustsetBuilder.d.ts +21 -0
- package/dist/src/lib/trustsetBuilder.d.ts.map +1 -0
- package/dist/src/lib/trustsetBuilder.js +72 -0
- package/dist/src/lib/utils.d.ts +78 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +304 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts +19 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/walletInitializationBuilder.js +76 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/ripple.d.ts +112 -2
- package/dist/src/ripple.d.ts.map +1 -1
- package/dist/src/ripple.js +57 -22
- package/dist/src/txrp.d.ts +3 -2
- package/dist/src/txrp.d.ts.map +1 -1
- package/dist/src/txrp.js +5 -5
- package/dist/src/xrp.d.ts +25 -64
- package/dist/src/xrp.d.ts.map +1 -1
- package/dist/src/xrp.js +375 -159
- package/dist/src/xrpToken.d.ts +22 -0
- package/dist/src/xrpToken.d.ts.map +1 -0
- package/dist/src/xrpToken.js +61 -0
- package/dist/tsconfig.tsbuildinfo +1 -8867
- package/package.json +15 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -200
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TokenTransferBuilder = void 0;
|
|
7
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
9
|
+
const iface_1 = require("./iface");
|
|
10
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
11
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
12
|
+
class TokenTransferBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
13
|
+
constructor(_coinConfig) {
|
|
14
|
+
super(_coinConfig);
|
|
15
|
+
}
|
|
16
|
+
get transactionType() {
|
|
17
|
+
return sdk_core_1.TransactionType.Send;
|
|
18
|
+
}
|
|
19
|
+
get xrpTransactionType() {
|
|
20
|
+
return iface_1.XrpTransactionType.Payment;
|
|
21
|
+
}
|
|
22
|
+
initBuilder(tx) {
|
|
23
|
+
super.initBuilder(tx);
|
|
24
|
+
const { destination, amount, destinationTag } = tx.toJson();
|
|
25
|
+
if (!destination) {
|
|
26
|
+
throw new sdk_core_1.BuildTransactionError('Missing destination');
|
|
27
|
+
}
|
|
28
|
+
if (!amount) {
|
|
29
|
+
throw new sdk_core_1.BuildTransactionError('Missing amount');
|
|
30
|
+
}
|
|
31
|
+
const normalizeAddress = utils_1.default.normalizeAddress({ address: destination, destinationTag });
|
|
32
|
+
this.to(normalizeAddress);
|
|
33
|
+
if (!utils_1.default.isIssuedCurrencyAmount(amount)) {
|
|
34
|
+
throw new sdk_core_1.BuildTransactionError('Invalid Amount');
|
|
35
|
+
}
|
|
36
|
+
const amountBigNum = (0, bignumber_js_1.default)(amount.value).shiftedBy(this._coinConfig.decimalPlaces);
|
|
37
|
+
this.amount(amountBigNum.toFixed());
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Set the receiver address
|
|
41
|
+
* @param {string} address - the address with optional destination tag
|
|
42
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
43
|
+
*/
|
|
44
|
+
to(address) {
|
|
45
|
+
const { address: xrpAddress, destinationTag } = utils_1.default.getAddressDetails(address);
|
|
46
|
+
this._destination = xrpAddress;
|
|
47
|
+
this._destinationTag = destinationTag;
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Set the amount to send
|
|
52
|
+
* @param {string} amount - the amount sent
|
|
53
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
54
|
+
*/
|
|
55
|
+
amount(amount) {
|
|
56
|
+
if (typeof amount !== 'string') {
|
|
57
|
+
throw new Error(`amount type ${typeof amount} must be a string`);
|
|
58
|
+
}
|
|
59
|
+
const amountBigNum = (0, bignumber_js_1.default)(amount);
|
|
60
|
+
if (amountBigNum.lt(0)) {
|
|
61
|
+
throw new Error(`amount ${amount} is not valid`);
|
|
62
|
+
}
|
|
63
|
+
const currency = utils_1.default.getXrpCurrencyFromTokenName(this._coinConfig.name);
|
|
64
|
+
// Unlike most coins, XRP Token amounts are represented in decimal notation
|
|
65
|
+
const value = amountBigNum.shiftedBy(-1 * this._coinConfig.decimalPlaces).toFixed();
|
|
66
|
+
this._amount = {
|
|
67
|
+
value: value,
|
|
68
|
+
...currency,
|
|
69
|
+
};
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
/** @inheritdoc */
|
|
73
|
+
async buildImplementation() {
|
|
74
|
+
if (!this._sender) {
|
|
75
|
+
throw new sdk_core_1.BuildTransactionError('Sender must be set before building the transaction');
|
|
76
|
+
}
|
|
77
|
+
const transferFields = {
|
|
78
|
+
TransactionType: this.xrpTransactionType,
|
|
79
|
+
Account: this._sender,
|
|
80
|
+
Destination: this._destination,
|
|
81
|
+
Amount: this._amount,
|
|
82
|
+
};
|
|
83
|
+
if (typeof this._destinationTag === 'number') {
|
|
84
|
+
transferFields.DestinationTag = this._destinationTag;
|
|
85
|
+
}
|
|
86
|
+
this._specificFields = transferFields;
|
|
87
|
+
return await super.buildImplementation();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.TokenTransferBuilder = TokenTransferBuilder;
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUE4RTtBQUU5RSxnRUFBcUM7QUFFckMsbUNBQTZDO0FBRTdDLDZEQUEwRDtBQUMxRCxvREFBNEI7QUFFNUIsTUFBYSxvQkFBcUIsU0FBUSx1Q0FBa0I7SUFLMUQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFjLGtCQUFrQjtRQUM5QixPQUFPLDBCQUFrQixDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQWU7UUFDekIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0QixNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxlQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFLLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBQSxzQkFBUyxFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsRUFBRSxDQUFDLE9BQWU7UUFDaEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsZUFBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsTUFBYztRQUNuQixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxPQUFPLE1BQU0sbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBQSxzQkFBUyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxNQUFNLGVBQWUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSwyRUFBMkU7UUFDM0UsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BGLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixLQUFLLEVBQUUsS0FBSztZQUNaLEdBQUcsUUFBUTtTQUNaLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0I7SUFDUixLQUFLLENBQUMsbUJBQW1CO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFZO1lBQzlCLGVBQWUsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQ3hDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDOUIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3JCLENBQUM7UUFFRixJQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxjQUFjLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDdkQsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBRXRDLE9BQU8sTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUE3RkQsb0RBNkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBBbW91bnQsIFBheW1lbnQgfSBmcm9tICd4cnBsJztcbmltcG9ydCB7IFhycFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRva2VuVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfYW1vdW50OiBBbW91bnQ7XG4gIHByaXZhdGUgX2Rlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2Rlc3RpbmF0aW9uVGFnPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB4cnBUcmFuc2FjdGlvblR5cGUoKTogWHJwVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQge1xuICAgIHJldHVybiBYcnBUcmFuc2FjdGlvblR5cGUuUGF5bWVudDtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcblxuICAgIGNvbnN0IHsgZGVzdGluYXRpb24sIGFtb3VudCwgZGVzdGluYXRpb25UYWcgfSA9IHR4LnRvSnNvbigpO1xuICAgIGlmICghZGVzdGluYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgZGVzdGluYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFhbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplQWRkcmVzcyA9IHV0aWxzLm5vcm1hbGl6ZUFkZHJlc3MoeyBhZGRyZXNzOiBkZXN0aW5hdGlvbiwgZGVzdGluYXRpb25UYWcgfSk7XG4gICAgdGhpcy50byhub3JtYWxpemVBZGRyZXNzKTtcbiAgICBpZiAoIXV0aWxzLmlzSXNzdWVkQ3VycmVuY3lBbW91bnQoYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBBbW91bnQnKTtcbiAgICB9XG4gICAgY29uc3QgYW1vdW50QmlnTnVtID0gQmlnTnVtYmVyKGFtb3VudC52YWx1ZSkuc2hpZnRlZEJ5KHRoaXMuX2NvaW5Db25maWcuZGVjaW1hbFBsYWNlcyk7XG4gICAgdGhpcy5hbW91bnQoYW1vdW50QmlnTnVtLnRvRml4ZWQoKSk7XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgcmVjZWl2ZXIgYWRkcmVzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIHRoZSBhZGRyZXNzIHdpdGggb3B0aW9uYWwgZGVzdGluYXRpb24gdGFnXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgdG8oYWRkcmVzczogc3RyaW5nKTogVG9rZW5UcmFuc2ZlckJ1aWxkZXIge1xuICAgIGNvbnN0IHsgYWRkcmVzczogeHJwQWRkcmVzcywgZGVzdGluYXRpb25UYWcgfSA9IHV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGFkZHJlc3MpO1xuICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0geHJwQWRkcmVzcztcbiAgICB0aGlzLl9kZXN0aW5hdGlvblRhZyA9IGRlc3RpbmF0aW9uVGFnO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqICBTZXQgdGhlIGFtb3VudCB0byBzZW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgYW1vdW50IHNlbnRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBhbW91bnQoYW1vdW50OiBzdHJpbmcpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhbW91bnQgdHlwZSAke3R5cGVvZiBhbW91bnR9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICB9XG4gICAgY29uc3QgYW1vdW50QmlnTnVtID0gQmlnTnVtYmVyKGFtb3VudCk7XG4gICAgaWYgKGFtb3VudEJpZ051bS5sdCgwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhbW91bnQgJHthbW91bnR9IGlzIG5vdCB2YWxpZGApO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW5jeSA9IHV0aWxzLmdldFhycEN1cnJlbmN5RnJvbVRva2VuTmFtZSh0aGlzLl9jb2luQ29uZmlnLm5hbWUpO1xuICAgIC8vIFVubGlrZSBtb3N0IGNvaW5zLCBYUlAgVG9rZW4gYW1vdW50cyBhcmUgcmVwcmVzZW50ZWQgaW4gZGVjaW1hbCBub3RhdGlvblxuICAgIGNvbnN0IHZhbHVlID0gYW1vdW50QmlnTnVtLnNoaWZ0ZWRCeSgtMSAqIHRoaXMuX2NvaW5Db25maWcuZGVjaW1hbFBsYWNlcykudG9GaXhlZCgpO1xuICAgIHRoaXMuX2Ftb3VudCA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIC4uLmN1cnJlbmN5LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGlmICghdGhpcy5fc2VuZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdTZW5kZXIgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZmVyRmllbGRzOiBQYXltZW50ID0ge1xuICAgICAgVHJhbnNhY3Rpb25UeXBlOiB0aGlzLnhycFRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIEFjY291bnQ6IHRoaXMuX3NlbmRlcixcbiAgICAgIERlc3RpbmF0aW9uOiB0aGlzLl9kZXN0aW5hdGlvbixcbiAgICAgIEFtb3VudDogdGhpcy5fYW1vdW50LFxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX2Rlc3RpbmF0aW9uVGFnID09PSAnbnVtYmVyJykge1xuICAgICAgdHJhbnNmZXJGaWVsZHMuRGVzdGluYXRpb25UYWcgPSB0aGlzLl9kZXN0aW5hdGlvblRhZztcbiAgICB9XG5cbiAgICB0aGlzLl9zcGVjaWZpY0ZpZWxkcyA9IHRyYW5zZmVyRmllbGRzO1xuXG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { BaseKey, BaseTransaction, TransactionType } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { TransactionExplanation, TxData, XrpTransaction } from './iface';
|
|
4
|
+
import { KeyPair } from './keyPair';
|
|
5
|
+
/**
|
|
6
|
+
* XRP transaction.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Transaction extends BaseTransaction {
|
|
9
|
+
protected _xrpTransaction: XrpTransaction;
|
|
10
|
+
protected _isMultiSig: boolean;
|
|
11
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
12
|
+
get xrpTransaction(): XrpTransaction;
|
|
13
|
+
set xrpTransaction(tx: XrpTransaction);
|
|
14
|
+
canSign(key: BaseKey): boolean;
|
|
15
|
+
toJson(): TxData;
|
|
16
|
+
getSignablePayload(): XrpTransaction;
|
|
17
|
+
sign(keyPair: KeyPair | KeyPair[]): void;
|
|
18
|
+
/** @inheritdoc */
|
|
19
|
+
toBroadcastFormat(): string;
|
|
20
|
+
explainTransaction(): TransactionExplanation;
|
|
21
|
+
private explainPaymentTransaction;
|
|
22
|
+
private explainAccountSetTransaction;
|
|
23
|
+
private explainSignerListSetTransaction;
|
|
24
|
+
private calculateIdFromRawTx;
|
|
25
|
+
/**
|
|
26
|
+
* Set the transaction type.
|
|
27
|
+
*
|
|
28
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
29
|
+
*/
|
|
30
|
+
setTransactionType(transactionType: TransactionType): void;
|
|
31
|
+
setMultiSigValue(isMultiSig: boolean): void;
|
|
32
|
+
/**
|
|
33
|
+
* Sets this transaction payload
|
|
34
|
+
*
|
|
35
|
+
* @param rawTransaction
|
|
36
|
+
*/
|
|
37
|
+
fromRawTransaction(rawTransaction: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Load the input and output data on this transaction.
|
|
40
|
+
*/
|
|
41
|
+
loadInputsAndOutputs(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Groups and sorts the signers by account.
|
|
44
|
+
* @param {Signer[]}signers1 - The first set of signers.
|
|
45
|
+
* @param {Signer[]}signers2 - The second set of signers.
|
|
46
|
+
* @returns The grouped and sorted signers.
|
|
47
|
+
**/
|
|
48
|
+
private concatAndSortSigners;
|
|
49
|
+
/**
|
|
50
|
+
* If presented in binary form, the Signers array must be sorted based on
|
|
51
|
+
* the numeric value of the signer addresses, with the lowest value first.
|
|
52
|
+
* (If submitted as JSON, the submit_multisigned method handles this automatically.)
|
|
53
|
+
* https://xrpl.org/multi-signing.html.
|
|
54
|
+
*
|
|
55
|
+
* @param left - A Signer to compare with.
|
|
56
|
+
* @param right - A second Signer to compare with.
|
|
57
|
+
* @returns 1 if left \> right, 0 if left = right, -1 if left \< right, and null if left or right are NaN.
|
|
58
|
+
*/
|
|
59
|
+
private compareSignersByAccount;
|
|
60
|
+
private addressToBigNumber;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,EACP,eAAe,EAIf,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAK7D,OAAO,EAGL,sBAAsB,EACtB,MAAM,EACN,cAAc,EAEf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,qBAAa,WAAY,SAAQ,eAAe;IAE9C,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC;gBAEnB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI5C,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED,IAAI,cAAc,CAAC,EAAE,EAAE,cAAc,EAEpC;IAED,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAO9B,MAAM,IAAI,MAAM;IA2DhB,kBAAkB,IAAI,cAAc;IAOpC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI;IAoDxC,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B,kBAAkB,IAAI,sBAAsB;IAa5C,OAAO,CAAC,yBAAyB;IAwBjC,OAAO,CAAC,4BAA4B;IAoBpC,OAAO,CAAC,+BAA+B;IAoBvC,OAAO,CAAC,oBAAoB;IAY5B;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAI3C;;;;OAIG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAgDhD;;OAEG;IACH,oBAAoB,IAAI,IAAI;IA0B5B;;;;;QAKI;IACJ,OAAO,CAAC,oBAAoB;IAM5B;;;;;;;;;OASG;IACH,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,kBAAkB;CAK3B"}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.Transaction = void 0;
|
|
40
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
41
|
+
const xrpl = __importStar(require("xrpl"));
|
|
42
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
43
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
44
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
45
|
+
const iface_1 = require("./iface");
|
|
46
|
+
/**
|
|
47
|
+
* XRP transaction.
|
|
48
|
+
*/
|
|
49
|
+
class Transaction extends sdk_core_1.BaseTransaction {
|
|
50
|
+
constructor(coinConfig) {
|
|
51
|
+
super(coinConfig);
|
|
52
|
+
}
|
|
53
|
+
get xrpTransaction() {
|
|
54
|
+
return this._xrpTransaction;
|
|
55
|
+
}
|
|
56
|
+
set xrpTransaction(tx) {
|
|
57
|
+
this._xrpTransaction = tx;
|
|
58
|
+
}
|
|
59
|
+
canSign(key) {
|
|
60
|
+
if (!utils_1.default.isValidPrivateKey(key.key)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
toJson() {
|
|
66
|
+
if (!this._xrpTransaction) {
|
|
67
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
68
|
+
}
|
|
69
|
+
const txData = {
|
|
70
|
+
from: this._xrpTransaction.Account,
|
|
71
|
+
isMultiSig: this._isMultiSig,
|
|
72
|
+
transactionType: this._xrpTransaction.TransactionType,
|
|
73
|
+
id: this._id,
|
|
74
|
+
fee: this._xrpTransaction.Fee,
|
|
75
|
+
sequence: this._xrpTransaction.Sequence,
|
|
76
|
+
lastLedgerSequence: this._xrpTransaction.LastLedgerSequence,
|
|
77
|
+
flags: this._xrpTransaction.Flags,
|
|
78
|
+
signingPubKey: this._xrpTransaction.SigningPubKey,
|
|
79
|
+
signers: this._xrpTransaction.Signers,
|
|
80
|
+
txnSignature: this._xrpTransaction.TxnSignature,
|
|
81
|
+
};
|
|
82
|
+
if (this._xrpTransaction.SigningPubKey === '' && !lodash_1.default.isEmpty(this._xrpTransaction.Signers)) {
|
|
83
|
+
txData.isMultiSig = true;
|
|
84
|
+
}
|
|
85
|
+
if (this._xrpTransaction.SigningPubKey && utils_1.default.isValidPublicKey(this._xrpTransaction.SigningPubKey)) {
|
|
86
|
+
txData.isMultiSig = false;
|
|
87
|
+
}
|
|
88
|
+
switch (this._xrpTransaction.TransactionType) {
|
|
89
|
+
case iface_1.XrpTransactionType.Payment:
|
|
90
|
+
txData.destination = this._xrpTransaction.Destination;
|
|
91
|
+
txData.destinationTag = this._xrpTransaction.DestinationTag;
|
|
92
|
+
if (typeof this._xrpTransaction.Amount === 'string' ||
|
|
93
|
+
utils_1.default.isIssuedCurrencyAmount(this._xrpTransaction.Amount)) {
|
|
94
|
+
txData.amount = this._xrpTransaction.Amount;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
throw new sdk_core_1.InvalidTransactionError('Invalid amount');
|
|
98
|
+
}
|
|
99
|
+
return txData;
|
|
100
|
+
case iface_1.XrpTransactionType.AccountSet:
|
|
101
|
+
txData.setFlag = this._xrpTransaction.SetFlag;
|
|
102
|
+
txData.messageKey = this._xrpTransaction.MessageKey;
|
|
103
|
+
return txData;
|
|
104
|
+
case iface_1.XrpTransactionType.SignerListSet:
|
|
105
|
+
txData.signerQuorum = this._xrpTransaction.SignerQuorum;
|
|
106
|
+
txData.signerEntries = this._xrpTransaction.SignerEntries;
|
|
107
|
+
return txData;
|
|
108
|
+
case iface_1.XrpTransactionType.TrustSet:
|
|
109
|
+
txData.amount = this._xrpTransaction.LimitAmount;
|
|
110
|
+
return txData;
|
|
111
|
+
default:
|
|
112
|
+
throw new sdk_core_1.InvalidTransactionError('Invalid transaction type');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
getSignablePayload() {
|
|
116
|
+
if (!this._xrpTransaction) {
|
|
117
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
118
|
+
}
|
|
119
|
+
return lodash_1.default.omit(this._xrpTransaction, ['TxnSignature', 'Signers', 'SigningPubKey']);
|
|
120
|
+
}
|
|
121
|
+
sign(keyPair) {
|
|
122
|
+
if (!this._xrpTransaction) {
|
|
123
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
124
|
+
}
|
|
125
|
+
if (!this._xrpTransaction.Fee) {
|
|
126
|
+
throw new sdk_core_1.InvalidTransactionError('Missing fee');
|
|
127
|
+
}
|
|
128
|
+
if (!this._xrpTransaction.Sequence) {
|
|
129
|
+
throw new sdk_core_1.InvalidTransactionError('Missing sequence');
|
|
130
|
+
}
|
|
131
|
+
if (!this._xrpTransaction.Flags) {
|
|
132
|
+
throw new sdk_core_1.InvalidTransactionError('Missing flags');
|
|
133
|
+
}
|
|
134
|
+
if (lodash_1.default.isEmpty(keyPair)) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
|
|
138
|
+
for (const kp of keyPairs) {
|
|
139
|
+
const { pub, prv } = kp.getKeys();
|
|
140
|
+
if (!prv) {
|
|
141
|
+
throw new sdk_core_1.SigningError('Missing private key');
|
|
142
|
+
}
|
|
143
|
+
if (this._isMultiSig === false && this._xrpTransaction.TxnSignature) {
|
|
144
|
+
throw new sdk_core_1.SigningError('Transaction has already been signed');
|
|
145
|
+
}
|
|
146
|
+
const signablePayload = this.getSignablePayload();
|
|
147
|
+
const xrpWallet = new xrpl.Wallet(pub, prv);
|
|
148
|
+
const signedTx = xrpWallet.sign(signablePayload, this._isMultiSig);
|
|
149
|
+
const xrpSignedTx = xrpl.decode(signedTx.tx_blob);
|
|
150
|
+
xrpl.validate(xrpSignedTx);
|
|
151
|
+
if (this._isMultiSig === false) {
|
|
152
|
+
xrpWallet.verifyTransaction(signedTx.tx_blob);
|
|
153
|
+
this._xrpTransaction = xrpSignedTx;
|
|
154
|
+
this._id = signedTx.hash;
|
|
155
|
+
}
|
|
156
|
+
if (this._isMultiSig === true) {
|
|
157
|
+
if (!xrpSignedTx.Signers || !lodash_1.default.isArray(xrpSignedTx.Signers)) {
|
|
158
|
+
throw new sdk_core_1.SigningError('Missing or invalid signers');
|
|
159
|
+
}
|
|
160
|
+
const sortedSigners = this.concatAndSortSigners(this._xrpTransaction.Signers || [], xrpSignedTx.Signers);
|
|
161
|
+
this._xrpTransaction = xrpSignedTx;
|
|
162
|
+
this._xrpTransaction.Signers = sortedSigners;
|
|
163
|
+
this._id = this.calculateIdFromRawTx(xrpl.encode(this._xrpTransaction));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** @inheritdoc */
|
|
168
|
+
toBroadcastFormat() {
|
|
169
|
+
if (!this._xrpTransaction) {
|
|
170
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
171
|
+
}
|
|
172
|
+
return xrpl.encode(this._xrpTransaction);
|
|
173
|
+
}
|
|
174
|
+
explainTransaction() {
|
|
175
|
+
switch (this._xrpTransaction.TransactionType) {
|
|
176
|
+
case iface_1.XrpTransactionType.Payment:
|
|
177
|
+
return this.explainPaymentTransaction();
|
|
178
|
+
case iface_1.XrpTransactionType.AccountSet:
|
|
179
|
+
return this.explainAccountSetTransaction();
|
|
180
|
+
case iface_1.XrpTransactionType.SignerListSet:
|
|
181
|
+
return this.explainSignerListSetTransaction();
|
|
182
|
+
default:
|
|
183
|
+
throw new Error('Unsupported transaction type');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
explainPaymentTransaction() {
|
|
187
|
+
const tx = this._xrpTransaction;
|
|
188
|
+
const address = utils_1.default.normalizeAddress({ address: tx.Destination, destinationTag: tx.DestinationTag });
|
|
189
|
+
const amount = lodash_1.default.isString(tx.Amount) ? tx.Amount : 0;
|
|
190
|
+
return {
|
|
191
|
+
displayOrder: ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee'],
|
|
192
|
+
id: this._id,
|
|
193
|
+
changeOutputs: [],
|
|
194
|
+
outputAmount: amount,
|
|
195
|
+
changeAmount: 0,
|
|
196
|
+
outputs: [
|
|
197
|
+
{
|
|
198
|
+
address,
|
|
199
|
+
amount,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
fee: {
|
|
203
|
+
fee: tx.Fee,
|
|
204
|
+
feeRate: undefined,
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
explainAccountSetTransaction() {
|
|
209
|
+
const tx = this._xrpTransaction;
|
|
210
|
+
return {
|
|
211
|
+
displayOrder: ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'accountSet'],
|
|
212
|
+
id: this._id,
|
|
213
|
+
changeOutputs: [],
|
|
214
|
+
outputAmount: 0,
|
|
215
|
+
changeAmount: 0,
|
|
216
|
+
outputs: [],
|
|
217
|
+
fee: {
|
|
218
|
+
fee: tx.Fee,
|
|
219
|
+
feeRate: undefined,
|
|
220
|
+
},
|
|
221
|
+
accountSet: {
|
|
222
|
+
messageKey: tx.MessageKey,
|
|
223
|
+
setFlag: tx.SetFlag,
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
explainSignerListSetTransaction() {
|
|
228
|
+
const tx = this._xrpTransaction;
|
|
229
|
+
return {
|
|
230
|
+
displayOrder: ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'signerListSet'],
|
|
231
|
+
id: this._id,
|
|
232
|
+
changeOutputs: [],
|
|
233
|
+
outputAmount: 0,
|
|
234
|
+
changeAmount: 0,
|
|
235
|
+
outputs: [],
|
|
236
|
+
fee: {
|
|
237
|
+
fee: tx.Fee,
|
|
238
|
+
feeRate: undefined,
|
|
239
|
+
},
|
|
240
|
+
signerListSet: {
|
|
241
|
+
signerQuorum: tx.SignerQuorum,
|
|
242
|
+
signerEntries: tx.SignerEntries,
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
calculateIdFromRawTx(rawTransaction) {
|
|
247
|
+
let id;
|
|
248
|
+
// hashes ids are different for signed and unsigned tx
|
|
249
|
+
// first we try to get the hash id as if it is signed, will throw if its not
|
|
250
|
+
try {
|
|
251
|
+
id = xrpl.hashes.hashSignedTx(rawTransaction);
|
|
252
|
+
}
|
|
253
|
+
catch (e) {
|
|
254
|
+
id = xrpl.hashes.hashTx(rawTransaction);
|
|
255
|
+
}
|
|
256
|
+
return id;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Set the transaction type.
|
|
260
|
+
*
|
|
261
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
262
|
+
*/
|
|
263
|
+
setTransactionType(transactionType) {
|
|
264
|
+
this._type = transactionType;
|
|
265
|
+
}
|
|
266
|
+
setMultiSigValue(isMultiSig) {
|
|
267
|
+
this._isMultiSig = isMultiSig;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Sets this transaction payload
|
|
271
|
+
*
|
|
272
|
+
* @param rawTransaction
|
|
273
|
+
*/
|
|
274
|
+
fromRawTransaction(rawTransaction) {
|
|
275
|
+
let txHex = rawTransaction;
|
|
276
|
+
if (!utils_1.default.isValidHex(rawTransaction)) {
|
|
277
|
+
try {
|
|
278
|
+
txHex = xrpl.encode(JSON.parse(rawTransaction));
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
throw new sdk_core_1.InvalidTransactionError('Invalid transaction');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
utils_1.default.validateRawTransaction(txHex);
|
|
285
|
+
this._xrpTransaction = xrpl.decode(txHex);
|
|
286
|
+
if (!iface_1.XrpTransactionType[this._xrpTransaction.TransactionType]) {
|
|
287
|
+
throw new sdk_core_1.InvalidTransactionError('Unsupported transaction type, got: ' + this._xrpTransaction.TransactionType);
|
|
288
|
+
}
|
|
289
|
+
if (this._xrpTransaction.SigningPubKey && this._xrpTransaction.SigningPubKey !== '') {
|
|
290
|
+
this._isMultiSig = false;
|
|
291
|
+
}
|
|
292
|
+
if (this._xrpTransaction.SigningPubKey === '' &&
|
|
293
|
+
this._xrpTransaction.Signers &&
|
|
294
|
+
this._xrpTransaction.Signers.length > 0) {
|
|
295
|
+
this._isMultiSig = true;
|
|
296
|
+
}
|
|
297
|
+
this._id = this.calculateIdFromRawTx(txHex);
|
|
298
|
+
switch (this._xrpTransaction.TransactionType) {
|
|
299
|
+
case iface_1.XrpTransactionType.SignerListSet:
|
|
300
|
+
this.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
|
|
301
|
+
break;
|
|
302
|
+
case iface_1.XrpTransactionType.AccountSet:
|
|
303
|
+
this.setTransactionType(sdk_core_1.TransactionType.AccountUpdate);
|
|
304
|
+
break;
|
|
305
|
+
case iface_1.XrpTransactionType.Payment:
|
|
306
|
+
if (utils_1.default.isIssuedCurrencyAmount(this._xrpTransaction.Amount)) {
|
|
307
|
+
this.setTransactionType(sdk_core_1.TransactionType.SendToken);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
this.setTransactionType(sdk_core_1.TransactionType.Send);
|
|
311
|
+
}
|
|
312
|
+
break;
|
|
313
|
+
case iface_1.XrpTransactionType.TrustSet:
|
|
314
|
+
this.setTransactionType(sdk_core_1.TransactionType.TrustLine);
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
this.loadInputsAndOutputs();
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Load the input and output data on this transaction.
|
|
321
|
+
*/
|
|
322
|
+
loadInputsAndOutputs() {
|
|
323
|
+
if (!this._xrpTransaction) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
if (this._xrpTransaction.TransactionType === iface_1.XrpTransactionType.Payment) {
|
|
327
|
+
let value;
|
|
328
|
+
const { Account, Destination, Amount, DestinationTag } = this._xrpTransaction;
|
|
329
|
+
if (typeof Amount === 'string') {
|
|
330
|
+
value = Amount;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
value = Amount.value;
|
|
334
|
+
}
|
|
335
|
+
const coin = this._coinConfig.name;
|
|
336
|
+
this.inputs.push({
|
|
337
|
+
address: Account,
|
|
338
|
+
value,
|
|
339
|
+
coin,
|
|
340
|
+
});
|
|
341
|
+
this.outputs.push({
|
|
342
|
+
address: utils_1.default.normalizeAddress({ address: Destination, destinationTag: DestinationTag }),
|
|
343
|
+
value,
|
|
344
|
+
coin,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Groups and sorts the signers by account.
|
|
350
|
+
* @param {Signer[]}signers1 - The first set of signers.
|
|
351
|
+
* @param {Signer[]}signers2 - The second set of signers.
|
|
352
|
+
* @returns The grouped and sorted signers.
|
|
353
|
+
**/
|
|
354
|
+
concatAndSortSigners(signers1, signers2) {
|
|
355
|
+
return signers1
|
|
356
|
+
.concat(signers2)
|
|
357
|
+
.sort((signer1, signer2) => this.compareSignersByAccount(signer1.Signer.Account, signer2.Signer.Account));
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* If presented in binary form, the Signers array must be sorted based on
|
|
361
|
+
* the numeric value of the signer addresses, with the lowest value first.
|
|
362
|
+
* (If submitted as JSON, the submit_multisigned method handles this automatically.)
|
|
363
|
+
* https://xrpl.org/multi-signing.html.
|
|
364
|
+
*
|
|
365
|
+
* @param left - A Signer to compare with.
|
|
366
|
+
* @param right - A second Signer to compare with.
|
|
367
|
+
* @returns 1 if left \> right, 0 if left = right, -1 if left \< right, and null if left or right are NaN.
|
|
368
|
+
*/
|
|
369
|
+
compareSignersByAccount(address1, address2) {
|
|
370
|
+
const addressBN1 = this.addressToBigNumber(address1);
|
|
371
|
+
const addressBN2 = this.addressToBigNumber(address2);
|
|
372
|
+
return addressBN1.comparedTo(addressBN2);
|
|
373
|
+
}
|
|
374
|
+
addressToBigNumber(address) {
|
|
375
|
+
const hex = Buffer.from(xrpl.decodeAccountID(address)).toString('hex');
|
|
376
|
+
const numberOfBitsInHex = 16;
|
|
377
|
+
return new bignumber_js_1.default(hex, numberOfBitsInHex);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
exports.Transaction = Transaction;
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUF1QjtBQUN2QiwyQ0FBNkI7QUFFN0IsbURBTzhCO0FBRTlCLG9EQUE0QjtBQUU1QixnRUFBcUM7QUFFckMsbUNBT2lCO0FBR2pCOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFLOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLEVBQWtCO1FBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBWTtRQUNsQixJQUFJLENBQUMsZUFBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBVztZQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPO1lBQ2xDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM1QixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFxQztZQUMzRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDWixHQUFHLEVBQUUs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R0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksc0JBQVMsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUEvV0Qsa0NBK1dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHhycGwgZnJvbSAneHJwbCc7XG5cbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IFNpZ25lciB9IGZyb20gJ3hycGwnO1xuaW1wb3J0IHtcbiAgQWNjb3VudFNldFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFNpZ25lckxpc3RTZXRUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUeERhdGEsXG4gIFhycFRyYW5zYWN0aW9uLFxuICBYcnBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5cbi8qKlxuICogWFJQIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICAvLyBYUlAgc3BlY2lmaWMgZmllbGRzXG4gIHByb3RlY3RlZCBfeHJwVHJhbnNhY3Rpb246IFhycFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgX2lzTXVsdGlTaWc6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgfVxuXG4gIGdldCB4cnBUcmFuc2FjdGlvbigpOiBYcnBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3hycFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgc2V0IHhycFRyYW5zYWN0aW9uKHR4OiBYcnBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3hycFRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICBjYW5TaWduKGtleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIGlmICghdXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoa2V5LmtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBpZiAoIXRoaXMuX3hycFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhEYXRhOiBUeERhdGEgPSB7XG4gICAgICBmcm9tOiB0aGlzLl94cnBUcmFuc2FjdGlvbi5BY2NvdW50LFxuICAgICAgaXNNdWx0aVNpZzogdGhpcy5faXNNdWx0aVNpZyxcbiAgICAgIHRyYW5zYWN0aW9uVHlwZTogdGhpcy5feHJwVHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlIGFzIFhycFRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgIGZlZTogdGhpcy5feHJwVHJhbnNhY3Rpb24uRmVlLFxuICAgICAgc2VxdWVuY2U6IHRoaXMuX3hycFRyYW5zYWN0aW9uLlNlcXVlbmNlLFxuICAgICAgbGFzdExlZGdlclNlcXVlbmNlOiB0aGlzLl94cnBUcmFuc2FjdGlvbi5MYXN0TGVkZ2VyU2VxdWVuY2UsXG4gICAgICBmbGFnczogdGhpcy5feHJwVHJhbnNhY3Rpb24uRmxhZ3MgYXMgbnVtYmVyLFxuICAgICAgc2lnbmluZ1B1YktleTogdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmluZ1B1YktleSxcbiAgICAgIHNpZ25lcnM6IHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25lcnMsXG4gICAgICB0eG5TaWduYXR1cmU6IHRoaXMuX3hycFRyYW5zYWN0aW9uLlR4blNpZ25hdHVyZSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25pbmdQdWJLZXkgPT09ICcnICYmICFfLmlzRW1wdHkodGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmVycykpIHtcbiAgICAgIHR4RGF0YS5pc011bHRpU2lnID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25pbmdQdWJLZXkgJiYgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSh0aGlzLl94cnBUcmFuc2FjdGlvbi5TaWduaW5nUHViS2V5KSkge1xuICAgICAgdHhEYXRhLmlzTXVsdGlTaWcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3hycFRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuUGF5bWVudDpcbiAgICAgICAgdHhEYXRhLmRlc3RpbmF0aW9uID0gdGhpcy5feHJwVHJhbnNhY3Rpb24uRGVzdGluYXRpb247XG4gICAgICAgIHR4RGF0YS5kZXN0aW5hdGlvblRhZyA9IHRoaXMuX3hycFRyYW5zYWN0aW9uLkRlc3RpbmF0aW9uVGFnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHRoaXMuX3hycFRyYW5zYWN0aW9uLkFtb3VudCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICB1dGlscy5pc0lzc3VlZEN1cnJlbmN5QW1vdW50KHRoaXMuX3hycFRyYW5zYWN0aW9uLkFtb3VudClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHhEYXRhLmFtb3VudCA9IHRoaXMuX3hycFRyYW5zYWN0aW9uLkFtb3VudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgYW1vdW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR4RGF0YTtcblxuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuQWNjb3VudFNldDpcbiAgICAgICAgdHhEYXRhLnNldEZsYWcgPSB0aGlzLl94cnBUcmFuc2FjdGlvbi5TZXRGbGFnO1xuICAgICAgICB0eERhdGEubWVzc2FnZUtleSA9IHRoaXMuX3hycFRyYW5zYWN0aW9uLk1lc3NhZ2VLZXk7XG4gICAgICAgIHJldHVybiB0eERhdGE7XG5cbiAgICAgIGNhc2UgWHJwVHJhbnNhY3Rpb25UeXBlLlNpZ25lckxpc3RTZXQ6XG4gICAgICAgIHR4RGF0YS5zaWduZXJRdW9ydW0gPSB0aGlzLl94cnBUcmFuc2FjdGlvbi5TaWduZXJRdW9ydW07XG4gICAgICAgIHR4RGF0YS5zaWduZXJFbnRyaWVzID0gdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmVyRW50cmllcztcbiAgICAgICAgcmV0dXJuIHR4RGF0YTtcblxuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuVHJ1c3RTZXQ6XG4gICAgICAgIHR4RGF0YS5hbW91bnQgPSB0aGlzLl94cnBUcmFuc2FjdGlvbi5MaW1pdEFtb3VudDtcbiAgICAgICAgcmV0dXJuIHR4RGF0YTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG4gIH1cblxuICBnZXRTaWduYWJsZVBheWxvYWQoKTogWHJwVHJhbnNhY3Rpb24ge1xuICAgIGlmICghdGhpcy5feHJwVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIF8ub21pdCh0aGlzLl94cnBUcmFuc2FjdGlvbiwgWydUeG5TaWduYXR1cmUnLCAnU2lnbmVycycsICdTaWduaW5nUHViS2V5J10pIGFzIFhycFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgc2lnbihrZXlQYWlyOiBLZXlQYWlyIHwgS2V5UGFpcltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl94cnBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3hycFRyYW5zYWN0aW9uLkZlZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdNaXNzaW5nIGZlZScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3hycFRyYW5zYWN0aW9uLlNlcXVlbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3Npbmcgc2VxdWVuY2UnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl94cnBUcmFuc2FjdGlvbi5GbGFncykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdNaXNzaW5nIGZsYWdzJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkoa2V5UGFpcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlQYWlycyA9IGtleVBhaXIgaW5zdGFuY2VvZiBBcnJheSA/IGtleVBhaXIgOiBba2V5UGFpcl07XG4gICAgZm9yIChjb25zdCBrcCBvZiBrZXlQYWlycykge1xuICAgICAgY29uc3QgeyBwdWIsIHBydiB9ID0ga3AuZ2V0S2V5cygpO1xuICAgICAgaWYgKCFwcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNNdWx0aVNpZyA9PT0gZmFsc2UgJiYgdGhpcy5feHJwVHJhbnNhY3Rpb24uVHhuU2lnbmF0dXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ1RyYW5zYWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2lnbmVkJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0aGlzLmdldFNpZ25hYmxlUGF5bG9hZCgpO1xuXG4gICAgICBjb25zdCB4cnBXYWxsZXQgPSBuZXcgeHJwbC5XYWxsZXQocHViLCBwcnYpO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSB4cnBXYWxsZXQuc2lnbihzaWduYWJsZVBheWxvYWQsIHRoaXMuX2lzTXVsdGlTaWcpO1xuICAgICAgY29uc3QgeHJwU2lnbmVkVHggPSB4cnBsLmRlY29kZShzaWduZWRUeC50eF9ibG9iKTtcbiAgICAgIHhycGwudmFsaWRhdGUoeHJwU2lnbmVkVHgpO1xuXG4gICAgICBpZiAodGhpcy5faXNNdWx0aVNpZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgeHJwV2FsbGV0LnZlcmlmeVRyYW5zYWN0aW9uKHNpZ25lZFR4LnR4X2Jsb2IpO1xuICAgICAgICB0aGlzLl94cnBUcmFuc2FjdGlvbiA9IHhycFNpZ25lZFR4IGFzIHVua25vd24gYXMgWHJwVHJhbnNhY3Rpb247XG4gICAgICAgIHRoaXMuX2lkID0gc2lnbmVkVHguaGFzaDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzTXVsdGlTaWcgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKCF4cnBTaWduZWRUeC5TaWduZXJzIHx8ICFfLmlzQXJyYXkoeHJwU2lnbmVkVHguU2lnbmVycykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgc2lnbmVycycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvcnRlZFNpZ25lcnMgPSB0aGlzLmNvbmNhdEFuZFNvcnRTaWduZXJzKHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25lcnMgfHwgW10sIHhycFNpZ25lZFR4LlNpZ25lcnMpO1xuICAgICAgICB0aGlzLl94cnBUcmFuc2FjdGlvbiA9IHhycFNpZ25lZFR4IGFzIHVua25vd24gYXMgWHJwVHJhbnNhY3Rpb247XG4gICAgICAgIHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25lcnMgPSBzb3J0ZWRTaWduZXJzO1xuICAgICAgICB0aGlzLl9pZCA9IHRoaXMuY2FsY3VsYXRlSWRGcm9tUmF3VHgoeHJwbC5lbmNvZGUodGhpcy5feHJwVHJhbnNhY3Rpb24pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3hycFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB4cnBsLmVuY29kZSh0aGlzLl94cnBUcmFuc2FjdGlvbik7XG4gIH1cblxuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgc3dpdGNoICh0aGlzLl94cnBUcmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgWHJwVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQ6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5QYXltZW50VHJhbnNhY3Rpb24oKTtcbiAgICAgIGNhc2UgWHJwVHJhbnNhY3Rpb25UeXBlLkFjY291bnRTZXQ6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5BY2NvdW50U2V0VHJhbnNhY3Rpb24oKTtcbiAgICAgIGNhc2UgWHJwVHJhbnNhY3Rpb25UeXBlLlNpZ25lckxpc3RTZXQ6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5TaWduZXJMaXN0U2V0VHJhbnNhY3Rpb24oKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXhwbGFpblBheW1lbnRUcmFuc2FjdGlvbigpOiBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHggPSB0aGlzLl94cnBUcmFuc2FjdGlvbiBhcyB4cnBsLlBheW1lbnQ7XG4gICAgY29uc3QgYWRkcmVzcyA9IHV0aWxzLm5vcm1hbGl6ZUFkZHJlc3MoeyBhZGRyZXNzOiB0eC5EZXN0aW5hdGlvbiwgZGVzdGluYXRpb25UYWc6IHR4LkRlc3RpbmF0aW9uVGFnIH0pO1xuICAgIGNvbnN0IGFtb3VudCA9IF8uaXNTdHJpbmcodHguQW1vdW50KSA/IHR4LkFtb3VudCA6IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZSddLFxuICAgICAgaWQ6IHRoaXMuX2lkIGFzIHN0cmluZyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgb3V0cHV0QW1vdW50OiBhbW91bnQsXG4gICAgICBjaGFuZ2VBbW91bnQ6IDAsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiB0eC5GZWUgYXMgc3RyaW5nLFxuICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGV4cGxhaW5BY2NvdW50U2V0VHJhbnNhY3Rpb24oKTogQWNjb3VudFNldFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4ID0gdGhpcy5feHJwVHJhbnNhY3Rpb24gYXMgeHJwbC5BY2NvdW50U2V0O1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ2FjY291bnRTZXQnXSxcbiAgICAgIGlkOiB0aGlzLl9pZCBhcyBzdHJpbmcsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgIGNoYW5nZUFtb3VudDogMCxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogdHguRmVlIGFzIHN0cmluZyxcbiAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIGFjY291bnRTZXQ6IHtcbiAgICAgICAgbWVzc2FnZUtleTogdHguTWVzc2FnZUtleSxcbiAgICAgICAgc2V0RmxhZzogdHguU2V0RmxhZyBhcyB4cnBsLkFjY291bnRTZXRBc2ZGbGFncyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwbGFpblNpZ25lckxpc3RTZXRUcmFuc2FjdGlvbigpOiBTaWduZXJMaXN0U2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHggPSB0aGlzLl94cnBUcmFuc2FjdGlvbiBhcyB4cnBsLlNpZ25lckxpc3RTZXQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAnc2lnbmVyTGlzdFNldCddLFxuICAgICAgaWQ6IHRoaXMuX2lkIGFzIHN0cmluZyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgb3V0cHV0QW1vdW50OiAwLFxuICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiB0eC5GZWUgYXMgc3RyaW5nLFxuICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgc2lnbmVyTGlzdFNldDoge1xuICAgICAgICBzaWduZXJRdW9ydW06IHR4LlNpZ25lclF1b3J1bSxcbiAgICAgICAgc2lnbmVyRW50cmllczogdHguU2lnbmVyRW50cmllcyBhcyB4cnBsLlNpZ25lckVudHJ5W10sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUlkRnJvbVJhd1R4KHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBpZDogc3RyaW5nO1xuICAgIC8vIGhhc2hlcyBpZHMgYXJlIGRpZmZlcmVudCBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCB0eFxuICAgIC8vIGZpcnN0IHdlIHRyeSB0byBnZXQgdGhlIGhhc2ggaWQgYXMgaWYgaXQgaXMgc2lnbmVkLCB3aWxsIHRocm93IGlmIGl0cyBub3RcbiAgICB0cnkge1xuICAgICAgaWQgPSB4cnBsLmhhc2hlcy5oYXNoU2lnbmVkVHgocmF3VHJhbnNhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlkID0geHJwbC5oYXNoZXMuaGFzaFR4KHJhd1RyYW5zYWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXQuXG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgc2V0TXVsdGlTaWdWYWx1ZShpc011bHRpU2lnOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faXNNdWx0aVNpZyA9IGlzTXVsdGlTaWc7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCB0eEhleCA9IHJhd1RyYW5zYWN0aW9uO1xuICAgIGlmICghdXRpbHMuaXNWYWxpZEhleChyYXdUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHR4SGV4ID0geHJwbC5lbmNvZGUoSlNPTi5wYXJzZShyYXdUcmFuc2FjdGlvbikpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih0eEhleCk7XG5cbiAgICB0aGlzLl94cnBUcmFuc2FjdGlvbiA9IHhycGwuZGVjb2RlKHR4SGV4KSBhcyB1bmtub3duIGFzIFhycFRyYW5zYWN0aW9uO1xuICAgIGlmICghWHJwVHJhbnNhY3Rpb25UeXBlW3RoaXMuX3hycFRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZV0pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZSwgZ290OiAnICsgdGhpcy5feHJwVHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25pbmdQdWJLZXkgJiYgdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmluZ1B1YktleSAhPT0gJycpIHtcbiAgICAgIHRoaXMuX2lzTXVsdGlTaWcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmluZ1B1YktleSA9PT0gJycgJiZcbiAgICAgIHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25lcnMgJiZcbiAgICAgIHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25lcnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5faXNNdWx0aVNpZyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2lkID0gdGhpcy5jYWxjdWxhdGVJZEZyb21SYXdUeCh0eEhleCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3hycFRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuU2lnbmVyTGlzdFNldDpcbiAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFhycFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50U2V0OlxuICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuUGF5bWVudDpcbiAgICAgICAgaWYgKHV0aWxzLmlzSXNzdWVkQ3VycmVuY3lBbW91bnQodGhpcy5feHJwVHJhbnNhY3Rpb24uQW1vdW50KSkge1xuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgWHJwVHJhbnNhY3Rpb25UeXBlLlRydXN0U2V0OlxuICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuVHJ1c3RMaW5lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5feHJwVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3hycFRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZSA9PT0gWHJwVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpIHtcbiAgICAgIGxldCB2YWx1ZTogc3RyaW5nO1xuICAgICAgY29uc3QgeyBBY2NvdW50LCBEZXN0aW5hdGlvbiwgQW1vdW50LCBEZXN0aW5hdGlvblRhZyB9ID0gdGhpcy5feHJwVHJhbnNhY3Rpb247XG4gICAgICBpZiAodHlwZW9mIEFtb3VudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWUgPSBBbW91bnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IEFtb3VudC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvaW4gPSB0aGlzLl9jb2luQ29uZmlnLm5hbWU7XG4gICAgICB0aGlzLmlucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogQWNjb3VudCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGNvaW4sXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3V0cHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogdXRpbHMubm9ybWFsaXplQWRkcmVzcyh7IGFkZHJlc3M6IERlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblRhZzogRGVzdGluYXRpb25UYWcgfSksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb2luLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwcyBhbmQgc29ydHMgdGhlIHNpZ25lcnMgYnkgYWNjb3VudC5cbiAgICogQHBhcmFtIHtTaWduZXJbXX1zaWduZXJzMSAtIFRoZSBmaXJzdCBzZXQgb2Ygc2lnbmVycy5cbiAgICogQHBhcmFtIHtTaWduZXJbXX1zaWduZXJzMiAtIFRoZSBzZWNvbmQgc2V0IG9mIHNpZ25lcnMuXG4gICAqIEByZXR1cm5zIFRoZSBncm91cGVkIGFuZCBzb3J0ZWQgc2lnbmVycy5cbiAgICoqL1xuICBwcml2YXRlIGNvbmNhdEFuZFNvcnRTaWduZXJzKHNpZ25lcnMxOiBTaWduZXJbXSwgc2lnbmVyczI6IFNpZ25lcltdKTogU2lnbmVyW10ge1xuICAgIHJldHVybiBzaWduZXJzMVxuICAgICAgLmNvbmNhdChzaWduZXJzMilcbiAgICAgIC5zb3J0KChzaWduZXIxLCBzaWduZXIyKSA9PiB0aGlzLmNvbXBhcmVTaWduZXJzQnlBY2NvdW50KHNpZ25lcjEuU2lnbmVyLkFjY291bnQsIHNpZ25lcjIuU2lnbmVyLkFjY291bnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBwcmVzZW50ZWQgaW4gYmluYXJ5IGZvcm0sIHRoZSBTaWduZXJzIGFycmF5IG11c3QgYmUgc29ydGVkIGJhc2VkIG9uXG4gICAqIHRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzaWduZXIgYWRkcmVzc2VzLCB3aXRoIHRoZSBsb3dlc3QgdmFsdWUgZmlyc3QuXG4gICAqIChJZiBzdWJtaXR0ZWQgYXMgSlNPTiwgdGhlIHN1Ym1pdF9tdWx0aXNpZ25lZCBtZXRob2QgaGFuZGxlcyB0aGlzIGF1dG9tYXRpY2FsbHkuKVxuICAgKiBodHRwczovL3hycGwub3JnL211bHRpLXNpZ25pbmcuaHRtbC5cbiAgICpcbiAgICogQHBhcmFtIGxlZnQgLSBBIFNpZ25lciB0byBjb21wYXJlIHdpdGguXG4gICAqIEBwYXJhbSByaWdodCAtIEEgc2Vjb25kIFNpZ25lciB0byBjb21wYXJlIHdpdGguXG4gICAqIEByZXR1cm5zIDEgaWYgbGVmdCBcXD4gcmlnaHQsIDAgaWYgbGVmdCA9IHJpZ2h0LCAtMSBpZiBsZWZ0IFxcPCByaWdodCwgYW5kIG51bGwgaWYgbGVmdCBvciByaWdodCBhcmUgTmFOLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wYXJlU2lnbmVyc0J5QWNjb3VudChhZGRyZXNzMTogc3RyaW5nLCBhZGRyZXNzMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBhZGRyZXNzQk4xID0gdGhpcy5hZGRyZXNzVG9CaWdOdW1iZXIoYWRkcmVzczEpO1xuICAgIGNvbnN0IGFkZHJlc3NCTjIgPSB0aGlzLmFkZHJlc3NUb0JpZ051bWJlcihhZGRyZXNzMik7XG4gICAgcmV0dXJuIGFkZHJlc3NCTjEuY29tcGFyZWRUbyhhZGRyZXNzQk4yKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkcmVzc1RvQmlnTnVtYmVyKGFkZHJlc3M6IHN0cmluZyk6IEJpZ051bWJlciB7XG4gICAgY29uc3QgaGV4ID0gQnVmZmVyLmZyb20oeHJwbC5kZWNvZGVBY2NvdW50SUQoYWRkcmVzcykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBudW1iZXJPZkJpdHNJbkhleCA9IDE2O1xuICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKGhleCwgbnVtYmVyT2ZCaXRzSW5IZXgpO1xuICB9XG59XG4iXX0=
|