@bitgo/sdk-coin-avaxp 5.2.13 → 5.2.15
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/CHANGELOG.md +8 -0
- package/package.json +6 -6
- package/LICENSE +0 -191
- package/dist/src/avaxp.d.ts +0 -91
- package/dist/src/avaxp.d.ts.map +0 -1
- package/dist/src/avaxp.js +0 -343
- package/dist/src/iface.d.ts +0 -42
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/index.d.ts +0 -6
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -45
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -21
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +0 -49
- package/dist/src/lib/atomicTransactionBuilder.d.ts +0 -38
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/atomicTransactionBuilder.js +0 -129
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -95
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -285
- package/dist/src/lib/deprecatedTransaction.d.ts +0 -98
- package/dist/src/lib/deprecatedTransaction.d.ts.map +0 -1
- package/dist/src/lib/deprecatedTransaction.js +0 -344
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts +0 -114
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/deprecatedTransactionBuilder.js +0 -210
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -55
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -159
- package/dist/src/lib/exportTxBuilder.d.ts +0 -33
- package/dist/src/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportTxBuilder.js +0 -88
- package/dist/src/lib/iface.d.ts +0 -68
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -20
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -44
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -131
- package/dist/src/lib/importTxBuilder.d.ts +0 -18
- package/dist/src/lib/importTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importTxBuilder.js +0 -67
- package/dist/src/lib/index.d.ts +0 -11
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -37
- package/dist/src/lib/keyPair.d.ts +0 -58
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -150
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -154
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -452
- package/dist/src/lib/transaction.d.ts +0 -78
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -254
- package/dist/src/lib/transactionBuilder.d.ts +0 -71
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -138
- package/dist/src/lib/transactionBuilderFactory.d.ts +0 -57
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilderFactory.js +0 -178
- package/dist/src/lib/utils.d.ts +0 -184
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/lib/utils.js +0 -378
- package/dist/src/lib/utxoEngine.d.ts +0 -53
- package/dist/src/lib/utxoEngine.d.ts.map +0 -1
- package/dist/src/lib/utxoEngine.js +0 -112
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -37
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -69
- package/dist/src/register.d.ts +0 -3
- package/dist/src/register.d.ts.map +0 -1
- package/dist/src/register.js +0 -11
- package/dist/src/tavaxp.d.ts +0 -9
- package/dist/src/tavaxp.d.ts.map +0 -1
- package/dist/src/tavaxp.js +0 -14
- package/dist/test/resources/avaxp.d.ts +0 -259
- package/dist/test/resources/avaxp.d.ts.map +0 -1
- package/dist/test/resources/avaxp.js +0 -1093
- package/dist/test/resources/errors.d.ts +0 -19
- package/dist/test/resources/errors.d.ts.map +0 -1
- package/dist/test/resources/errors.js +0 -22
- package/dist/test/resources/keychains.d.ts +0 -18
- package/dist/test/resources/keychains.d.ts.map +0 -1
- package/dist/test/resources/keychains.js +0 -30
- package/dist/test/resources/tx/exportC.d.ts +0 -14
- package/dist/test/resources/tx/exportC.d.ts.map +0 -1
- package/dist/test/resources/tx/exportC.js +0 -21
- package/dist/test/resources/tx/importC.d.ts +0 -29
- package/dist/test/resources/tx/importC.d.ts.map +0 -1
- package/dist/test/resources/tx/importC.js +0 -42
- package/dist/test/resources/tx/importP.d.ts +0 -29
- package/dist/test/resources/tx/importP.d.ts.map +0 -1
- package/dist/test/resources/tx/importP.js +0 -42
- package/dist/test/unit/avaxp.d.ts +0 -2
- package/dist/test/unit/avaxp.d.ts.map +0 -1
- package/dist/test/unit/avaxp.js +0 -732
- package/dist/test/unit/lib/exportC2PTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportC2PTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportC2PTxBuilder.js +0 -125
- package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportP2CTxBuilder.js +0 -183
- package/dist/test/unit/lib/importC2PTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importC2PTxBuilder.js +0 -99
- package/dist/test/unit/lib/importP2CTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importP2CTxBuilder.js +0 -137
- package/dist/test/unit/lib/keyPair.d.ts +0 -2
- package/dist/test/unit/lib/keyPair.d.ts.map +0 -1
- package/dist/test/unit/lib/keyPair.js +0 -186
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +0 -341
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +0 -20
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +0 -1
- package/dist/test/unit/lib/signFlowTestSuit.js +0 -80
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +0 -2
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/lib/transactionBuilderFactory.js +0 -179
- package/dist/test/unit/lib/utils.d.ts +0 -2
- package/dist/test/unit/lib/utils.d.ts.map +0 -1
- package/dist/test/unit/lib/utils.js +0 -83
- package/dist/test/unit/lib/utxoEngine.d.ts +0 -2
- package/dist/test/unit/lib/utxoEngine.d.ts.map +0 -1
- package/dist/test/unit/lib/utxoEngine.js +0 -168
- package/dist/test/unit/lib/validateTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/validateTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/validateTxBuilder.js +0 -327
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { AvalancheNetwork, BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
-
import { BaseKey, BaseTransaction, Entry, TransactionFee, TransactionType } from '@bitgo/sdk-core';
|
|
3
|
-
import { KeyPair } from './keyPair';
|
|
4
|
-
import { DeprecatedBaseTx, DecodedUtxoObj, TransactionExplanation, DeprecatedTx, TxData } from './iface';
|
|
5
|
-
import { BN, Buffer as BufferAvax } from 'avalanche';
|
|
6
|
-
import { Credential } from 'avalanche/dist/common';
|
|
7
|
-
import { Buffer } from 'buffer';
|
|
8
|
-
export declare class DeprecatedTransaction extends BaseTransaction {
|
|
9
|
-
protected _avaxTransaction: DeprecatedTx;
|
|
10
|
-
_type: TransactionType;
|
|
11
|
-
_network: AvalancheNetwork;
|
|
12
|
-
_networkID: number;
|
|
13
|
-
_assetId: BufferAvax;
|
|
14
|
-
_blockchainID: BufferAvax;
|
|
15
|
-
_threshold: number;
|
|
16
|
-
_locktime: BN;
|
|
17
|
-
_fromAddresses: BufferAvax[];
|
|
18
|
-
_rewardAddresses: BufferAvax[];
|
|
19
|
-
_utxos: DecodedUtxoObj[];
|
|
20
|
-
_to: BufferAvax[];
|
|
21
|
-
_fee: Partial<TransactionFee>;
|
|
22
|
-
constructor(coinConfig: Readonly<CoinConfig>);
|
|
23
|
-
get avaxPTransaction(): DeprecatedBaseTx;
|
|
24
|
-
get signature(): string[];
|
|
25
|
-
get credentials(): Credential[];
|
|
26
|
-
get hasCredentials(): boolean;
|
|
27
|
-
/** @inheritdoc */
|
|
28
|
-
canSign({ key }: BaseKey): boolean;
|
|
29
|
-
/**
|
|
30
|
-
* Sign a avaxp transaction and update the transaction hex
|
|
31
|
-
* validator, delegator, import, exports extend baseTx
|
|
32
|
-
* unsignedTx: UnsignedTx = new UnsignedTx(baseTx) (baseTx = addValidatorTx)
|
|
33
|
-
* const tx: Tx = unsignedTx.sign(keychain) (tx is type standard signed tx)
|
|
34
|
-
* get baseTx then create new unsignedTx then sign
|
|
35
|
-
*
|
|
36
|
-
* @param {KeyPair} keyPair
|
|
37
|
-
*/
|
|
38
|
-
sign(keyPair: KeyPair): void;
|
|
39
|
-
/** @inheritdoc */
|
|
40
|
-
/**
|
|
41
|
-
* should be of signedTx doing this with baseTx
|
|
42
|
-
*/
|
|
43
|
-
toBroadcastFormat(): string;
|
|
44
|
-
toJson(): TxData;
|
|
45
|
-
setTransaction(tx: DeprecatedTx): void;
|
|
46
|
-
/**
|
|
47
|
-
* Set the transaction type
|
|
48
|
-
*
|
|
49
|
-
* @param {TransactionType} transactionType The transaction type to be set
|
|
50
|
-
*/
|
|
51
|
-
setTransactionType(transactionType: TransactionType): void;
|
|
52
|
-
/**
|
|
53
|
-
* Returns the portion of the transaction that needs to be signed in Buffer format.
|
|
54
|
-
* Only needed for coins that support adding signatures directly (e.g. TSS).
|
|
55
|
-
*/
|
|
56
|
-
get signablePayload(): Buffer;
|
|
57
|
-
get id(): string;
|
|
58
|
-
get fromAddresses(): string[];
|
|
59
|
-
get rewardAddresses(): string[];
|
|
60
|
-
/**
|
|
61
|
-
* Get the list of outputs. Amounts are expressed in absolute value.
|
|
62
|
-
*/
|
|
63
|
-
get outputs(): Entry[];
|
|
64
|
-
/**
|
|
65
|
-
* Get a Transasction Fee.
|
|
66
|
-
*/
|
|
67
|
-
get fee(): TransactionFee;
|
|
68
|
-
get changeOutputs(): Entry[];
|
|
69
|
-
get inputs(): Entry[];
|
|
70
|
-
/**
|
|
71
|
-
* Avax wrapper to create signature and return it for credentials
|
|
72
|
-
* @param prv
|
|
73
|
-
* @return hexstring
|
|
74
|
-
*/
|
|
75
|
-
createSignature(prv: Buffer): string;
|
|
76
|
-
/** @inheritdoc */
|
|
77
|
-
explainTransaction(): TransactionExplanation;
|
|
78
|
-
/**
|
|
79
|
-
* Check if this transaction is a P chain
|
|
80
|
-
*/
|
|
81
|
-
get isTransactionForCChain(): boolean;
|
|
82
|
-
/**
|
|
83
|
-
* get the source chain id or undefined if it's a cross chain transfer.
|
|
84
|
-
*/
|
|
85
|
-
get sourceChain(): string | undefined;
|
|
86
|
-
/**
|
|
87
|
-
* get the destinationChain or undefined if it's a cross chain transfer.
|
|
88
|
-
*/
|
|
89
|
-
get destinationChain(): string | undefined;
|
|
90
|
-
/**
|
|
91
|
-
* Convert a blockchainId buffer to string and return P or C alias if match of any of that chains.
|
|
92
|
-
* @param {BufferAvax} blockchainIDBuffer
|
|
93
|
-
* @return {string} blocchainID or alias if exists.
|
|
94
|
-
* @private
|
|
95
|
-
*/
|
|
96
|
-
private blockchainIDtoAlias;
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=deprecatedTransaction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deprecatedTransaction.d.ts","sourceRoot":"","sources":["../../../src/lib/deprecatedTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,MAAM,EAGP,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA2ChC,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,UAAU,SAAK;IACf,SAAS,EAAE,EAAE,CAAa;IAC1B,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;gBAE9B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAMxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAKlC;;;;;;;;OAQG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA+B5B,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B,MAAM,IAAI,MAAM;IAmBhB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAItC;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CA6BrB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAU3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CA2BpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IA2B5C;;OAEG;IACH,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAapC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAazC;IAED;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
|
|
@@ -1,344 +0,0 @@
|
|
|
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.DeprecatedTransaction = void 0;
|
|
7
|
-
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
8
|
-
const iface_1 = require("./iface");
|
|
9
|
-
const avalanche_1 = require("avalanche");
|
|
10
|
-
const utils_1 = __importDefault(require("./utils"));
|
|
11
|
-
function isEmptySignature(s) {
|
|
12
|
-
return !!s && s.startsWith(''.padStart(90, '0'));
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Signatures are prestore as empty buffer for hsm and address of signar for first signature.
|
|
16
|
-
* When sign is required, this method return the function that identify a signature to be replaced.
|
|
17
|
-
* @param signatures any signatures as samples to identify which signature required replace.
|
|
18
|
-
*/
|
|
19
|
-
function generateSelectorSignature(signatures) {
|
|
20
|
-
if (signatures.length > 1 && signatures.every((sig) => isEmptySignature(sig.bytes))) {
|
|
21
|
-
// Look for address.
|
|
22
|
-
return function (sig, address) {
|
|
23
|
-
try {
|
|
24
|
-
if (!isEmptySignature(sig.bytes)) {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
const pub = sig.bytes.substring(90);
|
|
28
|
-
return pub === address;
|
|
29
|
-
}
|
|
30
|
-
catch (e) {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
// Look for empty string
|
|
37
|
-
return function (sig, address) {
|
|
38
|
-
if (isEmptySignature(sig.bytes))
|
|
39
|
-
return true;
|
|
40
|
-
return false;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// end region utils for sign
|
|
45
|
-
class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
|
|
46
|
-
constructor(coinConfig) {
|
|
47
|
-
super(coinConfig);
|
|
48
|
-
this._threshold = 2;
|
|
49
|
-
this._locktime = new avalanche_1.BN(0);
|
|
50
|
-
this._fromAddresses = [];
|
|
51
|
-
this._utxos = [];
|
|
52
|
-
this._fee = {};
|
|
53
|
-
this._network = coinConfig.network;
|
|
54
|
-
this._assetId = utils_1.default.cb58Decode(this._network.avaxAssetID);
|
|
55
|
-
this._blockchainID = utils_1.default.cb58Decode(this._network.blockchainID);
|
|
56
|
-
this._networkID = this._network.networkID;
|
|
57
|
-
}
|
|
58
|
-
get avaxPTransaction() {
|
|
59
|
-
return this._avaxTransaction.getUnsignedTx().getTransaction();
|
|
60
|
-
}
|
|
61
|
-
get signature() {
|
|
62
|
-
if (this.credentials.length === 0) {
|
|
63
|
-
return [];
|
|
64
|
-
}
|
|
65
|
-
const obj = this.credentials[0].serialize();
|
|
66
|
-
return obj.sigArray.map((s) => s.bytes).filter((s) => !isEmptySignature(s));
|
|
67
|
-
}
|
|
68
|
-
get credentials() {
|
|
69
|
-
return this._avaxTransaction?.credentials;
|
|
70
|
-
}
|
|
71
|
-
get hasCredentials() {
|
|
72
|
-
return this.credentials !== undefined && this.credentials.length > 0;
|
|
73
|
-
}
|
|
74
|
-
/** @inheritdoc */
|
|
75
|
-
canSign({ key }) {
|
|
76
|
-
// TODO(BG-56700): Improve canSign by check in addresses in empty credentials match signer
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Sign a avaxp transaction and update the transaction hex
|
|
81
|
-
* validator, delegator, import, exports extend baseTx
|
|
82
|
-
* unsignedTx: UnsignedTx = new UnsignedTx(baseTx) (baseTx = addValidatorTx)
|
|
83
|
-
* const tx: Tx = unsignedTx.sign(keychain) (tx is type standard signed tx)
|
|
84
|
-
* get baseTx then create new unsignedTx then sign
|
|
85
|
-
*
|
|
86
|
-
* @param {KeyPair} keyPair
|
|
87
|
-
*/
|
|
88
|
-
sign(keyPair) {
|
|
89
|
-
const prv = keyPair.getPrivateKey();
|
|
90
|
-
const addressHex = keyPair.getAddressBuffer().toString('hex');
|
|
91
|
-
if (!prv) {
|
|
92
|
-
throw new sdk_core_1.SigningError('Missing private key');
|
|
93
|
-
}
|
|
94
|
-
if (!this.avaxPTransaction) {
|
|
95
|
-
throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
|
|
96
|
-
}
|
|
97
|
-
if (!this.hasCredentials) {
|
|
98
|
-
throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
|
|
99
|
-
}
|
|
100
|
-
const signature = this.createSignature(prv);
|
|
101
|
-
let checkSign = undefined;
|
|
102
|
-
this.credentials.forEach((c, index) => {
|
|
103
|
-
const cs = c.serialize();
|
|
104
|
-
if (checkSign === undefined) {
|
|
105
|
-
checkSign = generateSelectorSignature(cs.sigArray);
|
|
106
|
-
}
|
|
107
|
-
let find = false;
|
|
108
|
-
cs.sigArray.forEach((sig) => {
|
|
109
|
-
if (checkSign && checkSign(sig, addressHex)) {
|
|
110
|
-
sig.bytes = signature;
|
|
111
|
-
find = true;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
if (!find)
|
|
115
|
-
throw new sdk_core_1.SigningError('Private key cannot sign the transaction');
|
|
116
|
-
c.deserialize(cs);
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
/** @inheritdoc */
|
|
120
|
-
/**
|
|
121
|
-
* should be of signedTx doing this with baseTx
|
|
122
|
-
*/
|
|
123
|
-
toBroadcastFormat() {
|
|
124
|
-
if (!this.avaxPTransaction) {
|
|
125
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
126
|
-
}
|
|
127
|
-
return this._avaxTransaction.toStringHex();
|
|
128
|
-
}
|
|
129
|
-
// types - stakingTransaction, import, export
|
|
130
|
-
toJson() {
|
|
131
|
-
if (!this.avaxPTransaction) {
|
|
132
|
-
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
133
|
-
}
|
|
134
|
-
return {
|
|
135
|
-
id: this.id,
|
|
136
|
-
inputs: this.inputs,
|
|
137
|
-
fromAddresses: this.fromAddresses,
|
|
138
|
-
threshold: this._threshold,
|
|
139
|
-
locktime: this._locktime.toString(),
|
|
140
|
-
type: this.type,
|
|
141
|
-
signatures: this.signature,
|
|
142
|
-
outputs: this.outputs,
|
|
143
|
-
changeOutputs: this.changeOutputs,
|
|
144
|
-
sourceChain: this.sourceChain,
|
|
145
|
-
destinationChain: this.destinationChain,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
setTransaction(tx) {
|
|
149
|
-
this._avaxTransaction = tx;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Set the transaction type
|
|
153
|
-
*
|
|
154
|
-
* @param {TransactionType} transactionType The transaction type to be set
|
|
155
|
-
*/
|
|
156
|
-
setTransactionType(transactionType) {
|
|
157
|
-
this._type = transactionType;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Returns the portion of the transaction that needs to be signed in Buffer format.
|
|
161
|
-
* Only needed for coins that support adding signatures directly (e.g. TSS).
|
|
162
|
-
*/
|
|
163
|
-
get signablePayload() {
|
|
164
|
-
return utils_1.default.sha256(this._avaxTransaction.getUnsignedTx().toBuffer());
|
|
165
|
-
}
|
|
166
|
-
get id() {
|
|
167
|
-
return utils_1.default.cb58Encode(avalanche_1.Buffer.from(utils_1.default.sha256(this._avaxTransaction.toBuffer())));
|
|
168
|
-
}
|
|
169
|
-
get fromAddresses() {
|
|
170
|
-
return this._fromAddresses.map((a) => utils_1.default.addressToString(this._network.hrp, this._network.alias, a));
|
|
171
|
-
}
|
|
172
|
-
get rewardAddresses() {
|
|
173
|
-
return this._rewardAddresses.map((a) => utils_1.default.addressToString(this._network.hrp, this._network.alias, a));
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Get the list of outputs. Amounts are expressed in absolute value.
|
|
177
|
-
*/
|
|
178
|
-
get outputs() {
|
|
179
|
-
switch (this.type) {
|
|
180
|
-
case sdk_core_1.TransactionType.Import:
|
|
181
|
-
return this.avaxPTransaction
|
|
182
|
-
.getOuts()
|
|
183
|
-
.map(utils_1.default.deprecatedMapOutputToEntry(this._network));
|
|
184
|
-
case sdk_core_1.TransactionType.Export:
|
|
185
|
-
if (utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID)) {
|
|
186
|
-
return this.avaxPTransaction
|
|
187
|
-
.getExportedOutputs()
|
|
188
|
-
.map(utils_1.default.deprecatedMapOutputToEntry(this._network));
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
return this.avaxPTransaction
|
|
192
|
-
.getExportOutputs()
|
|
193
|
-
.map(utils_1.default.deprecatedMapOutputToEntry(this._network));
|
|
194
|
-
}
|
|
195
|
-
case sdk_core_1.TransactionType.AddDelegator:
|
|
196
|
-
case sdk_core_1.TransactionType.AddValidator:
|
|
197
|
-
// Get staked outputs
|
|
198
|
-
const addValidatorTx = this.avaxPTransaction;
|
|
199
|
-
return [
|
|
200
|
-
{
|
|
201
|
-
address: addValidatorTx.getNodeIDString(),
|
|
202
|
-
value: addValidatorTx.getStakeAmount().toString(),
|
|
203
|
-
},
|
|
204
|
-
];
|
|
205
|
-
default:
|
|
206
|
-
return [];
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Get a Transasction Fee.
|
|
211
|
-
*/
|
|
212
|
-
get fee() {
|
|
213
|
-
return { fee: '0', ...this._fee };
|
|
214
|
-
}
|
|
215
|
-
get changeOutputs() {
|
|
216
|
-
// C-chain tx adn Import Txs don't have change outputs
|
|
217
|
-
if (this.type === sdk_core_1.TransactionType.Import ||
|
|
218
|
-
utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID)) {
|
|
219
|
-
return [];
|
|
220
|
-
}
|
|
221
|
-
// general support any transaction type, but it's scoped yet
|
|
222
|
-
return this.avaxPTransaction.getOuts().map(utils_1.default.deprecatedMapOutputToEntry(this._network));
|
|
223
|
-
}
|
|
224
|
-
get inputs() {
|
|
225
|
-
let inputs;
|
|
226
|
-
switch (this.type) {
|
|
227
|
-
case sdk_core_1.TransactionType.Import:
|
|
228
|
-
inputs = this.avaxPTransaction.getImportInputs();
|
|
229
|
-
break;
|
|
230
|
-
case sdk_core_1.TransactionType.Export:
|
|
231
|
-
if (utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID)) {
|
|
232
|
-
return this.avaxPTransaction.getInputs().map((evmInput) => ({
|
|
233
|
-
address: '0x' + evmInput.getAddressString(),
|
|
234
|
-
value: new avalanche_1.BN(evmInput.amount).toString(),
|
|
235
|
-
nonce: evmInput.getNonce().toNumber(),
|
|
236
|
-
}));
|
|
237
|
-
}
|
|
238
|
-
inputs = this.avaxPTransaction.getIns();
|
|
239
|
-
break;
|
|
240
|
-
default:
|
|
241
|
-
inputs = this.avaxPTransaction.getIns();
|
|
242
|
-
}
|
|
243
|
-
return inputs.map((input) => {
|
|
244
|
-
const amountInput = input.getInput();
|
|
245
|
-
return {
|
|
246
|
-
id: utils_1.default.cb58Encode(input.getTxID()) + iface_1.INPUT_SEPARATOR + utils_1.default.outputidxBufferToNumber(input.getOutputIdx()),
|
|
247
|
-
address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
|
|
248
|
-
value: amountInput.getAmount().toString(),
|
|
249
|
-
};
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Avax wrapper to create signature and return it for credentials
|
|
254
|
-
* @param prv
|
|
255
|
-
* @return hexstring
|
|
256
|
-
*/
|
|
257
|
-
createSignature(prv) {
|
|
258
|
-
const signval = utils_1.default.createSignatureAvaxBuffer(this._network, avalanche_1.Buffer.from(this.signablePayload), avalanche_1.Buffer.from(prv));
|
|
259
|
-
return signval.toString('hex');
|
|
260
|
-
}
|
|
261
|
-
/** @inheritdoc */
|
|
262
|
-
explainTransaction() {
|
|
263
|
-
const txJson = this.toJson();
|
|
264
|
-
const displayOrder = ['id', 'inputs', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
|
|
265
|
-
const outputAmount = txJson.outputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
|
|
266
|
-
const changeAmount = txJson.changeOutputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
|
|
267
|
-
let rewardAddresses;
|
|
268
|
-
if ([sdk_core_1.TransactionType.AddValidator, sdk_core_1.TransactionType.AddDelegator].includes(txJson.type)) {
|
|
269
|
-
rewardAddresses = this.rewardAddresses;
|
|
270
|
-
displayOrder.splice(6, 0, 'rewardAddresses');
|
|
271
|
-
}
|
|
272
|
-
return {
|
|
273
|
-
displayOrder,
|
|
274
|
-
id: txJson.id,
|
|
275
|
-
inputs: txJson.inputs,
|
|
276
|
-
outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.value })),
|
|
277
|
-
outputAmount,
|
|
278
|
-
changeOutputs: txJson.changeOutputs.map((o) => ({ address: o.address, amount: o.value })),
|
|
279
|
-
changeAmount,
|
|
280
|
-
rewardAddresses,
|
|
281
|
-
fee: this.fee,
|
|
282
|
-
type: txJson.type,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Check if this transaction is a P chain
|
|
287
|
-
*/
|
|
288
|
-
get isTransactionForCChain() {
|
|
289
|
-
return utils_1.default.isTransactionOf(this._avaxTransaction, this._network.cChainBlockchainID);
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* get the source chain id or undefined if it's a cross chain transfer.
|
|
293
|
-
*/
|
|
294
|
-
get sourceChain() {
|
|
295
|
-
let blockchainID;
|
|
296
|
-
switch (this.type) {
|
|
297
|
-
case sdk_core_1.TransactionType.Import:
|
|
298
|
-
blockchainID = this.avaxPTransaction.getSourceChain();
|
|
299
|
-
break;
|
|
300
|
-
case sdk_core_1.TransactionType.Export:
|
|
301
|
-
blockchainID = this.avaxPTransaction.getBlockchainID();
|
|
302
|
-
break;
|
|
303
|
-
default:
|
|
304
|
-
return undefined;
|
|
305
|
-
}
|
|
306
|
-
return this.blockchainIDtoAlias(blockchainID);
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* get the destinationChain or undefined if it's a cross chain transfer.
|
|
310
|
-
*/
|
|
311
|
-
get destinationChain() {
|
|
312
|
-
let blockchainID;
|
|
313
|
-
switch (this.type) {
|
|
314
|
-
case sdk_core_1.TransactionType.Import:
|
|
315
|
-
blockchainID = this.avaxPTransaction.getBlockchainID();
|
|
316
|
-
break;
|
|
317
|
-
case sdk_core_1.TransactionType.Export:
|
|
318
|
-
blockchainID = this.avaxPTransaction.getDestinationChain();
|
|
319
|
-
break;
|
|
320
|
-
default:
|
|
321
|
-
return undefined;
|
|
322
|
-
}
|
|
323
|
-
return this.blockchainIDtoAlias(blockchainID);
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Convert a blockchainId buffer to string and return P or C alias if match of any of that chains.
|
|
327
|
-
* @param {BufferAvax} blockchainIDBuffer
|
|
328
|
-
* @return {string} blocchainID or alias if exists.
|
|
329
|
-
* @private
|
|
330
|
-
*/
|
|
331
|
-
blockchainIDtoAlias(blockchainIDBuffer) {
|
|
332
|
-
const blockchainId = utils_1.default.cb58Encode(blockchainIDBuffer);
|
|
333
|
-
switch (blockchainId) {
|
|
334
|
-
case this._network.cChainBlockchainID:
|
|
335
|
-
return 'C';
|
|
336
|
-
case this._network.blockchainID:
|
|
337
|
-
return 'P';
|
|
338
|
-
default:
|
|
339
|
-
return blockchainId;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
exports.DeprecatedTransaction = DeprecatedTransaction;
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwcmVjYXRlZFRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXByZWNhdGVkVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsOENBUXlCO0FBRXpCLG1DQVFpQjtBQUdqQix5Q0FBcUQ7QUFDckQsb0RBQTRCO0FBWTVCLFNBQVMsZ0JBQWdCLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFpQztJQUNsRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEYsb0JBQW9CO1FBQ3BCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNqQyxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2dCQUNELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUM7WUFDekIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTix3QkFBd0I7UUFDeEIsT0FBTyxVQUFVLEdBQUcsRUFB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QUMsUUFBUSxDQUFDLFlBQVk7Z0JBQzdCLE9BQU8sR0FBRyxDQUFDO1lBQ2I7Z0JBQ0UsT0FBTyxZQUFZLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpWRCxzREFpVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdmFsYW5jaGVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25GZWUsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHtcbiAgRGVwcmVjYXRlZEJhc2VUeCxcbiAgRGVjb2RlZFV0eG9PYmosXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIERlcHJlY2F0ZWRUeCxcbiAgVHhEYXRhLFxuICBJTlBVVF9TRVBBUkFUT1IsXG4gIEFERFJFU1NfU0VQQVJBVE9SLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEFkZERlbGVnYXRvclR4LCBBbW91bnRJbnB1dCwgQmFzZVR4IGFzIFBWTUJhc2VUeCwgRXhwb3J0VHgsIEltcG9ydFR4IH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvYXBpcy9wbGF0Zm9ybXZtJztcbmltcG9ydCB7IEV4cG9ydFR4IGFzIEVWTUV4cG9ydFR4LCBJbXBvcnRUeCBhcyBFVk1JbXBvcnRUeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvZXZtJztcbmltcG9ydCB7IEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBDcmVkZW50aWFsIH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvY29tbW9uJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbi8vIHJlZ2lvbiB1dGlscyB0byBzaWduXG5pbnRlcmZhY2Ugc2lnbmF0dXJlU2VyaWFsaXplZCB7XG4gIGJ5dGVzOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgQ2hlY2tTaWduYXR1cmUge1xuICAoc2lnYXR1cmU6IHNpZ25hdHVyZVNlcmlhbGl6ZWQsIGFkZHJlc3NIZXg6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlTaWduYXR1cmUoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXMgJiYgcy5zdGFydHNXaXRoKCcnLnBhZFN0YXJ0KDkwLCAnMCcpKTtcbn1cblxuLyoqXG4gKiBTaWduYXR1cmVzIGFyZSBwcmVzdG9yZSBhcyBlbXB0eSBidWZmZXIgZm9yIGhzbSBhbmQgYWRkcmVzcyBvZiBzaWduYXIgZm9yIGZpcnN0IHNpZ25hdHVyZS5cbiAqIFdoZW4gc2lnbiBpcyByZXF1aXJlZCwgdGhpcyBtZXRob2QgcmV0dXJuIHRoZSBmdW5jdGlvbiB0aGF0IGlkZW50aWZ5IGEgc2lnbmF0dXJlIHRvIGJlIHJlcGxhY2VkLlxuICogQHBhcmFtIHNpZ25hdHVyZXMgYW55IHNpZ25hdHVyZXMgYXMgc2FtcGxlcyB0byBpZGVudGlmeSB3aGljaCBzaWduYXR1cmUgcmVxdWlyZWQgcmVwbGFjZS5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzOiBzaWduYXR1cmVTZXJpYWxpemVkW10pOiBDaGVja1NpZ25hdHVyZSB7XG4gIGlmIChzaWduYXR1cmVzLmxlbmd0aCA+IDEgJiYgc2lnbmF0dXJlcy5ldmVyeSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpKSB7XG4gICAgLy8gTG9vayBmb3IgYWRkcmVzcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHViID0gc2lnLmJ5dGVzLnN1YnN0cmluZyg5MCk7XG4gICAgICAgIHJldHVybiBwdWIgPT09IGFkZHJlc3M7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIExvb2sgZm9yIGVtcHR5IHN0cmluZ1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICBpZiAoaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG59XG4vLyBlbmQgcmVnaW9uIHV0aWxzIGZvciBzaWduXG5cbmV4cG9ydCBjbGFzcyBEZXByZWNhdGVkVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2F2YXhUcmFuc2FjdGlvbjogRGVwcmVjYXRlZFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrO1xuICBwdWJsaWMgX25ldHdvcmtJRDogbnVtYmVyO1xuICBwdWJsaWMgX2Fzc2V0SWQ6IEJ1ZmZlckF2YXg7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBCdWZmZXJBdmF4O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWU6IEJOID0gbmV3IEJOKDApO1xuICBwdWJsaWMgX2Zyb21BZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXSA9IFtdO1xuICBwdWJsaWMgX3Jld2FyZEFkZHJlc3NlczogQnVmZmVyQXZheFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107XG4gIHB1YmxpYyBfdG86IEJ1ZmZlckF2YXhbXTtcbiAgcHVibGljIF9mZWU6IFBhcnRpYWw8VHJhbnNhY3Rpb25GZWU+ID0ge307XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcms7XG4gICAgdGhpcy5fYXNzZXRJZCA9IHV0aWxzLmNiNThEZWNvZGUodGhpcy5fbmV0d29yay5hdmF4QXNzZXRJRCk7XG4gICAgdGhpcy5fYmxvY2tjaGFpbklEID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCk7XG4gICAgdGhpcy5fbmV0d29ya0lEID0gdGhpcy5fbmV0d29yay5uZXR3b3JrSUQ7XG4gIH1cblxuICBnZXQgYXZheFBUcmFuc2FjdGlvbigpOiBEZXByZWNhdGVkQmFzZVR4IHtcbiAgICByZXR1cm4gdGhpcy5fYXZheFRyYW5zYWN0aW9uLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9iajogYW55ID0gdGhpcy5jcmVkZW50aWFsc1swXS5zZXJpYWxpemUoKTtcbiAgICByZXR1cm4gb2JqLnNpZ0FycmF5Lm1hcCgocykgPT4gcy5ieXRlcykuZmlsdGVyKChzKSA9PiAhaXNFbXB0eVNpZ25hdHVyZShzKSk7XG4gIH1cblxuICBnZXQgY3JlZGVudGlhbHMoKTogQ3JlZGVudGlhbFtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBhbnkpPy5jcmVkZW50aWFscztcbiAgfVxuXG4gIGdldCBoYXNDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKHsga2V5IH06IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPKEJHLTU2NzAwKTogIEltcHJvdmUgY2FuU2lnbiBieSBjaGVjayBpbiBhZGRyZXNzZXMgaW4gZW1wdHkgY3JlZGVudGlhbHMgbWF0Y2ggc2lnbmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIGF2YXhwIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiB2YWxpZGF0b3IsIGRlbGVnYXRvciwgaW1wb3J0LCBleHBvcnRzIGV4dGVuZCBiYXNlVHhcbiAgICogdW5zaWduZWRUeDogVW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeCkgIChiYXNlVHggPSBhZGRWYWxpZGF0b3JUeClcbiAgICogY29uc3QgdHg6IFR4ID0gdW5zaWduZWRUeC5zaWduKGtleWNoYWluKSAodHggaXMgdHlwZSBzdGFuZGFyZCBzaWduZWQgdHgpXG4gICAqIGdldCBiYXNlVHggdGhlbiBjcmVhdGUgbmV3IHVuc2lnbmVkVHggdGhlbiBzaWduXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpclxuICAgKi9cbiAgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogdm9pZCB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCk7XG4gICAgY29uc3QgYWRkcmVzc0hleCA9IGtleVBhaXIuZ2V0QWRkcmVzc0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuY3JlYXRlU2lnbmF0dXJlKHBydik7XG4gICAgbGV0IGNoZWNrU2lnbjogQ2hlY2tTaWduYXR1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jcmVkZW50aWFscy5mb3JFYWNoKChjLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY3M6IGFueSA9IGMuc2VyaWFsaXplKCk7XG4gICAgICBpZiAoY2hlY2tTaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShjcy5zaWdBcnJheSk7XG4gICAgICB9XG4gICAgICBsZXQgZmluZCA9IGZhbHNlO1xuICAgICAgY3Muc2lnQXJyYXkuZm9yRWFjaCgoc2lnKSA9PiB7XG4gICAgICAgIGlmIChjaGVja1NpZ24gJiYgY2hlY2tTaWduKHNpZywgYWRkcmVzc0hleCkpIHtcbiAgICAgICAgICBzaWcuYnl0ZXMgPSBzaWduYXR1cmU7XG4gICAgICAgICAgZmluZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFmaW5kKSB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgIGMuZGVzZXJpYWxpemUoY3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIC8qKlxuICAgKiBzaG91bGQgYmUgb2Ygc2lnbmVkVHggZG9pbmcgdGhpcyB3aXRoIGJhc2VUeFxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdmF4VHJhbnNhY3Rpb24udG9TdHJpbmdIZXgoKTtcbiAgfVxuXG4gIC8vIHR5cGVzIC0gc3Rha2luZ1RyYW5zYWN0aW9uLCBpbXBvcnQsIGV4cG9ydFxuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlucHV0czogdGhpcy5pbnB1dHMsXG4gICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLmZyb21BZGRyZXNzZXMsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX3RocmVzaG9sZCxcbiAgICAgIGxvY2t0aW1lOiB0aGlzLl9sb2NrdGltZS50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUsXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0aGlzLmNoYW5nZU91dHB1dHMsXG4gICAgICBzb3VyY2VDaGFpbjogdGhpcy5zb3VyY2VDaGFpbixcbiAgICAgIGRlc3RpbmF0aW9uQ2hhaW46IHRoaXMuZGVzdGluYXRpb25DaGFpbixcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IERlcHJlY2F0ZWRUeCk6IHZvaWQge1xuICAgIHRoaXMuX2F2YXhUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHNpZ25lZCBpbiBCdWZmZXIgZm9ybWF0LlxuICAgKiBPbmx5IG5lZWRlZCBmb3IgY29pbnMgdGhhdCBzdXBwb3J0IGFkZGluZyBzaWduYXR1cmVzIGRpcmVjdGx5IChlLmcuIFRTUykuXG4gICAqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHV0aWxzLnNoYTI1Nih0aGlzLl9hdmF4VHJhbnNhY3Rpb24uZ2V0VW5zaWduZWRUeCgpLnRvQnVmZmVyKCkpO1xuICB9XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyQXZheC5mcm9tKHV0aWxzLnNoYTI1Nih0aGlzLl9hdmF4VHJhbnNhY3Rpb24udG9CdWZmZXIoKSkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLl9uZXR3b3JrLmhycCwgdGhpcy5fbmV0d29yay5hbGlhcywgYSkpO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGEpID0+IHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLl9uZXR3b3JrLmhycCwgdGhpcy5fbmV0d29yay5hbGlhcywgYSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KVxuICAgICAgICAgIC5nZXRPdXRzKClcbiAgICAgICAgICAubWFwKHV0aWxzLmRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgaWYgKHV0aWxzLmlzVHJhbnNhY3Rpb25PZih0aGlzLl9hdmF4VHJhbnNhY3Rpb24sIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKSkge1xuICAgICAgICAgIHJldHVybiAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEVWTUV4cG9ydFR4KVxuICAgICAgICAgICAgLmdldEV4cG9ydGVkT3V0cHV0cygpXG4gICAgICAgICAgICAubWFwKHV0aWxzLmRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFeHBvcnRUeClcbiAgICAgICAgICAgIC5nZXRFeHBvcnRPdXRwdXRzKClcbiAgICAgICAgICAgIC5tYXAodXRpbHMuZGVwcmVjYXRlZE1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICAgICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3I6XG4gICAgICAgIC8vIEdldCBzdGFrZWQgb3V0cHV0c1xuICAgICAgICBjb25zdCBhZGRWYWxpZGF0b3JUeCA9IHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBBZGREZWxlZ2F0b3JUeDtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBhZGRWYWxpZGF0b3JUeC5nZXROb2RlSURTdHJpbmcoKSxcbiAgICAgICAgICAgIHZhbHVlOiBhZGRWYWxpZGF0b3JUeC5nZXRTdGFrZUFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgVHJhbnNhc2N0aW9uIEZlZS5cbiAgICovXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIGdldCBjaGFuZ2VPdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIC8vIEMtY2hhaW4gdHggYWRuIEltcG9ydCBUeHMgZG9uJ3QgaGF2ZSBjaGFuZ2Ugb3V0cHV0c1xuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkltcG9ydCB8fFxuICAgICAgdXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIGdlbmVyYWwgc3VwcG9ydCBhbnkgdHJhbnNhY3Rpb24gdHlwZSwgYnV0IGl0J3Mgc2NvcGVkIHlldFxuICAgIHJldHVybiAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIFBWTUJhc2VUeCkuZ2V0T3V0cygpLm1hcCh1dGlscy5kZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IEVudHJ5W10ge1xuICAgIGxldCBpbnB1dHM7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgaW5wdXRzID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRJbXBvcnRJbnB1dHMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGlmICh1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFVk1FeHBvcnRUeCkuZ2V0SW5wdXRzKCkubWFwKChldm1JbnB1dCkgPT4gKHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcweCcgKyBldm1JbnB1dC5nZXRBZGRyZXNzU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogbmV3IEJOKChldm1JbnB1dCBhcyBhbnkpLmFtb3VudCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5vbmNlOiBldm1JbnB1dC5nZXROb25jZSgpLnRvTnVtYmVyKCksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0cyA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgUFZNQmFzZVR4KS5nZXRJbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnB1dHMgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIFBWTUJhc2VUeCkuZ2V0SW5zKCk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgYW1vdW50SW5wdXQgPSBpbnB1dC5nZXRJbnB1dCgpIGFzIGFueSBhcyBBbW91bnRJbnB1dDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiB1dGlscy5jYjU4RW5jb2RlKGlucHV0LmdldFR4SUQoKSkgKyBJTlBVVF9TRVBBUkFUT1IgKyB1dGlscy5vdXRwdXRpZHhCdWZmZXJUb051bWJlcihpbnB1dC5nZXRPdXRwdXRJZHgoKSksXG4gICAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICAgIHZhbHVlOiBhbW91bnRJbnB1dC5nZXRBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdmF4IHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ252YWwgPSB1dGlscy5jcmVhdGVTaWduYXR1cmVBdmF4QnVmZmVyKFxuICAgICAgdGhpcy5fbmV0d29yayxcbiAgICAgIEJ1ZmZlckF2YXguZnJvbSh0aGlzLnNpZ25hYmxlUGF5bG9hZCksXG4gICAgICBCdWZmZXJBdmF4LmZyb20ocHJ2KVxuICAgICk7XG4gICAgcmV0dXJuIHNpZ252YWwudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB0eEpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnaW5wdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICd0eXBlJ107XG5cbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0eEpzb24ub3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0eEpzb24uY2hhbmdlT3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcblxuICAgIGxldCByZXdhcmRBZGRyZXNzZXM7XG4gICAgaWYgKFtUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yLCBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBhIFAgY2hhaW5cbiAgICovXG4gIGdldCBpc1RyYW5zYWN0aW9uRm9yQ0NoYWluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBzb3VyY2UgY2hhaW4gaWQgb3IgdW5kZWZpbmVkIGlmIGl0J3MgYSBjcm9zcyBjaGFpbiB0cmFuc2Zlci5cbiAgICovXG4gIGdldCBzb3VyY2VDaGFpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBibG9ja2NoYWluSUQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRTb3VyY2VDaGFpbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFeHBvcnRUeCB8IEVWTUV4cG9ydFR4KS5nZXRCbG9ja2NoYWluSUQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ibG9ja2NoYWluSUR0b0FsaWFzKGJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBkZXN0aW5hdGlvbkNoYWluIG9yIHVuZGVmaW5lZCBpZiBpdCdzIGEgY3Jvc3MgY2hhaW4gdHJhbnNmZXIuXG4gICAqL1xuICBnZXQgZGVzdGluYXRpb25DaGFpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBibG9ja2NoYWluSUQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBJbXBvcnRUeCB8IEVWTUltcG9ydFR4KS5nZXRCbG9ja2NoYWluSUQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRXhwb3J0VHggfCBFVk1FeHBvcnRUeCkuZ2V0RGVzdGluYXRpb25DaGFpbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJsb2NrY2hhaW5JRHRvQWxpYXMoYmxvY2tjaGFpbklEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgYmxvY2tjaGFpbklkIGJ1ZmZlciB0byBzdHJpbmcgYW5kIHJldHVybiBQIG9yIEMgYWxpYXMgaWYgbWF0Y2ggb2YgYW55IG9mIHRoYXQgY2hhaW5zLlxuICAgKiBAcGFyYW0ge0J1ZmZlckF2YXh9IGJsb2NrY2hhaW5JREJ1ZmZlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJsb2NjaGFpbklEIG9yIGFsaWFzIGlmIGV4aXN0cy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYmxvY2tjaGFpbklEdG9BbGlhcyhibG9ja2NoYWluSURCdWZmZXI6IEJ1ZmZlckF2YXgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJsb2NrY2hhaW5JZCA9IHV0aWxzLmNiNThFbmNvZGUoYmxvY2tjaGFpbklEQnVmZmVyKTtcbiAgICBzd2l0Y2ggKGJsb2NrY2hhaW5JZCkge1xuICAgICAgY2FzZSB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRDpcbiAgICAgICAgcmV0dXJuICdDJztcbiAgICAgIGNhc2UgdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQ6XG4gICAgICAgIHJldHVybiAnUCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYmxvY2tjaGFpbklkO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
-
import BigNumber from 'bignumber.js';
|
|
3
|
-
import { BaseAddress, BaseKey, BaseTransactionBuilder, TransactionType, BaseTransaction } from '@bitgo/sdk-core';
|
|
4
|
-
import { DeprecatedTransaction } from './deprecatedTransaction';
|
|
5
|
-
import { KeyPair } from './keyPair';
|
|
6
|
-
import { BN, Buffer as BufferAvax } from 'avalanche';
|
|
7
|
-
import { DecodedUtxoObj, DeprecatedTx } from './iface';
|
|
8
|
-
export declare abstract class DeprecatedTransactionBuilder extends BaseTransactionBuilder {
|
|
9
|
-
private _transaction;
|
|
10
|
-
_signer: KeyPair[];
|
|
11
|
-
protected recoverSigner: boolean;
|
|
12
|
-
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
13
|
-
/**
|
|
14
|
-
* Initialize the transaction builder fields using the decoded transaction data
|
|
15
|
-
*
|
|
16
|
-
* @param {DeprecatedTx} tx the transaction data
|
|
17
|
-
* @returns itself
|
|
18
|
-
*/
|
|
19
|
-
initBuilder(tx: DeprecatedTx): this;
|
|
20
|
-
/** @inheritdoc */
|
|
21
|
-
protected fromImplementation(rawTransaction: string): DeprecatedTransaction;
|
|
22
|
-
/** @inheritdoc */
|
|
23
|
-
protected buildImplementation(): Promise<DeprecatedTransaction>;
|
|
24
|
-
/**
|
|
25
|
-
* Builds the avax transaction. transaction field is changed.
|
|
26
|
-
*/
|
|
27
|
-
protected abstract buildAvaxTransaction(): void;
|
|
28
|
-
/**
|
|
29
|
-
* When using recovery key must be set here
|
|
30
|
-
* TODO: STLX-17317 recovery key signing
|
|
31
|
-
* @param {boolean} true if it's recovery signer, default true.
|
|
32
|
-
*/
|
|
33
|
-
recoverMode(recoverSigner?: boolean): this;
|
|
34
|
-
/**
|
|
35
|
-
* Threshold is an int that names the number of unique signatures required to spend the output.
|
|
36
|
-
* Must be less than or equal to the length of Addresses.
|
|
37
|
-
* @param {number}
|
|
38
|
-
*/
|
|
39
|
-
threshold(value: number): this;
|
|
40
|
-
/**
|
|
41
|
-
* Locktime is a long that contains the unix timestamp that this output can be spent after.
|
|
42
|
-
* The unix timestamp is specific to the second.
|
|
43
|
-
* @param value
|
|
44
|
-
*/
|
|
45
|
-
locktime(value: string | number): this;
|
|
46
|
-
/**
|
|
47
|
-
* fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output.
|
|
48
|
-
* @param {string | stirng[]} senderPubKey
|
|
49
|
-
*/
|
|
50
|
-
fromPubKey(senderPubKey: string | string[]): this;
|
|
51
|
-
/**
|
|
52
|
-
* List of UTXO required as inputs.
|
|
53
|
-
* A UTXO is a standalone representation of a transaction output.
|
|
54
|
-
*
|
|
55
|
-
* @param {DecodedUtxoObj[]} list of UTXOS
|
|
56
|
-
*/
|
|
57
|
-
utxos(value: DecodedUtxoObj[]): this;
|
|
58
|
-
/**
|
|
59
|
-
* Getter for know if build should sign
|
|
60
|
-
*/
|
|
61
|
-
get hasSigner(): boolean;
|
|
62
|
-
/** @inheritdoc */
|
|
63
|
-
protected get transaction(): DeprecatedTransaction;
|
|
64
|
-
protected set transaction(transaction: DeprecatedTransaction);
|
|
65
|
-
/** @inheritdoc */
|
|
66
|
-
protected signImplementation({ key }: BaseKey): BaseTransaction;
|
|
67
|
-
protected abstract get transactionType(): TransactionType;
|
|
68
|
-
/**
|
|
69
|
-
* Validates the threshold
|
|
70
|
-
* @param threshold
|
|
71
|
-
*/
|
|
72
|
-
validateThreshold(threshold: number): void;
|
|
73
|
-
/**
|
|
74
|
-
* Validates locktime
|
|
75
|
-
* @param locktime
|
|
76
|
-
*/
|
|
77
|
-
validateLocktime(locktime: BN): void;
|
|
78
|
-
/** @inheritdoc */
|
|
79
|
-
validateAddress(address: BaseAddress, addressFormat?: string): void;
|
|
80
|
-
/** @inheritdoc */
|
|
81
|
-
validateKey({ key }: BaseKey): void;
|
|
82
|
-
/**
|
|
83
|
-
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
84
|
-
* It overrides abstract method from BaseTransactionBuilder
|
|
85
|
-
*
|
|
86
|
-
* @param rawTransaction Transaction in any format
|
|
87
|
-
*/
|
|
88
|
-
validateRawTransaction(rawTransaction: string): void;
|
|
89
|
-
/** @inheritdoc */
|
|
90
|
-
validateTransaction(transaction?: DeprecatedTransaction): void;
|
|
91
|
-
/** @inheritdoc */
|
|
92
|
-
validateValue(value: BigNumber): void;
|
|
93
|
-
/**
|
|
94
|
-
* Check the list of UTXOS is empty and check each UTXO.
|
|
95
|
-
* @param values
|
|
96
|
-
*/
|
|
97
|
-
validateUtxos(values: DecodedUtxoObj[]): void;
|
|
98
|
-
/**
|
|
99
|
-
* Check the UTXO has expected fields.
|
|
100
|
-
* @param UTXO
|
|
101
|
-
*/
|
|
102
|
-
validateUtxo(value: DecodedUtxoObj): void;
|
|
103
|
-
/**
|
|
104
|
-
* Check the amount is positive.
|
|
105
|
-
* @param amount
|
|
106
|
-
*/
|
|
107
|
-
validateAmount(amount: BN): void;
|
|
108
|
-
/**
|
|
109
|
-
* Check the buffer has 32 byte long.
|
|
110
|
-
* @param chainID
|
|
111
|
-
*/
|
|
112
|
-
validateChainId(chainID: BufferAvax): void;
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=deprecatedTransactionBuilder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deprecatedTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/deprecatedTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EACtB,eAAe,EAEf,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvD,8BAAsB,4BAA6B,SAAQ,sBAAsB;IAC/E,OAAO,CAAC,YAAY,CAAwB;IACrC,OAAO,EAAE,OAAO,EAAE,CAAM;IAC/B,SAAS,CAAC,aAAa,UAAS;gBAEpB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAYnC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,qBAAqB;IAO3E,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IASrE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,IAAI;IAG/C;;;;OAIG;IACI,WAAW,CAAC,aAAa,UAAO,GAAG,IAAI;IAK9C;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMtC;;;OAGG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMjD;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAMpC;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,qBAAqB,CAEjD;IAED,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,qBAAqB,EAE3D;IAED,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,eAAe;IAK/D,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAK1D;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1C;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI;IAMpC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE,kBAAkB;IAClB,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI;IAMnC;;;;;OAKG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,qBAAqB,GAAG,IAAI;IAI9D,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAO7C;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAMzC;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI;IAMhC;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAO3C"}
|