@bitgo-beta/sdk-coin-hbar 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +26 -0
- package/LICENSE +191 -0
- package/README.md +30 -0
- package/dist/src/hbar.d.ts +114 -0
- package/dist/src/hbar.d.ts.map +1 -0
- package/dist/src/hbar.js +301 -0
- package/dist/src/hbarToken.d.ts +18 -0
- package/dist/src/hbarToken.d.ts.map +1 -0
- package/dist/src/hbarToken.js +49 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +17 -0
- package/dist/src/lib/coinTransferBuilder.d.ts +47 -0
- package/dist/src/lib/coinTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/coinTransferBuilder.js +145 -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 +12 -0
- package/dist/src/lib/iface.d.ts +50 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +3 -0
- package/dist/src/lib/index.d.ts +10 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +39 -0
- package/dist/src/lib/keyPair.d.ts +23 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +70 -0
- package/dist/src/lib/tokenAssociateBuilder.d.ts +38 -0
- package/dist/src/lib/tokenAssociateBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenAssociateBuilder.js +126 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +25 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +116 -0
- package/dist/src/lib/transaction.d.ts +106 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +317 -0
- package/dist/src/lib/transactionBuilder.d.ts +111 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +270 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +47 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +88 -0
- package/dist/src/lib/transferBuilder.d.ts +24 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +74 -0
- package/dist/src/lib/utils.d.ts +193 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +410 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts +28 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/walletInitializationBuilder.js +110 -0
- package/dist/src/seedValidator.d.ts +31 -0
- package/dist/src/seedValidator.d.ts.map +1 -0
- package/dist/src/seedValidator.js +89 -0
- package/dist/src/thbar.d.ts +14 -0
- package/dist/src/thbar.d.ts.map +1 -0
- package/dist/src/thbar.js +17 -0
- package/package.json +61 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.TokenTransferBuilder = void 0;
|
|
23
|
+
const Long = __importStar(require("long"));
|
|
24
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
25
|
+
const transferBuilder_1 = require("./transferBuilder");
|
|
26
|
+
const utils_1 = require("./utils");
|
|
27
|
+
const bignumber_js_1 = require("bignumber.js");
|
|
28
|
+
class TokenTransferBuilder extends transferBuilder_1.TransferBuilder {
|
|
29
|
+
constructor(_coinConfig) {
|
|
30
|
+
super(_coinConfig);
|
|
31
|
+
}
|
|
32
|
+
/** @inheritdoc */
|
|
33
|
+
async buildImplementation() {
|
|
34
|
+
this._txBodyData.tokenTransfers = this.buildTokenTransferData(); // set to list by the contract
|
|
35
|
+
return await super.buildImplementation();
|
|
36
|
+
}
|
|
37
|
+
buildTokenTransferData() {
|
|
38
|
+
let tokenTransferAmount = new bignumber_js_1.BigNumber(0); // total send amount for each token
|
|
39
|
+
const tokenId = utils_1.getHederaTokenIdFromName(this._tokenName);
|
|
40
|
+
const tokenTransferData = [
|
|
41
|
+
{
|
|
42
|
+
accountID: utils_1.buildHederaAccountID(this._source.address),
|
|
43
|
+
amount: Long.fromInt(0),
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
this._recipients.forEach((recipient) => {
|
|
47
|
+
tokenTransferAmount = tokenTransferAmount.plus(recipient.amount);
|
|
48
|
+
tokenTransferData.push({ accountID: utils_1.buildHederaAccountID(recipient.address), amount: Long.fromString(recipient.amount) } // recipient
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
tokenTransferData[0].amount = Long.fromString(tokenTransferAmount.toString()).negate(); // update sender send amount
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
token: utils_1.buildHederaTokenID(tokenId),
|
|
55
|
+
transfers: tokenTransferData,
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
/** @inheritdoc */
|
|
60
|
+
initBuilder(tx) {
|
|
61
|
+
super.initBuilder(tx);
|
|
62
|
+
const transferData = tx.txBody.cryptoTransfer;
|
|
63
|
+
if (utils_1.isTokenTransfer(transferData)) {
|
|
64
|
+
this.initTokenTransfers(transferData.tokenTransfers);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Initialize the transfer specific data, getting the recipient account
|
|
69
|
+
* represented by the element with a positive amount on the transfer element.
|
|
70
|
+
* The negative amount represents the source account so it's ignored.
|
|
71
|
+
*
|
|
72
|
+
* @param {proto.IAccountAmount[]} transfers array of objects which contains accountID and transferred amount
|
|
73
|
+
*/
|
|
74
|
+
initTokenTransfers(tokenTransfers) {
|
|
75
|
+
tokenTransfers.forEach((tokenTransfer) => {
|
|
76
|
+
if (!tokenTransfer.token) {
|
|
77
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing token id');
|
|
78
|
+
}
|
|
79
|
+
if (!tokenTransfer.transfers) {
|
|
80
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing transfer data');
|
|
81
|
+
}
|
|
82
|
+
const token = utils_1.getHederaTokenNameFromId(utils_1.stringifyTokenId(tokenTransfer.token));
|
|
83
|
+
if (!token) {
|
|
84
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: invalid token id');
|
|
85
|
+
}
|
|
86
|
+
tokenTransfer.transfers.forEach((transferData) => {
|
|
87
|
+
const amount = Long.fromValue(transferData.amount);
|
|
88
|
+
if (amount.isPositive()) {
|
|
89
|
+
this.send({
|
|
90
|
+
address: utils_1.stringifyAccountId(transferData.accountID),
|
|
91
|
+
amount: amount.toString(),
|
|
92
|
+
tokenName: token.name,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// region Transfer fields
|
|
99
|
+
/** @inheritdoc */
|
|
100
|
+
send(recipient) {
|
|
101
|
+
if (!recipient.tokenName) {
|
|
102
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid missing token name');
|
|
103
|
+
}
|
|
104
|
+
const tokenId = utils_1.getHederaTokenIdFromName(recipient.tokenName);
|
|
105
|
+
if (!tokenId) {
|
|
106
|
+
throw new sdk_core_1.InvalidParameterValueError(`Invalid token name: ${recipient.tokenName}`);
|
|
107
|
+
}
|
|
108
|
+
if (this._tokenName && this._tokenName !== recipient.tokenName) {
|
|
109
|
+
throw new sdk_core_1.InvalidParameterValueError(`Invalid token: received ${recipient.tokenName} for ${this._tokenName} tx`);
|
|
110
|
+
}
|
|
111
|
+
this._tokenName = recipient.tokenName;
|
|
112
|
+
return super.send(recipient);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.TokenTransferBuilder = TokenTransferBuilder;
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwyQ0FBNkI7QUFFN0IsbURBQXlGO0FBRXpGLHVEQUFvRDtBQUVwRCxtQ0FRaUI7QUFDakIsK0NBQXlDO0FBRXpDLE1BQWEsb0JBQXFCLFNBQVEsaUNBQWU7SUFHdkQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELGtCQUFrQjtJQUNSLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyw4QkFBOEI7UUFDL0YsT0FBTyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLHdCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUM7UUFDL0UsTUFBTSxPQUFPLEdBQUcsZ0NBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE1BQU0saUJBQWlCLEdBQTJCO1lBQ2hEO2dCQUNFLFNBQVMsRUFBRSw0QkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDckQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDckMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRSxpQkFBaUIsQ0FB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LENBQUMsU0FBUyxRQUFRLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDO1NBQ2xIO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBRUY7QUFsR0Qsb0RBa0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCAqIGFzIHByb3RvIGZyb20gJ0BoYXNoZ3JhcGgvcHJvdG8nO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFJlY2lwaWVudCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIGJ1aWxkSGVkZXJhQWNjb3VudElELFxuICBidWlsZEhlZGVyYVRva2VuSUQsXG4gIGdldEhlZGVyYVRva2VuSWRGcm9tTmFtZSxcbiAgZ2V0SGVkZXJhVG9rZW5OYW1lRnJvbUlkLFxuICBpc1Rva2VuVHJhbnNmZXIsXG4gIHN0cmluZ2lmeUFjY291bnRJZCxcbiAgc3RyaW5naWZ5VG9rZW5JZCxcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgVG9rZW5UcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2ZlckJ1aWxkZXIge1xuICBwcml2YXRlIF90b2tlbk5hbWU7IC8vIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMSB0b2tlbi90cmFuc2ZlclxuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5fdHhCb2R5RGF0YS50b2tlblRyYW5zZmVycyA9IHRoaXMuYnVpbGRUb2tlblRyYW5zZmVyRGF0YSgpOyAvLyBzZXQgdG8gbGlzdCBieSB0aGUgY29udHJhY3RcbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRva2VuVHJhbnNmZXJEYXRhKCk6IHByb3RvLklUb2tlblRyYW5zZmVyTGlzdFtdIHtcbiAgICBsZXQgdG9rZW5UcmFuc2ZlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7IC8vIHRvdGFsIHNlbmQgYW1vdW50IGZvciBlYWNoIHRva2VuXG4gICAgY29uc3QgdG9rZW5JZCA9IGdldEhlZGVyYVRva2VuSWRGcm9tTmFtZSh0aGlzLl90b2tlbk5hbWUpO1xuICAgIGNvbnN0IHRva2VuVHJhbnNmZXJEYXRhOiBwcm90by5JQWNjb3VudEFtb3VudFtdID0gW1xuICAgICAge1xuICAgICAgICBhY2NvdW50SUQ6IGJ1aWxkSGVkZXJhQWNjb3VudElEKHRoaXMuX3NvdXJjZS5hZGRyZXNzKSxcbiAgICAgICAgYW1vdW50OiBMb25nLmZyb21JbnQoMCksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB0aGlzLl9yZWNpcGllbnRzLmZvckVhY2goKHJlY2lwaWVudCkgPT4ge1xuICAgICAgdG9rZW5UcmFuc2ZlckFtb3VudCA9IHRva2VuVHJhbnNmZXJBbW91bnQucGx1cyhyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgIHRva2VuVHJhbnNmZXJEYXRhLnB1c2goXG4gICAgICAgIHsgYWNjb3VudElEOiBidWlsZEhlZGVyYUFjY291bnRJRChyZWNpcGllbnQuYWRkcmVzcyksIGFtb3VudDogTG9uZy5mcm9tU3RyaW5nKHJlY2lwaWVudC5hbW91bnQpIH0gLy8gcmVjaXBpZW50XG4gICAgICApO1xuICAgIH0pO1xuICAgIHRva2VuVHJhbnNmZXJEYXRhWzBdLmFtb3VudCA9IExvbmcuZnJvbVN0cmluZyh0b2tlblRyYW5zZmVyQW1vdW50LnRvU3RyaW5nKCkpLm5lZ2F0ZSgpOyAvLyB1cGRhdGUgc2VuZGVyIHNlbmQgYW1vdW50XG5cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0b2tlbjogYnVpbGRIZWRlcmFUb2tlbklEKHRva2VuSWQhKSxcbiAgICAgICAgdHJhbnNmZXJzOiB0b2tlblRyYW5zZmVyRGF0YSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgdHJhbnNmZXJEYXRhID0gdHgudHhCb2R5LmNyeXB0b1RyYW5zZmVyITtcbiAgICBpZiAoaXNUb2tlblRyYW5zZmVyKHRyYW5zZmVyRGF0YSkpIHtcbiAgICAgIHRoaXMuaW5pdFRva2VuVHJhbnNmZXJzKHRyYW5zZmVyRGF0YS50b2tlblRyYW5zZmVycyEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSB0cmFuc2ZlciBzcGVjaWZpYyBkYXRhLCBnZXR0aW5nIHRoZSByZWNpcGllbnQgYWNjb3VudFxuICAgKiByZXByZXNlbnRlZCBieSB0aGUgZWxlbWVudCB3aXRoIGEgcG9zaXRpdmUgYW1vdW50IG9uIHRoZSB0cmFuc2ZlciBlbGVtZW50LlxuICAgKiBUaGUgbmVnYXRpdmUgYW1vdW50IHJlcHJlc2VudHMgdGhlIHNvdXJjZSBhY2NvdW50IHNvIGl0J3MgaWdub3JlZC5cbiAgICpcbiAgICogQHBhcmFtIHtwcm90by5JQWNjb3VudEFtb3VudFtdfSB0cmFuc2ZlcnMgYXJyYXkgb2Ygb2JqZWN0cyB3aGljaCBjb250YWlucyBhY2NvdW50SUQgYW5kIHRyYW5zZmVycmVkIGFtb3VudFxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRUb2tlblRyYW5zZmVycyh0b2tlblRyYW5zZmVyczogcHJvdG8uSVRva2VuVHJhbnNmZXJMaXN0W10pOiB2b2lkIHtcbiAgICB0b2tlblRyYW5zZmVycy5mb3JFYWNoKCh0b2tlblRyYW5zZmVyOiBwcm90by5JVG9rZW5UcmFuc2Zlckxpc3QpID0+IHtcbiAgICAgIGlmICghdG9rZW5UcmFuc2Zlci50b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHRva2VuIGlkJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRva2VuVHJhbnNmZXIudHJhbnNmZXJzKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgdHJhbnNmZXIgZGF0YScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGdldEhlZGVyYVRva2VuTmFtZUZyb21JZChzdHJpbmdpZnlUb2tlbklkKHRva2VuVHJhbnNmZXIudG9rZW4hKSk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgdG9rZW4gaWQnKTtcbiAgICAgIH1cbiAgICAgIHRva2VuVHJhbnNmZXIudHJhbnNmZXJzLmZvckVhY2goKHRyYW5zZmVyRGF0YSkgPT4ge1xuICAgICAgICBjb25zdCBhbW91bnQgPSBMb25nLmZyb21WYWx1ZSh0cmFuc2ZlckRhdGEuYW1vdW50ISk7XG4gICAgICAgIGlmIChhbW91bnQuaXNQb3NpdGl2ZSgpKSB7XG4gICAgICAgICAgdGhpcy5zZW5kKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHN0cmluZ2lmeUFjY291bnRJZCh0cmFuc2ZlckRhdGEuYWNjb3VudElEISksXG4gICAgICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHJlZ2lvbiBUcmFuc2ZlciBmaWVsZHNcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHNlbmQocmVjaXBpZW50OiBSZWNpcGllbnQpOiB0aGlzIHtcbiAgICBpZiAoIXJlY2lwaWVudC50b2tlbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBtaXNzaW5nIHRva2VuIG5hbWUnKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW5JZCA9IGdldEhlZGVyYVRva2VuSWRGcm9tTmFtZShyZWNpcGllbnQudG9rZW5OYW1lKTtcbiAgICBpZiAoIXRva2VuSWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcihgSW52YWxpZCB0b2tlbiBuYW1lOiAke3JlY2lwaWVudC50b2tlbk5hbWV9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl90b2tlbk5hbWUgJiYgdGhpcy5fdG9rZW5OYW1lICE9PSByZWNpcGllbnQudG9rZW5OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IoYEludmFsaWQgdG9rZW46IHJlY2VpdmVkICR7cmVjaXBpZW50LnRva2VuTmFtZX0gZm9yICR7dGhpcy5fdG9rZW5OYW1lfSB0eGApO1xuICAgIH1cbiAgICB0aGlzLl90b2tlbk5hbWUgPSByZWNpcGllbnQudG9rZW5OYW1lO1xuICAgIHJldHVybiBzdXBlci5zZW5kKHJlY2lwaWVudCk7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG59XG4iXX0=
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
+
import { BaseKey, BaseTransaction, TransactionType } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import * as proto from '@hashgraph/proto';
|
|
4
|
+
import { TxData } from './iface';
|
|
5
|
+
import { KeyPair } from './';
|
|
6
|
+
export declare class Transaction extends BaseTransaction {
|
|
7
|
+
private _hederaTx;
|
|
8
|
+
private _txBody;
|
|
9
|
+
protected _type: TransactionType;
|
|
10
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
11
|
+
/** @inheritdoc */
|
|
12
|
+
canSign(key: BaseKey): boolean;
|
|
13
|
+
sign(keyPair: KeyPair): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Add a signature to this transaction
|
|
16
|
+
*
|
|
17
|
+
* @param {string} signature - The signature to add, in string hex format
|
|
18
|
+
* @param {KeyPair} key - The key of the key that created the signature
|
|
19
|
+
*/
|
|
20
|
+
addSignature(signature: string, key: KeyPair): void;
|
|
21
|
+
/** @inheritdoc */
|
|
22
|
+
toBroadcastFormat(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Sets this transaction payload
|
|
25
|
+
*
|
|
26
|
+
* @param rawTransaction
|
|
27
|
+
*/
|
|
28
|
+
fromRawTransaction(rawTransaction: Uint8Array | string): void;
|
|
29
|
+
/** @inheritdoc */
|
|
30
|
+
toJson(): TxData;
|
|
31
|
+
/**
|
|
32
|
+
* Get the recipient account and the amount
|
|
33
|
+
* transferred on this transaction
|
|
34
|
+
*
|
|
35
|
+
* @returns { tokenName, Recipient[]} is object consisting of tokenName if it's a token transfer and recipients consisting
|
|
36
|
+
* the recipient address, the transfer amount, and the token name for token transfer
|
|
37
|
+
*/
|
|
38
|
+
private getTransferData;
|
|
39
|
+
/**
|
|
40
|
+
* Get the recipient account and the amount
|
|
41
|
+
* transferred on this transaction
|
|
42
|
+
*
|
|
43
|
+
* @returns { accountId: string; tokenNames[]} is an object consisting of accountId for the token owner
|
|
44
|
+
* and list of tokenNames that will be enabled
|
|
45
|
+
*/
|
|
46
|
+
private getAccountAssociateData;
|
|
47
|
+
get txBody(): proto.TransactionBody;
|
|
48
|
+
get hederaTx(): proto.Transaction;
|
|
49
|
+
/**
|
|
50
|
+
* Sets this transaction body components
|
|
51
|
+
*
|
|
52
|
+
* @param {proto.Transaction} tx - Body Transaction
|
|
53
|
+
*/
|
|
54
|
+
body(tx: proto.Transaction): void;
|
|
55
|
+
/**
|
|
56
|
+
* Set the transaction type
|
|
57
|
+
*
|
|
58
|
+
* @param {TransactionType} transactionType - The transaction type to be set
|
|
59
|
+
*/
|
|
60
|
+
setTransactionType(transactionType: TransactionType): void;
|
|
61
|
+
/**
|
|
62
|
+
* Decode previous signatures from the inner hedera transaction
|
|
63
|
+
* and save them into the base transaction signature list.
|
|
64
|
+
*/
|
|
65
|
+
loadPreviousSignatures(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Load the input and output data on this transaction using the transaction json
|
|
68
|
+
* if there are outputs. For transactions without outputs (e.g. wallet initializations),
|
|
69
|
+
* this function will not do anything
|
|
70
|
+
*/
|
|
71
|
+
loadInputsAndOutputs(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Sets this transaction body components
|
|
74
|
+
*
|
|
75
|
+
* @param {Uint8Array} bytes - Encoded body transaction
|
|
76
|
+
*/
|
|
77
|
+
bodyBytes(bytes: Uint8Array): void;
|
|
78
|
+
/**
|
|
79
|
+
* Returns this hedera transaction id components in a readable format
|
|
80
|
+
*
|
|
81
|
+
* @returns {[string, string]} - Transaction id parts [<account id>, <startTime in seconds>]
|
|
82
|
+
*/
|
|
83
|
+
getTxIdParts(): [string, string];
|
|
84
|
+
/**
|
|
85
|
+
* Returns this transaction hash
|
|
86
|
+
*
|
|
87
|
+
* @returns {string} - The transaction hash
|
|
88
|
+
*/
|
|
89
|
+
getTxHash(): string;
|
|
90
|
+
/**
|
|
91
|
+
* Encode an object using the given encoder class
|
|
92
|
+
*
|
|
93
|
+
* @param {proto} obj - The object to be encoded, must be in proto namespace
|
|
94
|
+
* @param encoder - Object encoder
|
|
95
|
+
* @returns {Uint8Array} - Encoded object byte array
|
|
96
|
+
*/
|
|
97
|
+
private encode;
|
|
98
|
+
/**
|
|
99
|
+
* Returns a sha-384 hash
|
|
100
|
+
*
|
|
101
|
+
* @param {Uint8Array} bytes - Bytes to be hashed
|
|
102
|
+
* @returns {string} - The resulting hash string
|
|
103
|
+
*/
|
|
104
|
+
sha(bytes: Uint8Array): string;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAA4C,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM3H,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAa,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAG7B,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAwB;IACvC,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC;gBAErB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAIxB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IAWnD,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAK3B;;;;OAIG;IACH,kBAAkB,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAgB7D,kBAAkB;IAClB,MAAM,IAAI,MAAM;IAkChB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IA+BvB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAS/B,IAAI,MAAM,IAAI,KAAK,CAAC,eAAe,CAElC;IAED,IAAI,QAAQ,IAAI,KAAK,CAAC,WAAW,CAEhC;IAED;;;;OAIG;IACH,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI;IAMjC;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,sBAAsB,IAAI,IAAI;IAY9B;;;;OAIG;IACH,oBAAoB,IAAI,IAAI;IAwC5B;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAMlC;;;;OAIG;IACH,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAehC;;;;OAIG;IACH,SAAS,IAAI,MAAM;IAYnB;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;IAOd;;;;;OAKG;IACH,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;CAG/B"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.Transaction = void 0;
|
|
26
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
27
|
+
const sha384_1 = require("@stablelib/sha384");
|
|
28
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
29
|
+
const nacl = __importStar(require("tweetnacl"));
|
|
30
|
+
const Long = __importStar(require("long"));
|
|
31
|
+
const proto = __importStar(require("@hashgraph/proto"));
|
|
32
|
+
const utils_1 = require("./utils");
|
|
33
|
+
const constants_1 = require("./constants");
|
|
34
|
+
class Transaction extends sdk_core_1.BaseTransaction {
|
|
35
|
+
constructor(_coinConfig) {
|
|
36
|
+
super(_coinConfig);
|
|
37
|
+
}
|
|
38
|
+
/** @inheritdoc */
|
|
39
|
+
canSign(key) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
async sign(keyPair) {
|
|
43
|
+
const keys = keyPair.getKeys(true);
|
|
44
|
+
if (!keys.prv) {
|
|
45
|
+
throw new sdk_core_1.SigningError('Missing private key');
|
|
46
|
+
}
|
|
47
|
+
const secretKey = sdk_core_1.toUint8Array(keys.prv + keys.pub);
|
|
48
|
+
const signature = nacl.sign.detached(this._hederaTx.bodyBytes, secretKey);
|
|
49
|
+
this.addSignature(sdk_core_1.toHex(signature), keyPair);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Add a signature to this transaction
|
|
53
|
+
*
|
|
54
|
+
* @param {string} signature - The signature to add, in string hex format
|
|
55
|
+
* @param {KeyPair} key - The key of the key that created the signature
|
|
56
|
+
*/
|
|
57
|
+
addSignature(signature, key) {
|
|
58
|
+
const sigPair = new proto.SignaturePair();
|
|
59
|
+
sigPair.pubKeyPrefix = sdk_core_1.toUint8Array(key.getKeys(true).pub);
|
|
60
|
+
sigPair.ed25519 = sdk_core_1.toUint8Array(signature);
|
|
61
|
+
const sigMap = this._hederaTx.sigMap || new proto.SignatureMap();
|
|
62
|
+
sigMap.sigPair.push(sigPair);
|
|
63
|
+
this._hederaTx.sigMap = sigMap;
|
|
64
|
+
this._signatures.push(signature);
|
|
65
|
+
}
|
|
66
|
+
/** @inheritdoc */
|
|
67
|
+
toBroadcastFormat() {
|
|
68
|
+
const encoder = proto.Transaction;
|
|
69
|
+
return sdk_core_1.toHex(this.encode(this._hederaTx, encoder));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Sets this transaction payload
|
|
73
|
+
*
|
|
74
|
+
* @param rawTransaction
|
|
75
|
+
*/
|
|
76
|
+
fromRawTransaction(rawTransaction) {
|
|
77
|
+
const buffer = typeof rawTransaction === 'string' ? sdk_core_1.toUint8Array(rawTransaction) : rawTransaction;
|
|
78
|
+
this.bodyBytes(buffer);
|
|
79
|
+
switch (this.txBody.data) {
|
|
80
|
+
case constants_1.HederaTransactionTypes.Transfer:
|
|
81
|
+
this.setTransactionType(sdk_core_1.TransactionType.Send);
|
|
82
|
+
break;
|
|
83
|
+
case constants_1.HederaTransactionTypes.CreateAccount:
|
|
84
|
+
this.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
|
|
85
|
+
break;
|
|
86
|
+
case constants_1.HederaTransactionTypes.TokenAssociateToAccount:
|
|
87
|
+
this.setTransactionType(sdk_core_1.TransactionType.AssociatedTokenAccountInitialization);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** @inheritdoc */
|
|
92
|
+
toJson() {
|
|
93
|
+
const [acc, time] = this.getTxIdParts();
|
|
94
|
+
const result = {
|
|
95
|
+
id: acc + '@' + time,
|
|
96
|
+
hash: this.getTxHash(),
|
|
97
|
+
data: sdk_core_1.toHex(this._hederaTx.bodyBytes),
|
|
98
|
+
fee: new bignumber_js_1.default(this._txBody.transactionFee.toString()).toNumber(),
|
|
99
|
+
from: acc,
|
|
100
|
+
startTime: time,
|
|
101
|
+
validDuration: this._txBody.transactionValidDuration.seconds.toString(),
|
|
102
|
+
node: utils_1.stringifyAccountId(this._txBody.nodeAccountID),
|
|
103
|
+
memo: this._txBody.memo,
|
|
104
|
+
};
|
|
105
|
+
switch (this._txBody.data) {
|
|
106
|
+
case constants_1.HederaTransactionTypes.Transfer:
|
|
107
|
+
result.instructionsData = {
|
|
108
|
+
type: constants_1.HederaTransactionTypes.Transfer,
|
|
109
|
+
params: this.getTransferData(),
|
|
110
|
+
};
|
|
111
|
+
result.to = result.instructionsData.params.recipients[0].address;
|
|
112
|
+
result.amount = result.instructionsData.params.recipients[0].amount;
|
|
113
|
+
break;
|
|
114
|
+
case constants_1.HederaTransactionTypes.TokenAssociateToAccount:
|
|
115
|
+
result.instructionsData = {
|
|
116
|
+
type: constants_1.HederaTransactionTypes.TokenAssociateToAccount,
|
|
117
|
+
params: this.getAccountAssociateData(),
|
|
118
|
+
};
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get the recipient account and the amount
|
|
125
|
+
* transferred on this transaction
|
|
126
|
+
*
|
|
127
|
+
* @returns { tokenName, Recipient[]} is object consisting of tokenName if it's a token transfer and recipients consisting
|
|
128
|
+
* the recipient address, the transfer amount, and the token name for token transfer
|
|
129
|
+
*/
|
|
130
|
+
getTransferData() {
|
|
131
|
+
var _a, _b, _c, _d, _e;
|
|
132
|
+
const [acc] = this.getTxIdParts();
|
|
133
|
+
const transferData = [];
|
|
134
|
+
const tokenTransfers = ((_a = this._txBody.cryptoTransfer) === null || _a === void 0 ? void 0 : _a.tokenTransfers) || [];
|
|
135
|
+
const transfers = ((_b = tokenTransfers[0]) === null || _b === void 0 ? void 0 : _b.transfers) || ((_d = (_c = this._txBody.cryptoTransfer) === null || _c === void 0 ? void 0 : _c.transfers) === null || _d === void 0 ? void 0 : _d.accountAmounts) || [];
|
|
136
|
+
const tokenName = tokenTransfers.length
|
|
137
|
+
? (_e = utils_1.getHederaTokenNameFromId(utils_1.stringifyTokenId(tokenTransfers[0].token))) === null || _e === void 0 ? void 0 : _e.name
|
|
138
|
+
: undefined;
|
|
139
|
+
transfers.forEach((transfer) => {
|
|
140
|
+
const amount = Long.fromValue(transfer.amount);
|
|
141
|
+
if (amount.isPositive() && utils_1.stringifyAccountId(transfer.accountID) !== acc) {
|
|
142
|
+
transferData.push({
|
|
143
|
+
address: utils_1.stringifyAccountId(transfer.accountID),
|
|
144
|
+
amount: amount.toString(),
|
|
145
|
+
...(tokenTransfers.length && {
|
|
146
|
+
tokenName: tokenName,
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
...(tokenTransfers.length && {
|
|
153
|
+
tokenName: tokenName,
|
|
154
|
+
}),
|
|
155
|
+
recipients: transferData,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get the recipient account and the amount
|
|
160
|
+
* transferred on this transaction
|
|
161
|
+
*
|
|
162
|
+
* @returns { accountId: string; tokenNames[]} is an object consisting of accountId for the token owner
|
|
163
|
+
* and list of tokenNames that will be enabled
|
|
164
|
+
*/
|
|
165
|
+
getAccountAssociateData() {
|
|
166
|
+
const tokens = this._txBody.tokenAssociate.tokens || [];
|
|
167
|
+
return {
|
|
168
|
+
accountId: utils_1.stringifyAccountId(this._txBody.tokenAssociate.account),
|
|
169
|
+
tokenNames: tokens.map((token) => utils_1.getHederaTokenNameFromId(utils_1.stringifyTokenId(token)).name),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// region getters & setters
|
|
173
|
+
get txBody() {
|
|
174
|
+
return this._txBody;
|
|
175
|
+
}
|
|
176
|
+
get hederaTx() {
|
|
177
|
+
return this._hederaTx;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Sets this transaction body components
|
|
181
|
+
*
|
|
182
|
+
* @param {proto.Transaction} tx - Body Transaction
|
|
183
|
+
*/
|
|
184
|
+
body(tx) {
|
|
185
|
+
this._txBody = proto.TransactionBody.decode(tx.bodyBytes);
|
|
186
|
+
this._hederaTx = tx;
|
|
187
|
+
this.loadInputsAndOutputs();
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Set the transaction type
|
|
191
|
+
*
|
|
192
|
+
* @param {TransactionType} transactionType - The transaction type to be set
|
|
193
|
+
*/
|
|
194
|
+
setTransactionType(transactionType) {
|
|
195
|
+
this._type = transactionType;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Decode previous signatures from the inner hedera transaction
|
|
199
|
+
* and save them into the base transaction signature list.
|
|
200
|
+
*/
|
|
201
|
+
loadPreviousSignatures() {
|
|
202
|
+
if (this._hederaTx.sigMap && this._hederaTx.sigMap.sigPair) {
|
|
203
|
+
const sigPairs = this._hederaTx.sigMap.sigPair;
|
|
204
|
+
sigPairs.forEach((sigPair) => {
|
|
205
|
+
const signature = sigPair.ed25519;
|
|
206
|
+
if (signature) {
|
|
207
|
+
this._signatures.push(sdk_core_1.toHex(signature));
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Load the input and output data on this transaction using the transaction json
|
|
214
|
+
* if there are outputs. For transactions without outputs (e.g. wallet initializations),
|
|
215
|
+
* this function will not do anything
|
|
216
|
+
*/
|
|
217
|
+
loadInputsAndOutputs() {
|
|
218
|
+
const txJson = this.toJson();
|
|
219
|
+
const instruction = txJson.instructionsData;
|
|
220
|
+
const outputs = [];
|
|
221
|
+
const inputs = [];
|
|
222
|
+
switch (instruction === null || instruction === void 0 ? void 0 : instruction.type) {
|
|
223
|
+
case constants_1.HederaTransactionTypes.Transfer:
|
|
224
|
+
let totalAmount = new bignumber_js_1.default(0);
|
|
225
|
+
instruction.params.recipients.forEach((recipient) => {
|
|
226
|
+
totalAmount = totalAmount.plus(recipient.amount);
|
|
227
|
+
outputs.push({
|
|
228
|
+
address: recipient.address,
|
|
229
|
+
value: recipient.amount,
|
|
230
|
+
coin: recipient.tokenName || this._coinConfig.name,
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
inputs.push({
|
|
234
|
+
address: txJson.from,
|
|
235
|
+
value: totalAmount.toString(),
|
|
236
|
+
coin: instruction.params.tokenName || this._coinConfig.name,
|
|
237
|
+
});
|
|
238
|
+
break;
|
|
239
|
+
case constants_1.HederaTransactionTypes.TokenAssociateToAccount:
|
|
240
|
+
instruction.params.tokenNames.forEach((tokenName) => {
|
|
241
|
+
const tokenEntry = {
|
|
242
|
+
address: instruction.params.accountId,
|
|
243
|
+
value: '0',
|
|
244
|
+
coin: tokenName,
|
|
245
|
+
};
|
|
246
|
+
inputs.push(tokenEntry);
|
|
247
|
+
outputs.push(tokenEntry);
|
|
248
|
+
});
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
this._inputs = inputs;
|
|
252
|
+
this._outputs = outputs;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Sets this transaction body components
|
|
256
|
+
*
|
|
257
|
+
* @param {Uint8Array} bytes - Encoded body transaction
|
|
258
|
+
*/
|
|
259
|
+
bodyBytes(bytes) {
|
|
260
|
+
this.body(proto.Transaction.decode(bytes));
|
|
261
|
+
}
|
|
262
|
+
// endregion
|
|
263
|
+
// region helpers
|
|
264
|
+
/**
|
|
265
|
+
* Returns this hedera transaction id components in a readable format
|
|
266
|
+
*
|
|
267
|
+
* @returns {[string, string]} - Transaction id parts [<account id>, <startTime in seconds>]
|
|
268
|
+
*/
|
|
269
|
+
getTxIdParts() {
|
|
270
|
+
if (this._txBody &&
|
|
271
|
+
this._txBody.transactionID &&
|
|
272
|
+
this._txBody.transactionID.accountID &&
|
|
273
|
+
this._txBody.transactionID.transactionValidStart) {
|
|
274
|
+
return [
|
|
275
|
+
utils_1.stringifyAccountId(this._txBody.transactionID.accountID),
|
|
276
|
+
utils_1.stringifyTxTime(this._txBody.transactionID.transactionValidStart),
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
throw new Error('Missing transaction id information');
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Returns this transaction hash
|
|
283
|
+
*
|
|
284
|
+
* @returns {string} - The transaction hash
|
|
285
|
+
*/
|
|
286
|
+
getTxHash() {
|
|
287
|
+
if (!this._txBody.nodeAccountID) {
|
|
288
|
+
throw new Error('Missing transaction node id');
|
|
289
|
+
}
|
|
290
|
+
const _signedTx = new proto.SignedTransaction();
|
|
291
|
+
_signedTx.sigMap = this._hederaTx.sigMap;
|
|
292
|
+
_signedTx.bodyBytes = this._hederaTx.bodyBytes;
|
|
293
|
+
const encoder = proto.SignedTransaction;
|
|
294
|
+
return this.sha(this.encode(_signedTx, encoder));
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Encode an object using the given encoder class
|
|
298
|
+
*
|
|
299
|
+
* @param {proto} obj - The object to be encoded, must be in proto namespace
|
|
300
|
+
* @param encoder - Object encoder
|
|
301
|
+
* @returns {Uint8Array} - Encoded object byte array
|
|
302
|
+
*/
|
|
303
|
+
encode(obj, encoder) {
|
|
304
|
+
return encoder.encode(obj).finish();
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Returns a sha-384 hash
|
|
308
|
+
*
|
|
309
|
+
* @param {Uint8Array} bytes - Bytes to be hashed
|
|
310
|
+
* @returns {string} - The resulting hash string
|
|
311
|
+
*/
|
|
312
|
+
sha(bytes) {
|
|
313
|
+
return sdk_core_1.toHex(sha384_1.hash(bytes));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
exports.Transaction = Transaction;
|
|
317
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxtREFBMkg7QUFDM0gsOENBQXlDO0FBQ3pDLGdFQUFxQztBQUVyQyxnREFBa0M7QUFDbEMsMkNBQTZCO0FBQzdCLHdEQUEwQztBQUUxQyxtQ0FBMEc7QUFFMUcsMkNBQXFEO0FBRXJELE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBSzlDLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFnQjtRQUN6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2IsTUFBTSxJQUFJLHVCQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUMvQztRQUNELE1BQU0sU0FBUyxHQUFHLHVCQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFlBQVksQ0FBQyxTQUFpQixFQUFFLEdBQVk7UUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLENB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LENBQUMsTUFBTSxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFFL0MsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQ1osR0FBTSxFQUNOLE9BQW1DO1FBRW5DLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxHQUFHLENBQUMsS0FBaUI7UUFDbkIsT0FBTyxnQkFBSyxDQUFDLGFBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQTdURCxrQ0E2VEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCYXNlS2V5LCBCYXNlVHJhbnNhY3Rpb24sIEVudHJ5LCBTaWduaW5nRXJyb3IsIHRvSGV4LCB0b1VpbnQ4QXJyYXksIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGhhc2ggfSBmcm9tICdAc3RhYmxlbGliL3NoYTM4NCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBXcml0ZXIgfSBmcm9tICdwcm90b2J1ZmpzJztcbmltcG9ydCAqIGFzIG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCAqIGFzIExvbmcgZnJvbSAnbG9uZyc7XG5pbXBvcnQgKiBhcyBwcm90byBmcm9tICdAaGFzaGdyYXBoL3Byb3RvJztcbmltcG9ydCB7IFR4RGF0YSwgUmVjaXBpZW50IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBzdHJpbmdpZnlBY2NvdW50SWQsIHN0cmluZ2lmeVR4VGltZSwgc3RyaW5naWZ5VG9rZW5JZCwgZ2V0SGVkZXJhVG9rZW5OYW1lRnJvbUlkIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgSGVkZXJhVHJhbnNhY3Rpb25UeXBlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSBfaGVkZXJhVHg6IHByb3RvLlRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF90eEJvZHk6IHByb3RvLlRyYW5zYWN0aW9uQm9keTtcbiAgcHJvdGVjdGVkIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKHRydWUpO1xuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0S2V5ID0gdG9VaW50OEFycmF5KGtleXMucHJ2ICsga2V5cy5wdWIpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IG5hY2wuc2lnbi5kZXRhY2hlZCh0aGlzLl9oZWRlcmFUeC5ib2R5Qnl0ZXMsIHNlY3JldEtleSk7XG4gICAgdGhpcy5hZGRTaWduYXR1cmUodG9IZXgoc2lnbmF0dXJlKSwga2V5UGFpcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc2lnbmF0dXJlIHRvIHRoaXMgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIFRoZSBzaWduYXR1cmUgdG8gYWRkLCBpbiBzdHJpbmcgaGV4IGZvcm1hdFxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGtleSB0aGF0IGNyZWF0ZWQgdGhlIHNpZ25hdHVyZVxuICAgKi9cbiAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nLCBrZXk6IEtleVBhaXIpOiB2b2lkIHtcbiAgICBjb25zdCBzaWdQYWlyID0gbmV3IHByb3RvLlNpZ25hdHVyZVBhaXIoKTtcbiAgICBzaWdQYWlyLnB1YktleVByZWZpeCA9IHRvVWludDhBcnJheShrZXkuZ2V0S2V5cyh0cnVlKS5wdWIpO1xuICAgIHNpZ1BhaXIuZWQyNTUxOSA9IHRvVWludDhBcnJheShzaWduYXR1cmUpO1xuXG4gICAgY29uc3Qgc2lnTWFwID0gdGhpcy5faGVkZXJhVHguc2lnTWFwIHx8IG5ldyBwcm90by5TaWduYXR1cmVNYXAoKTtcbiAgICBzaWdNYXAuc2lnUGFpciEucHVzaChzaWdQYWlyKTtcbiAgICB0aGlzLl9oZWRlcmFUeC5zaWdNYXAgPSBzaWdNYXA7XG4gICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHNpZ25hdHVyZSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbmNvZGVyID0gcHJvdG8uVHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIHRvSGV4KHRoaXMuZW5jb2RlKHRoaXMuX2hlZGVyYVR4LCBlbmNvZGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IFVpbnQ4QXJyYXkgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXIgPSB0eXBlb2YgcmF3VHJhbnNhY3Rpb24gPT09ICdzdHJpbmcnID8gdG9VaW50OEFycmF5KHJhd1RyYW5zYWN0aW9uKSA6IHJhd1RyYW5zYWN0aW9uO1xuICAgIHRoaXMuYm9keUJ5dGVzKGJ1ZmZlcik7XG4gICAgc3dpdGNoICh0aGlzLnR4Qm9keS5kYXRhKSB7XG4gICAgICBjYXNlIEhlZGVyYVRyYW5zYWN0aW9uVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEhlZGVyYVRyYW5zYWN0aW9uVHlwZXMuQ3JlYXRlQWNjb3VudDpcbiAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEhlZGVyYVRyYW5zYWN0aW9uVHlwZXMuVG9rZW5Bc3NvY2lhdGVUb0FjY291bnQ6XG4gICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb24pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgY29uc3QgW2FjYywgdGltZV0gPSB0aGlzLmdldFR4SWRQYXJ0cygpO1xuICAgIGNvbnN0IHJlc3VsdDogVHhEYXRhID0ge1xuICAgICAgaWQ6IGFjYyArICdAJyArIHRpbWUsXG4gICAgICBoYXNoOiB0aGlzLmdldFR4SGFzaCgpLCAvLyBUT0RPOiBVcGRhdGUgb25jZSBoZWRlcmEtc2RrIHJlbGVhc2UgdGhpcyBmdW5jdGlvbmFsaXR5IEJHQS0yODRcbiAgICAgIGRhdGE6IHRvSGV4KHRoaXMuX2hlZGVyYVR4LmJvZHlCeXRlcyksXG4gICAgICBmZWU6IG5ldyBCaWdOdW1iZXIodGhpcy5fdHhCb2R5LnRyYW5zYWN0aW9uRmVlIS50b1N0cmluZygpKS50b051bWJlcigpLFxuICAgICAgZnJvbTogYWNjLFxuICAgICAgc3RhcnRUaW1lOiB0aW1lLFxuICAgICAgdmFsaWREdXJhdGlvbjogdGhpcy5fdHhCb2R5LnRyYW5zYWN0aW9uVmFsaWREdXJhdGlvbiEuc2Vjb25kcyEudG9TdHJpbmcoKSxcbiAgICAgIG5vZGU6IHN0cmluZ2lmeUFjY291bnRJZCh0aGlzLl90eEJvZHkubm9kZUFjY291bnRJRCEpLFxuICAgICAgbWVtbzogdGhpcy5fdHhCb2R5Lm1lbW8sXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5fdHhCb2R5LmRhdGEpIHtcbiAgICAgIGNhc2UgSGVkZXJhVHJhbnNhY3Rpb25UeXBlcy5UcmFuc2ZlcjpcbiAgICAgICAgcmVzdWx0Lmluc3RydWN0aW9uc0RhdGEgPSB7XG4gICAgICAgICAgdHlwZTogSGVkZXJhVHJhbnNhY3Rpb25UeXBlcy5UcmFuc2ZlcixcbiAgICAgICAgICBwYXJhbXM6IHRoaXMuZ2V0VHJhbnNmZXJEYXRhKCksXG4gICAgICAgIH07XG4gICAgICAgIHJlc3VsdC50byA9IHJlc3VsdC5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3M7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSByZXN1bHQuaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50c1swXS5hbW91bnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBIZWRlcmFUcmFuc2FjdGlvblR5cGVzLlRva2VuQXNzb2NpYXRlVG9BY2NvdW50OlxuICAgICAgICByZXN1bHQuaW5zdHJ1Y3Rpb25zRGF0YSA9IHtcbiAgICAgICAgICB0eXBlOiBIZWRlcmFUcmFuc2FjdGlvblR5cGVzLlRva2VuQXNzb2NpYXRlVG9BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczogdGhpcy5nZXRBY2NvdW50QXNzb2NpYXRlRGF0YSgpLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVjaXBpZW50IGFjY291bnQgYW5kIHRoZSBhbW91bnRcbiAgICogdHJhbnNmZXJyZWQgb24gdGhpcyB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7IHRva2VuTmFtZSwgUmVjaXBpZW50W119IGlzIG9iamVjdCBjb25zaXN0aW5nIG9mIHRva2VuTmFtZSBpZiBpdCdzIGEgdG9rZW4gdHJhbnNmZXIgYW5kIHJlY2lwaWVudHMgY29uc2lzdGluZ1xuICAgKiAgdGhlIHJlY2lwaWVudCBhZGRyZXNzLCB0aGUgdHJhbnNmZXIgYW1vdW50LCBhbmQgdGhlIHRva2VuIG5hbWUgZm9yIHRva2VuIHRyYW5zZmVyXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zZmVyRGF0YSgpOiB7IHRva2VuTmFtZT86IHN0cmluZzsgcmVjaXBpZW50czogUmVjaXBpZW50W10gfSB7XG4gICAgY29uc3QgW2FjY10gPSB0aGlzLmdldFR4SWRQYXJ0cygpO1xuICAgIGNvbnN0IHRyYW5zZmVyRGF0YTogUmVjaXBpZW50W10gPSBbXTtcbiAgICBjb25zdCB0b2tlblRyYW5zZmVyczogcHJvdG8uSVRva2VuVHJhbnNmZXJMaXN0W10gPSB0aGlzLl90eEJvZHkuY3J5cHRvVHJhbnNmZXI/LnRva2VuVHJhbnNmZXJzIHx8IFtdO1xuICAgIGNvbnN0IHRyYW5zZmVyczogcHJvdG8uSUFjY291bnRBbW91bnRbXSA9XG4gICAgICB0b2tlblRyYW5zZmVyc1swXT8udHJhbnNmZXJzIHx8IHRoaXMuX3R4Qm9keS5jcnlwdG9UcmFuc2Zlcj8udHJhbnNmZXJzPy5hY2NvdW50QW1vdW50cyB8fCBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB0b2tlblRyYW5zZmVycy5sZW5ndGhcbiAgICAgID8gZ2V0SGVkZXJhVG9rZW5OYW1lRnJvbUlkKHN0cmluZ2lmeVRva2VuSWQodG9rZW5UcmFuc2ZlcnNbMF0udG9rZW4hKSk/Lm5hbWVcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgdHJhbnNmZXJzLmZvckVhY2goKHRyYW5zZmVyKSA9PiB7XG4gICAgICBjb25zdCBhbW91bnQgPSBMb25nLmZyb21WYWx1ZSh0cmFuc2Zlci5hbW91bnQhKTtcbiAgICAgIGlmIChhbW91bnQuaXNQb3NpdGl2ZSgpICYmIHN0cmluZ2lmeUFjY291bnRJZCh0cmFuc2Zlci5hY2NvdW50SUQhKSAhPT0gYWNjKSB7XG4gICAgICAgIHRyYW5zZmVyRGF0YS5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiBzdHJpbmdpZnlBY2NvdW50SWQodHJhbnNmZXIuYWNjb3VudElEISksXG4gICAgICAgICAgYW1vdW50OiBhbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAuLi4odG9rZW5UcmFuc2ZlcnMubGVuZ3RoICYmIHtcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi4odG9rZW5UcmFuc2ZlcnMubGVuZ3RoICYmIHtcbiAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICB9KSxcbiAgICAgIHJlY2lwaWVudHM6IHRyYW5zZmVyRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVjaXBpZW50IGFjY291bnQgYW5kIHRoZSBhbW91bnRcbiAgICogdHJhbnNmZXJyZWQgb24gdGhpcyB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7IGFjY291bnRJZDogc3RyaW5nOyB0b2tlbk5hbWVzW119IGlzIGFuIG9iamVjdCBjb25zaXN0aW5nIG9mIGFjY291bnRJZCBmb3IgdGhlIHRva2VuIG93bmVyXG4gICAqICBhbmQgbGlzdCBvZiB0b2tlbk5hbWVzIHRoYXQgd2lsbCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGdldEFjY291bnRBc3NvY2lhdGVEYXRhKCk6IHsgYWNjb3VudElkOiBzdHJpbmc7IHRva2VuTmFtZXM6IHN0cmluZ1tdIH0ge1xuICAgIGNvbnN0IHRva2VuczogcHJvdG8uSVRva2VuSURbXSA9IHRoaXMuX3R4Qm9keS50b2tlbkFzc29jaWF0ZSEudG9rZW5zIHx8IFtdO1xuICAgIHJldHVybiB7XG4gICAgICBhY2NvdW50SWQ6IHN0cmluZ2lmeUFjY291bnRJZCh0aGlzLl90eEJvZHkudG9rZW5Bc3NvY2lhdGUhLmFjY291bnQhKSxcbiAgICAgIHRva2VuTmFtZXM6IHRva2Vucy5tYXAoKHRva2VuOiBwcm90by5JVG9rZW5JRCkgPT4gZ2V0SGVkZXJhVG9rZW5OYW1lRnJvbUlkKHN0cmluZ2lmeVRva2VuSWQodG9rZW4pKSEubmFtZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIHJlZ2lvbiBnZXR0ZXJzICYgc2V0dGVyc1xuICBnZXQgdHhCb2R5KCk6IHByb3RvLlRyYW5zYWN0aW9uQm9keSB7XG4gICAgcmV0dXJuIHRoaXMuX3R4Qm9keTtcbiAgfVxuXG4gIGdldCBoZWRlcmFUeCgpOiBwcm90by5UcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hlZGVyYVR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhpcyB0cmFuc2FjdGlvbiBib2R5IGNvbXBvbmVudHNcbiAgICpcbiAgICogQHBhcmFtIHtwcm90by5UcmFuc2FjdGlvbn0gdHggLSBCb2R5IFRyYW5zYWN0aW9uXG4gICAqL1xuICBib2R5KHR4OiBwcm90by5UcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX3R4Qm9keSA9IHByb3RvLlRyYW5zYWN0aW9uQm9keS5kZWNvZGUodHguYm9keUJ5dGVzKTtcbiAgICB0aGlzLl9oZWRlcmFUeCA9IHR4O1xuICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSAtIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgcHJldmlvdXMgc2lnbmF0dXJlcyBmcm9tIHRoZSBpbm5lciBoZWRlcmEgdHJhbnNhY3Rpb25cbiAgICogYW5kIHNhdmUgdGhlbSBpbnRvIHRoZSBiYXNlIHRyYW5zYWN0aW9uIHNpZ25hdHVyZSBsaXN0LlxuICAgKi9cbiAgbG9hZFByZXZpb3VzU2lnbmF0dXJlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faGVkZXJhVHguc2lnTWFwICYmIHRoaXMuX2hlZGVyYVR4LnNpZ01hcC5zaWdQYWlyKSB7XG4gICAgICBjb25zdCBzaWdQYWlycyA9IHRoaXMuX2hlZGVyYVR4LnNpZ01hcC5zaWdQYWlyO1xuICAgICAgc2lnUGFpcnMuZm9yRWFjaCgoc2lnUGFpcikgPT4ge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBzaWdQYWlyLmVkMjU1MTk7XG4gICAgICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2godG9IZXgoc2lnbmF0dXJlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbiB1c2luZyB0aGUgdHJhbnNhY3Rpb24ganNvblxuICAgKiBpZiB0aGVyZSBhcmUgb3V0cHV0cy4gRm9yIHRyYW5zYWN0aW9ucyB3aXRob3V0IG91dHB1dHMgKGUuZy4gd2FsbGV0IGluaXRpYWxpemF0aW9ucyksXG4gICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZG8gYW55dGhpbmdcbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YTtcbiAgICBjb25zdCBvdXRwdXRzOiBFbnRyeVtdID0gW107XG4gICAgY29uc3QgaW5wdXRzOiBFbnRyeVtdID0gW107XG5cbiAgICBzd2l0Y2ggKGluc3RydWN0aW9uPy50eXBlKSB7XG4gICAgICBjYXNlIEhlZGVyYVRyYW5zYWN0aW9uVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgIGxldCB0b3RhbEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5yZWNpcGllbnRzLmZvckVhY2goKHJlY2lwaWVudCkgPT4ge1xuICAgICAgICAgIHRvdGFsQW1vdW50ID0gdG90YWxBbW91bnQucGx1cyhyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogcmVjaXBpZW50LmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHJlY2lwaWVudC50b2tlbk5hbWUgfHwgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IHR4SnNvbi5mcm9tLFxuICAgICAgICAgIHZhbHVlOiB0b3RhbEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGNvaW46IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUgfHwgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSGVkZXJhVHJhbnNhY3Rpb25UeXBlcy5Ub2tlbkFzc29jaWF0ZVRvQWNjb3VudDpcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZXMuZm9yRWFjaCgodG9rZW5OYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG9rZW5FbnRyeTogRW50cnkgPSB7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuYWNjb3VudElkLFxuICAgICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICAgIGNvaW46IHRva2VuTmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlucHV0cy5wdXNoKHRva2VuRW50cnkpO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh0b2tlbkVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHM7XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIGJvZHkgY29tcG9uZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gRW5jb2RlZCBib2R5IHRyYW5zYWN0aW9uXG4gICAqL1xuICBib2R5Qnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICB0aGlzLmJvZHkocHJvdG8uVHJhbnNhY3Rpb24uZGVjb2RlKGJ5dGVzKSk7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLy8gcmVnaW9uIGhlbHBlcnNcbiAgLyoqXG4gICAqIFJldHVybnMgdGhpcyBoZWRlcmEgdHJhbnNhY3Rpb24gaWQgY29tcG9uZW50cyBpbiBhIHJlYWRhYmxlIGZvcm1hdFxuICAgKlxuICAgKiBAcmV0dXJucyB7W3N0cmluZywgc3RyaW5nXX0gLSBUcmFuc2FjdGlvbiBpZCBwYXJ0cyBbPGFjY291bnQgaWQ+LCA8c3RhcnRUaW1lIGluIHNlY29uZHM+XVxuICAgKi9cbiAgZ2V0VHhJZFBhcnRzKCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX3R4Qm9keSAmJlxuICAgICAgdGhpcy5fdHhCb2R5LnRyYW5zYWN0aW9uSUQgJiZcbiAgICAgIHRoaXMuX3R4Qm9keS50cmFuc2FjdGlvbklELmFjY291bnRJRCAmJlxuICAgICAgdGhpcy5fdHhCb2R5LnRyYW5zYWN0aW9uSUQudHJhbnNhY3Rpb25WYWxpZFN0YXJ0XG4gICAgKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBzdHJpbmdpZnlBY2NvdW50SWQodGhpcy5fdHhCb2R5LnRyYW5zYWN0aW9uSUQuYWNjb3VudElEKSxcbiAgICAgICAgc3RyaW5naWZ5VHhUaW1lKHRoaXMuX3R4Qm9keS50cmFuc2FjdGlvbklELnRyYW5zYWN0aW9uVmFsaWRTdGFydCksXG4gICAgICBdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdHJhbnNhY3Rpb24gaWQgaW5mb3JtYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoaXMgdHJhbnNhY3Rpb24gaGFzaFxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0cmFuc2FjdGlvbiBoYXNoXG4gICAqL1xuICBnZXRUeEhhc2goKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3R4Qm9keS5ub2RlQWNjb3VudElEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdHJhbnNhY3Rpb24gbm9kZSBpZCcpO1xuICAgIH1cbiAgICBjb25zdCBfc2lnbmVkVHggPSBuZXcgcHJvdG8uU2lnbmVkVHJhbnNhY3Rpb24oKTtcbiAgICBfc2lnbmVkVHguc2lnTWFwID0gdGhpcy5faGVkZXJhVHguc2lnTWFwO1xuICAgIF9zaWduZWRUeC5ib2R5Qnl0ZXMgPSB0aGlzLl9oZWRlcmFUeC5ib2R5Qnl0ZXM7XG5cbiAgICBjb25zdCBlbmNvZGVyID0gcHJvdG8uU2lnbmVkVHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIHRoaXMuc2hhKHRoaXMuZW5jb2RlKF9zaWduZWRUeCwgZW5jb2RlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhbiBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIGVuY29kZXIgY2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtwcm90b30gb2JqIC0gVGhlIG9iamVjdCB0byBiZSBlbmNvZGVkLCBtdXN0IGJlIGluIHByb3RvIG5hbWVzcGFjZVxuICAgKiBAcGFyYW0gZW5jb2RlciAtIE9iamVjdCBlbmNvZGVyXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSAtIEVuY29kZWQgb2JqZWN0IGJ5dGUgYXJyYXlcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlPEN0b3JGbiBleHRlbmRzIHsgbmV3ICgpOiBUIH0sIFQgZXh0ZW5kcyB7IGNvbnN0cnVjdG9yOiBDdG9yRm4gfT4oXG4gICAgb2JqOiBULFxuICAgIGVuY29kZXI6IHsgZW5jb2RlKGFyZzogVCk6IFdyaXRlciB9XG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBlbmNvZGVyLmVuY29kZShvYmopLmZpbmlzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzaGEtMzg0IGhhc2hcbiAgICpcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGVzIHRvIGJlIGhhc2hlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSByZXN1bHRpbmcgaGFzaCBzdHJpbmdcbiAgICovXG4gIHNoYShieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRvSGV4KGhhc2goYnl0ZXMpKTtcbiAgfVxufVxuIl19
|