@bitgo/sdk-coin-algo 1.0.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +191 -0
- package/README.md +35 -0
- package/dist/src/algo.d.ts +210 -0
- package/dist/src/algo.d.ts.map +1 -0
- package/dist/src/algo.js +415 -0
- package/dist/src/algoToken.d.ts +40 -0
- package/dist/src/algoToken.d.ts.map +1 -0
- package/dist/src/algoToken.js +95 -0
- package/dist/src/builder.d.ts +3 -0
- package/dist/src/builder.d.ts.map +1 -0
- package/dist/src/builder.js +10 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +30 -0
- package/dist/src/lib/assetTransferBuilder.d.ts +42 -0
- package/dist/src/lib/assetTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/assetTransferBuilder.js +105 -0
- package/dist/src/lib/errors.d.ts +11 -0
- package/dist/src/lib/errors.d.ts.map +1 -0
- package/dist/src/lib/errors.js +27 -0
- package/dist/src/lib/ifaces.d.ts +46 -0
- package/dist/src/lib/ifaces.d.ts.map +1 -0
- package/dist/src/lib/ifaces.js +3 -0
- package/dist/src/lib/index.d.ts +13 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +47 -0
- package/dist/src/lib/keyPair.d.ts +25 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +77 -0
- package/dist/src/lib/keyRegistrationBuilder.d.ts +104 -0
- package/dist/src/lib/keyRegistrationBuilder.d.ts.map +1 -0
- package/dist/src/lib/keyRegistrationBuilder.js +240 -0
- package/dist/src/lib/seedEncoding.d.ts +25 -0
- package/dist/src/lib/seedEncoding.d.ts.map +1 -0
- package/dist/src/lib/seedEncoding.js +97 -0
- package/dist/src/lib/transaction.d.ts +75 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +251 -0
- package/dist/src/lib/transactionBuilder.d.ts +204 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +373 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +16 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +52 -0
- package/dist/src/lib/transferBuilder.d.ts +40 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +89 -0
- package/dist/src/lib/txnSchema.d.ts +7 -0
- package/dist/src/lib/txnSchema.d.ts.map +1 -0
- package/dist/src/lib/txnSchema.js +68 -0
- package/dist/src/lib/utils.d.ts +249 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +539 -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/talgo.d.ts +12 -0
- package/dist/src/talgo.d.ts.map +1 -0
- package/dist/src/talgo.js +20 -0
- package/package.json +65 -0
- package/types/index.d.ts +60 -0
|
@@ -0,0 +1,240 @@
|
|
|
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.KeyRegistrationBuilder = void 0;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const algosdk_1 = __importDefault(require("algosdk"));
|
|
9
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
10
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
11
|
+
const txnSchema_1 = require("./txnSchema");
|
|
12
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
13
|
+
class KeyRegistrationBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
14
|
+
constructor(coinConfig) {
|
|
15
|
+
super(coinConfig);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Sets the vote key
|
|
19
|
+
*
|
|
20
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} key The root participation public key. See Generate a Participation Key to learn more.
|
|
23
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
24
|
+
*/
|
|
25
|
+
voteKey(key) {
|
|
26
|
+
this._voteKey = key;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Sets the selection key
|
|
31
|
+
*
|
|
32
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
33
|
+
*
|
|
34
|
+
* @param {string} key The VRF public key for the account.
|
|
35
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
36
|
+
*/
|
|
37
|
+
selectionKey(key) {
|
|
38
|
+
this._selectionKey = key;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sets the stateProof key
|
|
43
|
+
*
|
|
44
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
45
|
+
*
|
|
46
|
+
* @param {string} key The stateproof key. See consensus for more information.
|
|
47
|
+
* https://developer.algorand.org/docs/get-details/algorand_consensus/?from_query=state#state-proof-keys
|
|
48
|
+
*/
|
|
49
|
+
stateProofKey(key) {
|
|
50
|
+
utils_1.default.validateBase64(key);
|
|
51
|
+
this._stateProofKey = key;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
*Sets the vote first round
|
|
56
|
+
*
|
|
57
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
58
|
+
*
|
|
59
|
+
* @param {number} round The first round that the participation key is valid. Not to be confused with the FirstValid round of the keyreg transaction.
|
|
60
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
61
|
+
*/
|
|
62
|
+
voteFirst(round) {
|
|
63
|
+
this.validateValue(new bignumber_js_1.default(round));
|
|
64
|
+
this._voteFirst = round;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Sets the vote last round
|
|
69
|
+
*
|
|
70
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
71
|
+
*
|
|
72
|
+
* A recommended range is 3,000,000 rounds.
|
|
73
|
+
*
|
|
74
|
+
* @param {number} round No theoretical limit.
|
|
75
|
+
* https://developer.algorand.org/docs/run-a-node/participate/generate_keys/
|
|
76
|
+
*/
|
|
77
|
+
voteLast(round) {
|
|
78
|
+
this.validateValue(new bignumber_js_1.default(round));
|
|
79
|
+
this._voteLast = round;
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Sets the vote key dilution
|
|
84
|
+
*
|
|
85
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
86
|
+
*
|
|
87
|
+
* Defaults to 10,000
|
|
88
|
+
*
|
|
89
|
+
* @param {number} size [10000]. To reduce the size of the participation key, set the key dilution value to roughly the square root of the range that the partkey is valid for.
|
|
90
|
+
* https://developer.algorand.org/docs/run-a-node/participate/generate_keys/#generate-the-participation-key-with-goal
|
|
91
|
+
* @param size
|
|
92
|
+
*/
|
|
93
|
+
voteKeyDilution(size = 10000) {
|
|
94
|
+
this.validateValue(new bignumber_js_1.default(size));
|
|
95
|
+
this._voteKeyDilution = size;
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Sets the non participation flag
|
|
100
|
+
*
|
|
101
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
102
|
+
*
|
|
103
|
+
* @param {boolean} nonParticipation All new Algorand accounts are participating by default.
|
|
104
|
+
* This means that they earn rewards. Mark an account nonparticipating by setting this value to true and this account
|
|
105
|
+
* will no longer earn rewards NEVER.
|
|
106
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
107
|
+
*/
|
|
108
|
+
nonParticipation(nonParticipation) {
|
|
109
|
+
this._nonParticipation = nonParticipation;
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
buildAlgoTxn() {
|
|
113
|
+
return this.isOfflineKeyRegAccountLibTransaction()
|
|
114
|
+
? this.buildOfflineKeyRegTransaction()
|
|
115
|
+
: this.isNonParticipationKeyRegAccountLibTransaction()
|
|
116
|
+
? this.buildNonParticipationKeyRegTransaction()
|
|
117
|
+
: this.buildOnlineKeyRegTransaction();
|
|
118
|
+
}
|
|
119
|
+
buildOfflineKeyRegTransaction() {
|
|
120
|
+
return algosdk_1.default.makeKeyRegistrationTxnWithSuggestedParams(this._sender, this._note, undefined, // voteKey param
|
|
121
|
+
undefined, // selectionKey param
|
|
122
|
+
undefined, // voteFirst param
|
|
123
|
+
undefined, // voteLast param
|
|
124
|
+
undefined, // voteKeyDilution param
|
|
125
|
+
this.suggestedParams);
|
|
126
|
+
}
|
|
127
|
+
buildOnlineKeyRegTransaction() {
|
|
128
|
+
return algosdk_1.default.makeKeyRegistrationTxnWithSuggestedParams(this._sender, this._note, this._voteKey, this._selectionKey, this._voteFirst, this._voteLast, this._voteKeyDilution, this.suggestedParams, undefined, // reKeyTo param
|
|
129
|
+
undefined, // nonParticipation param
|
|
130
|
+
this._stateProofKey);
|
|
131
|
+
}
|
|
132
|
+
buildNonParticipationKeyRegTransaction() {
|
|
133
|
+
return algosdk_1.default.makeKeyRegistrationTxnWithSuggestedParams(this._sender, this._note, undefined, // voteKey param
|
|
134
|
+
undefined, // selectionKey param
|
|
135
|
+
undefined, // voteFirst param
|
|
136
|
+
undefined, // voteLast param
|
|
137
|
+
undefined, // voteKeyDilution param
|
|
138
|
+
this.suggestedParams, this._reKeyTo, true // nonParticipation param
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
get transactionType() {
|
|
142
|
+
return sdk_core_1.TransactionType.WalletInitialization;
|
|
143
|
+
}
|
|
144
|
+
/** @inheritdoc */
|
|
145
|
+
fromImplementation(rawTransaction) {
|
|
146
|
+
const tx = super.fromImplementation(rawTransaction);
|
|
147
|
+
const algoTxn = tx.getAlgoTransaction();
|
|
148
|
+
if (algoTxn) {
|
|
149
|
+
if (this.isNonParticipationKeyRegAlgoSDKTransaction(algoTxn)) {
|
|
150
|
+
this.nonParticipation(!!algoTxn.nonParticipation);
|
|
151
|
+
}
|
|
152
|
+
else if (this.isOnlineKeyRegAlgoSDKTransaction(algoTxn)) {
|
|
153
|
+
this.voteKey(algoTxn.voteKey.toString('base64'));
|
|
154
|
+
this.selectionKey(algoTxn.selectionKey.toString('base64'));
|
|
155
|
+
this.voteFirst(algoTxn.voteFirst);
|
|
156
|
+
this.voteLast(algoTxn.voteLast);
|
|
157
|
+
this.voteKeyDilution(algoTxn.voteKeyDilution);
|
|
158
|
+
if (algoTxn.stateProofKey) {
|
|
159
|
+
this.stateProofKey(algoTxn.stateProofKey.toString('base64'));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return tx;
|
|
164
|
+
}
|
|
165
|
+
/** @inheritdoc */
|
|
166
|
+
validateRawTransaction(rawTransaction) {
|
|
167
|
+
const decodeTxn = utils_1.default.decodeAlgoTxn(rawTransaction);
|
|
168
|
+
const algoTxn = decodeTxn.txn;
|
|
169
|
+
if (algoTxn.type !== algosdk_1.default.TransactionType.keyreg) {
|
|
170
|
+
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${algoTxn.type}. Expected ${algosdk_1.default.TransactionType.keyreg}`);
|
|
171
|
+
}
|
|
172
|
+
if (this.isOnlineKeyRegAlgoSDKTransaction(algoTxn)) {
|
|
173
|
+
this.validateFields(algoTxn.voteKey.toString('base64'), algoTxn.selectionKey.toString('base64'), algoTxn.voteFirst, algoTxn.voteLast, algoTxn.voteKeyDilution, algoTxn.stateProofKey && algoTxn.stateProofKey.toString('base64'));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
isNonParticipationKeyRegAlgoSDKTransaction(algoTxn) {
|
|
177
|
+
return !!algoTxn.nonParticipation;
|
|
178
|
+
}
|
|
179
|
+
isNonParticipationKeyRegAccountLibTransaction() {
|
|
180
|
+
return !!this._nonParticipation;
|
|
181
|
+
}
|
|
182
|
+
isOnlineKeyRegAlgoSDKTransaction(algoTxn) {
|
|
183
|
+
return !(this.isOfflineKeyRegAlgoSDKTransaction(algoTxn) || this.isNonParticipationKeyRegAlgoSDKTransaction(algoTxn));
|
|
184
|
+
}
|
|
185
|
+
isOnlineKeyRegAccountLibTransaction() {
|
|
186
|
+
return !(this.isOfflineKeyRegAccountLibTransaction() || this.isNonParticipationKeyRegAccountLibTransaction());
|
|
187
|
+
}
|
|
188
|
+
isOfflineKeyRegAlgoSDKTransaction(algoTxn) {
|
|
189
|
+
return (!algoTxn.voteKey &&
|
|
190
|
+
!algoTxn.selectionKey &&
|
|
191
|
+
!algoTxn.voteFirst &&
|
|
192
|
+
!algoTxn.voteLast &&
|
|
193
|
+
!algoTxn.voteKeyDilution &&
|
|
194
|
+
!algoTxn.stateProofKey &&
|
|
195
|
+
!algoTxn.nonParticipation);
|
|
196
|
+
}
|
|
197
|
+
isOfflineKeyRegAccountLibTransaction() {
|
|
198
|
+
return (!this._voteKey &&
|
|
199
|
+
!this._selectionKey &&
|
|
200
|
+
!this._voteFirst &&
|
|
201
|
+
!this._voteLast &&
|
|
202
|
+
!this._voteKeyDilution &&
|
|
203
|
+
!this._stateProofKey &&
|
|
204
|
+
!this._nonParticipation);
|
|
205
|
+
}
|
|
206
|
+
/** @inheritdoc */
|
|
207
|
+
validateTransaction(transaction) {
|
|
208
|
+
super.validateTransaction(transaction);
|
|
209
|
+
if (this.isOnlineKeyRegAccountLibTransaction()) {
|
|
210
|
+
// invalid offline will reach here
|
|
211
|
+
this.validateFields(this._voteKey, this._selectionKey, this._voteFirst, this._voteLast, this._voteKeyDilution, this._stateProofKey);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// offline or nonparticipation transaction
|
|
215
|
+
if (this._voteKey ||
|
|
216
|
+
this._selectionKey ||
|
|
217
|
+
this._voteFirst ||
|
|
218
|
+
this._voteLast ||
|
|
219
|
+
this._voteKeyDilution ||
|
|
220
|
+
this._stateProofKey) {
|
|
221
|
+
throw new sdk_core_1.InvalidTransactionError('VoteKey, SelectionKey, VoteFirst, VoteLast, VoteKeyDilution, StateProofKey fields cannot be set when offline or nonparticipation is set');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
validateFields(voteKey, selectionKey, voteFirst, voteLast, voteKeyDilution, stateProofKey) {
|
|
226
|
+
const validationResult = txnSchema_1.KeyRegTxnSchema.validate({
|
|
227
|
+
voteKey,
|
|
228
|
+
selectionKey,
|
|
229
|
+
voteFirst,
|
|
230
|
+
voteLast,
|
|
231
|
+
voteKeyDilution,
|
|
232
|
+
stateProofKey,
|
|
233
|
+
});
|
|
234
|
+
if (validationResult.error) {
|
|
235
|
+
throw new sdk_core_1.InvalidTransactionError(`Transaction validation failed: ${validationResult.error.message}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
exports.KeyRegistrationBuilder = KeyRegistrationBuilder;
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UmVnaXN0cmF0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UmVnaXN0cmF0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnRUFBcUM7QUFDckMsc0RBQThCO0FBRTlCLDhDQUEyRTtBQUMzRSw2REFBMEQ7QUFFMUQsMkNBQThDO0FBQzlDLG9EQUE0QjtBQUU1QixNQUFhLHNCQUF1QixTQUFRLHVDQUFrQjtJQVM1RCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZLENBQUMsR0FBVztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsYUFBYSxDQUFDLEdBQVc7UUFDdkIsZUFBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHNCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUks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QixDQUFDLGtDQUFrQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUN2RztJQUNILENBQUM7Q0FDRjtBQXhURCx3REF3VEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYWxnb3NkayBmcm9tICdhbGdvc2RrJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIEludmFsaWRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLZXlSZWdUeG5TY2hlbWEgfSBmcm9tICcuL3R4blNjaGVtYSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF92b3RlS2V5OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfc2VsZWN0aW9uS2V5OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdm90ZUZpcnN0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdm90ZUxhc3Q6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF92b3RlS2V5RGlsdXRpb246IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9ub25QYXJ0aWNpcGF0aW9uOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgX3N0YXRlUHJvb2ZLZXk6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZvdGUga2V5XG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcm9vdCBwYXJ0aWNpcGF0aW9uIHB1YmxpYyBrZXkuIFNlZSBHZW5lcmF0ZSBhIFBhcnRpY2lwYXRpb24gS2V5IHRvIGxlYXJuIG1vcmUuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3JlZmVyZW5jZS90cmFuc2FjdGlvbnMvI2tleS1yZWdpc3RyYXRpb24tdHJhbnNhY3Rpb25cbiAgICovXG4gIHZvdGVLZXkoa2V5OiBzdHJpbmcpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLl92b3RlS2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNlbGVjdGlvbiBrZXlcbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBWUkYgcHVibGljIGtleSBmb3IgdGhlIGFjY291bnQuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3JlZmVyZW5jZS90cmFuc2FjdGlvbnMvI2tleS1yZWdpc3RyYXRpb24tdHJhbnNhY3Rpb25cbiAgICovXG4gIHNlbGVjdGlvbktleShrZXk6IHN0cmluZyk6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuX3NlbGVjdGlvbktleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdGF0ZVByb29mIGtleVxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHN0YXRlcHJvb2Yga2V5LiBTZWUgY29uc2Vuc3VzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9nZXQtZGV0YWlscy9hbGdvcmFuZF9jb25zZW5zdXMvP2Zyb21fcXVlcnk9c3RhdGUjc3RhdGUtcHJvb2Yta2V5c1xuICAgKi9cbiAgc3RhdGVQcm9vZktleShrZXk6IHN0cmluZyk6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIFV0aWxzLnZhbGlkYXRlQmFzZTY0KGtleSk7XG4gICAgdGhpcy5fc3RhdGVQcm9vZktleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKlNldHMgdGhlIHZvdGUgZmlyc3Qgcm91bmRcbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcm91bmQgVGhlIGZpcnN0IHJvdW5kIHRoYXQgdGhlIHBhcnRpY2lwYXRpb24ga2V5IGlzIHZhbGlkLiBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgRmlyc3RWYWxpZCByb3VuZCBvZiB0aGUga2V5cmVnIHRyYW5zYWN0aW9uLlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyNrZXktcmVnaXN0cmF0aW9uLXRyYW5zYWN0aW9uXG4gICAqL1xuICB2b3RlRmlyc3Qocm91bmQ6IG51bWJlcik6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHJvdW5kKSk7XG4gICAgdGhpcy5fdm90ZUZpcnN0ID0gcm91bmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2b3RlIGxhc3Qgcm91bmRcbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBBIHJlY29tbWVuZGVkIHJhbmdlIGlzIDMsMDAwLDAwMCByb3VuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByb3VuZCBObyB0aGVvcmV0aWNhbCBsaW1pdC5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcnVuLWEtbm9kZS9wYXJ0aWNpcGF0ZS9nZW5lcmF0ZV9rZXlzL1xuICAgKi9cbiAgdm90ZUxhc3Qocm91bmQ6IG51bWJlcik6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHJvdW5kKSk7XG4gICAgdGhpcy5fdm90ZUxhc3QgPSByb3VuZDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZvdGUga2V5IGRpbHV0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gMTAsMDAwXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFsxMDAwMF0uIFRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgcGFydGljaXBhdGlvbiBrZXksIHNldCB0aGUga2V5IGRpbHV0aW9uIHZhbHVlIHRvIHJvdWdobHkgdGhlIHNxdWFyZSByb290IG9mIHRoZSByYW5nZSB0aGF0IHRoZSBwYXJ0a2V5IGlzIHZhbGlkIGZvci5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcnVuLWEtbm9kZS9wYXJ0aWNpcGF0ZS9nZW5lcmF0ZV9rZXlzLyNnZW5lcmF0ZS10aGUtcGFydGljaXBhdGlvbi1rZXktd2l0aC1nb2FsXG4gICAqIEBwYXJhbSBzaXplXG4gICAqL1xuICB2b3RlS2V5RGlsdXRpb24oc2l6ZSA9IDEwMDAwKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoc2l6ZSkpO1xuICAgIHRoaXMuX3ZvdGVLZXlEaWx1dGlvbiA9IHNpemU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBub24gcGFydGljaXBhdGlvbiBmbGFnXG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBub25QYXJ0aWNpcGF0aW9uIEFsbCBuZXcgQWxnb3JhbmQgYWNjb3VudHMgYXJlIHBhcnRpY2lwYXRpbmcgYnkgZGVmYXVsdC5cbiAgICogVGhpcyBtZWFucyB0aGF0IHRoZXkgZWFybiByZXdhcmRzLiBNYXJrIGFuIGFjY291bnQgbm9ucGFydGljaXBhdGluZyBieSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ1ZSBhbmQgdGhpcyBhY2NvdW50XG4gICAqIHdpbGwgbm8gbG9uZ2VyIGVhcm4gcmV3YXJkcyBORVZFUi5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcmVmZXJlbmNlL3RyYW5zYWN0aW9ucy8ja2V5LXJlZ2lzdHJhdGlvbi10cmFuc2FjdGlvblxuICAgKi9cbiAgbm9uUGFydGljaXBhdGlvbihub25QYXJ0aWNpcGF0aW9uOiBib29sZWFuKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy5fbm9uUGFydGljaXBhdGlvbiA9IG5vblBhcnRpY2lwYXRpb247XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEFsZ29UeG4oKTogYWxnb3Nkay5UcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNPZmZsaW5lS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKClcbiAgICAgID8gdGhpcy5idWlsZE9mZmxpbmVLZXlSZWdUcmFuc2FjdGlvbigpXG4gICAgICA6IHRoaXMuaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKClcbiAgICAgID8gdGhpcy5idWlsZE5vblBhcnRpY2lwYXRpb25LZXlSZWdUcmFuc2FjdGlvbigpXG4gICAgICA6IHRoaXMuYnVpbGRPbmxpbmVLZXlSZWdUcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE9mZmxpbmVLZXlSZWdUcmFuc2FjdGlvbigpOiBhbGdvc2RrLlRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gYWxnb3Nkay5tYWtlS2V5UmVnaXN0cmF0aW9uVHhuV2l0aFN1Z2dlc3RlZFBhcmFtcyhcbiAgICAgIHRoaXMuX3NlbmRlcixcbiAgICAgIHRoaXMuX25vdGUsXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVLZXkgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gc2VsZWN0aW9uS2V5IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVGaXJzdCBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlTGFzdCBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlS2V5RGlsdXRpb24gcGFyYW1cbiAgICAgIHRoaXMuc3VnZ2VzdGVkUGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPbmxpbmVLZXlSZWdUcmFuc2FjdGlvbigpOiBhbGdvc2RrLlRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gYWxnb3Nkay5tYWtlS2V5UmVnaXN0cmF0aW9uVHhuV2l0aFN1Z2dlc3RlZFBhcmFtcyhcbiAgICAgIHRoaXMuX3NlbmRlcixcbiAgICAgIHRoaXMuX25vdGUsXG4gICAgICB0aGlzLl92b3RlS2V5LFxuICAgICAgdGhpcy5fc2VsZWN0aW9uS2V5LFxuICAgICAgdGhpcy5fdm90ZUZpcnN0LFxuICAgICAgdGhpcy5fdm90ZUxhc3QsXG4gICAgICB0aGlzLl92b3RlS2V5RGlsdXRpb24sXG4gICAgICB0aGlzLnN1Z2dlc3RlZFBhcmFtcyxcbiAgICAgIHVuZGVmaW5lZCwgLy8gcmVLZXlUbyBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyBub25QYXJ0aWNpcGF0aW9uIHBhcmFtXG4gICAgICB0aGlzLl9zdGF0ZVByb29mS2V5XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGROb25QYXJ0aWNpcGF0aW9uS2V5UmVnVHJhbnNhY3Rpb24oKTogYWxnb3Nkay5UcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIGFsZ29zZGsubWFrZUtleVJlZ2lzdHJhdGlvblR4bldpdGhTdWdnZXN0ZWRQYXJhbXMoXG4gICAgICB0aGlzLl9zZW5kZXIsXG4gICAgICB0aGlzLl9ub3RlLFxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlS2V5IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHNlbGVjdGlvbktleSBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlRmlyc3QgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUxhc3QgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUtleURpbHV0aW9uIHBhcmFtXG4gICAgICB0aGlzLnN1Z2dlc3RlZFBhcmFtcyxcbiAgICAgIHRoaXMuX3JlS2V5VG8sXG4gICAgICB0cnVlIC8vIG5vblBhcnRpY2lwYXRpb24gcGFyYW1cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IFVpbnQ4QXJyYXkgfCBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHggPSBzdXBlci5mcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IGFsZ29UeG4gPSB0eC5nZXRBbGdvVHJhbnNhY3Rpb24oKTtcblxuICAgIGlmIChhbGdvVHhuKSB7XG4gICAgICBpZiAodGhpcy5pc05vblBhcnRpY2lwYXRpb25LZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bikpIHtcbiAgICAgICAgdGhpcy5ub25QYXJ0aWNpcGF0aW9uKCEhYWxnb1R4bi5ub25QYXJ0aWNpcGF0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc09ubGluZUtleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuKSkge1xuICAgICAgICB0aGlzLnZvdGVLZXkoYWxnb1R4bi52b3RlS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uS2V5KGFsZ29UeG4uc2VsZWN0aW9uS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgICAgIHRoaXMudm90ZUZpcnN0KGFsZ29UeG4udm90ZUZpcnN0KTtcbiAgICAgICAgdGhpcy52b3RlTGFzdChhbGdvVHhuLnZvdGVMYXN0KTtcbiAgICAgICAgdGhpcy52b3RlS2V5RGlsdXRpb24oYWxnb1R4bi52b3RlS2V5RGlsdXRpb24pO1xuICAgICAgICBpZiAoYWxnb1R4bi5zdGF0ZVByb29mS2V5KSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVByb29mS2V5KGFsZ29UeG4uc3RhdGVQcm9vZktleS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBVaW50OEFycmF5IHwgc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGVjb2RlVHhuID0gVXRpbHMuZGVjb2RlQWxnb1R4bihyYXdUcmFuc2FjdGlvbik7XG4gICAgY29uc3QgYWxnb1R4biA9IGRlY29kZVR4bi50eG47XG4gICAgaWYgKGFsZ29UeG4udHlwZSAhPT0gYWxnb3Nkay5UcmFuc2FjdGlvblR5cGUua2V5cmVnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6ICR7YWxnb1R4bi50eXBlfS4gRXhwZWN0ZWQgJHthbGdvc2RrLlRyYW5zYWN0aW9uVHlwZS5rZXlyZWd9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc09ubGluZUtleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhcbiAgICAgICAgYWxnb1R4bi52b3RlS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgYWxnb1R4bi5zZWxlY3Rpb25LZXkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICBhbGdvVHhuLnZvdGVGaXJzdCxcbiAgICAgICAgYWxnb1R4bi52b3RlTGFzdCxcbiAgICAgICAgYWxnb1R4bi52b3RlS2V5RGlsdXRpb24sXG4gICAgICAgIGFsZ29UeG4uc3RhdGVQcm9vZktleSAmJiBhbGdvVHhuLnN0YXRlUHJvb2ZLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG46IGFsZ29zZGsuVHJhbnNhY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhbGdvVHhuLm5vblBhcnRpY2lwYXRpb247XG4gIH1cblxuICBwcml2YXRlIGlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9ub25QYXJ0aWNpcGF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09ubGluZUtleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuOiBhbGdvc2RrLlRyYW5zYWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmlzT2ZmbGluZUtleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuKSB8fCB0aGlzLmlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzT25saW5lS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHRoaXMuaXNPZmZsaW5lS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCkgfHwgdGhpcy5pc05vblBhcnRpY2lwYXRpb25LZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKSk7XG4gIH1cblxuICBwcml2YXRlIGlzT2ZmbGluZUtleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuOiBhbGdvc2RrLlRyYW5zYWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICFhbGdvVHhuLnZvdGVLZXkgJiZcbiAgICAgICFhbGdvVHhuLnNlbGVjdGlvbktleSAmJlxuICAgICAgIWFsZ29UeG4udm90ZUZpcnN0ICYmXG4gICAgICAhYWxnb1R4bi52b3RlTGFzdCAmJlxuICAgICAgIWFsZ29UeG4udm90ZUtleURpbHV0aW9uICYmXG4gICAgICAhYWxnb1R4bi5zdGF0ZVByb29mS2V5ICYmXG4gICAgICAhYWxnb1R4bi5ub25QYXJ0aWNpcGF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPZmZsaW5lS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5fdm90ZUtleSAmJlxuICAgICAgIXRoaXMuX3NlbGVjdGlvbktleSAmJlxuICAgICAgIXRoaXMuX3ZvdGVGaXJzdCAmJlxuICAgICAgIXRoaXMuX3ZvdGVMYXN0ICYmXG4gICAgICAhdGhpcy5fdm90ZUtleURpbHV0aW9uICYmXG4gICAgICAhdGhpcy5fc3RhdGVQcm9vZktleSAmJlxuICAgICAgIXRoaXMuX25vblBhcnRpY2lwYXRpb25cbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIudmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgaWYgKHRoaXMuaXNPbmxpbmVLZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKSkge1xuICAgICAgLy8gaW52YWxpZCBvZmZsaW5lIHdpbGwgcmVhY2ggaGVyZVxuICAgICAgdGhpcy52YWxpZGF0ZUZpZWxkcyhcbiAgICAgICAgdGhpcy5fdm90ZUtleSxcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uS2V5LFxuICAgICAgICB0aGlzLl92b3RlRmlyc3QsXG4gICAgICAgIHRoaXMuX3ZvdGVMYXN0LFxuICAgICAgICB0aGlzLl92b3RlS2V5RGlsdXRpb24sXG4gICAgICAgIHRoaXMuX3N0YXRlUHJvb2ZLZXlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9mZmxpbmUgb3Igbm9ucGFydGljaXBhdGlvbiB0cmFuc2FjdGlvblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl92b3RlS2V5IHx8XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbktleSB8fFxuICAgICAgICB0aGlzLl92b3RlRmlyc3QgfHxcbiAgICAgICAgdGhpcy5fdm90ZUxhc3QgfHxcbiAgICAgICAgdGhpcy5fdm90ZUtleURpbHV0aW9uIHx8XG4gICAgICAgIHRoaXMuX3N0YXRlUHJvb2ZLZXlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ1ZvdGVLZXksIFNlbGVjdGlvbktleSwgVm90ZUZpcnN0LCBWb3RlTGFzdCwgVm90ZUtleURpbHV0aW9uLCBTdGF0ZVByb29mS2V5IGZpZWxkcyBjYW5ub3QgYmUgc2V0IHdoZW4gb2ZmbGluZSBvciBub25wYXJ0aWNpcGF0aW9uIGlzIHNldCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRmllbGRzKFxuICAgIHZvdGVLZXk6IHN0cmluZyxcbiAgICBzZWxlY3Rpb25LZXk6IHN0cmluZyxcbiAgICB2b3RlRmlyc3Q6IG51bWJlcixcbiAgICB2b3RlTGFzdDogbnVtYmVyLFxuICAgIHZvdGVLZXlEaWx1dGlvbjogbnVtYmVyLFxuICAgIHN0YXRlUHJvb2ZLZXk/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IEtleVJlZ1R4blNjaGVtYS52YWxpZGF0ZSh7XG4gICAgICB2b3RlS2V5LFxuICAgICAgc2VsZWN0aW9uS2V5LFxuICAgICAgdm90ZUZpcnN0LFxuICAgICAgdm90ZUxhc3QsXG4gICAgICB2b3RlS2V5RGlsdXRpb24sXG4gICAgICBzdGF0ZVByb29mS2V5LFxuICAgIH0pO1xuXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Seed } from './ifaces';
|
|
2
|
+
export declare class SeedEncoding {
|
|
3
|
+
private static genericHash;
|
|
4
|
+
/**
|
|
5
|
+
* Checks if a seed is valid
|
|
6
|
+
* @param {String} seed - encoded Algorand seed
|
|
7
|
+
* @returns {Boolean} true if valid, false otherwise
|
|
8
|
+
*/
|
|
9
|
+
static isValidSeed(seed: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Decode a seed
|
|
12
|
+
*
|
|
13
|
+
* @param seed
|
|
14
|
+
* @return {{checksum: Uint8Array, seed: Uint8Array}}
|
|
15
|
+
*/
|
|
16
|
+
static decode(seed: string): Seed;
|
|
17
|
+
/**
|
|
18
|
+
* Encode a secret key into a seed
|
|
19
|
+
*
|
|
20
|
+
* @param secretKey
|
|
21
|
+
* @return {String} encoded seed
|
|
22
|
+
*/
|
|
23
|
+
static encode(secretKey: Uint8Array): string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=seedEncoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seedEncoding.d.ts","sourceRoot":"","sources":["../../../src/lib/seedEncoding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAOhC,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IA0BzC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAajC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;CAe7C"}
|
|
@@ -0,0 +1,97 @@
|
|
|
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.SeedEncoding = void 0;
|
|
26
|
+
const base32 = __importStar(require("hi-base32"));
|
|
27
|
+
const js_sha512_1 = __importDefault(require("js-sha512"));
|
|
28
|
+
const SEED_BYTES_LENGTH = 32;
|
|
29
|
+
const ALGORAND_SEED_BYTE_LENGTH = 36;
|
|
30
|
+
const ALGORAND_CHECKSUM_BYTE_LENGTH = 4;
|
|
31
|
+
const ALGORAND_SEED_LENGTH = 58;
|
|
32
|
+
class SeedEncoding {
|
|
33
|
+
static genericHash(arr) {
|
|
34
|
+
return js_sha512_1.default.sha512_256.array(arr);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Checks if a seed is valid
|
|
38
|
+
* @param {String} seed - encoded Algorand seed
|
|
39
|
+
* @returns {Boolean} true if valid, false otherwise
|
|
40
|
+
*/
|
|
41
|
+
static isValidSeed(seed) {
|
|
42
|
+
if (seed.length !== ALGORAND_SEED_LENGTH) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
// Try to decode
|
|
46
|
+
let decoded;
|
|
47
|
+
try {
|
|
48
|
+
decoded = SeedEncoding.decode(seed);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// Compute checksum
|
|
54
|
+
const checksum = SeedEncoding.genericHash(decoded.seed).slice(SEED_BYTES_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH, SEED_BYTES_LENGTH);
|
|
55
|
+
// Check if the checksum and the seed are equal
|
|
56
|
+
if (checksum.length !== decoded.checksum.length) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return checksum.every((val, i) => val === decoded.checksum[i]);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Decode a seed
|
|
63
|
+
*
|
|
64
|
+
* @param seed
|
|
65
|
+
* @return {{checksum: Uint8Array, seed: Uint8Array}}
|
|
66
|
+
*/
|
|
67
|
+
static decode(seed) {
|
|
68
|
+
// try to decode
|
|
69
|
+
const decoded = base32.decode.asBytes(seed);
|
|
70
|
+
// Sanity check
|
|
71
|
+
if (decoded.length !== ALGORAND_SEED_BYTE_LENGTH)
|
|
72
|
+
throw new Error('seed seems to be malformed');
|
|
73
|
+
return {
|
|
74
|
+
seed: new Uint8Array(decoded.slice(0, ALGORAND_SEED_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH)),
|
|
75
|
+
checksum: new Uint8Array(decoded.slice(SEED_BYTES_LENGTH, ALGORAND_SEED_BYTE_LENGTH)),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Encode a secret key into a seed
|
|
80
|
+
*
|
|
81
|
+
* @param secretKey
|
|
82
|
+
* @return {String} encoded seed
|
|
83
|
+
*/
|
|
84
|
+
static encode(secretKey) {
|
|
85
|
+
// get seed
|
|
86
|
+
const seed = secretKey.slice(0, SEED_BYTES_LENGTH);
|
|
87
|
+
// compute checksum
|
|
88
|
+
const checksum = SeedEncoding.genericHash(seed).slice(SEED_BYTES_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH, SEED_BYTES_LENGTH);
|
|
89
|
+
const arraySeed = new Uint8Array(seed.length + checksum.length);
|
|
90
|
+
arraySeed.set(seed);
|
|
91
|
+
arraySeed.set(checksum, seed.length);
|
|
92
|
+
const encodedSeed = base32.encode(arraySeed);
|
|
93
|
+
return encodedSeed.toString().slice(0, ALGORAND_SEED_LENGTH); // removing the extra '===='
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.SeedEncoding = SeedEncoding;
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VlZEVuY29kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zZWVkRW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFvQztBQUNwQywwREFBK0I7QUFHL0IsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFDckMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFaEMsTUFBYSxZQUFZO0lBQ2YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFlO1FBQ3hDLE9BQU8sbUJBQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFZO1FBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxvQkFBb0IsRUFBRTtZQUN4QyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksT0FBYSxDQUFDO1FBQ2xCLElBQUk7WUFDRixPQUFPLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELG1CQUFtQjtRQUNuQixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQzNELGlCQUFpQixHQUFHLDZCQUE2QixFQUNqRCxpQkFBaUIsQ0FDbEIsQ0FBQztRQUVGLCtDQUErQztRQUMvQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDL0MsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQ3hCLGdCQUFnQjtRQUNoQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QyxlQUFlO1FBQ2YsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLHlCQUF5QjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUVoRyxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixHQUFHLDZCQUE2QixDQUFDLENBQUM7WUFDakcsUUFBUSxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUseUJBQXlCLENBQUMsQ0FBQztTQUN0RixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFxQjtRQUNqQyxXQUFXO1FBQ1gsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNuRCxtQkFBbUI7UUFDbkIsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQ25ELGlCQUFpQixHQUFHLDZCQUE2QixFQUNqRCxpQkFBaUIsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0MsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0lBQzVGLENBQUM7Q0FDRjtBQTVFRCxvQ0E0RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlMzIgZnJvbSAnaGktYmFzZTMyJztcbmltcG9ydCBzaGE1MTIgZnJvbSAnanMtc2hhNTEyJztcbmltcG9ydCB7IFNlZWQgfSBmcm9tICcuL2lmYWNlcyc7XG5cbmNvbnN0IFNFRURfQllURVNfTEVOR1RIID0gMzI7XG5jb25zdCBBTEdPUkFORF9TRUVEX0JZVEVfTEVOR1RIID0gMzY7XG5jb25zdCBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCA9IDQ7XG5jb25zdCBBTEdPUkFORF9TRUVEX0xFTkdUSCA9IDU4O1xuXG5leHBvcnQgY2xhc3MgU2VlZEVuY29kaW5nIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJpY0hhc2goYXJyOiBVaW50OEFycmF5KTogbnVtYmVyW10ge1xuICAgIHJldHVybiBzaGE1MTIuc2hhNTEyXzI1Ni5hcnJheShhcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHNlZWQgaXMgdmFsaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlZWQgLSBlbmNvZGVkIEFsZ29yYW5kIHNlZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTZWVkKHNlZWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWVkLmxlbmd0aCAhPT0gQUxHT1JBTkRfU0VFRF9MRU5HVEgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZGVjb2RlXG4gICAgbGV0IGRlY29kZWQ6IFNlZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGRlY29kZWQgPSBTZWVkRW5jb2RpbmcuZGVjb2RlKHNlZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGNoZWNrc3VtXG4gICAgY29uc3QgY2hlY2tzdW0gPSBTZWVkRW5jb2RpbmcuZ2VuZXJpY0hhc2goZGVjb2RlZC5zZWVkKS5zbGljZShcbiAgICAgIFNFRURfQllURVNfTEVOR1RIIC0gQUxHT1JBTkRfQ0hFQ0tTVU1fQllURV9MRU5HVEgsXG4gICAgICBTRUVEX0JZVEVTX0xFTkdUSFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2hlY2tzdW0gYW5kIHRoZSBzZWVkIGFyZSBlcXVhbFxuICAgIGlmIChjaGVja3N1bS5sZW5ndGggIT09IGRlY29kZWQuY2hlY2tzdW0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBjaGVja3N1bS5ldmVyeSgodmFsLCBpKSA9PiB2YWwgPT09IGRlY29kZWQuY2hlY2tzdW1baV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHNlZWRcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybiB7e2NoZWNrc3VtOiBVaW50OEFycmF5LCBzZWVkOiBVaW50OEFycmF5fX1cbiAgICovXG4gIHN0YXRpYyBkZWNvZGUoc2VlZDogc3RyaW5nKTogU2VlZCB7XG4gICAgLy8gdHJ5IHRvIGRlY29kZVxuICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlMzIuZGVjb2RlLmFzQnl0ZXMoc2VlZCk7XG5cbiAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICBpZiAoZGVjb2RlZC5sZW5ndGggIT09IEFMR09SQU5EX1NFRURfQllURV9MRU5HVEgpIHRocm93IG5ldyBFcnJvcignc2VlZCBzZWVtcyB0byBiZSBtYWxmb3JtZWQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZWVkOiBuZXcgVWludDhBcnJheShkZWNvZGVkLnNsaWNlKDAsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCkpLFxuICAgICAgY2hlY2tzdW06IG5ldyBVaW50OEFycmF5KGRlY29kZWQuc2xpY2UoU0VFRF9CWVRFU19MRU5HVEgsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEgpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhIHNlY3JldCBrZXkgaW50byBhIHNlZWRcbiAgICpcbiAgICogQHBhcmFtIHNlY3JldEtleVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGVuY29kZWQgc2VlZFxuICAgKi9cbiAgc3RhdGljIGVuY29kZShzZWNyZXRLZXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIC8vIGdldCBzZWVkXG4gICAgY29uc3Qgc2VlZCA9IHNlY3JldEtleS5zbGljZSgwLCBTRUVEX0JZVEVTX0xFTkdUSCk7XG4gICAgLy8gY29tcHV0ZSBjaGVja3N1bVxuICAgIGNvbnN0IGNoZWNrc3VtID0gU2VlZEVuY29kaW5nLmdlbmVyaWNIYXNoKHNlZWQpLnNsaWNlKFxuICAgICAgU0VFRF9CWVRFU19MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCxcbiAgICAgIFNFRURfQllURVNfTEVOR1RIXG4gICAgKTtcbiAgICBjb25zdCBhcnJheVNlZWQgPSBuZXcgVWludDhBcnJheShzZWVkLmxlbmd0aCArIGNoZWNrc3VtLmxlbmd0aCk7XG4gICAgYXJyYXlTZWVkLnNldChzZWVkKTtcbiAgICBhcnJheVNlZWQuc2V0KGNoZWNrc3VtLCBzZWVkLmxlbmd0aCk7XG4gICAgY29uc3QgZW5jb2RlZFNlZWQgPSBiYXNlMzIuZW5jb2RlKGFycmF5U2VlZCk7XG5cbiAgICByZXR1cm4gZW5jb2RlZFNlZWQudG9TdHJpbmcoKS5zbGljZSgwLCBBTEdPUkFORF9TRUVEX0xFTkdUSCk7IC8vIHJlbW92aW5nIHRoZSBleHRyYSAnPT09PSdcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
+
import algosdk from 'algosdk';
|
|
3
|
+
import { BaseTransaction, TransactionType, BaseKey } from '@bitgo/sdk-core';
|
|
4
|
+
import { KeyPair } from './keyPair';
|
|
5
|
+
import { TxData } from './ifaces';
|
|
6
|
+
export declare class Transaction extends BaseTransaction {
|
|
7
|
+
private _algoTransaction?;
|
|
8
|
+
private _signedTransaction?;
|
|
9
|
+
private _numberOfRequiredSigners;
|
|
10
|
+
private _sender;
|
|
11
|
+
private _signers;
|
|
12
|
+
private _signedBy;
|
|
13
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
14
|
+
/** @inheritdoc */
|
|
15
|
+
canSign({ key }: BaseKey): boolean;
|
|
16
|
+
sender(address: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Signs transaction.
|
|
19
|
+
*
|
|
20
|
+
* @param {KeyPair} keyPair Signer keys.
|
|
21
|
+
*/
|
|
22
|
+
sign(keyPair: KeyPair[]): void;
|
|
23
|
+
/**
|
|
24
|
+
* Signs transaction.
|
|
25
|
+
*
|
|
26
|
+
* @param {KeyPair} keyPair Signer keys.
|
|
27
|
+
*/
|
|
28
|
+
private signSingle;
|
|
29
|
+
/**
|
|
30
|
+
* Signs multisig transaction.
|
|
31
|
+
*
|
|
32
|
+
* @param {KeyPair} keyPair Signers keys.
|
|
33
|
+
*/
|
|
34
|
+
private signMultiSig;
|
|
35
|
+
set signedTransaction(txn: Uint8Array);
|
|
36
|
+
get numberOfRequiredSigners(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Sets the number of signers required for signing this transaction.
|
|
39
|
+
*
|
|
40
|
+
* @param {number} num Threshold number of signers.
|
|
41
|
+
*/
|
|
42
|
+
setNumberOfRequiredSigners(num: number): void;
|
|
43
|
+
set signers(addrs: string[]);
|
|
44
|
+
get signers(): string[];
|
|
45
|
+
set signedBy(signer: string[]);
|
|
46
|
+
get signedBy(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Sets algo transaction.
|
|
49
|
+
*
|
|
50
|
+
* @param {algosdk.Transaction} tx
|
|
51
|
+
*/
|
|
52
|
+
setAlgoTransaction(tx: algosdk.Transaction): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get underlaying algo transaction.
|
|
55
|
+
*
|
|
56
|
+
* @returns {algosdk.Transaction}
|
|
57
|
+
*/
|
|
58
|
+
getAlgoTransaction(): algosdk.Transaction | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Set the transaction type.
|
|
61
|
+
*
|
|
62
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
63
|
+
*/
|
|
64
|
+
setTransactionType(transactionType: TransactionType): void;
|
|
65
|
+
estimateSize(): number;
|
|
66
|
+
/** @inheritdoc */
|
|
67
|
+
toBroadcastFormat(): Uint8Array;
|
|
68
|
+
/** @inheritdoc */
|
|
69
|
+
toJson(): TxData;
|
|
70
|
+
/**
|
|
71
|
+
* Load the input and output data on this transaction.
|
|
72
|
+
*/
|
|
73
|
+
loadInputsAndOutputs(): void;
|
|
74
|
+
}
|
|
75
|
+
//# 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,gBAAgB,CAAC;AACxD,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,eAAe,EACf,OAAO,EAIR,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,gBAAgB,CAAC,CAAsB;IAC/C,OAAO,CAAC,kBAAkB,CAAC,CAAa;IACxC,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAW;gBAEhB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM5C,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAiBlC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI;IAW9B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA+BpB,IAAI,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAEpC;IAED,IAAI,uBAAuB,IAAI,MAAM,CAEpC;IAED;;;;OAIG;IACH,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAE1B;IAED,IAAI,OAAO,IAAI,MAAM,EAAE,CAEtB;IAED,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAE5B;IAED,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED;;;;OAIG;IAEH,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI;IAIjD;;;;OAIG;IAEH,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS;IAIrD;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D,YAAY,IAAI,MAAM;IAQtB,kBAAkB;IAClB,iBAAiB,IAAI,UAAU;IAW/B,kBAAkB;IAClB,MAAM,IAAI,MAAM;IAoDhB;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAsB7B"}
|