@bitgo-beta/sdk-coin-algo 1.1.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 +88 -0
- package/LICENSE +191 -0
- package/README.md +30 -0
- package/dist/src/algo.d.ts +211 -0
- package/dist/src/algo.d.ts.map +1 -0
- package/dist/src/algo.js +419 -0
- package/dist/src/algoToken.d.ts +32 -0
- package/dist/src/algoToken.d.ts.map +1 -0
- package/dist/src/algoToken.js +82 -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 +64 -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-beta/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UmVnaXN0cmF0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UmVnaXN0cmF0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnRUFBcUM7QUFDckMsc0RBQThCO0FBRTlCLG1EQUFnRjtBQUNoRiw2REFBMEQ7QUFFMUQsMkNBQThDO0FBQzlDLG9EQUE0QjtBQUU1QixNQUFhLHNCQUF1QixTQUFRLHVDQUFrQjtJQVM1RCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZLENBQUMsR0FBVztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsYUFBYSxDQUFDLEdBQVc7UUFDdkIsZUFBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHNCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUks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QixDQUFDLGtDQUFrQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUN2RztJQUNILENBQUM7Q0FDRjtBQXhURCx3REF3VEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYWxnb3NkayBmcm9tICdhbGdvc2RrJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSwgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UmVnVHhuU2NoZW1hIH0gZnJvbSAnLi90eG5TY2hlbWEnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgS2V5UmVnaXN0cmF0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdm90ZUtleTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGlvbktleTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3ZvdGVGaXJzdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3ZvdGVMYXN0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdm90ZUtleURpbHV0aW9uOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfbm9uUGFydGljaXBhdGlvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIF9zdGF0ZVByb29mS2V5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2b3RlIGtleVxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJvb3QgcGFydGljaXBhdGlvbiBwdWJsaWMga2V5LiBTZWUgR2VuZXJhdGUgYSBQYXJ0aWNpcGF0aW9uIEtleSB0byBsZWFybiBtb3JlLlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyNrZXktcmVnaXN0cmF0aW9uLXRyYW5zYWN0aW9uXG4gICAqL1xuICB2b3RlS2V5KGtleTogc3RyaW5nKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy5fdm90ZUtleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24ga2V5XG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgVlJGIHB1YmxpYyBrZXkgZm9yIHRoZSBhY2NvdW50LlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyNrZXktcmVnaXN0cmF0aW9uLXRyYW5zYWN0aW9uXG4gICAqL1xuICBzZWxlY3Rpb25LZXkoa2V5OiBzdHJpbmcpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25LZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3RhdGVQcm9vZiBrZXlcbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBzdGF0ZXByb29mIGtleS4gU2VlIGNvbnNlbnN1cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvZ2V0LWRldGFpbHMvYWxnb3JhbmRfY29uc2Vuc3VzLz9mcm9tX3F1ZXJ5PXN0YXRlI3N0YXRlLXByb29mLWtleXNcbiAgICovXG4gIHN0YXRlUHJvb2ZLZXkoa2V5OiBzdHJpbmcpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICBVdGlscy52YWxpZGF0ZUJhc2U2NChrZXkpO1xuICAgIHRoaXMuX3N0YXRlUHJvb2ZLZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpTZXRzIHRoZSB2b3RlIGZpcnN0IHJvdW5kXG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJvdW5kIFRoZSBmaXJzdCByb3VuZCB0aGF0IHRoZSBwYXJ0aWNpcGF0aW9uIGtleSBpcyB2YWxpZC4gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggdGhlIEZpcnN0VmFsaWQgcm91bmQgb2YgdGhlIGtleXJlZyB0cmFuc2FjdGlvbi5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcmVmZXJlbmNlL3RyYW5zYWN0aW9ucy8ja2V5LXJlZ2lzdHJhdGlvbi10cmFuc2FjdGlvblxuICAgKi9cbiAgdm90ZUZpcnN0KHJvdW5kOiBudW1iZXIpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihyb3VuZCkpO1xuICAgIHRoaXMuX3ZvdGVGaXJzdCA9IHJvdW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdm90ZSBsYXN0IHJvdW5kXG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQSByZWNvbW1lbmRlZCByYW5nZSBpcyAzLDAwMCwwMDAgcm91bmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcm91bmQgTm8gdGhlb3JldGljYWwgbGltaXQuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3J1bi1hLW5vZGUvcGFydGljaXBhdGUvZ2VuZXJhdGVfa2V5cy9cbiAgICovXG4gIHZvdGVMYXN0KHJvdW5kOiBudW1iZXIpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihyb3VuZCkpO1xuICAgIHRoaXMuX3ZvdGVMYXN0ID0gcm91bmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2b3RlIGtleSBkaWx1dGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIDEwLDAwMFxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBbMTAwMDBdLiBUbyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHBhcnRpY2lwYXRpb24ga2V5LCBzZXQgdGhlIGtleSBkaWx1dGlvbiB2YWx1ZSB0byByb3VnaGx5IHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgcmFuZ2UgdGhhdCB0aGUgcGFydGtleSBpcyB2YWxpZCBmb3IuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3J1bi1hLW5vZGUvcGFydGljaXBhdGUvZ2VuZXJhdGVfa2V5cy8jZ2VuZXJhdGUtdGhlLXBhcnRpY2lwYXRpb24ta2V5LXdpdGgtZ29hbFxuICAgKiBAcGFyYW0gc2l6ZVxuICAgKi9cbiAgdm90ZUtleURpbHV0aW9uKHNpemUgPSAxMDAwMCk6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHNpemUpKTtcbiAgICB0aGlzLl92b3RlS2V5RGlsdXRpb24gPSBzaXplO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbm9uIHBhcnRpY2lwYXRpb24gZmxhZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9uUGFydGljaXBhdGlvbiBBbGwgbmV3IEFsZ29yYW5kIGFjY291bnRzIGFyZSBwYXJ0aWNpcGF0aW5nIGJ5IGRlZmF1bHQuXG4gICAqIFRoaXMgbWVhbnMgdGhhdCB0aGV5IGVhcm4gcmV3YXJkcy4gTWFyayBhbiBhY2NvdW50IG5vbnBhcnRpY2lwYXRpbmcgYnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgYW5kIHRoaXMgYWNjb3VudFxuICAgKiB3aWxsIG5vIGxvbmdlciBlYXJuIHJld2FyZHMgTkVWRVIuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3JlZmVyZW5jZS90cmFuc2FjdGlvbnMvI2tleS1yZWdpc3RyYXRpb24tdHJhbnNhY3Rpb25cbiAgICovXG4gIG5vblBhcnRpY2lwYXRpb24obm9uUGFydGljaXBhdGlvbjogYm9vbGVhbik6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuX25vblBhcnRpY2lwYXRpb24gPSBub25QYXJ0aWNpcGF0aW9uO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRBbGdvVHhuKCk6IGFsZ29zZGsuVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmlzT2ZmbGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpXG4gICAgICA/IHRoaXMuYnVpbGRPZmZsaW5lS2V5UmVnVHJhbnNhY3Rpb24oKVxuICAgICAgOiB0aGlzLmlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpXG4gICAgICA/IHRoaXMuYnVpbGROb25QYXJ0aWNpcGF0aW9uS2V5UmVnVHJhbnNhY3Rpb24oKVxuICAgICAgOiB0aGlzLmJ1aWxkT25saW5lS2V5UmVnVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPZmZsaW5lS2V5UmVnVHJhbnNhY3Rpb24oKTogYWxnb3Nkay5UcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIGFsZ29zZGsubWFrZUtleVJlZ2lzdHJhdGlvblR4bldpdGhTdWdnZXN0ZWRQYXJhbXMoXG4gICAgICB0aGlzLl9zZW5kZXIsXG4gICAgICB0aGlzLl9ub3RlLFxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlS2V5IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHNlbGVjdGlvbktleSBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlRmlyc3QgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUxhc3QgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUtleURpbHV0aW9uIHBhcmFtXG4gICAgICB0aGlzLnN1Z2dlc3RlZFBhcmFtc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkT25saW5lS2V5UmVnVHJhbnNhY3Rpb24oKTogYWxnb3Nkay5UcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIGFsZ29zZGsubWFrZUtleVJlZ2lzdHJhdGlvblR4bldpdGhTdWdnZXN0ZWRQYXJhbXMoXG4gICAgICB0aGlzLl9zZW5kZXIsXG4gICAgICB0aGlzLl9ub3RlLFxuICAgICAgdGhpcy5fdm90ZUtleSxcbiAgICAgIHRoaXMuX3NlbGVjdGlvbktleSxcbiAgICAgIHRoaXMuX3ZvdGVGaXJzdCxcbiAgICAgIHRoaXMuX3ZvdGVMYXN0LFxuICAgICAgdGhpcy5fdm90ZUtleURpbHV0aW9uLFxuICAgICAgdGhpcy5zdWdnZXN0ZWRQYXJhbXMsXG4gICAgICB1bmRlZmluZWQsIC8vIHJlS2V5VG8gcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gbm9uUGFydGljaXBhdGlvbiBwYXJhbVxuICAgICAgdGhpcy5fc3RhdGVQcm9vZktleVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTm9uUGFydGljaXBhdGlvbktleVJlZ1RyYW5zYWN0aW9uKCk6IGFsZ29zZGsuVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBhbGdvc2RrLm1ha2VLZXlSZWdpc3RyYXRpb25UeG5XaXRoU3VnZ2VzdGVkUGFyYW1zKFxuICAgICAgdGhpcy5fc2VuZGVyLFxuICAgICAgdGhpcy5fbm90ZSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUtleSBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyBzZWxlY3Rpb25LZXkgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUZpcnN0IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVMYXN0IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVLZXlEaWx1dGlvbiBwYXJhbVxuICAgICAgdGhpcy5zdWdnZXN0ZWRQYXJhbXMsXG4gICAgICB0aGlzLl9yZUtleVRvLFxuICAgICAgdHJ1ZSAvLyBub25QYXJ0aWNpcGF0aW9uIHBhcmFtXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBVaW50OEFycmF5IHwgc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBhbGdvVHhuID0gdHguZ2V0QWxnb1RyYW5zYWN0aW9uKCk7XG5cbiAgICBpZiAoYWxnb1R4bikge1xuICAgICAgaWYgKHRoaXMuaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG4pKSB7XG4gICAgICAgIHRoaXMubm9uUGFydGljaXBhdGlvbighIWFsZ29UeG4ubm9uUGFydGljaXBhdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNPbmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bikpIHtcbiAgICAgICAgdGhpcy52b3RlS2V5KGFsZ29UeG4udm90ZUtleS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbktleShhbGdvVHhuLnNlbGVjdGlvbktleS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICB0aGlzLnZvdGVGaXJzdChhbGdvVHhuLnZvdGVGaXJzdCk7XG4gICAgICAgIHRoaXMudm90ZUxhc3QoYWxnb1R4bi52b3RlTGFzdCk7XG4gICAgICAgIHRoaXMudm90ZUtleURpbHV0aW9uKGFsZ29UeG4udm90ZUtleURpbHV0aW9uKTtcbiAgICAgICAgaWYgKGFsZ29UeG4uc3RhdGVQcm9vZktleSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVQcm9vZktleShhbGdvVHhuLnN0YXRlUHJvb2ZLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogVWludDhBcnJheSB8IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRlY29kZVR4biA9IFV0aWxzLmRlY29kZUFsZ29UeG4ocmF3VHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IGFsZ29UeG4gPSBkZWNvZGVUeG4udHhuO1xuICAgIGlmIChhbGdvVHhuLnR5cGUgIT09IGFsZ29zZGsuVHJhbnNhY3Rpb25UeXBlLmtleXJlZykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBUcmFuc2FjdGlvbiBUeXBlOiAke2FsZ29UeG4udHlwZX0uIEV4cGVjdGVkICR7YWxnb3Nkay5UcmFuc2FjdGlvblR5cGUua2V5cmVnfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNPbmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bikpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGaWVsZHMoXG4gICAgICAgIGFsZ29UeG4udm90ZUtleS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgIGFsZ29UeG4uc2VsZWN0aW9uS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgYWxnb1R4bi52b3RlRmlyc3QsXG4gICAgICAgIGFsZ29UeG4udm90ZUxhc3QsXG4gICAgICAgIGFsZ29UeG4udm90ZUtleURpbHV0aW9uLFxuICAgICAgICBhbGdvVHhuLnN0YXRlUHJvb2ZLZXkgJiYgYWxnb1R4bi5zdGF0ZVByb29mS2V5LnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuOiBhbGdvc2RrLlRyYW5zYWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhYWxnb1R4bi5ub25QYXJ0aWNpcGF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBpc05vblBhcnRpY2lwYXRpb25LZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fbm9uUGFydGljaXBhdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNPbmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bjogYWxnb3Nkay5UcmFuc2FjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKFxuICAgICAgdGhpcy5pc09mZmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bikgfHwgdGhpcy5pc05vblBhcnRpY2lwYXRpb25LZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09ubGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLmlzT2ZmbGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpIHx8IHRoaXMuaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09mZmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bjogYWxnb3Nkay5UcmFuc2FjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhYWxnb1R4bi52b3RlS2V5ICYmXG4gICAgICAhYWxnb1R4bi5zZWxlY3Rpb25LZXkgJiZcbiAgICAgICFhbGdvVHhuLnZvdGVGaXJzdCAmJlxuICAgICAgIWFsZ29UeG4udm90ZUxhc3QgJiZcbiAgICAgICFhbGdvVHhuLnZvdGVLZXlEaWx1dGlvbiAmJlxuICAgICAgIWFsZ29UeG4uc3RhdGVQcm9vZktleSAmJlxuICAgICAgIWFsZ29UeG4ubm9uUGFydGljaXBhdGlvblxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzT2ZmbGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuX3ZvdGVLZXkgJiZcbiAgICAgICF0aGlzLl9zZWxlY3Rpb25LZXkgJiZcbiAgICAgICF0aGlzLl92b3RlRmlyc3QgJiZcbiAgICAgICF0aGlzLl92b3RlTGFzdCAmJlxuICAgICAgIXRoaXMuX3ZvdGVLZXlEaWx1dGlvbiAmJlxuICAgICAgIXRoaXMuX3N0YXRlUHJvb2ZLZXkgJiZcbiAgICAgICF0aGlzLl9ub25QYXJ0aWNpcGF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgIGlmICh0aGlzLmlzT25saW5lS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIC8vIGludmFsaWQgb2ZmbGluZSB3aWxsIHJlYWNoIGhlcmVcbiAgICAgIHRoaXMudmFsaWRhdGVGaWVsZHMoXG4gICAgICAgIHRoaXMuX3ZvdGVLZXksXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbktleSxcbiAgICAgICAgdGhpcy5fdm90ZUZpcnN0LFxuICAgICAgICB0aGlzLl92b3RlTGFzdCxcbiAgICAgICAgdGhpcy5fdm90ZUtleURpbHV0aW9uLFxuICAgICAgICB0aGlzLl9zdGF0ZVByb29mS2V5XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvZmZsaW5lIG9yIG5vbnBhcnRpY2lwYXRpb24gdHJhbnNhY3Rpb25cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fdm90ZUtleSB8fFxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25LZXkgfHxcbiAgICAgICAgdGhpcy5fdm90ZUZpcnN0IHx8XG4gICAgICAgIHRoaXMuX3ZvdGVMYXN0IHx8XG4gICAgICAgIHRoaXMuX3ZvdGVLZXlEaWx1dGlvbiB8fFxuICAgICAgICB0aGlzLl9zdGF0ZVByb29mS2V5XG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICdWb3RlS2V5LCBTZWxlY3Rpb25LZXksIFZvdGVGaXJzdCwgVm90ZUxhc3QsIFZvdGVLZXlEaWx1dGlvbiwgU3RhdGVQcm9vZktleSBmaWVsZHMgY2Fubm90IGJlIHNldCB3aGVuIG9mZmxpbmUgb3Igbm9ucGFydGljaXBhdGlvbiBpcyBzZXQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpZWxkcyhcbiAgICB2b3RlS2V5OiBzdHJpbmcsXG4gICAgc2VsZWN0aW9uS2V5OiBzdHJpbmcsXG4gICAgdm90ZUZpcnN0OiBudW1iZXIsXG4gICAgdm90ZUxhc3Q6IG51bWJlcixcbiAgICB2b3RlS2V5RGlsdXRpb246IG51bWJlcixcbiAgICBzdGF0ZVByb29mS2V5Pzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBLZXlSZWdUeG5TY2hlbWEudmFsaWRhdGUoe1xuICAgICAgdm90ZUtleSxcbiAgICAgIHNlbGVjdGlvbktleSxcbiAgICAgIHZvdGVGaXJzdCxcbiAgICAgIHZvdGVMYXN0LFxuICAgICAgdm90ZUtleURpbHV0aW9uLFxuICAgICAgc3RhdGVQcm9vZktleSxcbiAgICB9KTtcblxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYFRyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -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-beta/statics';
|
|
2
|
+
import algosdk from 'algosdk';
|
|
3
|
+
import { BaseTransaction, TransactionType, BaseKey } from '@bitgo-beta/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,qBAAqB,CAAC;AAC7D,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,eAAe,EACf,OAAO,EAIR,MAAM,sBAAsB,CAAC;AAE9B,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"}
|