@bitgo-beta/sdk-coin-algo 0.0.0-semantic-release-managed
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 +854 -0
- package/LICENSE +191 -0
- package/README.md +30 -0
- package/dist/src/algo.d.ts +291 -0
- package/dist/src/algo.d.ts.map +1 -0
- package/dist/src/algo.js +637 -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 +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -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 +45 -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 +61 -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 +91 -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 +111 -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 +250 -0
- package/dist/src/lib/transactionBuilder.d.ts +210 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +389 -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 +254 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +563 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +15 -0
- package/dist/src/seedValidator.d.ts +31 -0
- package/dist/src/seedValidator.d.ts.map +1 -0
- package/dist/src/seedValidator.js +103 -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 +63 -0
- package/types/index.d.ts +60 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.KeyPair = void 0;
|
|
40
|
+
const algosdk_1 = __importStar(require("algosdk"));
|
|
41
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
42
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
43
|
+
class KeyPair extends sdk_core_1.Ed25519KeyPair {
|
|
44
|
+
/**
|
|
45
|
+
* Public constructor. By default, creates a key pair with a random master seed.
|
|
46
|
+
*
|
|
47
|
+
* @param { KeyPairOptions } source Either a master seed, a private key, or a public key
|
|
48
|
+
*/
|
|
49
|
+
constructor(source) {
|
|
50
|
+
super(source);
|
|
51
|
+
}
|
|
52
|
+
/** @inheritdoc */
|
|
53
|
+
recordKeysFromPrivateKeyInProtocolFormat(prv) {
|
|
54
|
+
const decodedSeed = utils_1.default.decodeSeed(prv);
|
|
55
|
+
const bufferFromSeed = Buffer.from(decodedSeed.seed);
|
|
56
|
+
return utils_1.default.keyPairFromSeed(bufferFromSeed).keyPair;
|
|
57
|
+
}
|
|
58
|
+
/** @inheritdoc */
|
|
59
|
+
recordKeysFromPublicKeyInProtocolFormat(pub) {
|
|
60
|
+
const publicKey = algosdk_1.default.decodeAddress(pub).publicKey;
|
|
61
|
+
return { pub: utils_1.default.toHex(publicKey) };
|
|
62
|
+
}
|
|
63
|
+
/** @inheritdoc */
|
|
64
|
+
getAddress() {
|
|
65
|
+
return (0, algosdk_1.encodeAddress)(utils_1.default.toUint8Array(this.keyPair.pub));
|
|
66
|
+
}
|
|
67
|
+
/** @inheritdoc */
|
|
68
|
+
getKeys() {
|
|
69
|
+
// TODO(https://bitgoinc.atlassian.net/browse/STLX-6062): refactor this method
|
|
70
|
+
// should return the pub and prv in the Algorand encoded format
|
|
71
|
+
const result = { pub: this.keyPair.pub };
|
|
72
|
+
if (this.keyPair.prv) {
|
|
73
|
+
result.prv = this.keyPair.prv;
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Getting the base64 private key for signing an algo transaction.
|
|
79
|
+
*
|
|
80
|
+
* @returns {Uint8Array} base64 private key
|
|
81
|
+
* @see https://developer.algorand.org/docs/features/accounts/#transformation-private-key-to-base64-private-key
|
|
82
|
+
*/
|
|
83
|
+
getSigningKey() {
|
|
84
|
+
if (!this.keyPair.prv) {
|
|
85
|
+
throw new sdk_core_1.InvalidKey('Private key undefined');
|
|
86
|
+
}
|
|
87
|
+
return utils_1.default.toUint8Array(this.keyPair.prv + this.keyPair.pub);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.KeyPair = KeyPair;
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBaUQ7QUFDakQsbURBQStGO0FBQy9GLG9EQUE0QjtBQUU1QixNQUFhLE9BQVEsU0FBUSx5QkFBYztJQUN6Qzs7OztPQUlHO0lBQ0gsWUFBWSxNQUF1QjtRQUNqQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQix3Q0FBd0MsQ0FBQyxHQUFXO1FBQ2xELE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsT0FBTyxlQUFLLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN2RCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHVDQUF1QyxDQUFDLEdBQVc7UUFDakQsTUFBTSxTQUFTLEdBQUcsaUJBQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsVUFBVTtRQUNSLE9BQU8sSUFBQSx1QkFBYSxFQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTztRQUNMLDhFQUE4RTtRQUM5RSwrREFBK0Q7UUFDL0QsTUFBTSxNQUFNLEdBQWdCLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFdEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDaEMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUkscUJBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLGVBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRSxDQUFDO0NBQ0Y7QUF0REQsMEJBc0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsZ29zZGssIHsgZW5jb2RlQWRkcmVzcyB9IGZyb20gJ2FsZ29zZGsnO1xuaW1wb3J0IHsgRWQyNTUxOUtleVBhaXIsIERlZmF1bHRLZXlzLCBLZXlQYWlyT3B0aW9ucywgSW52YWxpZEtleSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEtleVBhaXIgZXh0ZW5kcyBFZDI1NTE5S2V5UGFpciB7XG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuIEJ5IGRlZmF1bHQsIGNyZWF0ZXMgYSBrZXkgcGFpciB3aXRoIGEgcmFuZG9tIG1hc3RlciBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0geyBLZXlQYWlyT3B0aW9ucyB9IHNvdXJjZSBFaXRoZXIgYSBtYXN0ZXIgc2VlZCwgYSBwcml2YXRlIGtleSwgb3IgYSBwdWJsaWMga2V5XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U/OiBLZXlQYWlyT3B0aW9ucykge1xuICAgIHN1cGVyKHNvdXJjZSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5SW5Qcm90b2NvbEZvcm1hdChwcnY6IHN0cmluZyk6IERlZmF1bHRLZXlzIHtcbiAgICBjb25zdCBkZWNvZGVkU2VlZCA9IHV0aWxzLmRlY29kZVNlZWQocHJ2KTtcbiAgICBjb25zdCBidWZmZXJGcm9tU2VlZCA9IEJ1ZmZlci5mcm9tKGRlY29kZWRTZWVkLnNlZWQpO1xuXG4gICAgcmV0dXJuIHV0aWxzLmtleVBhaXJGcm9tU2VlZChidWZmZXJGcm9tU2VlZCkua2V5UGFpcjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICByZWNvcmRLZXlzRnJvbVB1YmxpY0tleUluUHJvdG9jb2xGb3JtYXQocHViOiBzdHJpbmcpOiBEZWZhdWx0S2V5cyB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gYWxnb3Nkay5kZWNvZGVBZGRyZXNzKHB1YikucHVibGljS2V5O1xuICAgIHJldHVybiB7IHB1YjogdXRpbHMudG9IZXgocHVibGljS2V5KSB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZW5jb2RlQWRkcmVzcyh1dGlscy50b1VpbnQ4QXJyYXkodGhpcy5rZXlQYWlyLnB1YikpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldEtleXMoKTogRGVmYXVsdEtleXMge1xuICAgIC8vIFRPRE8oaHR0cHM6Ly9iaXRnb2luYy5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9TVExYLTYwNjIpOiByZWZhY3RvciB0aGlzIG1ldGhvZFxuICAgIC8vIHNob3VsZCByZXR1cm4gdGhlIHB1YiBhbmQgcHJ2IGluIHRoZSBBbGdvcmFuZCBlbmNvZGVkIGZvcm1hdFxuICAgIGNvbnN0IHJlc3VsdDogRGVmYXVsdEtleXMgPSB7IHB1YjogdGhpcy5rZXlQYWlyLnB1YiB9O1xuXG4gICAgaWYgKHRoaXMua2V5UGFpci5wcnYpIHtcbiAgICAgIHJlc3VsdC5wcnYgPSB0aGlzLmtleVBhaXIucHJ2O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGluZyB0aGUgYmFzZTY0IHByaXZhdGUga2V5IGZvciBzaWduaW5nIGFuIGFsZ28gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBiYXNlNjQgcHJpdmF0ZSBrZXlcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9mZWF0dXJlcy9hY2NvdW50cy8jdHJhbnNmb3JtYXRpb24tcHJpdmF0ZS1rZXktdG8tYmFzZTY0LXByaXZhdGUta2V5XG4gICAqL1xuICBnZXRTaWduaW5nS2V5KCk6IFVpbnQ4QXJyYXkge1xuICAgIGlmICghdGhpcy5rZXlQYWlyLnBydikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRLZXkoJ1ByaXZhdGUga2V5IHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdXRpbHMudG9VaW50OEFycmF5KHRoaXMua2V5UGFpci5wcnYgKyB0aGlzLmtleVBhaXIucHViKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import algosdk from 'algosdk';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
4
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
5
|
+
import { Transaction } from './transaction';
|
|
6
|
+
export declare class KeyRegistrationBuilder extends TransactionBuilder {
|
|
7
|
+
protected _voteKey: string;
|
|
8
|
+
protected _selectionKey: string;
|
|
9
|
+
protected _voteFirst: number;
|
|
10
|
+
protected _voteLast: number;
|
|
11
|
+
protected _voteKeyDilution: number;
|
|
12
|
+
protected _nonParticipation: boolean;
|
|
13
|
+
protected _stateProofKey: string;
|
|
14
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
15
|
+
/**
|
|
16
|
+
* Sets the vote key
|
|
17
|
+
*
|
|
18
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
19
|
+
*
|
|
20
|
+
* @param {string} key The root participation public key. See Generate a Participation Key to learn more.
|
|
21
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
22
|
+
*/
|
|
23
|
+
voteKey(key: string): KeyRegistrationBuilder;
|
|
24
|
+
/**
|
|
25
|
+
* Sets the selection key
|
|
26
|
+
*
|
|
27
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
28
|
+
*
|
|
29
|
+
* @param {string} key The VRF public key for the account.
|
|
30
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
31
|
+
*/
|
|
32
|
+
selectionKey(key: string): KeyRegistrationBuilder;
|
|
33
|
+
/**
|
|
34
|
+
* Sets the stateProof key
|
|
35
|
+
*
|
|
36
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} key The stateproof key. See consensus for more information.
|
|
39
|
+
* https://developer.algorand.org/docs/get-details/algorand_consensus/?from_query=state#state-proof-keys
|
|
40
|
+
*/
|
|
41
|
+
stateProofKey(key: string): KeyRegistrationBuilder;
|
|
42
|
+
/**
|
|
43
|
+
*Sets the vote first round
|
|
44
|
+
*
|
|
45
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
46
|
+
*
|
|
47
|
+
* @param {number} round The first round that the participation key is valid. Not to be confused with the FirstValid round of the keyreg transaction.
|
|
48
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
49
|
+
*/
|
|
50
|
+
voteFirst(round: number): KeyRegistrationBuilder;
|
|
51
|
+
/**
|
|
52
|
+
* Sets the vote last round
|
|
53
|
+
*
|
|
54
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
55
|
+
*
|
|
56
|
+
* A recommended range is 3,000,000 rounds.
|
|
57
|
+
*
|
|
58
|
+
* @param {number} round No theoretical limit.
|
|
59
|
+
* https://developer.algorand.org/docs/run-a-node/participate/generate_keys/
|
|
60
|
+
*/
|
|
61
|
+
voteLast(round: number): KeyRegistrationBuilder;
|
|
62
|
+
/**
|
|
63
|
+
* Sets the vote key dilution
|
|
64
|
+
*
|
|
65
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
66
|
+
*
|
|
67
|
+
* Defaults to 10,000
|
|
68
|
+
*
|
|
69
|
+
* @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.
|
|
70
|
+
* https://developer.algorand.org/docs/run-a-node/participate/generate_keys/#generate-the-participation-key-with-goal
|
|
71
|
+
* @param size
|
|
72
|
+
*/
|
|
73
|
+
voteKeyDilution(size?: number): KeyRegistrationBuilder;
|
|
74
|
+
/**
|
|
75
|
+
* Sets the non participation flag
|
|
76
|
+
*
|
|
77
|
+
* @returns {KeyRegistrationBuilder} This Key Registration builder.
|
|
78
|
+
*
|
|
79
|
+
* @param {boolean} nonParticipation All new Algorand accounts are participating by default.
|
|
80
|
+
* This means that they earn rewards. Mark an account nonparticipating by setting this value to true and this account
|
|
81
|
+
* will no longer earn rewards NEVER.
|
|
82
|
+
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
|
|
83
|
+
*/
|
|
84
|
+
nonParticipation(nonParticipation: boolean): KeyRegistrationBuilder;
|
|
85
|
+
protected buildAlgoTxn(): algosdk.Transaction;
|
|
86
|
+
private buildOfflineKeyRegTransaction;
|
|
87
|
+
private buildOnlineKeyRegTransaction;
|
|
88
|
+
private buildNonParticipationKeyRegTransaction;
|
|
89
|
+
protected get transactionType(): TransactionType;
|
|
90
|
+
/** @inheritdoc */
|
|
91
|
+
protected fromImplementation(rawTransaction: Uint8Array | string): Transaction;
|
|
92
|
+
/** @inheritdoc */
|
|
93
|
+
validateRawTransaction(rawTransaction: Uint8Array | string): void;
|
|
94
|
+
private isNonParticipationKeyRegAlgoSDKTransaction;
|
|
95
|
+
private isNonParticipationKeyRegAccountLibTransaction;
|
|
96
|
+
private isOnlineKeyRegAlgoSDKTransaction;
|
|
97
|
+
private isOnlineKeyRegAccountLibTransaction;
|
|
98
|
+
private isOfflineKeyRegAlgoSDKTransaction;
|
|
99
|
+
private isOfflineKeyRegAccountLibTransaction;
|
|
100
|
+
/** @inheritdoc */
|
|
101
|
+
validateTransaction(transaction: Transaction): void;
|
|
102
|
+
private validateFields;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=keyRegistrationBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyRegistrationBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/keyRegistrationBuilder.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAA2B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC5D,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;gBAErB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI5C;;;;;;;OAOG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB;IAK5C;;;;;;;OAOG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB;IAKjD;;;;;;;OAOG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB;IAMlD;;;;;;;OAOG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB;IAOhD;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB;IAO/C;;;;;;;;;;OAUG;IACH,eAAe,CAAC,IAAI,SAAQ,GAAG,sBAAsB;IAOrD;;;;;;;;;OASG;IACH,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,GAAG,sBAAsB;IAMnE,SAAS,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW;IAQ7C,OAAO,CAAC,6BAA6B;IAarC,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,sCAAsC;IAe9C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,GAAG,WAAW;IAqB9E,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAqBjE,OAAO,CAAC,0CAA0C;IAIlD,OAAO,CAAC,6CAA6C;IAIrD,OAAO,CAAC,gCAAgC;IAMxC,OAAO,CAAC,mCAAmC;IAI3C,OAAO,CAAC,iCAAiC;IAYzC,OAAO,CAAC,oCAAoC;IAY5C,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IA6BnD,OAAO,CAAC,cAAc;CAqBvB"}
|
|
@@ -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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UTtZQUNSLGVBQWU7WUFDZixhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQUMsa0NBQWtDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4VEQsd0RBd1RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIEludmFsaWRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEtleVJlZ1R4blNjaGVtYSB9IGZyb20gJy4vdHhuU2NoZW1hJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX3ZvdGVLZXk6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zZWxlY3Rpb25LZXk6IHN0cmluZztcbiAgcHJvdGVjdGVkIF92b3RlRmlyc3Q6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF92b3RlTGFzdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3ZvdGVLZXlEaWx1dGlvbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX25vblBhcnRpY2lwYXRpb246IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfc3RhdGVQcm9vZktleTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdm90ZSBrZXlcbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByb290IHBhcnRpY2lwYXRpb24gcHVibGljIGtleS4gU2VlIEdlbmVyYXRlIGEgUGFydGljaXBhdGlvbiBLZXkgdG8gbGVhcm4gbW9yZS5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcmVmZXJlbmNlL3RyYW5zYWN0aW9ucy8ja2V5LXJlZ2lzdHJhdGlvbi10cmFuc2FjdGlvblxuICAgKi9cbiAgdm90ZUtleShrZXk6IHN0cmluZyk6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuX3ZvdGVLZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc2VsZWN0aW9uIGtleVxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIFZSRiBwdWJsaWMga2V5IGZvciB0aGUgYWNjb3VudC5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcmVmZXJlbmNlL3RyYW5zYWN0aW9ucy8ja2V5LXJlZ2lzdHJhdGlvbi10cmFuc2FjdGlvblxuICAgKi9cbiAgc2VsZWN0aW9uS2V5KGtleTogc3RyaW5nKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy5fc2VsZWN0aW9uS2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0YXRlUHJvb2Yga2V5XG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgc3RhdGVwcm9vZiBrZXkuIFNlZSBjb25zZW5zdXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL2dldC1kZXRhaWxzL2FsZ29yYW5kX2NvbnNlbnN1cy8/ZnJvbV9xdWVyeT1zdGF0ZSNzdGF0ZS1wcm9vZi1rZXlzXG4gICAqL1xuICBzdGF0ZVByb29mS2V5KGtleTogc3RyaW5nKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgVXRpbHMudmFsaWRhdGVCYXNlNjQoa2V5KTtcbiAgICB0aGlzLl9zdGF0ZVByb29mS2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqU2V0cyB0aGUgdm90ZSBmaXJzdCByb3VuZFxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByb3VuZCBUaGUgZmlyc3Qgcm91bmQgdGhhdCB0aGUgcGFydGljaXBhdGlvbiBrZXkgaXMgdmFsaWQuIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZSBGaXJzdFZhbGlkIHJvdW5kIG9mIHRoZSBrZXlyZWcgdHJhbnNhY3Rpb24uXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3JlZmVyZW5jZS90cmFuc2FjdGlvbnMvI2tleS1yZWdpc3RyYXRpb24tdHJhbnNhY3Rpb25cbiAgICovXG4gIHZvdGVGaXJzdChyb3VuZDogbnVtYmVyKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIocm91bmQpKTtcbiAgICB0aGlzLl92b3RlRmlyc3QgPSByb3VuZDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZvdGUgbGFzdCByb3VuZFxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEEgcmVjb21tZW5kZWQgcmFuZ2UgaXMgMywwMDAsMDAwIHJvdW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJvdW5kIE5vIHRoZW9yZXRpY2FsIGxpbWl0LlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9ydW4tYS1ub2RlL3BhcnRpY2lwYXRlL2dlbmVyYXRlX2tleXMvXG4gICAqL1xuICB2b3RlTGFzdChyb3VuZDogbnVtYmVyKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIocm91bmQpKTtcbiAgICB0aGlzLl92b3RlTGFzdCA9IHJvdW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdm90ZSBrZXkgZGlsdXRpb25cbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byAxMCwwMDBcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgWzEwMDAwXS4gVG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBwYXJ0aWNpcGF0aW9uIGtleSwgc2V0IHRoZSBrZXkgZGlsdXRpb24gdmFsdWUgdG8gcm91Z2hseSB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHJhbmdlIHRoYXQgdGhlIHBhcnRrZXkgaXMgdmFsaWQgZm9yLlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9ydW4tYS1ub2RlL3BhcnRpY2lwYXRlL2dlbmVyYXRlX2tleXMvI2dlbmVyYXRlLXRoZS1wYXJ0aWNpcGF0aW9uLWtleS13aXRoLWdvYWxcbiAgICogQHBhcmFtIHNpemVcbiAgICovXG4gIHZvdGVLZXlEaWx1dGlvbihzaXplID0gMTAwMDApOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihzaXplKSk7XG4gICAgdGhpcy5fdm90ZUtleURpbHV0aW9uID0gc2l6ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5vbiBwYXJ0aWNpcGF0aW9uIGZsYWdcbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5vblBhcnRpY2lwYXRpb24gQWxsIG5ldyBBbGdvcmFuZCBhY2NvdW50cyBhcmUgcGFydGljaXBhdGluZyBieSBkZWZhdWx0LlxuICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhleSBlYXJuIHJld2FyZHMuIE1hcmsgYW4gYWNjb3VudCBub25wYXJ0aWNpcGF0aW5nIGJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnVlIGFuZCB0aGlzIGFjY291bnRcbiAgICogd2lsbCBubyBsb25nZXIgZWFybiByZXdhcmRzIE5FVkVSLlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyNrZXktcmVnaXN0cmF0aW9uLXRyYW5zYWN0aW9uXG4gICAqL1xuICBub25QYXJ0aWNpcGF0aW9uKG5vblBhcnRpY2lwYXRpb246IGJvb2xlYW4pOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLl9ub25QYXJ0aWNpcGF0aW9uID0gbm9uUGFydGljaXBhdGlvbjtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkQWxnb1R4bigpOiBhbGdvc2RrLlRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5pc09mZmxpbmVLZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKVxuICAgICAgPyB0aGlzLmJ1aWxkT2ZmbGluZUtleVJlZ1RyYW5zYWN0aW9uKClcbiAgICAgIDogdGhpcy5pc05vblBhcnRpY2lwYXRpb25LZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKVxuICAgICAgPyB0aGlzLmJ1aWxkTm9uUGFydGljaXBhdGlvbktleVJlZ1RyYW5zYWN0aW9uKClcbiAgICAgIDogdGhpcy5idWlsZE9ubGluZUtleVJlZ1RyYW5zYWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkT2ZmbGluZUtleVJlZ1RyYW5zYWN0aW9uKCk6IGFsZ29zZGsuVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBhbGdvc2RrLm1ha2VLZXlSZWdpc3RyYXRpb25UeG5XaXRoU3VnZ2VzdGVkUGFyYW1zKFxuICAgICAgdGhpcy5fc2VuZGVyLFxuICAgICAgdGhpcy5fbm90ZSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUtleSBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyBzZWxlY3Rpb25LZXkgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUZpcnN0IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVMYXN0IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVLZXlEaWx1dGlvbiBwYXJhbVxuICAgICAgdGhpcy5zdWdnZXN0ZWRQYXJhbXNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE9ubGluZUtleVJlZ1RyYW5zYWN0aW9uKCk6IGFsZ29zZGsuVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBhbGdvc2RrLm1ha2VLZXlSZWdpc3RyYXRpb25UeG5XaXRoU3VnZ2VzdGVkUGFyYW1zKFxuICAgICAgdGhpcy5fc2VuZGVyLFxuICAgICAgdGhpcy5fbm90ZSxcbiAgICAgIHRoaXMuX3ZvdGVLZXksXG4gICAgICB0aGlzLl9zZWxlY3Rpb25LZXksXG4gICAgICB0aGlzLl92b3RlRmlyc3QsXG4gICAgICB0aGlzLl92b3RlTGFzdCxcbiAgICAgIHRoaXMuX3ZvdGVLZXlEaWx1dGlvbixcbiAgICAgIHRoaXMuc3VnZ2VzdGVkUGFyYW1zLFxuICAgICAgdW5kZWZpbmVkLCAvLyByZUtleVRvIHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIG5vblBhcnRpY2lwYXRpb24gcGFyYW1cbiAgICAgIHRoaXMuX3N0YXRlUHJvb2ZLZXlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE5vblBhcnRpY2lwYXRpb25LZXlSZWdUcmFuc2FjdGlvbigpOiBhbGdvc2RrLlRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gYWxnb3Nkay5tYWtlS2V5UmVnaXN0cmF0aW9uVHhuV2l0aFN1Z2dlc3RlZFBhcmFtcyhcbiAgICAgIHRoaXMuX3NlbmRlcixcbiAgICAgIHRoaXMuX25vdGUsXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVLZXkgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gc2VsZWN0aW9uS2V5IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVGaXJzdCBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlTGFzdCBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlS2V5RGlsdXRpb24gcGFyYW1cbiAgICAgIHRoaXMuc3VnZ2VzdGVkUGFyYW1zLFxuICAgICAgdGhpcy5fcmVLZXlUbyxcbiAgICAgIHRydWUgLy8gbm9uUGFydGljaXBhdGlvbiBwYXJhbVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogVWludDhBcnJheSB8IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCB0eCA9IHN1cGVyLmZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgY29uc3QgYWxnb1R4biA9IHR4LmdldEFsZ29UcmFuc2FjdGlvbigpO1xuXG4gICAgaWYgKGFsZ29UeG4pIHtcbiAgICAgIGlmICh0aGlzLmlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuKSkge1xuICAgICAgICB0aGlzLm5vblBhcnRpY2lwYXRpb24oISFhbGdvVHhuLm5vblBhcnRpY2lwYXRpb24pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzT25saW5lS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG4pKSB7XG4gICAgICAgIHRoaXMudm90ZUtleShhbGdvVHhuLnZvdGVLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25LZXkoYWxnb1R4bi5zZWxlY3Rpb25LZXkudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgdGhpcy52b3RlRmlyc3QoYWxnb1R4bi52b3RlRmlyc3QpO1xuICAgICAgICB0aGlzLnZvdGVMYXN0KGFsZ29UeG4udm90ZUxhc3QpO1xuICAgICAgICB0aGlzLnZvdGVLZXlEaWx1dGlvbihhbGdvVHhuLnZvdGVLZXlEaWx1dGlvbik7XG4gICAgICAgIGlmIChhbGdvVHhuLnN0YXRlUHJvb2ZLZXkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlUHJvb2ZLZXkoYWxnb1R4bi5zdGF0ZVByb29mS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IFVpbnQ4QXJyYXkgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkZWNvZGVUeG4gPSBVdGlscy5kZWNvZGVBbGdvVHhuKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBhbGdvVHhuID0gZGVjb2RlVHhuLnR4bjtcbiAgICBpZiAoYWxnb1R4bi50eXBlICE9PSBhbGdvc2RrLlRyYW5zYWN0aW9uVHlwZS5rZXlyZWcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogJHthbGdvVHhuLnR5cGV9LiBFeHBlY3RlZCAke2FsZ29zZGsuVHJhbnNhY3Rpb25UeXBlLmtleXJlZ31gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzT25saW5lS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG4pKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRmllbGRzKFxuICAgICAgICBhbGdvVHhuLnZvdGVLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICBhbGdvVHhuLnNlbGVjdGlvbktleS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgIGFsZ29UeG4udm90ZUZpcnN0LFxuICAgICAgICBhbGdvVHhuLnZvdGVMYXN0LFxuICAgICAgICBhbGdvVHhuLnZvdGVLZXlEaWx1dGlvbixcbiAgICAgICAgYWxnb1R4bi5zdGF0ZVByb29mS2V5ICYmIGFsZ29UeG4uc3RhdGVQcm9vZktleS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc05vblBhcnRpY2lwYXRpb25LZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bjogYWxnb3Nkay5UcmFuc2FjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWFsZ29UeG4ubm9uUGFydGljaXBhdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX25vblBhcnRpY2lwYXRpb247XG4gIH1cblxuICBwcml2YXRlIGlzT25saW5lS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG46IGFsZ29zZGsuVHJhbnNhY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShcbiAgICAgIHRoaXMuaXNPZmZsaW5lS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG4pIHx8IHRoaXMuaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG4pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPbmxpbmVLZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEodGhpcy5pc09mZmxpbmVLZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKSB8fCB0aGlzLmlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPZmZsaW5lS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG46IGFsZ29zZGsuVHJhbnNhY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIWFsZ29UeG4udm90ZUtleSAmJlxuICAgICAgIWFsZ29UeG4uc2VsZWN0aW9uS2V5ICYmXG4gICAgICAhYWxnb1R4bi52b3RlRmlyc3QgJiZcbiAgICAgICFhbGdvVHhuLnZvdGVMYXN0ICYmXG4gICAgICAhYWxnb1R4bi52b3RlS2V5RGlsdXRpb24gJiZcbiAgICAgICFhbGdvVHhuLnN0YXRlUHJvb2ZLZXkgJiZcbiAgICAgICFhbGdvVHhuLm5vblBhcnRpY2lwYXRpb25cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09mZmxpbmVLZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLl92b3RlS2V5ICYmXG4gICAgICAhdGhpcy5fc2VsZWN0aW9uS2V5ICYmXG4gICAgICAhdGhpcy5fdm90ZUZpcnN0ICYmXG4gICAgICAhdGhpcy5fdm90ZUxhc3QgJiZcbiAgICAgICF0aGlzLl92b3RlS2V5RGlsdXRpb24gJiZcbiAgICAgICF0aGlzLl9zdGF0ZVByb29mS2V5ICYmXG4gICAgICAhdGhpcy5fbm9uUGFydGljaXBhdGlvblxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKTtcbiAgICBpZiAodGhpcy5pc09ubGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpKSB7XG4gICAgICAvLyBpbnZhbGlkIG9mZmxpbmUgd2lsbCByZWFjaCBoZXJlXG4gICAgICB0aGlzLnZhbGlkYXRlRmllbGRzKFxuICAgICAgICB0aGlzLl92b3RlS2V5LFxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25LZXksXG4gICAgICAgIHRoaXMuX3ZvdGVGaXJzdCxcbiAgICAgICAgdGhpcy5fdm90ZUxhc3QsXG4gICAgICAgIHRoaXMuX3ZvdGVLZXlEaWx1dGlvbixcbiAgICAgICAgdGhpcy5fc3RhdGVQcm9vZktleVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb2ZmbGluZSBvciBub25wYXJ0aWNpcGF0aW9uIHRyYW5zYWN0aW9uXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX3ZvdGVLZXkgfHxcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uS2V5IHx8XG4gICAgICAgIHRoaXMuX3ZvdGVGaXJzdCB8fFxuICAgICAgICB0aGlzLl92b3RlTGFzdCB8fFxuICAgICAgICB0aGlzLl92b3RlS2V5RGlsdXRpb24gfHxcbiAgICAgICAgdGhpcy5fc3RhdGVQcm9vZktleVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAnVm90ZUtleSwgU2VsZWN0aW9uS2V5LCBWb3RlRmlyc3QsIFZvdGVMYXN0LCBWb3RlS2V5RGlsdXRpb24sIFN0YXRlUHJvb2ZLZXkgZmllbGRzIGNhbm5vdCBiZSBzZXQgd2hlbiBvZmZsaW5lIG9yIG5vbnBhcnRpY2lwYXRpb24gaXMgc2V0J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVGaWVsZHMoXG4gICAgdm90ZUtleTogc3RyaW5nLFxuICAgIHNlbGVjdGlvbktleTogc3RyaW5nLFxuICAgIHZvdGVGaXJzdDogbnVtYmVyLFxuICAgIHZvdGVMYXN0OiBudW1iZXIsXG4gICAgdm90ZUtleURpbHV0aW9uOiBudW1iZXIsXG4gICAgc3RhdGVQcm9vZktleT86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gS2V5UmVnVHhuU2NoZW1hLnZhbGlkYXRlKHtcbiAgICAgIHZvdGVLZXksXG4gICAgICBzZWxlY3Rpb25LZXksXG4gICAgICB2b3RlRmlyc3QsXG4gICAgICB2b3RlTGFzdCxcbiAgICAgIHZvdGVLZXlEaWx1dGlvbixcbiAgICAgIHN0YXRlUHJvb2ZLZXksXG4gICAgfSk7XG5cbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -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,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SeedEncoding = void 0;
|
|
40
|
+
const base32 = __importStar(require("hi-base32"));
|
|
41
|
+
const js_sha512_1 = __importDefault(require("js-sha512"));
|
|
42
|
+
const SEED_BYTES_LENGTH = 32;
|
|
43
|
+
const ALGORAND_SEED_BYTE_LENGTH = 36;
|
|
44
|
+
const ALGORAND_CHECKSUM_BYTE_LENGTH = 4;
|
|
45
|
+
const ALGORAND_SEED_LENGTH = 58;
|
|
46
|
+
class SeedEncoding {
|
|
47
|
+
static genericHash(arr) {
|
|
48
|
+
return js_sha512_1.default.sha512_256.array(arr);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Checks if a seed is valid
|
|
52
|
+
* @param {String} seed - encoded Algorand seed
|
|
53
|
+
* @returns {Boolean} true if valid, false otherwise
|
|
54
|
+
*/
|
|
55
|
+
static isValidSeed(seed) {
|
|
56
|
+
if (seed.length !== ALGORAND_SEED_LENGTH) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Try to decode
|
|
60
|
+
let decoded;
|
|
61
|
+
try {
|
|
62
|
+
decoded = SeedEncoding.decode(seed);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
// Compute checksum
|
|
68
|
+
const checksum = SeedEncoding.genericHash(decoded.seed).slice(SEED_BYTES_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH, SEED_BYTES_LENGTH);
|
|
69
|
+
// Check if the checksum and the seed are equal
|
|
70
|
+
if (checksum.length !== decoded.checksum.length) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return checksum.every((val, i) => val === decoded.checksum[i]);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Decode a seed
|
|
77
|
+
*
|
|
78
|
+
* @param seed
|
|
79
|
+
* @return {{checksum: Uint8Array, seed: Uint8Array}}
|
|
80
|
+
*/
|
|
81
|
+
static decode(seed) {
|
|
82
|
+
// try to decode
|
|
83
|
+
const decoded = base32.decode.asBytes(seed);
|
|
84
|
+
// Sanity check
|
|
85
|
+
if (decoded.length !== ALGORAND_SEED_BYTE_LENGTH)
|
|
86
|
+
throw new Error('seed seems to be malformed');
|
|
87
|
+
return {
|
|
88
|
+
seed: new Uint8Array(decoded.slice(0, ALGORAND_SEED_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH)),
|
|
89
|
+
checksum: new Uint8Array(decoded.slice(SEED_BYTES_LENGTH, ALGORAND_SEED_BYTE_LENGTH)),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Encode a secret key into a seed
|
|
94
|
+
*
|
|
95
|
+
* @param secretKey
|
|
96
|
+
* @return {String} encoded seed
|
|
97
|
+
*/
|
|
98
|
+
static encode(secretKey) {
|
|
99
|
+
// get seed
|
|
100
|
+
const seed = secretKey.slice(0, SEED_BYTES_LENGTH);
|
|
101
|
+
// compute checksum
|
|
102
|
+
const checksum = SeedEncoding.genericHash(seed).slice(SEED_BYTES_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH, SEED_BYTES_LENGTH);
|
|
103
|
+
const arraySeed = new Uint8Array(seed.length + checksum.length);
|
|
104
|
+
arraySeed.set(seed);
|
|
105
|
+
arraySeed.set(checksum, seed.length);
|
|
106
|
+
const encodedSeed = base32.encode(arraySeed);
|
|
107
|
+
return encodedSeed.toString().slice(0, ALGORAND_SEED_LENGTH); // removing the extra '===='
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.SeedEncoding = SeedEncoding;
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VlZEVuY29kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zZWVkRW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQW9DO0FBQ3BDLDBEQUErQjtBQUcvQixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztBQUNyQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsQ0FBQztBQUN4QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUVoQyxNQUFhLFlBQVk7SUFDZixNQUFNLENBQUMsV0FBVyxDQUFDLEdBQWU7UUFDeEMsT0FBTyxtQkFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQVk7UUFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLG9CQUFvQixFQUFFLENBQUM7WUFDekMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksT0FBYSxDQUFDO1FBQ2xCLElBQUksQ0FBQztZQUNILE9BQU8sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FDM0QsaUJBQWlCLEdBQUcsNkJBQTZCLEVBQ2pELGlCQUFpQixDQUNsQixDQUFDO1FBRUYsK0NBQStDO1FBQy9DLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQ3hCLGdCQUFnQjtRQUNoQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QyxlQUFlO1FBQ2YsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLHlCQUF5QjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUVoRyxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixHQUFHLDZCQUE2QixDQUFDLENBQUM7WUFDakcsUUFBUSxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUseUJBQXlCLENBQUMsQ0FBQztTQUN0RixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFxQjtRQUNqQyxXQUFXO1FBQ1gsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNuRCxtQkFBbUI7UUFDbkIsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQ25ELGlCQUFpQixHQUFHLDZCQUE2QixFQUNqRCxpQkFBaUIsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0MsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0lBQzVGLENBQUM7Q0FDRjtBQTVFRCxvQ0E0RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlMzIgZnJvbSAnaGktYmFzZTMyJztcbmltcG9ydCBzaGE1MTIgZnJvbSAnanMtc2hhNTEyJztcbmltcG9ydCB7IFNlZWQgfSBmcm9tICcuL2lmYWNlcyc7XG5cbmNvbnN0IFNFRURfQllURVNfTEVOR1RIID0gMzI7XG5jb25zdCBBTEdPUkFORF9TRUVEX0JZVEVfTEVOR1RIID0gMzY7XG5jb25zdCBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCA9IDQ7XG5jb25zdCBBTEdPUkFORF9TRUVEX0xFTkdUSCA9IDU4O1xuXG5leHBvcnQgY2xhc3MgU2VlZEVuY29kaW5nIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJpY0hhc2goYXJyOiBVaW50OEFycmF5KTogbnVtYmVyW10ge1xuICAgIHJldHVybiBzaGE1MTIuc2hhNTEyXzI1Ni5hcnJheShhcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHNlZWQgaXMgdmFsaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNlZWQgLSBlbmNvZGVkIEFsZ29yYW5kIHNlZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTZWVkKHNlZWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWVkLmxlbmd0aCAhPT0gQUxHT1JBTkRfU0VFRF9MRU5HVEgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZGVjb2RlXG4gICAgbGV0IGRlY29kZWQ6IFNlZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGRlY29kZWQgPSBTZWVkRW5jb2RpbmcuZGVjb2RlKHNlZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGNoZWNrc3VtXG4gICAgY29uc3QgY2hlY2tzdW0gPSBTZWVkRW5jb2RpbmcuZ2VuZXJpY0hhc2goZGVjb2RlZC5zZWVkKS5zbGljZShcbiAgICAgIFNFRURfQllURVNfTEVOR1RIIC0gQUxHT1JBTkRfQ0hFQ0tTVU1fQllURV9MRU5HVEgsXG4gICAgICBTRUVEX0JZVEVTX0xFTkdUSFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2hlY2tzdW0gYW5kIHRoZSBzZWVkIGFyZSBlcXVhbFxuICAgIGlmIChjaGVja3N1bS5sZW5ndGggIT09IGRlY29kZWQuY2hlY2tzdW0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBjaGVja3N1bS5ldmVyeSgodmFsLCBpKSA9PiB2YWwgPT09IGRlY29kZWQuY2hlY2tzdW1baV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHNlZWRcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybiB7e2NoZWNrc3VtOiBVaW50OEFycmF5LCBzZWVkOiBVaW50OEFycmF5fX1cbiAgICovXG4gIHN0YXRpYyBkZWNvZGUoc2VlZDogc3RyaW5nKTogU2VlZCB7XG4gICAgLy8gdHJ5IHRvIGRlY29kZVxuICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlMzIuZGVjb2RlLmFzQnl0ZXMoc2VlZCk7XG5cbiAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICBpZiAoZGVjb2RlZC5sZW5ndGggIT09IEFMR09SQU5EX1NFRURfQllURV9MRU5HVEgpIHRocm93IG5ldyBFcnJvcignc2VlZCBzZWVtcyB0byBiZSBtYWxmb3JtZWQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZWVkOiBuZXcgVWludDhBcnJheShkZWNvZGVkLnNsaWNlKDAsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCkpLFxuICAgICAgY2hlY2tzdW06IG5ldyBVaW50OEFycmF5KGRlY29kZWQuc2xpY2UoU0VFRF9CWVRFU19MRU5HVEgsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEgpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhIHNlY3JldCBrZXkgaW50byBhIHNlZWRcbiAgICpcbiAgICogQHBhcmFtIHNlY3JldEtleVxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGVuY29kZWQgc2VlZFxuICAgKi9cbiAgc3RhdGljIGVuY29kZShzZWNyZXRLZXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIC8vIGdldCBzZWVkXG4gICAgY29uc3Qgc2VlZCA9IHNlY3JldEtleS5zbGljZSgwLCBTRUVEX0JZVEVTX0xFTkdUSCk7XG4gICAgLy8gY29tcHV0ZSBjaGVja3N1bVxuICAgIGNvbnN0IGNoZWNrc3VtID0gU2VlZEVuY29kaW5nLmdlbmVyaWNIYXNoKHNlZWQpLnNsaWNlKFxuICAgICAgU0VFRF9CWVRFU19MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCxcbiAgICAgIFNFRURfQllURVNfTEVOR1RIXG4gICAgKTtcbiAgICBjb25zdCBhcnJheVNlZWQgPSBuZXcgVWludDhBcnJheShzZWVkLmxlbmd0aCArIGNoZWNrc3VtLmxlbmd0aCk7XG4gICAgYXJyYXlTZWVkLnNldChzZWVkKTtcbiAgICBhcnJheVNlZWQuc2V0KGNoZWNrc3VtLCBzZWVkLmxlbmd0aCk7XG4gICAgY29uc3QgZW5jb2RlZFNlZWQgPSBiYXNlMzIuZW5jb2RlKGFycmF5U2VlZCk7XG5cbiAgICByZXR1cm4gZW5jb2RlZFNlZWQudG9TdHJpbmcoKS5zbGljZSgwLCBBTEdPUkFORF9TRUVEX0xFTkdUSCk7IC8vIHJlbW92aW5nIHRoZSBleHRyYSAnPT09PSdcbiAgfVxufVxuIl19
|