@bitgo-beta/sdk-coin-avaxp 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/.eslintrc.json +7 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +1091 -0
- package/LICENSE +191 -0
- package/README.md +39 -0
- package/dist/src/avaxp.d.ts +91 -0
- package/dist/src/avaxp.d.ts.map +1 -0
- package/dist/src/avaxp.js +343 -0
- package/dist/src/iface.d.ts +42 -0
- package/dist/src/iface.d.ts.map +1 -0
- package/dist/src/iface.js +3 -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/atomicInCTransactionBuilder.d.ts +21 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/atomicInCTransactionBuilder.js +49 -0
- package/dist/src/lib/atomicTransactionBuilder.d.ts +38 -0
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/atomicTransactionBuilder.js +129 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts +95 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +285 -0
- package/dist/src/lib/deprecatedTransaction.d.ts +98 -0
- package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransaction.js +344 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts +114 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
- package/dist/src/lib/errors.d.ts +8 -0
- package/dist/src/lib/errors.d.ts.map +1 -0
- package/dist/src/lib/errors.js +19 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +55 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/exportInCTxBuilder.js +159 -0
- package/dist/src/lib/exportTxBuilder.d.ts +33 -0
- package/dist/src/lib/exportTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/exportTxBuilder.js +88 -0
- package/dist/src/lib/iface.d.ts +68 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +20 -0
- package/dist/src/lib/importInCTxBuilder.d.ts +44 -0
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInCTxBuilder.js +131 -0
- package/dist/src/lib/importTxBuilder.d.ts +18 -0
- package/dist/src/lib/importTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importTxBuilder.js +67 -0
- package/dist/src/lib/index.d.ts +11 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +37 -0
- package/dist/src/lib/keyPair.d.ts +58 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +150 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +154 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +452 -0
- package/dist/src/lib/transaction.d.ts +78 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +254 -0
- package/dist/src/lib/transactionBuilder.d.ts +71 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +138 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +57 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +178 -0
- package/dist/src/lib/utils.d.ts +184 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +378 -0
- package/dist/src/lib/utxoEngine.d.ts +53 -0
- package/dist/src/lib/utxoEngine.d.ts.map +1 -0
- package/dist/src/lib/utxoEngine.js +112 -0
- package/dist/src/lib/validatorTxBuilder.d.ts +37 -0
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +69 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +11 -0
- package/dist/src/tavaxp.d.ts +9 -0
- package/dist/src/tavaxp.d.ts.map +1 -0
- package/dist/src/tavaxp.js +14 -0
- package/dist/test/resources/avaxp.d.ts +259 -0
- package/dist/test/resources/avaxp.d.ts.map +1 -0
- package/dist/test/resources/avaxp.js +1093 -0
- package/dist/test/resources/errors.d.ts +19 -0
- package/dist/test/resources/errors.d.ts.map +1 -0
- package/dist/test/resources/errors.js +22 -0
- package/dist/test/resources/keychains.d.ts +18 -0
- package/dist/test/resources/keychains.d.ts.map +1 -0
- package/dist/test/resources/keychains.js +30 -0
- package/dist/test/resources/tx/exportC.d.ts +14 -0
- package/dist/test/resources/tx/exportC.d.ts.map +1 -0
- package/dist/test/resources/tx/exportC.js +21 -0
- package/dist/test/resources/tx/importC.d.ts +29 -0
- package/dist/test/resources/tx/importC.d.ts.map +1 -0
- package/dist/test/resources/tx/importC.js +42 -0
- package/dist/test/resources/tx/importP.d.ts +29 -0
- package/dist/test/resources/tx/importP.d.ts.map +1 -0
- package/dist/test/resources/tx/importP.js +42 -0
- package/dist/test/unit/avaxp.d.ts +2 -0
- package/dist/test/unit/avaxp.d.ts.map +1 -0
- package/dist/test/unit/avaxp.js +732 -0
- package/dist/test/unit/lib/exportC2PTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportC2PTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportC2PTxBuilder.js +125 -0
- package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportP2CTxBuilder.js +183 -0
- package/dist/test/unit/lib/importC2PTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importC2PTxBuilder.js +99 -0
- package/dist/test/unit/lib/importP2CTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importP2CTxBuilder.js +137 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +186 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +341 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +80 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +179 -0
- package/dist/test/unit/lib/utils.d.ts +2 -0
- package/dist/test/unit/lib/utils.d.ts.map +1 -0
- package/dist/test/unit/lib/utils.js +83 -0
- package/dist/test/unit/lib/utxoEngine.d.ts +2 -0
- package/dist/test/unit/lib/utxoEngine.d.ts.map +1 -0
- package/dist/test/unit/lib/utxoEngine.js +168 -0
- package/dist/test/unit/lib/validateTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/validateTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/validateTxBuilder.js +327 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,178 @@
|
|
|
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.TransactionBuilderFactory = void 0;
|
|
7
|
+
const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
|
|
8
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
9
|
+
const avalanche_1 = require("avalanche");
|
|
10
|
+
const evm_1 = require("avalanche/dist/apis/evm");
|
|
11
|
+
const platformvm_1 = require("avalanche/dist/apis/platformvm");
|
|
12
|
+
const exportInCTxBuilder_1 = require("./exportInCTxBuilder");
|
|
13
|
+
const exportTxBuilder_1 = require("./exportTxBuilder");
|
|
14
|
+
const importInCTxBuilder_1 = require("./importInCTxBuilder");
|
|
15
|
+
const importTxBuilder_1 = require("./importTxBuilder");
|
|
16
|
+
const permissionlessValidatorTxBuilder_1 = require("./permissionlessValidatorTxBuilder");
|
|
17
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
18
|
+
const validatorTxBuilder_1 = require("./validatorTxBuilder");
|
|
19
|
+
class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
|
|
20
|
+
constructor(_coinConfig) {
|
|
21
|
+
super(_coinConfig);
|
|
22
|
+
this.recoverSigner = false;
|
|
23
|
+
}
|
|
24
|
+
/** @inheritdoc */
|
|
25
|
+
from(raw) {
|
|
26
|
+
utils_1.default.validateRawTransaction(raw);
|
|
27
|
+
let txSource = 'PVM';
|
|
28
|
+
let transactionBuilder = undefined;
|
|
29
|
+
let tx;
|
|
30
|
+
const rawNoHex = utils_1.default.removeHexPrefix(raw);
|
|
31
|
+
try {
|
|
32
|
+
tx = new platformvm_1.Tx();
|
|
33
|
+
// could throw an error if a txType doesn't match.
|
|
34
|
+
tx.fromBuffer(avalanche_1.Buffer.from(rawNoHex, 'hex'));
|
|
35
|
+
if (!utils_1.default.isTransactionOf(tx, this._coinConfig.network.blockchainID)) {
|
|
36
|
+
throw new Error('It is not a transaction of this platformvm old flow');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
try {
|
|
41
|
+
txSource = 'EVM';
|
|
42
|
+
tx = new evm_1.Tx();
|
|
43
|
+
tx.fromBuffer(avalanche_1.Buffer.from(rawNoHex, 'hex'));
|
|
44
|
+
if (!utils_1.default.isTransactionOf(tx, this._coinConfig.network.cChainBlockchainID)) {
|
|
45
|
+
throw new Error('It is not a transaction of this network or C chain EVM');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
try {
|
|
50
|
+
txSource = 'PVM';
|
|
51
|
+
// this should be the last because other PVM functions are still being detected in the new SDK
|
|
52
|
+
const manager = avalanchejs_1.utils.getManagerForVM('PVM');
|
|
53
|
+
const [codec, txBytes] = manager.getCodecFromBuffer(avalanchejs_1.utils.hexToBuffer(raw));
|
|
54
|
+
const unpackedTx = codec.UnpackPrefix(txBytes);
|
|
55
|
+
// A signed transaction includes 4 bytes for the number of credentials as an Int type that is not known by the codec
|
|
56
|
+
// We'll skip those 4 bytes, instead we'll loop until we've parsed all credentials
|
|
57
|
+
// @see https://docs.avax.network/reference/avalanchego/p-chain/txn-format#signed-transaction-example
|
|
58
|
+
const credentials = [];
|
|
59
|
+
let credentialBytes = unpackedTx[1].slice(4);
|
|
60
|
+
let moreCredentials = true;
|
|
61
|
+
do {
|
|
62
|
+
try {
|
|
63
|
+
const [credential, rest] = codec.UnpackPrefix(credentialBytes);
|
|
64
|
+
credentials.push(credential);
|
|
65
|
+
credentialBytes = rest;
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
moreCredentials = false;
|
|
69
|
+
}
|
|
70
|
+
} while (credentialBytes.length > 0 && moreCredentials);
|
|
71
|
+
const unpacked = codec.UnpackPrefix(txBytes);
|
|
72
|
+
const permissionlessValidatorTx = unpacked[0];
|
|
73
|
+
const outputs = permissionlessValidatorTx.baseTx.outputs;
|
|
74
|
+
const output = outputs[0].output;
|
|
75
|
+
if (outputs[0].getAssetId() !== this._coinConfig.network.avaxAssetID) {
|
|
76
|
+
throw new Error('The Asset ID of the output does not match the transaction');
|
|
77
|
+
}
|
|
78
|
+
const fromAddresses = output.outputOwners.addrs.map((a) => avalanchejs_1.utils.hexToBuffer(a.toHex()));
|
|
79
|
+
const addressMaps = fromAddresses.map((a) => new avalanchejs_1.utils.AddressMap([[new avalanchejs_1.Address(a), 0]]));
|
|
80
|
+
tx = new avalanchejs_1.UnsignedTx(unpacked[0], [], new avalanchejs_1.utils.AddressMaps(addressMaps), credentials);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
throw new Error(`The transaction type is not recognized as an old PVM or old EVM transaction. Additionally, parsing of the new PVM AddPermissionlessValidatorTx type failed: ${e.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (txSource === 'PVM') {
|
|
88
|
+
if (tx?.tx?._type && permissionlessValidatorTxBuilder_1.PermissionlessValidatorTxBuilder.verifyTxType(tx.tx._type)) {
|
|
89
|
+
transactionBuilder = this.getPermissionlessValidatorTxBuilder();
|
|
90
|
+
transactionBuilder.initBuilder(tx);
|
|
91
|
+
}
|
|
92
|
+
else if (validatorTxBuilder_1.ValidatorTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
93
|
+
transactionBuilder = this.getValidatorBuilder();
|
|
94
|
+
transactionBuilder.initBuilder(tx);
|
|
95
|
+
}
|
|
96
|
+
else if (exportTxBuilder_1.ExportTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
97
|
+
transactionBuilder = this.getExportBuilder();
|
|
98
|
+
transactionBuilder.initBuilder(tx);
|
|
99
|
+
}
|
|
100
|
+
else if (importTxBuilder_1.ImportTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
101
|
+
transactionBuilder = this.getImportBuilder();
|
|
102
|
+
transactionBuilder.initBuilder(tx);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (txSource === 'EVM') {
|
|
106
|
+
if (importInCTxBuilder_1.ImportInCTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
107
|
+
transactionBuilder = this.getImportInCBuilder();
|
|
108
|
+
transactionBuilder.initBuilder(tx);
|
|
109
|
+
}
|
|
110
|
+
else if (exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(tx.getUnsignedTx().getTransaction())) {
|
|
111
|
+
transactionBuilder = this.getExportInCBuilder();
|
|
112
|
+
transactionBuilder.initBuilder(tx);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (transactionBuilder === undefined) {
|
|
116
|
+
throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
|
|
117
|
+
}
|
|
118
|
+
return transactionBuilder;
|
|
119
|
+
}
|
|
120
|
+
/** @inheritdoc */
|
|
121
|
+
getTransferBuilder() {
|
|
122
|
+
throw new sdk_core_1.NotSupported('Transfer is not supported in P Chain');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Initialize Validator builder
|
|
126
|
+
*
|
|
127
|
+
* @returns {ValidatorTxBuilder} the builder initialized
|
|
128
|
+
*/
|
|
129
|
+
getValidatorBuilder() {
|
|
130
|
+
return new validatorTxBuilder_1.ValidatorTxBuilder(this._coinConfig);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Initialize Permissionless Validator builder
|
|
134
|
+
*
|
|
135
|
+
* @returns {PermissionlessValidatorTxBuilder} the builder initialized
|
|
136
|
+
*/
|
|
137
|
+
getPermissionlessValidatorTxBuilder() {
|
|
138
|
+
return new permissionlessValidatorTxBuilder_1.PermissionlessValidatorTxBuilder(this._coinConfig);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Export Cross chain transfer
|
|
142
|
+
*
|
|
143
|
+
* @returns {ExportTxBuilder} the builder initialized
|
|
144
|
+
*/
|
|
145
|
+
getExportBuilder() {
|
|
146
|
+
return new exportTxBuilder_1.ExportTxBuilder(this._coinConfig);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Import Cross chain transfer
|
|
150
|
+
*
|
|
151
|
+
* @returns {ImportTxBuilder} the builder initialized
|
|
152
|
+
*/
|
|
153
|
+
getImportBuilder() {
|
|
154
|
+
return new importTxBuilder_1.ImportTxBuilder(this._coinConfig);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Import in C chain Cross chain transfer
|
|
158
|
+
*
|
|
159
|
+
* @returns {ImportInCTxBuilder} the builder initialized
|
|
160
|
+
*/
|
|
161
|
+
getImportInCBuilder() {
|
|
162
|
+
return new importInCTxBuilder_1.ImportInCTxBuilder(this._coinConfig);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Export in C chain Cross chain transfer
|
|
166
|
+
*
|
|
167
|
+
* @returns {ExportInCTxBuilder} the builder initialized
|
|
168
|
+
*/
|
|
169
|
+
getExportInCBuilder() {
|
|
170
|
+
return new exportInCTxBuilder_1.ExportInCTxBuilder(this._coinConfig);
|
|
171
|
+
}
|
|
172
|
+
/** @inheritdoc */
|
|
173
|
+
getWalletInitializationBuilder() {
|
|
174
|
+
throw new sdk_core_1.NotSupported('Wallet initialization is not needed');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.TransactionBuilderFactory = TransactionBuilderFactory;
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFPa0M7QUFDbEMsbURBQW1GO0FBRW5GLHlDQUFpRDtBQUNqRCxpREFBc0Q7QUFDdEQsK0RBQTZEO0FBRTdELDZEQUEwRDtBQUMxRCx1REFBb0Q7QUFDcEQsNkRBQTBEO0FBQzFELHVEQUFvRDtBQUNwRCx5RkFBc0Y7QUFFdEYsb0RBQTRCO0FBQzVCLDZEQUEwRDtBQUUxRCxNQUFhLHlCQUEwQixTQUFRLHdDQUE2QjtJQUUxRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUZYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBR2hDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxDQUFDLEdBQVc7UUFDZCxlQUFLLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxRQUFRLEdBQWtCLEtBQUssQ0FBQztRQUNwQyxJQUFJLGtCQUFrQixHQUFrRSxTQUFTLENBQUM7UUFDbEcsSUFBSSxFQUE4QixDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLGVBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDO1lBQ0gsRUFBRSxHQUFHLElBQUksZUFBSyxFQUFFLENBQUM7WUFDakIsa0RBQWtEO1lBQ2xELEVBQUUsQ0FBQyxVQUFVLENBQUMsa0JBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFaEQsSUFBSSxDQUFDLGVBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBNEIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUM1RixNQUFNLElBQUks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Q0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1DQUFtQztRQUNqQyxPQUFPLElBQUksbUVBQWdDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLGlDQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLGlDQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSx1Q0FBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLHVDQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLDhCQUE4QjtRQUM1QixNQUFNLElBQUksdUJBQVksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQW5LRCw4REFtS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZGRyZXNzLFxuICB1dGlscyBhcyBBdmF4VXRpbHMsXG4gIENyZWRlbnRpYWwsXG4gIHB2bVNlcmlhbCxcbiAgVHJhbnNmZXJPdXRwdXQsXG4gIFVuc2lnbmVkVHgsXG59IGZyb20gJ0BiaXRnby1mb3Jrcy9hdmFsYW5jaGVqcyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgTm90U3VwcG9ydGVkIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXZhbGFuY2hlTmV0d29yaywgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IHsgVHggYXMgRVZNVHggfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9hcGlzL2V2bSc7XG5pbXBvcnQgeyBUeCBhcyBQVk1UeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvcGxhdGZvcm12bSc7XG5pbXBvcnQgeyBEZXByZWNhdGVkVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9kZXByZWNhdGVkVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IEV4cG9ydEluQ1R4QnVpbGRlciB9IGZyb20gJy4vZXhwb3J0SW5DVHhCdWlsZGVyJztcbmltcG9ydCB7IEV4cG9ydFR4QnVpbGRlciB9IGZyb20gJy4vZXhwb3J0VHhCdWlsZGVyJztcbmltcG9ydCB7IEltcG9ydEluQ1R4QnVpbGRlciB9IGZyb20gJy4vaW1wb3J0SW5DVHhCdWlsZGVyJztcbmltcG9ydCB7IEltcG9ydFR4QnVpbGRlciB9IGZyb20gJy4vaW1wb3J0VHhCdWlsZGVyJztcbmltcG9ydCB7IFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyIH0gZnJvbSAnLi9wZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBWYWxpZGF0b3JUeEJ1aWxkZXIgfSBmcm9tICcuL3ZhbGlkYXRvclR4QnVpbGRlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZnJvbShyYXc6IHN0cmluZyk6IFRyYW5zYWN0aW9uQnVpbGRlciB8IERlcHJlY2F0ZWRUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3KTtcbiAgICBsZXQgdHhTb3VyY2U6ICdFVk0nIHwgJ1BWTScgPSAnUFZNJztcbiAgICBsZXQgdHJhbnNhY3Rpb25CdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIgfCBEZXByZWNhdGVkVHJhbnNhY3Rpb25CdWlsZGVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCB0eDogUFZNVHggfCBFVk1UeCB8IFVuc2lnbmVkVHg7XG4gICAgY29uc3QgcmF3Tm9IZXggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgocmF3KTtcbiAgICB0cnkge1xuICAgICAgdHggPSBuZXcgUFZNVHgoKTtcbiAgICAgIC8vIGNvdWxkIHRocm93IGFuIGVycm9yIGlmIGEgdHhUeXBlIGRvZXNuJ3QgbWF0Y2guXG4gICAgICB0eC5mcm9tQnVmZmVyKEJ1ZmZlckF2YXguZnJvbShyYXdOb0hleCwgJ2hleCcpKTtcblxuICAgICAgaWYgKCF1dGlscy5pc1RyYW5zYWN0aW9uT2YodHgsICh0aGlzLl9jb2luQ29uZmlnLm5ldHdvcmsgYXMgQXZhbGFuY2hlTmV0d29yaykuYmxvY2tjaGFpbklEKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0IGlzIG5vdCBhIHRyYW5zYWN0aW9uIG9mIHRoaXMgcGxhdGZvcm12bSBvbGQgZmxvdycpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHR4U291cmNlID0gJ0VWTSc7XG4gICAgICAgIHR4ID0gbmV3IEVWTVR4KCk7XG4gICAgICAgIHR4LmZyb21CdWZmZXIoQnVmZmVyQXZheC5mcm9tKHJhd05vSGV4LCAnaGV4JykpO1xuXG4gICAgICAgIGlmICghdXRpbHMuaXNUcmFuc2FjdGlvbk9mKHR4LCAodGhpcy5fY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcmspLmNDaGFpbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0IGlzIG5vdCBhIHRyYW5zYWN0aW9uIG9mIHRoaXMgbmV0d29yayBvciBDIGNoYWluIEVWTScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHhTb3VyY2UgPSAnUFZNJztcbiAgICAgICAgICAvLyB0aGlzIHNob3VsZCBiZSB0aGUgbGFzdCBiZWNhdXNlIG90aGVyIFBWTSBmdW5jdGlvbnMgYXJlIHN0aWxsIGJlaW5nIGRldGVjdGVkIGluIHRoZSBuZXcgU0RLXG4gICAgICAgICAgY29uc3QgbWFuYWdlciA9IEF2YXhVdGlscy5nZXRNYW5hZ2VyRm9yVk0oJ1BWTScpO1xuICAgICAgICAgIGNvbnN0IFtjb2RlYywgdHhCeXRlc10gPSBtYW5hZ2VyLmdldENvZGVjRnJvbUJ1ZmZlcihBdmF4VXRpbHMuaGV4VG9CdWZmZXIocmF3KSk7XG4gICAgICAgICAgY29uc3QgdW5wYWNrZWRUeCA9IGNvZGVjLlVucGFja1ByZWZpeDxwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeD4odHhCeXRlcyk7XG4gICAgICAgICAgLy8gQSBzaWduZWQgdHJhbnNhY3Rpb24gaW5jbHVkZXMgNCBieXRlcyBmb3IgdGhlIG51bWJlciBvZiBjcmVkZW50aWFscyBhcyBhbiBJbnQgdHlwZSB0aGF0IGlzIG5vdCBrbm93biBieSB0aGUgY29kZWNcbiAgICAgICAgICAvLyBXZSdsbCBza2lwIHRob3NlIDQgYnl0ZXMsIGluc3RlYWQgd2UnbGwgbG9vcCB1bnRpbCB3ZSd2ZSBwYXJzZWQgYWxsIGNyZWRlbnRpYWxzXG4gICAgICAgICAgLy8gQHNlZSBodHRwczovL2RvY3MuYXZheC5uZXR3b3JrL3JlZmVyZW5jZS9hdmFsYW5jaGVnby9wLWNoYWluL3R4bi1mb3JtYXQjc2lnbmVkLXRyYW5zYWN0aW9uLWV4YW1wbGVcbiAgICAgICAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG4gICAgICAgICAgbGV0IGNyZWRlbnRpYWxCeXRlcyA9IHVucGFja2VkVHhbMV0uc2xpY2UoNCk7XG4gICAgICAgICAgbGV0IG1vcmVDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgW2NyZWRlbnRpYWwsIHJlc3RdID0gY29kZWMuVW5wYWNrUHJlZml4PENyZWRlbnRpYWw+KGNyZWRlbnRpYWxCeXRlcyk7XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzLnB1c2goY3JlZGVudGlhbCk7XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxCeXRlcyA9IHJlc3Q7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIG1vcmVDcmVkZW50aWFscyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGNyZWRlbnRpYWxCeXRlcy5sZW5ndGggPiAwICYmIG1vcmVDcmVkZW50aWFscyk7XG5cbiAgICAgICAgICBjb25zdCB1bnBhY2tlZCA9IGNvZGVjLlVucGFja1ByZWZpeDxwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeD4odHhCeXRlcyk7XG4gICAgICAgICAgY29uc3QgcGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCA9IHVucGFja2VkWzBdIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4O1xuICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4LmJhc2VUeC5vdXRwdXRzO1xuICAgICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF0ub3V0cHV0IGFzIFRyYW5zZmVyT3V0cHV0O1xuICAgICAgICAgIGlmIChvdXRwdXRzWzBdLmdldEFzc2V0SWQoKSAhPT0gKHRoaXMuX2NvaW5Db25maWcubmV0d29yayBhcyBBdmFsYW5jaGVOZXR3b3JrKS5hdmF4QXNzZXRJRCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXNzZXQgSUQgb2YgdGhlIG91dHB1dCBkb2VzIG5vdCBtYXRjaCB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZnJvbUFkZHJlc3NlcyA9IG91dHB1dC5vdXRwdXRPd25lcnMuYWRkcnMubWFwKChhKSA9PiBBdmF4VXRpbHMuaGV4VG9CdWZmZXIoYS50b0hleCgpKSk7XG4gICAgICAgICAgY29uc3QgYWRkcmVzc01hcHMgPSBmcm9tQWRkcmVzc2VzLm1hcCgoYSkgPT4gbmV3IEF2YXhVdGlscy5BZGRyZXNzTWFwKFtbbmV3IEFkZHJlc3MoYSksIDBdXSkpO1xuICAgICAgICAgIHR4ID0gbmV3IFVuc2lnbmVkVHgodW5wYWNrZWRbMF0sIFtdLCBuZXcgQXZheFV0aWxzLkFkZHJlc3NNYXBzKGFkZHJlc3NNYXBzKSwgY3JlZGVudGlhbHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSB0cmFuc2FjdGlvbiB0eXBlIGlzIG5vdCByZWNvZ25pemVkIGFzIGFuIG9sZCBQVk0gb3Igb2xkIEVWTSB0cmFuc2FjdGlvbi4gQWRkaXRpb25hbGx5LCBwYXJzaW5nIG9mIHRoZSBuZXcgUFZNIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHggdHlwZSBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR4U291cmNlID09PSAnUFZNJykge1xuICAgICAgaWYgKCh0eCBhcyBVbnNpZ25lZFR4KT8udHg/Ll90eXBlICYmIFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSgodHggYXMgVW5zaWduZWRUeCkudHguX3R5cGUpKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlciA9IHRoaXMuZ2V0UGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIoKTtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIH0gZWxzZSBpZiAoVmFsaWRhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSgodHggYXMgUFZNVHgpLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpKSkge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB0aGlzLmdldFZhbGlkYXRvckJ1aWxkZXIoKTtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLmluaXRCdWlsZGVyKHR4IGFzIFBWTVR4KTtcbiAgICAgIH0gZWxzZSBpZiAoRXhwb3J0VHhCdWlsZGVyLnZlcmlmeVR4VHlwZSgodHggYXMgUFZNVHgpLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpKSkge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB0aGlzLmdldEV4cG9ydEJ1aWxkZXIoKTtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLmluaXRCdWlsZGVyKHR4IGFzIFBWTVR4KTtcbiAgICAgIH0gZWxzZSBpZiAoSW1wb3J0VHhCdWlsZGVyLnZlcmlmeVR4VHlwZSgodHggYXMgUFZNVHgpLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpKSkge1xuICAgICAgICB0cmFuc2FjdGlvbkJ1aWxkZXIgPSB0aGlzLmdldEltcG9ydEJ1aWxkZXIoKTtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyLmluaXRCdWlsZGVyKHR4IGFzIFBWTVR4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR4U291cmNlID09PSAnRVZNJykge1xuICAgICAgaWYgKEltcG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUoKHR4IGFzIEVWTVR4KS5nZXRVbnNpZ25lZFR4KCkuZ2V0VHJhbnNhY3Rpb24oKSkpIHtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyID0gdGhpcy5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlci5pbml0QnVpbGRlcih0eCBhcyBFVk1UeCk7XG4gICAgICB9IGVsc2UgaWYgKEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUoKHR4IGFzIEVWTVR4KS5nZXRVbnNpZ25lZFR4KCkuZ2V0VHJhbnNhY3Rpb24oKSkpIHtcbiAgICAgICAgdHJhbnNhY3Rpb25CdWlsZGVyID0gdGhpcy5nZXRFeHBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAgIHRyYW5zYWN0aW9uQnVpbGRlci5pbml0QnVpbGRlcih0eCBhcyBFVk1UeCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0cmFuc2FjdGlvbkJ1aWxkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnVHJhbnNhY3Rpb24gY2Fubm90IGJlIHBhcnNlZCBvciBoYXMgYW4gdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZScpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25CdWlsZGVyO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFRyYW5zZmVyQnVpbGRlcigpOiBEZXByZWNhdGVkVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2ZlciBpcyBub3Qgc3VwcG9ydGVkIGluIFAgQ2hhaW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIFZhbGlkYXRvciBidWlsZGVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtWYWxpZGF0b3JUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIGluaXRpYWxpemVkXG4gICAqL1xuICBnZXRWYWxpZGF0b3JCdWlsZGVyKCk6IFZhbGlkYXRvclR4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBQZXJtaXNzaW9ubGVzcyBWYWxpZGF0b3IgYnVpbGRlclxuICAgKlxuICAgKiBAcmV0dXJucyB7UGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIGluaXRpYWxpemVkXG4gICAqL1xuICBnZXRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcigpOiBQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgQ3Jvc3MgY2hhaW4gdHJhbnNmZXJcbiAgICpcbiAgICogQHJldHVybnMge0V4cG9ydFR4QnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIGdldEV4cG9ydEJ1aWxkZXIoKTogRXhwb3J0VHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEV4cG9ydFR4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgQ3Jvc3MgY2hhaW4gdHJhbnNmZXJcbiAgICpcbiAgICogQHJldHVybnMge0ltcG9ydFR4QnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIGdldEltcG9ydEJ1aWxkZXIoKTogSW1wb3J0VHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEltcG9ydFR4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgaW4gQyBjaGFpbiBDcm9zcyBjaGFpbiB0cmFuc2ZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7SW1wb3J0SW5DVHhCdWlsZGVyfSB0aGUgYnVpbGRlciBpbml0aWFsaXplZFxuICAgKi9cbiAgZ2V0SW1wb3J0SW5DQnVpbGRlcigpOiBJbXBvcnRJbkNUeEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgSW1wb3J0SW5DVHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBpbiBDIGNoYWluIENyb3NzIGNoYWluIHRyYW5zZmVyXG4gICAqXG4gICAqIEByZXR1cm5zIHtFeHBvcnRJbkNUeEJ1aWxkZXJ9IHRoZSBidWlsZGVyIGluaXRpYWxpemVkXG4gICAqL1xuICBnZXRFeHBvcnRJbkNCdWlsZGVyKCk6IEV4cG9ydEluQ1R4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBFeHBvcnRJbkNUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk6IERlcHJlY2F0ZWRUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1dhbGxldCBpbml0aWFsaXphdGlvbiBpcyBub3QgbmVlZGVkJyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { Signature as AvaxSignature, TransferableOutput } from '@bitgo-forks/avalanchejs';
|
|
2
|
+
import { BaseUtils, Entry } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import { AvalancheNetwork } from '@bitgo-beta/statics';
|
|
4
|
+
import { Buffer as BufferAvax } from 'avalanche';
|
|
5
|
+
import { BaseTx, TransferableOutput as DeprecatedTransferableOutput } from 'avalanche/dist/apis/platformvm';
|
|
6
|
+
import { Signature } from 'avalanche/dist/common';
|
|
7
|
+
import { Credential } from 'avalanche/dist/common/credentials';
|
|
8
|
+
import { NodeIDStringToBuffer } from 'avalanche/dist/utils';
|
|
9
|
+
import { DeprecatedOutput, DeprecatedTx, Output } from './iface';
|
|
10
|
+
export declare class Utils implements BaseUtils {
|
|
11
|
+
private binTools;
|
|
12
|
+
cb58Decode: (bytes: BufferAvax | string) => BufferAvax;
|
|
13
|
+
cb58Encode: (bytes: BufferAvax) => string;
|
|
14
|
+
stringToBuffer: (str: string) => BufferAvax;
|
|
15
|
+
bufferToString: (buff: BufferAvax) => string;
|
|
16
|
+
NodeIDStringToBuffer: typeof NodeIDStringToBuffer;
|
|
17
|
+
addressToString: (hrp: string, chainid: string, bytes: BufferAvax) => string;
|
|
18
|
+
includeIn(walletAddresses: string[], otxoOutputAddresses: string[]): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Checks if it is a valid address no illegal characters
|
|
21
|
+
*
|
|
22
|
+
* @param {string} address - address to be validated
|
|
23
|
+
* @returns {boolean} - the validation result
|
|
24
|
+
*/
|
|
25
|
+
/** @inheritdoc */
|
|
26
|
+
isValidAddress(address: string | string[]): boolean;
|
|
27
|
+
private isValidAddressRegex;
|
|
28
|
+
/**
|
|
29
|
+
* Checks if it is a valid blockId with length 66 including 0x
|
|
30
|
+
*
|
|
31
|
+
* @param {string} hash - blockId to be validated
|
|
32
|
+
* @returns {boolean} - the validation result
|
|
33
|
+
*/
|
|
34
|
+
/** @inheritdoc */
|
|
35
|
+
isValidBlockId(hash: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Checks if the string is a valid protocol public key or
|
|
38
|
+
* extended public key.
|
|
39
|
+
*
|
|
40
|
+
* @param {string} pub - the public key to be validated
|
|
41
|
+
* @returns {boolean} - the validation result
|
|
42
|
+
*/
|
|
43
|
+
isValidPublicKey(pub: string): boolean;
|
|
44
|
+
parseAddress: (pub: string) => BufferAvax;
|
|
45
|
+
/**
|
|
46
|
+
* Returns whether or not the string is a valid protocol private key, or extended
|
|
47
|
+
* private key.
|
|
48
|
+
*
|
|
49
|
+
* The protocol key format is described in the @stacks/transactions npm package, in the
|
|
50
|
+
* createStacksPrivateKey function:
|
|
51
|
+
* https://github.com/blockstack/stacks.js/blob/master/packages/transactions/src/keys.ts#L125
|
|
52
|
+
*
|
|
53
|
+
* @param {string} prv - the private key (or extended private key) to be validated
|
|
54
|
+
* @returns {boolean} - the validation result
|
|
55
|
+
*/
|
|
56
|
+
isValidPrivateKey(prv: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Returns whether or not the string is a composed of hex chars only
|
|
59
|
+
*
|
|
60
|
+
* @param {string} maybe - the string to be validated
|
|
61
|
+
* @returns {boolean} - the validation result
|
|
62
|
+
*/
|
|
63
|
+
allHexChars(maybe: string): boolean;
|
|
64
|
+
/** @inheritdoc */
|
|
65
|
+
isValidSignature(signature: string): boolean;
|
|
66
|
+
/** @inheritdoc */
|
|
67
|
+
isValidTransactionId(txId: string): boolean;
|
|
68
|
+
getCredentials(tx: BaseTx): Credential[];
|
|
69
|
+
/**
|
|
70
|
+
* Avaxp wrapper to create signature and return it for credentials using Avalanche's buffer
|
|
71
|
+
* @param network
|
|
72
|
+
* @param message
|
|
73
|
+
* @param prv
|
|
74
|
+
* @return signature
|
|
75
|
+
*/
|
|
76
|
+
createSignatureAvaxBuffer(network: AvalancheNetwork, message: BufferAvax, prv: BufferAvax): BufferAvax;
|
|
77
|
+
/**
|
|
78
|
+
* Avaxp wrapper to create signature and return it for credentials
|
|
79
|
+
* @param network
|
|
80
|
+
* @param message
|
|
81
|
+
* @param prv
|
|
82
|
+
* @return signature
|
|
83
|
+
*/
|
|
84
|
+
createSignature(network: AvalancheNetwork, message: Buffer, prv: Buffer): Buffer;
|
|
85
|
+
/**
|
|
86
|
+
* Avaxp wrapper to verify signature using Avalanche's buffer
|
|
87
|
+
* @param network
|
|
88
|
+
* @param message
|
|
89
|
+
* @param signature
|
|
90
|
+
* @param prv
|
|
91
|
+
* @return true if it's verify successful
|
|
92
|
+
*/
|
|
93
|
+
verifySignatureAvaxBuffer(network: AvalancheNetwork, message: BufferAvax, signature: BufferAvax, prv: BufferAvax): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Avaxp wrapper to verify signature
|
|
96
|
+
* @param network
|
|
97
|
+
* @param message
|
|
98
|
+
* @param signature
|
|
99
|
+
* @param prv
|
|
100
|
+
* @return true if it's verify successful
|
|
101
|
+
*/
|
|
102
|
+
verifySignature(network: AvalancheNetwork, message: Buffer, signature: Buffer, prv: Buffer): boolean;
|
|
103
|
+
createSig(sigHex: string): Signature;
|
|
104
|
+
createNewSig(sigHex: string): AvaxSignature;
|
|
105
|
+
/**
|
|
106
|
+
* Avaxp wrapper to recovery signature using Avalanche's buffer
|
|
107
|
+
* @param network
|
|
108
|
+
* @param message
|
|
109
|
+
* @param signature
|
|
110
|
+
* @return
|
|
111
|
+
*/
|
|
112
|
+
recoverySignatureAvaxBuffer(network: AvalancheNetwork, message: BufferAvax, signature: BufferAvax): BufferAvax;
|
|
113
|
+
/**
|
|
114
|
+
* Avaxp wrapper to verify signature
|
|
115
|
+
* @param network
|
|
116
|
+
* @param message
|
|
117
|
+
* @param signature
|
|
118
|
+
* @return true if it's verify successful
|
|
119
|
+
*/
|
|
120
|
+
recoverySignature(network: AvalancheNetwork, message: Buffer, signature: Buffer): Buffer;
|
|
121
|
+
sha256(buf: Uint8Array): Buffer;
|
|
122
|
+
/**
|
|
123
|
+
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
124
|
+
* It's to reuse in TransactionBuilder and TransactionBuilderFactory
|
|
125
|
+
*
|
|
126
|
+
* @param rawTransaction Transaction as hex string
|
|
127
|
+
*/
|
|
128
|
+
validateRawTransaction(rawTransaction: string): void;
|
|
129
|
+
/**
|
|
130
|
+
* Check if tx is for the blockchainId
|
|
131
|
+
*
|
|
132
|
+
* @param {DeprecatedTx} tx
|
|
133
|
+
* @param {string} blockchainId
|
|
134
|
+
* @returns true if tx is for blockchainId
|
|
135
|
+
*/
|
|
136
|
+
isTransactionOf(tx: DeprecatedTx, blockchainId: string): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Check if Output is from PVM.
|
|
139
|
+
* Output could be EVM or PVM output.
|
|
140
|
+
* @param {DeprecatedOutput} output
|
|
141
|
+
* @returns {boolean} output is DeprecatedTransferableOutput
|
|
142
|
+
*/
|
|
143
|
+
deprecatedIsTransferableOutput(output: DeprecatedOutput): output is DeprecatedTransferableOutput;
|
|
144
|
+
/**
|
|
145
|
+
* Check if Output is from PVM.
|
|
146
|
+
* Output could be EVM or PVM output.
|
|
147
|
+
* @param {Output} output
|
|
148
|
+
* @returns {boolean} output is TransferableOutput
|
|
149
|
+
*/
|
|
150
|
+
isTransferableOutput(output: Output): output is TransferableOutput;
|
|
151
|
+
/**
|
|
152
|
+
* Return a mapper function to that network address representation.
|
|
153
|
+
* @param network required to stringify addresses
|
|
154
|
+
* @return mapper function
|
|
155
|
+
*/
|
|
156
|
+
deprecatedMapOutputToEntry(network: AvalancheNetwork): (DeprecatedOutput: any) => Entry;
|
|
157
|
+
/**
|
|
158
|
+
* Return a mapper function to that network address representation.
|
|
159
|
+
* @param network required to stringify addresses
|
|
160
|
+
* @return mapper function
|
|
161
|
+
*/
|
|
162
|
+
mapOutputToEntry(network: AvalancheNetwork): (Output: any) => Entry;
|
|
163
|
+
/**
|
|
164
|
+
* remove hex prefix (0x)
|
|
165
|
+
* @param hex string
|
|
166
|
+
* @returns hex without 0x
|
|
167
|
+
*/
|
|
168
|
+
removeHexPrefix(hex: string): string;
|
|
169
|
+
/**
|
|
170
|
+
* Outputidx convert from number (as string) to buffer.
|
|
171
|
+
* @param {string} outputidx number
|
|
172
|
+
* @return {BufferAvax} buffer of size 4 with that number value
|
|
173
|
+
*/
|
|
174
|
+
outputidxNumberToBuffer(outputidx: string): BufferAvax;
|
|
175
|
+
/**
|
|
176
|
+
* Outputidx buffer to number (as string)
|
|
177
|
+
* @param {BufferAvax} outputidx
|
|
178
|
+
* @return {string} outputidx number
|
|
179
|
+
*/
|
|
180
|
+
outputidxBufferToNumber(outputidx: BufferAvax): string;
|
|
181
|
+
}
|
|
182
|
+
declare const utils: Utils;
|
|
183
|
+
export default utils;
|
|
184
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|