@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,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TransferBuilder = void 0;
|
|
7
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
9
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
10
|
+
class TransferBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
11
|
+
constructor(_coinConfig) {
|
|
12
|
+
super(_coinConfig);
|
|
13
|
+
}
|
|
14
|
+
get transactionType() {
|
|
15
|
+
return sdk_core_1.TransactionType.Send;
|
|
16
|
+
}
|
|
17
|
+
get xrpTransactionType() {
|
|
18
|
+
return 'Payment';
|
|
19
|
+
}
|
|
20
|
+
initBuilder(tx) {
|
|
21
|
+
super.initBuilder(tx);
|
|
22
|
+
const { destination, amount, destinationTag } = tx.toJson();
|
|
23
|
+
if (!destination) {
|
|
24
|
+
throw new sdk_core_1.BuildTransactionError('Missing destination');
|
|
25
|
+
}
|
|
26
|
+
if (!amount) {
|
|
27
|
+
throw new sdk_core_1.BuildTransactionError('Missing amount');
|
|
28
|
+
}
|
|
29
|
+
const normalizeAddress = utils_1.default.normalizeAddress({ address: destination, destinationTag });
|
|
30
|
+
this.to(normalizeAddress);
|
|
31
|
+
if (typeof amount !== 'string') {
|
|
32
|
+
throw new sdk_core_1.BuildTransactionError('Invalid Amount');
|
|
33
|
+
}
|
|
34
|
+
this.amount(amount);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set the receiver address
|
|
38
|
+
* @param {string} address - the address with optional destination tag
|
|
39
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
40
|
+
*/
|
|
41
|
+
to(address) {
|
|
42
|
+
const { address: xrpAddress, destinationTag } = utils_1.default.getAddressDetails(address);
|
|
43
|
+
this._destination = xrpAddress;
|
|
44
|
+
this._destinationTag = destinationTag;
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Set the amount to send
|
|
49
|
+
* @param {string} amount - the amount sent
|
|
50
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
51
|
+
*/
|
|
52
|
+
amount(amount) {
|
|
53
|
+
if (typeof amount !== 'string') {
|
|
54
|
+
throw new Error(`amount type ${typeof amount} must be a string`);
|
|
55
|
+
}
|
|
56
|
+
const amountBigInt = BigInt(amount);
|
|
57
|
+
if (amountBigInt < 0) {
|
|
58
|
+
throw new Error(`amount ${amount} is not valid`);
|
|
59
|
+
}
|
|
60
|
+
this._amount = amount;
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
/** @inheritdoc */
|
|
64
|
+
async buildImplementation() {
|
|
65
|
+
if (!this._sender) {
|
|
66
|
+
throw new sdk_core_1.BuildTransactionError('Sender must be set before building the transaction');
|
|
67
|
+
}
|
|
68
|
+
const transferFields = {
|
|
69
|
+
TransactionType: this.xrpTransactionType,
|
|
70
|
+
Account: this._sender,
|
|
71
|
+
Destination: this._destination,
|
|
72
|
+
Amount: this._amount,
|
|
73
|
+
};
|
|
74
|
+
if (typeof this._destinationTag === 'number') {
|
|
75
|
+
transferFields.DestinationTag = this._destinationTag;
|
|
76
|
+
}
|
|
77
|
+
this._specificFields = transferFields;
|
|
78
|
+
return await super.buildImplementation();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.TransferBuilder = TransferBuilder;
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQThFO0FBSTlFLDZEQUEwRDtBQUMxRCxvREFBNEI7QUFFNUIsTUFBYSxlQUFnQixTQUFRLHVDQUFrQjtJQUtyRCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQWMsa0JBQWtCO1FBQzlCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBZTtRQUN6QixLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQyxPQUFlO1FBQ2hCLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxHQUFHLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQWM7UUFDbkIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsT0FBTyxNQUFNLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsTUFBTSxlQUFlLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBWTtZQUM5QixlQUFlLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUN4QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztTQUNyQixDQUFDO1FBRUYsSUFBSSxPQUFPLElBQUksQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0MsY0FBYyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3ZELENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUV0QyxPQUFPLE1BQU0sS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBdEZELDBDQXNGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQW1vdW50LCBQYXltZW50IH0gZnJvbSAneHJwbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfYW1vdW50OiBBbW91bnQ7XG4gIHByaXZhdGUgX2Rlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2Rlc3RpbmF0aW9uVGFnPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB4cnBUcmFuc2FjdGlvblR5cGUoKTogJ1BheW1lbnQnIHtcbiAgICByZXR1cm4gJ1BheW1lbnQnO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuXG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgYW1vdW50LCBkZXN0aW5hdGlvblRhZyB9ID0gdHgudG9Kc29uKCk7XG4gICAgaWYgKCFkZXN0aW5hdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBkZXN0aW5hdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIWFtb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBhbW91bnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVBZGRyZXNzID0gdXRpbHMubm9ybWFsaXplQWRkcmVzcyh7IGFkZHJlc3M6IGRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblRhZyB9KTtcbiAgICB0aGlzLnRvKG5vcm1hbGl6ZUFkZHJlc3MpO1xuICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBBbW91bnQnKTtcbiAgICB9XG4gICAgdGhpcy5hbW91bnQoYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2V0IHRoZSByZWNlaXZlciBhZGRyZXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gdGhlIGFkZHJlc3Mgd2l0aCBvcHRpb25hbCBkZXN0aW5hdGlvbiB0YWdcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICB0byhhZGRyZXNzOiBzdHJpbmcpOiBUcmFuc2ZlckJ1aWxkZXIge1xuICAgIGNvbnN0IHsgYWRkcmVzczogeHJwQWRkcmVzcywgZGVzdGluYXRpb25UYWcgfSA9IHV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGFkZHJlc3MpO1xuICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0geHJwQWRkcmVzcztcbiAgICB0aGlzLl9kZXN0aW5hdGlvblRhZyA9IGRlc3RpbmF0aW9uVGFnO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqICBTZXQgdGhlIGFtb3VudCB0byBzZW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgYW1vdW50IHNlbnRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBhbW91bnQoYW1vdW50OiBzdHJpbmcpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhbW91bnQgdHlwZSAke3R5cGVvZiBhbW91bnR9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICB9XG4gICAgY29uc3QgYW1vdW50QmlnSW50ID0gQmlnSW50KGFtb3VudCk7XG4gICAgaWYgKGFtb3VudEJpZ0ludCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYW1vdW50ICR7YW1vdW50fSBpcyBub3QgdmFsaWRgKTtcbiAgICB9XG4gICAgdGhpcy5fYW1vdW50ID0gYW1vdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoIXRoaXMuX3NlbmRlcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU2VuZGVyIG11c3QgYmUgc2V0IGJlZm9yZSBidWlsZGluZyB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2ZlckZpZWxkczogUGF5bWVudCA9IHtcbiAgICAgIFRyYW5zYWN0aW9uVHlwZTogdGhpcy54cnBUcmFuc2FjdGlvblR5cGUsXG4gICAgICBBY2NvdW50OiB0aGlzLl9zZW5kZXIsXG4gICAgICBEZXN0aW5hdGlvbjogdGhpcy5fZGVzdGluYXRpb24sXG4gICAgICBBbW91bnQ6IHRoaXMuX2Ftb3VudCxcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9kZXN0aW5hdGlvblRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRyYW5zZmVyRmllbGRzLkRlc3RpbmF0aW9uVGFnID0gdGhpcy5fZGVzdGluYXRpb25UYWc7XG4gICAgfVxuXG4gICAgdGhpcy5fc3BlY2lmaWNGaWVsZHMgPSB0cmFuc2ZlckZpZWxkcztcblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { XrpTransactionType } from './iface';
|
|
4
|
+
import { Transaction } from './transaction';
|
|
5
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
6
|
+
export declare class TrustSetBuilder extends TransactionBuilder {
|
|
7
|
+
private _amount;
|
|
8
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
9
|
+
protected get transactionType(): TransactionType;
|
|
10
|
+
protected get xrpTransactionType(): XrpTransactionType.TrustSet;
|
|
11
|
+
initBuilder(tx: Transaction): void;
|
|
12
|
+
/**
|
|
13
|
+
* Set the amount to send
|
|
14
|
+
* @param {string} amount - the amount sent
|
|
15
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
16
|
+
*/
|
|
17
|
+
amount(amount: string): TransactionBuilder;
|
|
18
|
+
/** @inheritdoc */
|
|
19
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=trustsetBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trustsetBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/trustsetBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,OAAO,CAAC,OAAO,CAAuB;gBAE1B,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,SAAS,KAAK,kBAAkB,IAAI,kBAAkB,CAAC,QAAQ,CAE9D;IAED,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAelC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAkB1C,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CAe5D"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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.TrustSetBuilder = 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 TrustSetBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
13
|
+
constructor(_coinConfig) {
|
|
14
|
+
super(_coinConfig);
|
|
15
|
+
}
|
|
16
|
+
get transactionType() {
|
|
17
|
+
return sdk_core_1.TransactionType.TrustLine;
|
|
18
|
+
}
|
|
19
|
+
get xrpTransactionType() {
|
|
20
|
+
return iface_1.XrpTransactionType.TrustSet;
|
|
21
|
+
}
|
|
22
|
+
initBuilder(tx) {
|
|
23
|
+
super.initBuilder(tx);
|
|
24
|
+
const { amount } = tx.toJson();
|
|
25
|
+
if (!amount) {
|
|
26
|
+
throw new sdk_core_1.BuildTransactionError('Missing amount');
|
|
27
|
+
}
|
|
28
|
+
if (!utils_1.default.isIssuedCurrencyAmount(amount)) {
|
|
29
|
+
throw new sdk_core_1.BuildTransactionError('Invalid Limit Amount');
|
|
30
|
+
}
|
|
31
|
+
// The amount is represented in decimal notation, so we need to multiply it by the decimal places
|
|
32
|
+
const amountBigNum = (0, bignumber_js_1.default)(amount.value).shiftedBy(this._coinConfig.decimalPlaces);
|
|
33
|
+
this.amount(amountBigNum.toFixed());
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Set the amount to send
|
|
37
|
+
* @param {string} amount - the amount sent
|
|
38
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
39
|
+
*/
|
|
40
|
+
amount(amount) {
|
|
41
|
+
if (typeof amount !== 'string') {
|
|
42
|
+
throw new Error(`amount type ${typeof amount} must be a string`);
|
|
43
|
+
}
|
|
44
|
+
const amountBigNum = (0, bignumber_js_1.default)(amount);
|
|
45
|
+
if (amountBigNum.lt(0)) {
|
|
46
|
+
throw new Error(`amount ${amount} is not valid`);
|
|
47
|
+
}
|
|
48
|
+
const currency = utils_1.default.getXrpCurrencyFromTokenName(this._coinConfig.name);
|
|
49
|
+
// Unlike most coins, XRP Token amounts are represented in decimal notation
|
|
50
|
+
const value = amountBigNum.shiftedBy(-1 * this._coinConfig.decimalPlaces).toFixed();
|
|
51
|
+
this._amount = {
|
|
52
|
+
value: value,
|
|
53
|
+
...currency,
|
|
54
|
+
};
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
/** @inheritdoc */
|
|
58
|
+
async buildImplementation() {
|
|
59
|
+
if (!this._sender) {
|
|
60
|
+
throw new sdk_core_1.BuildTransactionError('Sender must be set before building the transaction');
|
|
61
|
+
}
|
|
62
|
+
const trustSetFields = {
|
|
63
|
+
TransactionType: this.xrpTransactionType,
|
|
64
|
+
Account: this._sender,
|
|
65
|
+
LimitAmount: this._amount,
|
|
66
|
+
};
|
|
67
|
+
this._specificFields = trustSetFields;
|
|
68
|
+
return await super.buildImplementation();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.TrustSetBuilder = TrustSetBuilder;
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RzZXRCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cnVzdHNldEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQThFO0FBRTlFLGdFQUFxQztBQUVyQyxtQ0FBNkM7QUFFN0MsNkRBQTBEO0FBQzFELG9EQUE0QjtBQUU1QixNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBR3JELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBYyxrQkFBa0I7UUFDOUIsT0FBTywwQkFBa0IsQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFlO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxpR0FBaUc7UUFDakcsTUFBTSxZQUFZLEdBQUcsSUFBQSxzQkFBUyxFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQWM7UUFDbkIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsT0FBTyxNQUFNLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUEsc0JBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsTUFBTSxlQUFlLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUUsMkVBQTJFO1FBQzNFLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwRixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsS0FBSyxFQUFFLEtBQUs7WUFDWixHQUFHLFFBQVE7U0FDWixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBYTtZQUMvQixlQUFlLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUN4QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQzFCLENBQUM7UUFFRixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUV0QyxPQUFPLE1BQU0sS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBckVELDBDQXFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgSXNzdWVkQ3VycmVuY3lBbW91bnQsIFRydXN0U2V0IH0gZnJvbSAneHJwbCc7XG5pbXBvcnQgeyBYcnBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBUcnVzdFNldEJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9hbW91bnQ6IElzc3VlZEN1cnJlbmN5QW1vdW50O1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5UcnVzdExpbmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHhycFRyYW5zYWN0aW9uVHlwZSgpOiBYcnBUcmFuc2FjdGlvblR5cGUuVHJ1c3RTZXQge1xuICAgIHJldHVybiBYcnBUcmFuc2FjdGlvblR5cGUuVHJ1c3RTZXQ7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG5cbiAgICBjb25zdCB7IGFtb3VudCB9ID0gdHgudG9Kc29uKCk7XG4gICAgaWYgKCFhbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgYW1vdW50Jyk7XG4gICAgfVxuICAgIGlmICghdXRpbHMuaXNJc3N1ZWRDdXJyZW5jeUFtb3VudChhbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIExpbWl0IEFtb3VudCcpO1xuICAgIH1cbiAgICAvLyBUaGUgYW1vdW50IGlzIHJlcHJlc2VudGVkIGluIGRlY2ltYWwgbm90YXRpb24sIHNvIHdlIG5lZWQgdG8gbXVsdGlwbHkgaXQgYnkgdGhlIGRlY2ltYWwgcGxhY2VzXG4gICAgY29uc3QgYW1vdW50QmlnTnVtID0gQmlnTnVtYmVyKGFtb3VudC52YWx1ZSkuc2hpZnRlZEJ5KHRoaXMuX2NvaW5Db25maWcuZGVjaW1hbFBsYWNlcyk7XG4gICAgdGhpcy5hbW91bnQoYW1vdW50QmlnTnVtLnRvRml4ZWQoKSk7XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgYW1vdW50IHRvIHNlbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBhbW91bnQgc2VudFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGFtb3VudChhbW91bnQ6IHN0cmluZyk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFtb3VudCB0eXBlICR7dHlwZW9mIGFtb3VudH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgIH1cbiAgICBjb25zdCBhbW91bnRCaWdOdW0gPSBCaWdOdW1iZXIoYW1vdW50KTtcbiAgICBpZiAoYW1vdW50QmlnTnVtLmx0KDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFtb3VudCAke2Ftb3VudH0gaXMgbm90IHZhbGlkYCk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbmN5ID0gdXRpbHMuZ2V0WHJwQ3VycmVuY3lGcm9tVG9rZW5OYW1lKHRoaXMuX2NvaW5Db25maWcubmFtZSk7XG4gICAgLy8gVW5saWtlIG1vc3QgY29pbnMsIFhSUCBUb2tlbiBhbW91bnRzIGFyZSByZXByZXNlbnRlZCBpbiBkZWNpbWFsIG5vdGF0aW9uXG4gICAgY29uc3QgdmFsdWUgPSBhbW91bnRCaWdOdW0uc2hpZnRlZEJ5KC0xICogdGhpcy5fY29pbkNvbmZpZy5kZWNpbWFsUGxhY2VzKS50b0ZpeGVkKCk7XG4gICAgdGhpcy5fYW1vdW50ID0ge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgLi4uY3VycmVuY3ksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLl9zZW5kZXIpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1NlbmRlciBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJ1c3RTZXRGaWVsZHM6IFRydXN0U2V0ID0ge1xuICAgICAgVHJhbnNhY3Rpb25UeXBlOiB0aGlzLnhycFRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIEFjY291bnQ6IHRoaXMuX3NlbmRlcixcbiAgICAgIExpbWl0QW1vdW50OiB0aGlzLl9hbW91bnQsXG4gICAgfTtcblxuICAgIHRoaXMuX3NwZWNpZmljRmllbGRzID0gdHJ1c3RTZXRGaWVsZHM7XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { BaseUtils } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin } from '@bitgo-beta/statics';
|
|
3
|
+
import * as xrpl from 'xrpl';
|
|
4
|
+
import { Amount, IssuedCurrencyAmount } from 'xrpl';
|
|
5
|
+
import { Address, SignerDetails } from './iface';
|
|
6
|
+
declare class Utils implements BaseUtils {
|
|
7
|
+
isValidAddress(address: string): boolean;
|
|
8
|
+
isValidTransactionId(txId: string): boolean;
|
|
9
|
+
isValidPublicKey(key: string): boolean;
|
|
10
|
+
isValidPrivateKey(key: string): boolean;
|
|
11
|
+
isValidSignature(signature: string): boolean;
|
|
12
|
+
isValidBlockId(hash: string): boolean;
|
|
13
|
+
isValidHex(hex: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Parse an address string into address and destination tag
|
|
16
|
+
*/
|
|
17
|
+
getAddressDetails(address: string): Address;
|
|
18
|
+
/**
|
|
19
|
+
* Construct a full, normalized address from an address and destination tag
|
|
20
|
+
*/
|
|
21
|
+
normalizeAddress({ address, destinationTag }: Address): string;
|
|
22
|
+
/**
|
|
23
|
+
* @param message hex encoded string
|
|
24
|
+
* @param privateKey
|
|
25
|
+
* return hex encoded signature string, throws if any of the inputs are invalid
|
|
26
|
+
*/
|
|
27
|
+
signString(message: string, privateKey: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* @param message hex encoded string
|
|
30
|
+
* @param signature hex encooded signature string
|
|
31
|
+
* @param publicKey
|
|
32
|
+
* return boolean, throws if any of the inputs are invalid
|
|
33
|
+
*/
|
|
34
|
+
verifySignature(message: string, signature: string, publicKey: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} rawTransaction - Transaction in hex string format
|
|
39
|
+
*/
|
|
40
|
+
validateRawTransaction(rawTransaction: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Checks if raw transaction can be deserialized
|
|
43
|
+
*
|
|
44
|
+
* @param {string} rawTransaction - transaction in base64 string format
|
|
45
|
+
* @returns {boolean} - the validation result
|
|
46
|
+
*/
|
|
47
|
+
isValidRawTransaction(rawTransaction: string): boolean;
|
|
48
|
+
validateAccountSetFlag(setFlag: number): void;
|
|
49
|
+
validateSigner(signer: SignerDetails): void;
|
|
50
|
+
/**
|
|
51
|
+
* Determines if the provided `amount` is for a token payment
|
|
52
|
+
*/
|
|
53
|
+
isIssuedCurrencyAmount(amount: Amount): amount is IssuedCurrencyAmount;
|
|
54
|
+
/**
|
|
55
|
+
* Get the associated XRP Currency details from token name. Throws an error if token is unsupported
|
|
56
|
+
* @param {string} tokenName - The token name
|
|
57
|
+
*/
|
|
58
|
+
getXrpCurrencyFromTokenName(tokenName: string): xrpl.IssuedCurrency;
|
|
59
|
+
/**
|
|
60
|
+
* Decodes a serialized XRPL transaction.
|
|
61
|
+
*
|
|
62
|
+
* @param {string} txHex - The serialized transaction in hex.
|
|
63
|
+
* @returns {Object} - Decoded transaction object.
|
|
64
|
+
* @throws {Error} - If decoding fails or input is invalid.
|
|
65
|
+
*/
|
|
66
|
+
decodeTransaction(txHex: string): Record<string, unknown>;
|
|
67
|
+
/**
|
|
68
|
+
* Get the statics coin object matching a given Xrp token issuer address and currency code if it exists
|
|
69
|
+
*
|
|
70
|
+
* @param issuerAddress The token issuer address to match against
|
|
71
|
+
* @param currencyCode The token currency code to match against
|
|
72
|
+
* @returns statics BaseCoin object for the matching token
|
|
73
|
+
*/
|
|
74
|
+
getXrpToken(issuerAddress: any, currencyCode: any): Readonly<BaseCoin> | undefined;
|
|
75
|
+
}
|
|
76
|
+
declare const utils: Utils;
|
|
77
|
+
export default utils;
|
|
78
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAKV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAkB,MAAM,qBAAqB,CAAC;AAI/D,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIjD,cAAM,KAAM,YAAW,SAAS;IAC9B,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASxC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAStC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACI,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IA8ClD;;OAEG;IACI,gBAAgB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,GAAG,MAAM;IAgBrE;;;;OAIG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAU9D;;;;;OAKG;IACI,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAiBtF;;;;OAIG;IACI,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAY3D;;;;;OAKG;IACI,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAUtD,sBAAsB,CAAC,OAAO,EAAE,MAAM;IAStC,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAYlD;;OAEG;IACI,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,oBAAoB;IAU7E;;;OAGG;IACI,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,cAAc;IAc1E;;;;;;OAMG;IACI,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAWtC;;;;;;OAMG;IACI,WAAW,CAAC,aAAa,KAAA,EAAE,YAAY,KAAA,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS;CAehF;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,304 @@
|
|
|
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
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
40
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
41
|
+
const querystring = __importStar(require("querystring"));
|
|
42
|
+
const rippleKeypairs = __importStar(require("ripple-keypairs"));
|
|
43
|
+
const url = __importStar(require("url"));
|
|
44
|
+
const xrpl = __importStar(require("xrpl"));
|
|
45
|
+
const constants_1 = require("./constants");
|
|
46
|
+
const keyPair_1 = require("./keyPair");
|
|
47
|
+
const assert_1 = __importDefault(require("assert"));
|
|
48
|
+
class Utils {
|
|
49
|
+
isValidAddress(address) {
|
|
50
|
+
try {
|
|
51
|
+
const addressDetails = this.getAddressDetails(address);
|
|
52
|
+
return address === this.normalizeAddress(addressDetails);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
isValidTransactionId(txId) {
|
|
59
|
+
return this.isValidHex(txId);
|
|
60
|
+
}
|
|
61
|
+
isValidPublicKey(key) {
|
|
62
|
+
try {
|
|
63
|
+
new keyPair_1.KeyPair({ pub: key });
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
isValidPrivateKey(key) {
|
|
71
|
+
try {
|
|
72
|
+
new keyPair_1.KeyPair({ prv: key });
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
isValidSignature(signature) {
|
|
80
|
+
return this.isValidHex(signature);
|
|
81
|
+
}
|
|
82
|
+
isValidBlockId(hash) {
|
|
83
|
+
return this.isValidHex(hash);
|
|
84
|
+
}
|
|
85
|
+
isValidHex(hex) {
|
|
86
|
+
return /^([a-fA-F0-9])+$/.test(hex);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse an address string into address and destination tag
|
|
90
|
+
*/
|
|
91
|
+
getAddressDetails(address) {
|
|
92
|
+
const destinationDetails = url.parse(address);
|
|
93
|
+
const destinationAddress = destinationDetails.pathname;
|
|
94
|
+
if (!destinationAddress || !xrpl.isValidClassicAddress(destinationAddress)) {
|
|
95
|
+
throw new sdk_core_1.InvalidAddressError(`destination address "${destinationAddress}" is not valid`);
|
|
96
|
+
}
|
|
97
|
+
// there are no other properties like destination tags
|
|
98
|
+
if (destinationDetails.pathname === address) {
|
|
99
|
+
return {
|
|
100
|
+
address: address,
|
|
101
|
+
destinationTag: undefined,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (!destinationDetails.query) {
|
|
105
|
+
throw new sdk_core_1.InvalidAddressError('no query params present');
|
|
106
|
+
}
|
|
107
|
+
const queryDetails = querystring.parse(destinationDetails.query);
|
|
108
|
+
if (!queryDetails.dt) {
|
|
109
|
+
// if there are more properties, the query details need to contain the destination tag property.
|
|
110
|
+
throw new sdk_core_1.InvalidAddressError('destination tag missing');
|
|
111
|
+
}
|
|
112
|
+
if (Array.isArray(queryDetails.dt)) {
|
|
113
|
+
// if queryDetails.dt is an array, that means dt was given multiple times, which is not valid
|
|
114
|
+
throw new sdk_core_1.InvalidAddressError(`destination tag can appear at most once, but ${queryDetails.dt.length} destination tags were found`);
|
|
115
|
+
}
|
|
116
|
+
const parsedTag = parseInt(queryDetails.dt, 10);
|
|
117
|
+
if (!Number.isSafeInteger(parsedTag)) {
|
|
118
|
+
throw new sdk_core_1.InvalidAddressError('invalid destination tag');
|
|
119
|
+
}
|
|
120
|
+
if (parsedTag > 0xffffffff || parsedTag < 0) {
|
|
121
|
+
throw new sdk_core_1.InvalidAddressError('destination tag out of range');
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
address: destinationAddress,
|
|
125
|
+
destinationTag: parsedTag,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Construct a full, normalized address from an address and destination tag
|
|
130
|
+
*/
|
|
131
|
+
normalizeAddress({ address, destinationTag }) {
|
|
132
|
+
if (typeof address !== 'string') {
|
|
133
|
+
throw new sdk_core_1.InvalidAddressError('invalid address, expected string');
|
|
134
|
+
}
|
|
135
|
+
if (typeof destinationTag === 'undefined' || destinationTag === null) {
|
|
136
|
+
return address;
|
|
137
|
+
}
|
|
138
|
+
if (!Number.isInteger(destinationTag)) {
|
|
139
|
+
throw new sdk_core_1.InvalidAddressError('invalid destination tag, expected integer');
|
|
140
|
+
}
|
|
141
|
+
if (destinationTag > 0xffffffff || destinationTag < 0) {
|
|
142
|
+
throw new sdk_core_1.InvalidAddressError('destination tag out of range');
|
|
143
|
+
}
|
|
144
|
+
return `${address}?dt=${destinationTag}`;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* @param message hex encoded string
|
|
148
|
+
* @param privateKey
|
|
149
|
+
* return hex encoded signature string, throws if any of the inputs are invalid
|
|
150
|
+
*/
|
|
151
|
+
signString(message, privateKey) {
|
|
152
|
+
if (!this.isValidHex(message)) {
|
|
153
|
+
throw new sdk_core_1.UtilsError('message must be a hex encoded string');
|
|
154
|
+
}
|
|
155
|
+
if (!this.isValidPrivateKey(privateKey)) {
|
|
156
|
+
throw new sdk_core_1.UtilsError('invalid private key');
|
|
157
|
+
}
|
|
158
|
+
return rippleKeypairs.sign(message, privateKey);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* @param message hex encoded string
|
|
162
|
+
* @param signature hex encooded signature string
|
|
163
|
+
* @param publicKey
|
|
164
|
+
* return boolean, throws if any of the inputs are invalid
|
|
165
|
+
*/
|
|
166
|
+
verifySignature(message, signature, publicKey) {
|
|
167
|
+
if (!this.isValidHex(message)) {
|
|
168
|
+
throw new sdk_core_1.UtilsError('message must be a hex encoded string');
|
|
169
|
+
}
|
|
170
|
+
if (!this.isValidSignature(signature)) {
|
|
171
|
+
throw new sdk_core_1.UtilsError('invalid signature');
|
|
172
|
+
}
|
|
173
|
+
if (!this.isValidPublicKey(publicKey)) {
|
|
174
|
+
throw new sdk_core_1.UtilsError('invalid public key');
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
return rippleKeypairs.verify(message, signature, publicKey);
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
185
|
+
*
|
|
186
|
+
* @param {string} rawTransaction - Transaction in hex string format
|
|
187
|
+
*/
|
|
188
|
+
validateRawTransaction(rawTransaction) {
|
|
189
|
+
if (!rawTransaction) {
|
|
190
|
+
throw new sdk_core_1.InvalidTransactionError('Invalid raw transaction: Undefined');
|
|
191
|
+
}
|
|
192
|
+
if (!this.isValidHex(rawTransaction)) {
|
|
193
|
+
throw new sdk_core_1.InvalidTransactionError('Invalid raw transaction: Hex string expected');
|
|
194
|
+
}
|
|
195
|
+
if (!this.isValidRawTransaction(rawTransaction)) {
|
|
196
|
+
throw new sdk_core_1.InvalidTransactionError('Invalid raw transaction');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Checks if raw transaction can be deserialized
|
|
201
|
+
*
|
|
202
|
+
* @param {string} rawTransaction - transaction in base64 string format
|
|
203
|
+
* @returns {boolean} - the validation result
|
|
204
|
+
*/
|
|
205
|
+
isValidRawTransaction(rawTransaction) {
|
|
206
|
+
try {
|
|
207
|
+
const jsonTx = xrpl.decode(rawTransaction);
|
|
208
|
+
xrpl.validate(jsonTx);
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
validateAccountSetFlag(setFlag) {
|
|
216
|
+
if (typeof setFlag !== 'number') {
|
|
217
|
+
throw new sdk_core_1.UtilsError(`setFlag ${setFlag} is not valid`);
|
|
218
|
+
}
|
|
219
|
+
if (!constants_1.VALID_ACCOUNT_SET_FLAGS.includes(setFlag)) {
|
|
220
|
+
throw new sdk_core_1.UtilsError(`setFlag ${setFlag} is not a valid account set flag`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
validateSigner(signer) {
|
|
224
|
+
if (!signer.address) {
|
|
225
|
+
throw new sdk_core_1.UtilsError('signer must have an address');
|
|
226
|
+
}
|
|
227
|
+
if (!this.isValidAddress(signer.address)) {
|
|
228
|
+
throw new sdk_core_1.UtilsError(`signer address ${signer.address} is invalid`);
|
|
229
|
+
}
|
|
230
|
+
if (typeof signer.weight !== 'number' || signer.weight < 0) {
|
|
231
|
+
throw new sdk_core_1.UtilsError(`signer weight ${signer.weight} is not valid`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Determines if the provided `amount` is for a token payment
|
|
236
|
+
*/
|
|
237
|
+
isIssuedCurrencyAmount(amount) {
|
|
238
|
+
return (!!amount &&
|
|
239
|
+
typeof amount === 'object' &&
|
|
240
|
+
typeof amount.currency === 'string' &&
|
|
241
|
+
typeof amount.issuer === 'string' &&
|
|
242
|
+
typeof amount.value === 'string');
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get the associated XRP Currency details from token name. Throws an error if token is unsupported
|
|
246
|
+
* @param {string} tokenName - The token name
|
|
247
|
+
*/
|
|
248
|
+
getXrpCurrencyFromTokenName(tokenName) {
|
|
249
|
+
if (!statics_1.coins.has(tokenName)) {
|
|
250
|
+
throw new sdk_core_1.UnsupportedTokenError(`${tokenName} is not supported`);
|
|
251
|
+
}
|
|
252
|
+
const token = statics_1.coins.get(tokenName);
|
|
253
|
+
if (!token.isToken || !(token instanceof statics_1.XrpCoin)) {
|
|
254
|
+
throw new sdk_core_1.UnsupportedTokenError(`${tokenName} is not an XRP token`);
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
currency: token.currencyCode,
|
|
258
|
+
issuer: token.issuerAddress,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Decodes a serialized XRPL transaction.
|
|
263
|
+
*
|
|
264
|
+
* @param {string} txHex - The serialized transaction in hex.
|
|
265
|
+
* @returns {Object} - Decoded transaction object.
|
|
266
|
+
* @throws {Error} - If decoding fails or input is invalid.
|
|
267
|
+
*/
|
|
268
|
+
decodeTransaction(txHex) {
|
|
269
|
+
if (typeof txHex !== 'string' || txHex.trim() === '') {
|
|
270
|
+
throw new Error('Invalid transaction hex. Expected a non-empty string.');
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
return xrpl.decode(txHex);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
throw new Error(`Failed to decode transaction: ${error.message}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get the statics coin object matching a given Xrp token issuer address and currency code if it exists
|
|
281
|
+
*
|
|
282
|
+
* @param issuerAddress The token issuer address to match against
|
|
283
|
+
* @param currencyCode The token currency code to match against
|
|
284
|
+
* @returns statics BaseCoin object for the matching token
|
|
285
|
+
*/
|
|
286
|
+
getXrpToken(issuerAddress, currencyCode) {
|
|
287
|
+
const tokens = statics_1.coins.filter((coin) => {
|
|
288
|
+
if (coin instanceof statics_1.XrpCoin) {
|
|
289
|
+
return coin.issuerAddress === issuerAddress && coin.currencyCode === currencyCode;
|
|
290
|
+
}
|
|
291
|
+
return false;
|
|
292
|
+
});
|
|
293
|
+
const tokensArray = tokens.map((token) => token);
|
|
294
|
+
if (tokensArray.length >= 1) {
|
|
295
|
+
// there should never be two tokens with the same issuer address and currency code, so we assert that here
|
|
296
|
+
(0, assert_1.default)(tokensArray.length === 1);
|
|
297
|
+
return tokensArray[0];
|
|
298
|
+
}
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const utils = new Utils();
|
|
303
|
+
exports.default = utils;
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBTThCO0FBQzlCLGlEQUErRDtBQUMvRCx5REFBMkM7QUFDM0MsZ0VBQWtEO0FBQ2xELHlDQUEyQjtBQUMzQiwyQ0FBNkI7QUFFN0IsMkNBQXNEO0FBRXRELHVDQUFrRDtBQUNsRCxvREFBNEI7QUFFNUIsTUFBTSxLQUFLO0lBQ1QsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixJQUFJLENBQUM7WUFDSCxJQUFJLGlCQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBVztRQUMzQixJQUFJLENBQUM7WUFDSCxJQUFJLGlCQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFN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QztZQUNwRixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QiwwR0FBMEc7WUFDMUcsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZVV0aWxzLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgVW5zdXBwb3J0ZWRUb2tlbkVycm9yLFxuICBVdGlsc0Vycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiwgY29pbnMsIFhycENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCAqIGFzIHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJztcbmltcG9ydCAqIGFzIHJpcHBsZUtleXBhaXJzIGZyb20gJ3JpcHBsZS1rZXlwYWlycyc7XG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAndXJsJztcbmltcG9ydCAqIGFzIHhycGwgZnJvbSAneHJwbCc7XG5pbXBvcnQgeyBBbW91bnQsIElzc3VlZEN1cnJlbmN5QW1vdW50IH0gZnJvbSAneHJwbCc7XG5pbXBvcnQgeyBWQUxJRF9BQ0NPVU5UX1NFVF9GTEFHUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEFkZHJlc3MsIFNpZ25lckRldGFpbHMgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgYXMgWHJwS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gdGhpcy5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcbiAgICAgIHJldHVybiBhZGRyZXNzID09PSB0aGlzLm5vcm1hbGl6ZUFkZHJlc3MoYWRkcmVzc0RldGFpbHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGV4KHR4SWQpO1xuICB9XG5cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgWHJwS2V5UGFpcih7IHB1Yjoga2V5IH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFhycEtleVBhaXIoeyBwcnY6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGV4KHNpZ25hdHVyZSk7XG4gIH1cblxuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGV4KGhhc2gpO1xuICB9XG5cbiAgaXNWYWxpZEhleChoZXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXihbYS1mQS1GMC05XSkrJC8udGVzdChoZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFuIGFkZHJlc3Mgc3RyaW5nIGludG8gYWRkcmVzcyBhbmQgZGVzdGluYXRpb24gdGFnXG4gICAqL1xuICBwdWJsaWMgZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzczogc3RyaW5nKTogQWRkcmVzcyB7XG4gICAgY29uc3QgZGVzdGluYXRpb25EZXRhaWxzID0gdXJsLnBhcnNlKGFkZHJlc3MpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uQWRkcmVzcyA9IGRlc3RpbmF0aW9uRGV0YWlscy5wYXRobmFtZTtcbiAgICBpZiAoIWRlc3RpbmF0aW9uQWRkcmVzcyB8fCAheHJwbC5pc1ZhbGlkQ2xhc3NpY0FkZHJlc3MoZGVzdGluYXRpb25BZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGRlc3RpbmF0aW9uIGFkZHJlc3MgXCIke2Rlc3RpbmF0aW9uQWRkcmVzc31cIiBpcyBub3QgdmFsaWRgKTtcbiAgICB9XG4gICAgLy8gdGhlcmUgYXJlIG5vIG90aGVyIHByb3BlcnRpZXMgbGlrZSBkZXN0aW5hdGlvbiB0YWdzXG4gICAgaWYgKGRlc3RpbmF0aW9uRGV0YWlscy5wYXRobmFtZSA9PT0gYWRkcmVzcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgZGVzdGluYXRpb25UYWc6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFkZXN0aW5hdGlvbkRldGFpbHMucXVlcnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKCdubyBxdWVyeSBwYXJhbXMgcHJlc2VudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5RGV0YWlscyA9IHF1ZXJ5c3RyaW5nLnBhcnNlKGRlc3RpbmF0aW9uRGV0YWlscy5xdWVyeSk7XG4gICAgaWYgKCFxdWVyeURldGFpbHMuZHQpIHtcbiAgICAgIC8vIGlmIHRoZXJlIGFyZSBtb3JlIHByb3BlcnRpZXMsIHRoZSBxdWVyeSBkZXRhaWxzIG5lZWQgdG8gY29udGFpbiB0aGUgZGVzdGluYXRpb24gdGFnIHByb3BlcnR5LlxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoJ2Rlc3RpbmF0aW9uIHRhZyBtaXNzaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocXVlcnlEZXRhaWxzLmR0KSkge1xuICAgICAgLy8gaWYgcXVlcnlEZXRhaWxzLmR0IGlzIGFuIGFycmF5LCB0aGF0IG1lYW5zIGR0IHdhcyBnaXZlbiBtdWx0aXBsZSB0aW1lcywgd2hpY2ggaXMgbm90IHZhbGlkXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihcbiAgICAgICAgYGRlc3RpbmF0aW9uIHRhZyBjYW4gYXBwZWFyIGF0IG1vc3Qgb25jZSwgYnV0ICR7cXVlcnlEZXRhaWxzLmR0Lmxlbmd0aH0gZGVzdGluYXRpb24gdGFncyB3ZXJlIGZvdW5kYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRUYWcgPSBwYXJzZUludChxdWVyeURldGFpbHMuZHQsIDEwKTtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHBhcnNlZFRhZykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKCdpbnZhbGlkIGRlc3RpbmF0aW9uIHRhZycpO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRUYWcgPiAweGZmZmZmZmZmIHx8IHBhcnNlZFRhZyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKCdkZXN0aW5hdGlvbiB0YWcgb3V0IG9mIHJhbmdlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3M6IGRlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgIGRlc3RpbmF0aW9uVGFnOiBwYXJzZWRUYWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBmdWxsLCBub3JtYWxpemVkIGFkZHJlc3MgZnJvbSBhbiBhZGRyZXNzIGFuZCBkZXN0aW5hdGlvbiB0YWdcbiAgICovXG4gIHB1YmxpYyBub3JtYWxpemVBZGRyZXNzKHsgYWRkcmVzcywgZGVzdGluYXRpb25UYWcgfTogQWRkcmVzcyk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoJ2ludmFsaWQgYWRkcmVzcywgZXhwZWN0ZWQgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25UYWcgPT09ICd1bmRlZmluZWQnIHx8IGRlc3RpbmF0aW9uVGFnID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYWRkcmVzcztcbiAgICB9XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRlc3RpbmF0aW9uVGFnKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoJ2ludmFsaWQgZGVzdGluYXRpb24gdGFnLCBleHBlY3RlZCBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGlmIChkZXN0aW5hdGlvblRhZyA+IDB4ZmZmZmZmZmYgfHwgZGVzdGluYXRpb25UYWcgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcignZGVzdGluYXRpb24gdGFnIG91dCBvZiByYW5nZScpO1xuICAgIH1cbiAgICByZXR1cm4gYCR7YWRkcmVzc30/ZHQ9JHtkZXN0aW5hdGlvblRhZ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIGhleCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcGFyYW0gcHJpdmF0ZUtleVxuICAgKiByZXR1cm4gaGV4IGVuY29kZWQgc2lnbmF0dXJlIHN0cmluZywgdGhyb3dzIGlmIGFueSBvZiB0aGUgaW5wdXRzIGFyZSBpbnZhbGlkXG4gICAqL1xuICBwdWJsaWMgc2lnblN0cmluZyhtZXNzYWdlOiBzdHJpbmcsIHByaXZhdGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRIZXgobWVzc2FnZSkpIHtcbiAgICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdtZXNzYWdlIG11c3QgYmUgYSBoZXggZW5jb2RlZCBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRQcml2YXRlS2V5KHByaXZhdGVLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignaW52YWxpZCBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICByZXR1cm4gcmlwcGxlS2V5cGFpcnMuc2lnbihtZXNzYWdlLCBwcml2YXRlS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBoZXggZW5jb2RlZCBzdHJpbmdcbiAgICogQHBhcmFtIHNpZ25hdHVyZSBoZXggZW5jb29kZWQgc2lnbmF0dXJlIHN0cmluZ1xuICAgKiBAcGFyYW0gcHVibGljS2V5XG4gICAqIHJldHVybiBib29sZWFuLCB0aHJvd3MgaWYgYW55IG9mIHRoZSBpbnB1dHMgYXJlIGludmFsaWRcbiAgICovXG4gIHB1YmxpYyB2ZXJpZnlTaWduYXR1cmUobWVzc2FnZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgcHVibGljS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEhleChtZXNzYWdlKSkge1xuICAgICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ21lc3NhZ2UgbXVzdCBiZSBhIGhleCBlbmNvZGVkIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRQdWJsaWNLZXkocHVibGljS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ2ludmFsaWQgcHVibGljIGtleScpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJpcHBsZUtleXBhaXJzLnZlcmlmeShtZXNzYWdlLCBzaWduYXR1cmUsIHB1YmxpY0tleSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgcmF3IHRyYW5zYWN0aW9uIGhhcyBhIHZhbGlkIGZvcm1hdCBpbiB0aGUgYmxvY2tjaGFpbiBjb250ZXh0LCB0aHJvdyBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIFRyYW5zYWN0aW9uIGluIGhleCBzdHJpbmcgZm9ybWF0XG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogVW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkSGV4KHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogSGV4IHN0cmluZyBleHBlY3RlZCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgcmF3IHRyYW5zYWN0aW9uIGNhbiBiZSBkZXNlcmlhbGl6ZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QganNvblR4ID0geHJwbC5kZWNvZGUocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgeHJwbC52YWxpZGF0ZShqc29uVHgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZUFjY291bnRTZXRGbGFnKHNldEZsYWc6IG51bWJlcikge1xuICAgIGlmICh0eXBlb2Ygc2V0RmxhZyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBzZXRGbGFnICR7c2V0RmxhZ30gaXMgbm90IHZhbGlkYCk7XG4gICAgfVxuICAgIGlmICghVkFMSURfQUNDT1VOVF9TRVRfRkxBR1MuaW5jbHVkZXMoc2V0RmxhZykpIHtcbiAgICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBzZXRGbGFnICR7c2V0RmxhZ30gaXMgbm90IGEgdmFsaWQgYWNjb3VudCBzZXQgZmxhZ2ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZVNpZ25lcihzaWduZXI6IFNpZ25lckRldGFpbHMpOiB2b2lkIHtcbiAgICBpZiAoIXNpZ25lci5hZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignc2lnbmVyIG11c3QgaGF2ZSBhbiBhZGRyZXNzJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhzaWduZXIuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBzaWduZXIgYWRkcmVzcyAke3NpZ25lci5hZGRyZXNzfSBpcyBpbnZhbGlkYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2lnbmVyLndlaWdodCAhPT0gJ251bWJlcicgfHwgc2lnbmVyLndlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBzaWduZXIgd2VpZ2h0ICR7c2lnbmVyLndlaWdodH0gaXMgbm90IHZhbGlkYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIHByb3ZpZGVkIGBhbW91bnRgIGlzIGZvciBhIHRva2VuIHBheW1lbnRcbiAgICovXG4gIHB1YmxpYyBpc0lzc3VlZEN1cnJlbmN5QW1vdW50KGFtb3VudDogQW1vdW50KTogYW1vdW50IGlzIElzc3VlZEN1cnJlbmN5QW1vdW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFhbW91bnQgJiZcbiAgICAgIHR5cGVvZiBhbW91bnQgPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2YgYW1vdW50LmN1cnJlbmN5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIGFtb3VudC5pc3N1ZXIgPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2YgYW1vdW50LnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhc3NvY2lhdGVkIFhSUCBDdXJyZW5jeSBkZXRhaWxzIGZyb20gdG9rZW4gbmFtZS4gVGhyb3dzIGFuIGVycm9yIGlmIHRva2VuIGlzIHVuc3VwcG9ydGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbk5hbWUgLSBUaGUgdG9rZW4gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFhycEN1cnJlbmN5RnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IHhycGwuSXNzdWVkQ3VycmVuY3kge1xuICAgIGlmICghY29pbnMuaGFzKHRva2VuTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZFRva2VuRXJyb3IoYCR7dG9rZW5OYW1lfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gY29pbnMuZ2V0KHRva2VuTmFtZSk7XG4gICAgaWYgKCF0b2tlbi5pc1Rva2VuIHx8ICEodG9rZW4gaW5zdGFuY2VvZiBYcnBDb2luKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkVG9rZW5FcnJvcihgJHt0b2tlbk5hbWV9IGlzIG5vdCBhbiBYUlAgdG9rZW5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbmN5OiB0b2tlbi5jdXJyZW5jeUNvZGUsXG4gICAgICBpc3N1ZXI6IHRva2VuLmlzc3VlckFkZHJlc3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgc2VyaWFsaXplZCBYUlBMIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHhIZXggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBpbiBoZXguXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IC0gRGVjb2RlZCB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIGRlY29kaW5nIGZhaWxzIG9yIGlucHV0IGlzIGludmFsaWQuXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlVHJhbnNhY3Rpb24odHhIZXg6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdHhIZXggIT09ICdzdHJpbmcnIHx8IHR4SGV4LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbiBoZXguIEV4cGVjdGVkIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB4cnBsLmRlY29kZSh0eEhleCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSB0cmFuc2FjdGlvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBYcnAgdG9rZW4gaXNzdWVyIGFkZHJlc3MgYW5kIGN1cnJlbmN5IGNvZGUgaWYgaXQgZXhpc3RzXG4gICAqXG4gICAqIEBwYXJhbSBpc3N1ZXJBZGRyZXNzIFRoZSB0b2tlbiBpc3N1ZXIgYWRkcmVzcyB0byBtYXRjaCBhZ2FpbnN0XG4gICAqIEBwYXJhbSBjdXJyZW5jeUNvZGUgVGhlIHRva2VuIGN1cnJlbmN5IGNvZGUgdG8gbWF0Y2ggYWdhaW5zdFxuICAgKiBAcmV0dXJucyBzdGF0aWNzIEJhc2VDb2luIG9iamVjdCBmb3IgdGhlIG1hdGNoaW5nIHRva2VuXG4gICAqL1xuICBwdWJsaWMgZ2V0WHJwVG9rZW4oaXNzdWVyQWRkcmVzcywgY3VycmVuY3lDb2RlKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0b2tlbnMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IHtcbiAgICAgIGlmIChjb2luIGluc3RhbmNlb2YgWHJwQ29pbikge1xuICAgICAgICByZXR1cm4gY29pbi5pc3N1ZXJBZGRyZXNzID09PSBpc3N1ZXJBZGRyZXNzICYmIGNvaW4uY3VycmVuY3lDb2RlID09PSBjdXJyZW5jeUNvZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICAgIGlmICh0b2tlbnNBcnJheS5sZW5ndGggPj0gMSkge1xuICAgICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBpc3N1ZXIgYWRkcmVzcyBhbmQgY3VycmVuY3kgY29kZSwgc28gd2UgYXNzZXJ0IHRoYXQgaGVyZVxuICAgICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { SignerEntry } from 'xrpl/dist/npm/models/common';
|
|
4
|
+
import { SignerDetails } from './iface';
|
|
5
|
+
import { Transaction } from './transaction';
|
|
6
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
7
|
+
export declare class WalletInitializationBuilder extends TransactionBuilder {
|
|
8
|
+
protected _signerQuorum: number;
|
|
9
|
+
protected _signerEntries: SignerEntry[];
|
|
10
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
11
|
+
protected get transactionType(): TransactionType;
|
|
12
|
+
protected get xrpTransactionType(): 'SignerListSet';
|
|
13
|
+
signerQuorum(quorum: number): TransactionBuilder;
|
|
14
|
+
signer(signer: SignerDetails): TransactionBuilder;
|
|
15
|
+
initBuilder(tx: Transaction): void;
|
|
16
|
+
/** @inheritdoc */
|
|
17
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=walletInitializationBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walletInitializationBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/walletInitializationBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,2BAA4B,SAAQ,kBAAkB;IACjE,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,cAAc,EAAE,WAAW,EAAE,CAAM;gBACjC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,SAAS,KAAK,kBAAkB,IAAI,eAAe,CAElD;IAED,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAQhD,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB;IAWjD,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAkBlC,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;CAuB5D"}
|