@bitgo-beta/abstract-substrate 1.0.1-beta.8 → 1.0.1-beta.800
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/dist/src/abstractSubstrateCoin.d.ts +60 -3
- package/dist/src/abstractSubstrateCoin.d.ts.map +1 -1
- package/dist/src/abstractSubstrateCoin.js +374 -15
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +16 -1
- package/dist/src/lib/constants.d.ts +2 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +5 -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/iface.d.ts +250 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +83 -0
- package/dist/src/lib/index.d.ts +12 -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 +31 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +110 -0
- package/dist/src/lib/nativeTransferBuilder.d.ts +61 -0
- package/dist/src/lib/nativeTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/nativeTransferBuilder.js +150 -0
- package/dist/src/lib/singletonRegistry.d.ts +8 -0
- package/dist/src/lib/singletonRegistry.d.ts.map +1 -0
- package/dist/src/lib/singletonRegistry.js +20 -0
- package/dist/src/lib/transaction.d.ts +74 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +553 -0
- package/dist/src/lib/transactionBuilder.d.ts +121 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +334 -0
- package/dist/src/lib/transferBuilder.d.ts +6 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +11 -0
- package/dist/src/lib/txnSchema.d.ts +12 -0
- package/dist/src/lib/txnSchema.d.ts.map +1 -0
- package/dist/src/lib/txnSchema.js +71 -0
- package/dist/src/lib/utils.d.ts +139 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +281 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -6
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -10
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { BaseAddress, BaseKey, PublicKey as BasePublicKey, BaseTransactionBuilder, FeeOptions, SequenceId, Signature, TransactionType, ValidityWindow } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { UnsignedTransaction } from '@substrate/txwrapper-core';
|
|
4
|
+
import { DecodedSignedTx, DecodedSigningPayload, TypeRegistry } from '@substrate/txwrapper-core/lib/types';
|
|
5
|
+
import BigNumber from 'bignumber.js';
|
|
6
|
+
import { CreateBaseTxInfo, Material, TxMethod } from './iface';
|
|
7
|
+
import { KeyPair } from './keyPair';
|
|
8
|
+
import { Transaction } from './transaction';
|
|
9
|
+
export declare abstract class TransactionBuilder<TMethod = TxMethod, TTransaction extends Transaction = Transaction> extends BaseTransactionBuilder {
|
|
10
|
+
protected _transaction: TTransaction;
|
|
11
|
+
protected _keyPair: KeyPair;
|
|
12
|
+
protected _signature?: string;
|
|
13
|
+
protected _sender: string;
|
|
14
|
+
protected _blockNumber: number;
|
|
15
|
+
protected _referenceBlock: string;
|
|
16
|
+
protected _nonce: number;
|
|
17
|
+
protected _tip?: number;
|
|
18
|
+
protected _eraPeriod?: number;
|
|
19
|
+
protected _registry: TypeRegistry;
|
|
20
|
+
protected _method?: TMethod;
|
|
21
|
+
protected _material: Material;
|
|
22
|
+
protected _signatures: Signature[];
|
|
23
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
24
|
+
/**
|
|
25
|
+
* Sets the address of sending account.
|
|
26
|
+
*
|
|
27
|
+
* @param {BaseAddress} address The SS58-encoded address.
|
|
28
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
29
|
+
*
|
|
30
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
31
|
+
*/
|
|
32
|
+
sender({ address }: BaseAddress): this;
|
|
33
|
+
/**
|
|
34
|
+
* The nonce for this transaction.
|
|
35
|
+
*
|
|
36
|
+
* @param {number} nonce
|
|
37
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
38
|
+
*
|
|
39
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
40
|
+
*/
|
|
41
|
+
sequenceId(nonce: SequenceId): this;
|
|
42
|
+
/**
|
|
43
|
+
* The tip to increase transaction priority.
|
|
44
|
+
*
|
|
45
|
+
* @param {number | undefined} [fee.type] options for building fee tx
|
|
46
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
47
|
+
*
|
|
48
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
49
|
+
*/
|
|
50
|
+
fee(fee: FeeOptions): this;
|
|
51
|
+
/**
|
|
52
|
+
* The number of the checkpoint block after which the transaction is valid
|
|
53
|
+
*
|
|
54
|
+
* @param {ValidityWindow} firstValid block checkpoint where transaction is first valid
|
|
55
|
+
* @param {ValidityWindow} maxDuration number of blocks after checkpoint for which transaction is valid
|
|
56
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
57
|
+
*
|
|
58
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
59
|
+
*/
|
|
60
|
+
validity({ firstValid, maxDuration }: ValidityWindow): this;
|
|
61
|
+
/**
|
|
62
|
+
* The hash of the checkpoint block.
|
|
63
|
+
*
|
|
64
|
+
* @param {number} referenceBlock block hash checkpoint from where the transaction is valid
|
|
65
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
66
|
+
*
|
|
67
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
68
|
+
* @see https://wiki.polkadot.network/docs/build-protocol-info#transaction-mortality
|
|
69
|
+
*/
|
|
70
|
+
referenceBlock(referenceBlock: string): this;
|
|
71
|
+
private method;
|
|
72
|
+
/**
|
|
73
|
+
* The material data for the block.
|
|
74
|
+
*
|
|
75
|
+
* @param {Material} material
|
|
76
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
77
|
+
*
|
|
78
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
79
|
+
*/
|
|
80
|
+
material(material: Material): this;
|
|
81
|
+
/** @inheritdoc */
|
|
82
|
+
protected get transaction(): TTransaction;
|
|
83
|
+
/** @inheritdoc */
|
|
84
|
+
protected set transaction(transaction: TTransaction);
|
|
85
|
+
/** @inheritdoc */
|
|
86
|
+
protected fromImplementation(rawTransaction: string): TTransaction;
|
|
87
|
+
getMethodAndArguments(): string;
|
|
88
|
+
/** @inheritdoc */
|
|
89
|
+
protected buildImplementation(): Promise<TTransaction>;
|
|
90
|
+
protected createBaseTxInfo(): CreateBaseTxInfo;
|
|
91
|
+
/**
|
|
92
|
+
* Builds the specific transaction builder internally
|
|
93
|
+
* using the @substrate/txwrapper builder.
|
|
94
|
+
*/
|
|
95
|
+
protected abstract buildTransaction(): UnsignedTransaction;
|
|
96
|
+
/**
|
|
97
|
+
* The transaction type.
|
|
98
|
+
*/
|
|
99
|
+
protected abstract get transactionType(): TransactionType;
|
|
100
|
+
/** @inheritdoc */
|
|
101
|
+
validateAddress(address: BaseAddress, addressFormat?: string): void;
|
|
102
|
+
/** @inheritdoc */
|
|
103
|
+
validateKey({ key }: BaseKey): void;
|
|
104
|
+
/**
|
|
105
|
+
* Validates the specific transaction builder internally
|
|
106
|
+
*/
|
|
107
|
+
protected abstract validateDecodedTransaction(decodedTxn: DecodedSigningPayload | DecodedSignedTx, rawTransaction?: string): void;
|
|
108
|
+
/** @inheritdoc */
|
|
109
|
+
validateRawTransaction(rawTransaction: string): void;
|
|
110
|
+
/** @inheritdoc */
|
|
111
|
+
validateTransaction(_: TTransaction): void;
|
|
112
|
+
private validateBaseFields;
|
|
113
|
+
/** @inheritdoc */
|
|
114
|
+
validateValue(value: BigNumber): void;
|
|
115
|
+
/** @inheritdoc */
|
|
116
|
+
addSignature(publicKey: BasePublicKey, signature: Buffer): void;
|
|
117
|
+
/** @inheritdoc */
|
|
118
|
+
protected signImplementation({ key }: BaseKey): TTransaction;
|
|
119
|
+
protected getAddressFormat(): number;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=transactionBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,334 @@
|
|
|
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.TransactionBuilder = void 0;
|
|
40
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
+
const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
|
|
42
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
43
|
+
const _ = __importStar(require("lodash"));
|
|
44
|
+
const constants_1 = require("./constants");
|
|
45
|
+
const errors_1 = require("./errors");
|
|
46
|
+
const keyPair_1 = require("./keyPair");
|
|
47
|
+
const singletonRegistry_1 = require("./singletonRegistry");
|
|
48
|
+
const transaction_1 = require("./transaction");
|
|
49
|
+
const txnSchema_1 = require("./txnSchema");
|
|
50
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
51
|
+
class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
52
|
+
constructor(_coinConfig) {
|
|
53
|
+
super(_coinConfig);
|
|
54
|
+
// signatures that will be used to sign a transaction when building
|
|
55
|
+
// not the same as the _signatures in transaction which is the signature in
|
|
56
|
+
// string hex format used for validation after we call .build()
|
|
57
|
+
this._signatures = []; // only support single sig for now
|
|
58
|
+
this._transaction = new transaction_1.Transaction(_coinConfig);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Sets the address of sending account.
|
|
62
|
+
*
|
|
63
|
+
* @param {BaseAddress} address The SS58-encoded address.
|
|
64
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
65
|
+
*
|
|
66
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
67
|
+
*/
|
|
68
|
+
sender({ address }) {
|
|
69
|
+
this.validateAddress({ address });
|
|
70
|
+
this._sender = address;
|
|
71
|
+
this._transaction.sender(address);
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The nonce for this transaction.
|
|
76
|
+
*
|
|
77
|
+
* @param {number} nonce
|
|
78
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
79
|
+
*
|
|
80
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
81
|
+
*/
|
|
82
|
+
sequenceId(nonce) {
|
|
83
|
+
const value = new bignumber_js_1.default(nonce.value);
|
|
84
|
+
this.validateValue(value);
|
|
85
|
+
this._nonce = value.toNumber();
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The tip to increase transaction priority.
|
|
90
|
+
*
|
|
91
|
+
* @param {number | undefined} [fee.type] options for building fee tx
|
|
92
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
93
|
+
*
|
|
94
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
95
|
+
*/
|
|
96
|
+
fee(fee) {
|
|
97
|
+
if (fee.type !== 'tip') {
|
|
98
|
+
throw new errors_1.InvalidFeeError(fee.type, 'tip');
|
|
99
|
+
}
|
|
100
|
+
const tipBN = new bignumber_js_1.default(fee.amount);
|
|
101
|
+
this.validateValue(tipBN);
|
|
102
|
+
this._tip = tipBN.toNumber();
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The number of the checkpoint block after which the transaction is valid
|
|
107
|
+
*
|
|
108
|
+
* @param {ValidityWindow} firstValid block checkpoint where transaction is first valid
|
|
109
|
+
* @param {ValidityWindow} maxDuration number of blocks after checkpoint for which transaction is valid
|
|
110
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
111
|
+
*
|
|
112
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
113
|
+
*/
|
|
114
|
+
validity({ firstValid, maxDuration }) {
|
|
115
|
+
if (!_.isUndefined(firstValid)) {
|
|
116
|
+
this.validateValue(new bignumber_js_1.default(firstValid));
|
|
117
|
+
this._blockNumber = firstValid;
|
|
118
|
+
}
|
|
119
|
+
if (!_.isUndefined(maxDuration)) {
|
|
120
|
+
this.validateValue(new bignumber_js_1.default(maxDuration));
|
|
121
|
+
this._eraPeriod = maxDuration;
|
|
122
|
+
}
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The hash of the checkpoint block.
|
|
127
|
+
*
|
|
128
|
+
* @param {number} referenceBlock block hash checkpoint from where the transaction is valid
|
|
129
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
130
|
+
*
|
|
131
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
132
|
+
* @see https://wiki.polkadot.network/docs/build-protocol-info#transaction-mortality
|
|
133
|
+
*/
|
|
134
|
+
referenceBlock(referenceBlock) {
|
|
135
|
+
this._referenceBlock = referenceBlock;
|
|
136
|
+
return this;
|
|
137
|
+
}
|
|
138
|
+
method(method) {
|
|
139
|
+
this._method = method;
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The material data for the block.
|
|
144
|
+
*
|
|
145
|
+
* @param {Material} material
|
|
146
|
+
* @returns {TransactionBuilder} This transaction builder.
|
|
147
|
+
*
|
|
148
|
+
* @see https://wiki.polkadot.network/docs/build-transaction-construction
|
|
149
|
+
*/
|
|
150
|
+
material(material) {
|
|
151
|
+
this._material = material;
|
|
152
|
+
this._registry = singletonRegistry_1.SingletonRegistry.getInstance(material);
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
/** @inheritdoc */
|
|
156
|
+
get transaction() {
|
|
157
|
+
return this._transaction;
|
|
158
|
+
}
|
|
159
|
+
/** @inheritdoc */
|
|
160
|
+
set transaction(transaction) {
|
|
161
|
+
this._transaction = transaction;
|
|
162
|
+
}
|
|
163
|
+
/** @inheritdoc */
|
|
164
|
+
fromImplementation(rawTransaction) {
|
|
165
|
+
const decodedTxn = (0, txwrapper_polkadot_1.decode)(rawTransaction, {
|
|
166
|
+
metadataRpc: this._material.metadata,
|
|
167
|
+
registry: this._registry,
|
|
168
|
+
});
|
|
169
|
+
if (utils_1.default.isSigningPayload(decodedTxn)) {
|
|
170
|
+
this.referenceBlock(decodedTxn.blockHash);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
const keypair = utils_1.default.decodeSubstrateAddressToKeyPair(decodedTxn.address);
|
|
174
|
+
this.sender({ address: keypair.getAddress(this.getAddressFormat()) });
|
|
175
|
+
const edSignature = utils_1.default.recoverSignatureFromRawTx(rawTransaction, { registry: this._registry });
|
|
176
|
+
this.addSignature(keypair.getKeys(), Buffer.from(edSignature, 'hex'));
|
|
177
|
+
}
|
|
178
|
+
this.validity({ maxDuration: decodedTxn.eraPeriod });
|
|
179
|
+
this.sequenceId({
|
|
180
|
+
name: 'Nonce',
|
|
181
|
+
keyword: 'nonce',
|
|
182
|
+
value: decodedTxn.nonce,
|
|
183
|
+
});
|
|
184
|
+
if (decodedTxn.tip) {
|
|
185
|
+
this.fee({ amount: `${decodedTxn.tip}`, type: 'tip' });
|
|
186
|
+
}
|
|
187
|
+
this.method(decodedTxn.method);
|
|
188
|
+
return this._transaction;
|
|
189
|
+
}
|
|
190
|
+
getMethodAndArguments() {
|
|
191
|
+
this.validateTransaction(this.transaction);
|
|
192
|
+
const unsignedTransaction = this.buildTransaction();
|
|
193
|
+
return unsignedTransaction.method;
|
|
194
|
+
}
|
|
195
|
+
/** @inheritdoc */
|
|
196
|
+
async buildImplementation() {
|
|
197
|
+
this.transaction.setTransaction(this.buildTransaction());
|
|
198
|
+
this.transaction.transactionType(this.transactionType);
|
|
199
|
+
this.transaction.registry(this._registry);
|
|
200
|
+
this.transaction.chainName(this._material.chainName);
|
|
201
|
+
if (this._keyPair) {
|
|
202
|
+
this.transaction.sign(this._keyPair);
|
|
203
|
+
}
|
|
204
|
+
if (this._signatures?.length > 0) {
|
|
205
|
+
// if we have a signature, apply that and update this._signedTransaction
|
|
206
|
+
this.transaction.constructSignedPayload(this._signatures[0].signature);
|
|
207
|
+
}
|
|
208
|
+
this._transaction.loadInputsAndOutputs();
|
|
209
|
+
return this._transaction;
|
|
210
|
+
}
|
|
211
|
+
createBaseTxInfo() {
|
|
212
|
+
return {
|
|
213
|
+
baseTxInfo: {
|
|
214
|
+
address: this._sender,
|
|
215
|
+
blockHash: this._referenceBlock,
|
|
216
|
+
blockNumber: this._registry.createType('BlockNumber', this._blockNumber).toNumber(),
|
|
217
|
+
eraPeriod: this._eraPeriod,
|
|
218
|
+
genesisHash: this._material.genesisHash,
|
|
219
|
+
metadataRpc: this._material.metadata,
|
|
220
|
+
specVersion: this._material.specVersion,
|
|
221
|
+
transactionVersion: this._material.txVersion,
|
|
222
|
+
nonce: this._nonce,
|
|
223
|
+
tip: this._tip,
|
|
224
|
+
mode: 0,
|
|
225
|
+
},
|
|
226
|
+
options: {
|
|
227
|
+
metadataRpc: this._material.metadata,
|
|
228
|
+
registry: this._registry,
|
|
229
|
+
isImmortalEra: this._eraPeriod === 0,
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// region Validators
|
|
234
|
+
/** @inheritdoc */
|
|
235
|
+
validateAddress(address, addressFormat) {
|
|
236
|
+
if (!utils_1.default.isValidAddress(address.address)) {
|
|
237
|
+
throw new errors_1.AddressValidationError(address.address);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** @inheritdoc */
|
|
241
|
+
validateKey({ key }) {
|
|
242
|
+
let isValidPrivateKeyFromBytes;
|
|
243
|
+
const isValidPrivateKeyFromHex = (0, sdk_core_1.isValidEd25519Seed)(key);
|
|
244
|
+
const isValidPrivateKeyFromBase64 = (0, sdk_core_1.isValidEd25519Seed)(Buffer.from(key, 'base64').toString('hex'));
|
|
245
|
+
try {
|
|
246
|
+
const decodedSeed = utils_1.default.decodeSeed(key);
|
|
247
|
+
isValidPrivateKeyFromBytes = (0, sdk_core_1.isValidEd25519Seed)(Buffer.from(decodedSeed.seed).toString('hex'));
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
isValidPrivateKeyFromBytes = false;
|
|
251
|
+
}
|
|
252
|
+
if (!isValidPrivateKeyFromBytes && !isValidPrivateKeyFromHex && !isValidPrivateKeyFromBase64) {
|
|
253
|
+
throw new sdk_core_1.BuildTransactionError(`Key validation failed`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/** @inheritdoc */
|
|
257
|
+
validateRawTransaction(rawTransaction) {
|
|
258
|
+
const decodedTxn = (0, txwrapper_polkadot_1.decode)(rawTransaction, {
|
|
259
|
+
metadataRpc: this._material.metadata,
|
|
260
|
+
registry: this._registry,
|
|
261
|
+
});
|
|
262
|
+
const eraPeriod = decodedTxn.eraPeriod;
|
|
263
|
+
const nonce = decodedTxn.nonce;
|
|
264
|
+
const tip = decodedTxn.tip;
|
|
265
|
+
if (utils_1.default.isSigningPayload(decodedTxn)) {
|
|
266
|
+
const blockHash = decodedTxn.blockHash;
|
|
267
|
+
const validationResult = txnSchema_1.SigningPayloadTransactionSchema.validate({
|
|
268
|
+
eraPeriod,
|
|
269
|
+
blockHash,
|
|
270
|
+
nonce,
|
|
271
|
+
tip,
|
|
272
|
+
});
|
|
273
|
+
if (validationResult.error) {
|
|
274
|
+
throw new sdk_core_1.InvalidTransactionError(`Transaction validation failed: ${validationResult.error.message}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const sender = decodedTxn.address;
|
|
279
|
+
const validationResult = txnSchema_1.SignedTransactionSchema.validate({
|
|
280
|
+
sender,
|
|
281
|
+
nonce,
|
|
282
|
+
eraPeriod,
|
|
283
|
+
tip,
|
|
284
|
+
});
|
|
285
|
+
if (validationResult.error) {
|
|
286
|
+
throw new sdk_core_1.InvalidTransactionError(`Transaction validation failed: ${validationResult.error.message}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
this.validateDecodedTransaction(decodedTxn, rawTransaction);
|
|
290
|
+
}
|
|
291
|
+
/** @inheritdoc */
|
|
292
|
+
validateTransaction(_) {
|
|
293
|
+
this.validateBaseFields(this._sender, this._blockNumber, this._referenceBlock, this._material.genesisHash, this._material.chainName, this._nonce, this._material.specVersion, this._material.specName, this._material.txVersion, this._eraPeriod, this._tip);
|
|
294
|
+
}
|
|
295
|
+
validateBaseFields(sender, blockNumber, blockHash, genesisHash, chainName, nonce, specVersion, specName, transactionVersion, eraPeriod, tip) {
|
|
296
|
+
const validationResult = txnSchema_1.BaseTransactionSchema.validate({
|
|
297
|
+
sender,
|
|
298
|
+
blockNumber,
|
|
299
|
+
blockHash,
|
|
300
|
+
genesisHash,
|
|
301
|
+
chainName,
|
|
302
|
+
nonce,
|
|
303
|
+
specVersion,
|
|
304
|
+
specName,
|
|
305
|
+
transactionVersion,
|
|
306
|
+
eraPeriod,
|
|
307
|
+
tip,
|
|
308
|
+
});
|
|
309
|
+
if (validationResult.error) {
|
|
310
|
+
throw new sdk_core_1.InvalidTransactionError(`Transaction validation failed: ${validationResult.error.message}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/** @inheritdoc */
|
|
314
|
+
validateValue(value) {
|
|
315
|
+
if (value.isLessThan(0)) {
|
|
316
|
+
throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// endregion
|
|
320
|
+
/** @inheritdoc */
|
|
321
|
+
addSignature(publicKey, signature) {
|
|
322
|
+
this._signatures.push({ publicKey, signature });
|
|
323
|
+
}
|
|
324
|
+
/** @inheritdoc */
|
|
325
|
+
signImplementation({ key }) {
|
|
326
|
+
this._keyPair = new keyPair_1.KeyPair({ prv: key });
|
|
327
|
+
return this._transaction;
|
|
328
|
+
}
|
|
329
|
+
getAddressFormat() {
|
|
330
|
+
return constants_1.DEFAULT_SUBSTRATE_PREFIX;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
exports.TransactionBuilder = TransactionBuilder;
|
|
334
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBYThCO0FBSTlCLHNFQUF1RDtBQUN2RCxnRUFBcUM7QUFDckMsMENBQTRCO0FBQzVCLDJDQUF1RDtBQUN2RCxxQ0FBbUU7QUFFbkUsdUNBQW9DO0FBQ3BDLDJEQUF3RDtBQUN4RCwrQ0FBNEM7QUFDNUMsMkNBQThHO0FBQzlHLG9EQUE0QjtBQUU1QixNQUFzQixrQkFHcEIsU0FBUSxpQ0FBc0I7SUFtQjlCLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBTnJCLG1FQUFtRTtRQUNuRSwyRUFBMkU7UUFDM0UsK0RBQStEO1FBQ3JELGdCQUFXLEdBQWdCLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQztRQUl6RSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkseUJBQVcsQ0FBQyxXQUFXLENBQWlCLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQWU7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFVBQVUsQ0FBQyxLQUFpQjtRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLHNCQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEdBQUcsQ0FBQyxHQUFlO1FBQ2pCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksd0JBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLHNCQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFrQjtRQUNsRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxzQkFBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHNCQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxjQUFjLENBQUMsY0FBc0I7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sTUFBTSxDQUFDLE1BQWU7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFFBQVEsQ0FBQyxRQUFrQjtRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLHFDQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBYyxXQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQWMsV0FBVyxDQUFDLFdBQXlCO1FBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrQkFBa0I7SUFDUixrQkFBa0IsQ0FBQyxjQUFzQjtRQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFBLDJCQUFNLEVBQUMsY0FBYyxFQUFFO1lBQ3hDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3pCLENBQTRDLENBQUM7UUFDOUMsSUFBSSxlQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sT0FBTyxHQUFHLGVBQUssQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDbEcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2QsSUFBSSxFQUFFLE9BQU87WUFDYixPQUFPLEVBQUUsT0FBTztZQUNoQixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBNEIsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRCxPQUFPLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRXpDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLE9BQU87WUFDTCxVQUFVLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQy9CLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRTtnQkFDbkYsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMxQixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXO2dCQUN2QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO2dCQUNwQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXO2dCQUN2QyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7Z0JBQzVDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbEIsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNkLElBQUksRUFBRSxDQUFDO2FBQ1I7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUTtnQkFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN4QixhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDO2FBQ3JDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFhRCxvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLGVBQWUsQ0FBQyxPQUFvQixFQUFFLGFBQXNCO1FBQzFELElBQUksQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSwrQkFBc0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFXO1FBQzFCLElBQUksMEJBQTBCLENBQUM7UUFDL0IsTUFBTSx3QkFBd0IsR0FBRyxJQUFBLDZCQUFrQixFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sMkJBQTJCLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRyxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxlQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLDBCQUEwQixHQUFHLElBQUEsNkJBQWtCLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakcsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYiwwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksQ0FBQywwQkFBMEIsSUFBSSxDQUFDLHdCQUF3QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUM3RixNQUFNLElBQUksZ0NBQXFCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQVVELGtCQUFrQjtJQUNsQixzQkFBc0IsQ0FBQyxjQUFzQjtRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFBLDJCQUFNLEVBQUMsY0FBYyxFQUFFO1lBQ3hDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3pCLENBQTRDLENBQUM7UUFFOUMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFFM0IsSUFBSSxlQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsMkNBQStCLENBQUMsUUFBUSxDQUFDO2dCQUNoRSxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsS0FBSztnQkFDTCxHQUFHO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLGtDQUF1QixDQUFDLGtDQUFrQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsbUNBQXVCLENBQUMsUUFBUSxDQUFDO2dCQUN4RCxNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsU0FBUztnQkFDVCxHQUFHO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLGtDQUF1QixDQUFDLGtDQUFrQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixtQkFBbUIsQ0FBQyxDQUFlO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsSUFBSSxDQUNWLENBQUM7SUFDSixDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLE1BQWMsRUFDZCxXQUFtQixFQUNuQixTQUFpQixFQUNqQixXQUFtQixFQUNuQixTQUFpQixFQUNqQixLQUFhLEVBQ2IsV0FBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsa0JBQTBCLEVBQzFCLFNBQTZCLEVBQzdCLEdBQXVCO1FBRXZCLE1BQU0sZ0JBQWdCLEdBQUcsaUNBQXFCLENBQUMsUUFBUSxDQUFDO1lBQ3RELE1BQU07WUFDTixXQUFXO1lBQ1gsU0FBUztZQUNULFdBQVc7WUFDWCxTQUFTO1lBQ1QsS0FBSztZQUNMLFdBQVc7WUFDWCxRQUFRO1lBQ1Isa0JBQWtCO1lBQ2xCLFNBQVM7WUFDVCxHQUFHO1NBQ0osQ0FBQyxDQUFDO1FBRUgsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQUMsa0NBQWtDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGFBQWEsQ0FBQyxLQUFnQjtRQUM1QixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsWUFBWSxDQUFDLFNBQXdCLEVBQUUsU0FBaUI7UUFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1Isa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQVc7UUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVTLGdCQUFnQjtRQUN4QixPQUFPLG9DQUF3QixDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQTlXRCxnREE4V0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlQWRkcmVzcyxcbiAgQmFzZUtleSxcbiAgUHVibGljS2V5IGFzIEJhc2VQdWJsaWNLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgRmVlT3B0aW9ucyxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIGlzVmFsaWRFZDI1NTE5U2VlZCxcbiAgU2VxdWVuY2VJZCxcbiAgU2lnbmF0dXJlLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFZhbGlkaXR5V2luZG93LFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBVbnNpZ25lZFRyYW5zYWN0aW9uIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZSc7XG5pbXBvcnQgeyBEZWNvZGVkU2lnbmVkVHgsIERlY29kZWRTaWduaW5nUGF5bG9hZCwgVHlwZVJlZ2lzdHJ5IH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZS9saWIvdHlwZXMnO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItcG9sa2Fkb3QnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9TVUJTVFJBVEVfUFJFRklYIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQWRkcmVzc1ZhbGlkYXRpb25FcnJvciwgSW52YWxpZEZlZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgQ3JlYXRlQmFzZVR4SW5mbywgTWF0ZXJpYWwsIFR4TWV0aG9kIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IFNpbmdsZXRvblJlZ2lzdHJ5IH0gZnJvbSAnLi9zaW5nbGV0b25SZWdpc3RyeSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQmFzZVRyYW5zYWN0aW9uU2NoZW1hLCBTaWduZWRUcmFuc2FjdGlvblNjaGVtYSwgU2lnbmluZ1BheWxvYWRUcmFuc2FjdGlvblNjaGVtYSB9IGZyb20gJy4vdHhuU2NoZW1hJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlcjxcbiAgVE1ldGhvZCA9IFR4TWV0aG9kLFxuICBUVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uXG4+IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRUcmFuc2FjdGlvbjtcbiAgcHJvdGVjdGVkIF9rZXlQYWlyOiBLZXlQYWlyO1xuICBwcm90ZWN0ZWQgX3NpZ25hdHVyZT86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zZW5kZXI6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX2Jsb2NrTnVtYmVyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfcmVmZXJlbmNlQmxvY2s6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9ub25jZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3RpcD86IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9lcmFQZXJpb2Q/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfcmVnaXN0cnk6IFR5cGVSZWdpc3RyeTtcbiAgcHJvdGVjdGVkIF9tZXRob2Q/OiBUTWV0aG9kO1xuICBwcm90ZWN0ZWQgX21hdGVyaWFsOiBNYXRlcmlhbDtcbiAgLy8gc2lnbmF0dXJlcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBzaWduIGEgdHJhbnNhY3Rpb24gd2hlbiBidWlsZGluZ1xuICAvLyBub3QgdGhlIHNhbWUgYXMgdGhlIF9zaWduYXR1cmVzIGluIHRyYW5zYWN0aW9uIHdoaWNoIGlzIHRoZSBzaWduYXR1cmUgaW5cbiAgLy8gc3RyaW5nIGhleCBmb3JtYXQgdXNlZCBmb3IgdmFsaWRhdGlvbiBhZnRlciB3ZSBjYWxsIC5idWlsZCgpXG4gIHByb3RlY3RlZCBfc2lnbmF0dXJlczogU2lnbmF0dXJlW10gPSBbXTsgLy8gb25seSBzdXBwb3J0IHNpbmdsZSBzaWcgZm9yIG5vd1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZykgYXMgVFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFkZHJlc3Mgb2Ygc2VuZGluZyBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VBZGRyZXNzfSBhZGRyZXNzIFRoZSBTUzU4LWVuY29kZWQgYWRkcmVzcy5cbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd2lraS5wb2xrYWRvdC5uZXR3b3JrL2RvY3MvYnVpbGQtdHJhbnNhY3Rpb24tY29uc3RydWN0aW9uXG4gICAqL1xuICBzZW5kZXIoeyBhZGRyZXNzIH06IEJhc2VBZGRyZXNzKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICAgIHRoaXMuX3NlbmRlciA9IGFkZHJlc3M7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2VuZGVyKGFkZHJlc3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBub25jZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5vbmNlXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3dpa2kucG9sa2Fkb3QubmV0d29yay9kb2NzL2J1aWxkLXRyYW5zYWN0aW9uLWNvbnN0cnVjdGlvblxuICAgKi9cbiAgc2VxdWVuY2VJZChub25jZTogU2VxdWVuY2VJZCk6IHRoaXMge1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IEJpZ051bWJlcihub25jZS52YWx1ZSk7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLl9ub25jZSA9IHZhbHVlLnRvTnVtYmVyKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRpcCB0byBpbmNyZWFzZSB0cmFuc2FjdGlvbiBwcmlvcml0eS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IFtmZWUudHlwZV0gb3B0aW9ucyBmb3IgYnVpbGRpbmcgZmVlIHR4XG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3dpa2kucG9sa2Fkb3QubmV0d29yay9kb2NzL2J1aWxkLXRyYW5zYWN0aW9uLWNvbnN0cnVjdGlvblxuICAgKi9cbiAgZmVlKGZlZTogRmVlT3B0aW9ucyk6IHRoaXMge1xuICAgIGlmIChmZWUudHlwZSAhPT0gJ3RpcCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRmVlRXJyb3IoZmVlLnR5cGUsICd0aXAnKTtcbiAgICB9XG4gICAgY29uc3QgdGlwQk4gPSBuZXcgQmlnTnVtYmVyKGZlZS5hbW91bnQpO1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh0aXBCTik7XG4gICAgdGhpcy5fdGlwID0gdGlwQk4udG9OdW1iZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHRoZSBjaGVja3BvaW50IGJsb2NrIGFmdGVyIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiBpcyB2YWxpZFxuICAgKlxuICAgKiBAcGFyYW0ge1ZhbGlkaXR5V2luZG93fSBmaXJzdFZhbGlkIGJsb2NrIGNoZWNrcG9pbnQgd2hlcmUgdHJhbnNhY3Rpb24gaXMgZmlyc3QgdmFsaWRcbiAgICogQHBhcmFtIHtWYWxpZGl0eVdpbmRvd30gbWF4RHVyYXRpb24gbnVtYmVyIG9mIGJsb2NrcyBhZnRlciBjaGVja3BvaW50IGZvciB3aGljaCB0cmFuc2FjdGlvbiBpcyB2YWxpZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBvbGthZG90Lm5ldHdvcmsvZG9jcy9idWlsZC10cmFuc2FjdGlvbi1jb25zdHJ1Y3Rpb25cbiAgICovXG4gIHZhbGlkaXR5KHsgZmlyc3RWYWxpZCwgbWF4RHVyYXRpb24gfTogVmFsaWRpdHlXaW5kb3cpOiB0aGlzIHtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZmlyc3RWYWxpZCkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKGZpcnN0VmFsaWQpKTtcbiAgICAgIHRoaXMuX2Jsb2NrTnVtYmVyID0gZmlyc3RWYWxpZDtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKG1heER1cmF0aW9uKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIobWF4RHVyYXRpb24pKTtcbiAgICAgIHRoaXMuX2VyYVBlcmlvZCA9IG1heER1cmF0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaGFzaCBvZiB0aGUgY2hlY2twb2ludCBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUJsb2NrIGJsb2NrIGhhc2ggY2hlY2twb2ludCBmcm9tIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBpcyB2YWxpZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBvbGthZG90Lm5ldHdvcmsvZG9jcy9idWlsZC10cmFuc2FjdGlvbi1jb25zdHJ1Y3Rpb25cbiAgICogQHNlZSBodHRwczovL3dpa2kucG9sa2Fkb3QubmV0d29yay9kb2NzL2J1aWxkLXByb3RvY29sLWluZm8jdHJhbnNhY3Rpb24tbW9ydGFsaXR5XG4gICAqL1xuICByZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jazogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fcmVmZXJlbmNlQmxvY2sgPSByZWZlcmVuY2VCbG9jaztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgbWV0aG9kKG1ldGhvZDogVE1ldGhvZCk6IHRoaXMge1xuICAgIHRoaXMuX21ldGhvZCA9IG1ldGhvZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWF0ZXJpYWwgZGF0YSBmb3IgdGhlIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBvbGthZG90Lm5ldHdvcmsvZG9jcy9idWlsZC10cmFuc2FjdGlvbi1jb25zdHJ1Y3Rpb25cbiAgICovXG4gIG1hdGVyaWFsKG1hdGVyaWFsOiBNYXRlcmlhbCk6IHRoaXMge1xuICAgIHRoaXMuX21hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgdGhpcy5fcmVnaXN0cnkgPSBTaW5nbGV0b25SZWdpc3RyeS5nZXRJbnN0YW5jZShtYXRlcmlhbCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBUVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgZGVjb2RlZFR4biA9IGRlY29kZShyYXdUcmFuc2FjdGlvbiwge1xuICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX21hdGVyaWFsLm1ldGFkYXRhLFxuICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgIH0pIGFzIERlY29kZWRTaWduaW5nUGF5bG9hZCB8IERlY29kZWRTaWduZWRUeDtcbiAgICBpZiAodXRpbHMuaXNTaWduaW5nUGF5bG9hZChkZWNvZGVkVHhuKSkge1xuICAgICAgdGhpcy5yZWZlcmVuY2VCbG9jayhkZWNvZGVkVHhuLmJsb2NrSGFzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSB1dGlscy5kZWNvZGVTdWJzdHJhdGVBZGRyZXNzVG9LZXlQYWlyKGRlY29kZWRUeG4uYWRkcmVzcyk7XG4gICAgICB0aGlzLnNlbmRlcih7IGFkZHJlc3M6IGtleXBhaXIuZ2V0QWRkcmVzcyh0aGlzLmdldEFkZHJlc3NGb3JtYXQoKSkgfSk7XG4gICAgICBjb25zdCBlZFNpZ25hdHVyZSA9IHV0aWxzLnJlY292ZXJTaWduYXR1cmVGcm9tUmF3VHgocmF3VHJhbnNhY3Rpb24sIHsgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5IH0pO1xuICAgICAgdGhpcy5hZGRTaWduYXR1cmUoa2V5cGFpci5nZXRLZXlzKCksIEJ1ZmZlci5mcm9tKGVkU2lnbmF0dXJlLCAnaGV4JykpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkaXR5KHsgbWF4RHVyYXRpb246IGRlY29kZWRUeG4uZXJhUGVyaW9kIH0pO1xuICAgIHRoaXMuc2VxdWVuY2VJZCh7XG4gICAgICBuYW1lOiAnTm9uY2UnLFxuICAgICAga2V5d29yZDogJ25vbmNlJyxcbiAgICAgIHZhbHVlOiBkZWNvZGVkVHhuLm5vbmNlLFxuICAgIH0pO1xuICAgIGlmIChkZWNvZGVkVHhuLnRpcCkge1xuICAgICAgdGhpcy5mZWUoeyBhbW91bnQ6IGAke2RlY29kZWRUeG4udGlwfWAsIHR5cGU6ICd0aXAnIH0pO1xuICAgIH1cbiAgICB0aGlzLm1ldGhvZChkZWNvZGVkVHhuLm1ldGhvZCBhcyB1bmtub3duIGFzIFRNZXRob2QpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIGdldE1ldGhvZEFuZEFyZ3VtZW50cygpOiBzdHJpbmcge1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbih0aGlzLnRyYW5zYWN0aW9uKTtcbiAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIHVuc2lnbmVkVHJhbnNhY3Rpb24ubWV0aG9kO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih0aGlzLmJ1aWxkVHJhbnNhY3Rpb24oKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi50cmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24ucmVnaXN0cnkodGhpcy5fcmVnaXN0cnkpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uY2hhaW5OYW1lKHRoaXMuX21hdGVyaWFsLmNoYWluTmFtZSk7XG4gICAgaWYgKHRoaXMuX2tleVBhaXIpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uc2lnbih0aGlzLl9rZXlQYWlyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpZ25hdHVyZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBzaWduYXR1cmUsIGFwcGx5IHRoYXQgYW5kIHVwZGF0ZSB0aGlzLl9zaWduZWRUcmFuc2FjdGlvblxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5jb25zdHJ1Y3RTaWduZWRQYXlsb2FkKHRoaXMuX3NpZ25hdHVyZXNbMF0uc2lnbmF0dXJlKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24ubG9hZElucHV0c0FuZE91dHB1dHMoKTtcblxuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVCYXNlVHhJbmZvKCk6IENyZWF0ZUJhc2VUeEluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICBiYXNlVHhJbmZvOiB7XG4gICAgICAgIGFkZHJlc3M6IHRoaXMuX3NlbmRlcixcbiAgICAgICAgYmxvY2tIYXNoOiB0aGlzLl9yZWZlcmVuY2VCbG9jayxcbiAgICAgICAgYmxvY2tOdW1iZXI6IHRoaXMuX3JlZ2lzdHJ5LmNyZWF0ZVR5cGUoJ0Jsb2NrTnVtYmVyJywgdGhpcy5fYmxvY2tOdW1iZXIpLnRvTnVtYmVyKCksXG4gICAgICAgIGVyYVBlcmlvZDogdGhpcy5fZXJhUGVyaW9kLFxuICAgICAgICBnZW5lc2lzSGFzaDogdGhpcy5fbWF0ZXJpYWwuZ2VuZXNpc0hhc2gsXG4gICAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9tYXRlcmlhbC5tZXRhZGF0YSxcbiAgICAgICAgc3BlY1ZlcnNpb246IHRoaXMuX21hdGVyaWFsLnNwZWNWZXJzaW9uLFxuICAgICAgICB0cmFuc2FjdGlvblZlcnNpb246IHRoaXMuX21hdGVyaWFsLnR4VmVyc2lvbixcbiAgICAgICAgbm9uY2U6IHRoaXMuX25vbmNlLFxuICAgICAgICB0aXA6IHRoaXMuX3RpcCxcbiAgICAgICAgbW9kZTogMCxcbiAgICAgIH0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9tYXRlcmlhbC5tZXRhZGF0YSxcbiAgICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgICAgICBpc0ltbW9ydGFsRXJhOiB0aGlzLl9lcmFQZXJpb2QgPT09IDAsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBzcGVjaWZpYyB0cmFuc2FjdGlvbiBidWlsZGVyIGludGVybmFsbHlcbiAgICogdXNpbmcgdGhlIEBzdWJzdHJhdGUvdHh3cmFwcGVyIGJ1aWxkZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRUcmFuc2FjdGlvbigpOiBVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZTtcblxuICAvLyByZWdpb24gVmFsaWRhdG9yc1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IEJhc2VBZGRyZXNzLCBhZGRyZXNzRm9ybWF0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQWRkcmVzc1ZhbGlkYXRpb25FcnJvcihhZGRyZXNzLmFkZHJlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUtleSh7IGtleSB9OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgbGV0IGlzVmFsaWRQcml2YXRlS2V5RnJvbUJ5dGVzO1xuICAgIGNvbnN0IGlzVmFsaWRQcml2YXRlS2V5RnJvbUhleCA9IGlzVmFsaWRFZDI1NTE5U2VlZChrZXkpO1xuICAgIGNvbnN0IGlzVmFsaWRQcml2YXRlS2V5RnJvbUJhc2U2NCA9IGlzVmFsaWRFZDI1NTE5U2VlZChCdWZmZXIuZnJvbShrZXksICdiYXNlNjQnKS50b1N0cmluZygnaGV4JykpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkU2VlZCA9IHV0aWxzLmRlY29kZVNlZWQoa2V5KTtcbiAgICAgIGlzVmFsaWRQcml2YXRlS2V5RnJvbUJ5dGVzID0gaXNWYWxpZEVkMjU1MTlTZWVkKEJ1ZmZlci5mcm9tKGRlY29kZWRTZWVkLnNlZWQpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpc1ZhbGlkUHJpdmF0ZUtleUZyb21CeXRlcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNWYWxpZFByaXZhdGVLZXlGcm9tQnl0ZXMgJiYgIWlzVmFsaWRQcml2YXRlS2V5RnJvbUhleCAmJiAhaXNWYWxpZFByaXZhdGVLZXlGcm9tQmFzZTY0KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBLZXkgdmFsaWRhdGlvbiBmYWlsZWRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBzcGVjaWZpYyB0cmFuc2FjdGlvbiBidWlsZGVyIGludGVybmFsbHlcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB2YWxpZGF0ZURlY29kZWRUcmFuc2FjdGlvbihcbiAgICBkZWNvZGVkVHhuOiBEZWNvZGVkU2lnbmluZ1BheWxvYWQgfCBEZWNvZGVkU2lnbmVkVHgsXG4gICAgcmF3VHJhbnNhY3Rpb24/OiBzdHJpbmdcbiAgKTogdm9pZDtcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGVjb2RlZFR4biA9IGRlY29kZShyYXdUcmFuc2FjdGlvbiwge1xuICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX21hdGVyaWFsLm1ldGFkYXRhLFxuICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgIH0pIGFzIERlY29kZWRTaWduaW5nUGF5bG9hZCB8IERlY29kZWRTaWduZWRUeDtcblxuICAgIGNvbnN0IGVyYVBlcmlvZCA9IGRlY29kZWRUeG4uZXJhUGVyaW9kO1xuICAgIGNvbnN0IG5vbmNlID0gZGVjb2RlZFR4bi5ub25jZTtcbiAgICBjb25zdCB0aXAgPSBkZWNvZGVkVHhuLnRpcDtcblxuICAgIGlmICh1dGlscy5pc1NpZ25pbmdQYXlsb2FkKGRlY29kZWRUeG4pKSB7XG4gICAgICBjb25zdCBibG9ja0hhc2ggPSBkZWNvZGVkVHhuLmJsb2NrSGFzaDtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBTaWduaW5nUGF5bG9hZFRyYW5zYWN0aW9uU2NoZW1hLnZhbGlkYXRlKHtcbiAgICAgICAgZXJhUGVyaW9kLFxuICAgICAgICBibG9ja0hhc2gsXG4gICAgICAgIG5vbmNlLFxuICAgICAgICB0aXAsXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZW5kZXIgPSBkZWNvZGVkVHhuLmFkZHJlc3M7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gU2lnbmVkVHJhbnNhY3Rpb25TY2hlbWEudmFsaWRhdGUoe1xuICAgICAgICBzZW5kZXIsXG4gICAgICAgIG5vbmNlLFxuICAgICAgICBlcmFQZXJpb2QsXG4gICAgICAgIHRpcCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZURlY29kZWRUcmFuc2FjdGlvbihkZWNvZGVkVHhuLCByYXdUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbihfOiBUVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlQmFzZUZpZWxkcyhcbiAgICAgIHRoaXMuX3NlbmRlcixcbiAgICAgIHRoaXMuX2Jsb2NrTnVtYmVyLFxuICAgICAgdGhpcy5fcmVmZXJlbmNlQmxvY2ssXG4gICAgICB0aGlzLl9tYXRlcmlhbC5nZW5lc2lzSGFzaCxcbiAgICAgIHRoaXMuX21hdGVyaWFsLmNoYWluTmFtZSxcbiAgICAgIHRoaXMuX25vbmNlLFxuICAgICAgdGhpcy5fbWF0ZXJpYWwuc3BlY1ZlcnNpb24sXG4gICAgICB0aGlzLl9tYXRlcmlhbC5zcGVjTmFtZSxcbiAgICAgIHRoaXMuX21hdGVyaWFsLnR4VmVyc2lvbixcbiAgICAgIHRoaXMuX2VyYVBlcmlvZCxcbiAgICAgIHRoaXMuX3RpcFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQmFzZUZpZWxkcyhcbiAgICBzZW5kZXI6IHN0cmluZyxcbiAgICBibG9ja051bWJlcjogbnVtYmVyLFxuICAgIGJsb2NrSGFzaDogc3RyaW5nLFxuICAgIGdlbmVzaXNIYXNoOiBzdHJpbmcsXG4gICAgY2hhaW5OYW1lOiBzdHJpbmcsXG4gICAgbm9uY2U6IG51bWJlcixcbiAgICBzcGVjVmVyc2lvbjogbnVtYmVyLFxuICAgIHNwZWNOYW1lOiBzdHJpbmcsXG4gICAgdHJhbnNhY3Rpb25WZXJzaW9uOiBudW1iZXIsXG4gICAgZXJhUGVyaW9kOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgdGlwOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IEJhc2VUcmFuc2FjdGlvblNjaGVtYS52YWxpZGF0ZSh7XG4gICAgICBzZW5kZXIsXG4gICAgICBibG9ja051bWJlcixcbiAgICAgIGJsb2NrSGFzaCxcbiAgICAgIGdlbmVzaXNIYXNoLFxuICAgICAgY2hhaW5OYW1lLFxuICAgICAgbm9uY2UsXG4gICAgICBzcGVjVmVyc2lvbixcbiAgICAgIHNwZWNOYW1lLFxuICAgICAgdHJhbnNhY3Rpb25WZXJzaW9uLFxuICAgICAgZXJhUGVyaW9kLFxuICAgICAgdGlwLFxuICAgIH0pO1xuXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuaXNMZXNzVGhhbigwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZW5kcmVnaW9uXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhZGRTaWduYXR1cmUocHVibGljS2V5OiBCYXNlUHVibGljS2V5LCBzaWduYXR1cmU6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaCh7IHB1YmxpY0tleSwgc2lnbmF0dXJlIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oeyBrZXkgfTogQmFzZUtleSk6IFRUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy5fa2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFkZHJlc3NGb3JtYXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gREVGQVVMVF9TVUJTVFJBVEVfUFJFRklYO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
+
import { NativeTransferBuilder } from './nativeTransferBuilder';
|
|
3
|
+
export declare class TransferBuilder extends NativeTransferBuilder {
|
|
4
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=transferBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,qBAAa,eAAgB,SAAQ,qBAAqB;gBAC5C,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;CAG9C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransferBuilder = void 0;
|
|
4
|
+
const nativeTransferBuilder_1 = require("./nativeTransferBuilder");
|
|
5
|
+
class TransferBuilder extends nativeTransferBuilder_1.NativeTransferBuilder {
|
|
6
|
+
constructor(_coinConfig) {
|
|
7
|
+
super(_coinConfig);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.TransferBuilder = TransferBuilder;
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUVBQWdFO0FBRWhFLE1BQWEsZUFBZ0IsU0FBUSw2Q0FBcUI7SUFDeEQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBSkQsMENBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBOYXRpdmVUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL25hdGl2ZVRyYW5zZmVyQnVpbGRlcic7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBOYXRpdmVUcmFuc2ZlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import joi from 'joi';
|
|
2
|
+
export declare const BaseTransactionSchema: joi.ObjectSchema<any>;
|
|
3
|
+
export declare const SigningPayloadTransactionSchema: joi.ObjectSchema<any>;
|
|
4
|
+
export declare const SignedTransactionSchema: joi.ObjectSchema<any>;
|
|
5
|
+
export declare const TransferTransactionSchema: joi.ObjectSchema<any>;
|
|
6
|
+
export declare const TransferAllTransactionSchema: joi.ObjectSchema<any>;
|
|
7
|
+
export declare const TransferWithMemoTransactionSchema: joi.ObjectSchema<any>;
|
|
8
|
+
export declare const StakeTransactionSchema: joi.ObjectSchema<any>;
|
|
9
|
+
export declare const UnstakeTransactionSchema: joi.ObjectSchema<any>;
|
|
10
|
+
export declare const TransferStakeTransactionSchema: joi.ObjectSchema<any>;
|
|
11
|
+
export declare const MoveStakeTransactionSchema: joi.ObjectSchema<any>;
|
|
12
|
+
//# sourceMappingURL=txnSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txnSchema.d.ts","sourceRoot":"","sources":["../../../src/lib/txnSchema.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAKtB,eAAO,MAAM,qBAAqB,uBAYhC,CAAC;AAEH,eAAO,MAAM,+BAA+B,uBAK1C,CAAC;AAEH,eAAO,MAAM,uBAAuB,uBAKlC,CAAC;AAEH,eAAO,MAAM,yBAAyB,uBAGpC,CAAC;AAEH,eAAO,MAAM,4BAA4B,uBAEvC,CAAC;AAEH,eAAO,MAAM,iCAAiC,uBAI5C,CAAC;AAEH,eAAO,MAAM,sBAAsB,uBAIjC,CAAC;AAEH,eAAO,MAAM,wBAAwB,uBAInC,CAAC;AAEH,eAAO,MAAM,8BAA8B,uBAMzC,CAAC;AAEH,eAAO,MAAM,0BAA0B,uBAMrC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
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.MoveStakeTransactionSchema = exports.TransferStakeTransactionSchema = exports.UnstakeTransactionSchema = exports.StakeTransactionSchema = exports.TransferWithMemoTransactionSchema = exports.TransferAllTransactionSchema = exports.TransferTransactionSchema = exports.SignedTransactionSchema = exports.SigningPayloadTransactionSchema = exports.BaseTransactionSchema = void 0;
|
|
7
|
+
const joi_1 = __importDefault(require("joi"));
|
|
8
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
9
|
+
const addressSchema = joi_1.default.string().custom((addr) => utils_1.default.isValidAddress(addr));
|
|
10
|
+
exports.BaseTransactionSchema = joi_1.default.object({
|
|
11
|
+
sender: addressSchema.required(),
|
|
12
|
+
blockNumber: joi_1.default.number().required(),
|
|
13
|
+
blockHash: joi_1.default.string().required(),
|
|
14
|
+
genesisHash: joi_1.default.string().required(),
|
|
15
|
+
specVersion: joi_1.default.number().required(),
|
|
16
|
+
specName: joi_1.default.string().required(),
|
|
17
|
+
transactionVersion: joi_1.default.number().required(),
|
|
18
|
+
chainName: joi_1.default.string().required(),
|
|
19
|
+
eraPeriod: joi_1.default.number().required(),
|
|
20
|
+
nonce: joi_1.default.number().required(),
|
|
21
|
+
tip: joi_1.default.number().optional(),
|
|
22
|
+
});
|
|
23
|
+
exports.SigningPayloadTransactionSchema = joi_1.default.object({
|
|
24
|
+
eraPeriod: joi_1.default.number().optional(),
|
|
25
|
+
blockHash: joi_1.default.string().required(),
|
|
26
|
+
nonce: joi_1.default.number().required(),
|
|
27
|
+
tip: joi_1.default.number().optional(),
|
|
28
|
+
});
|
|
29
|
+
exports.SignedTransactionSchema = joi_1.default.object({
|
|
30
|
+
sender: addressSchema.required(),
|
|
31
|
+
nonce: joi_1.default.number().required(),
|
|
32
|
+
eraPeriod: joi_1.default.number().optional(),
|
|
33
|
+
tip: joi_1.default.number().optional(),
|
|
34
|
+
});
|
|
35
|
+
exports.TransferTransactionSchema = joi_1.default.object({
|
|
36
|
+
amount: joi_1.default.string().required(),
|
|
37
|
+
to: addressSchema.required(),
|
|
38
|
+
});
|
|
39
|
+
exports.TransferAllTransactionSchema = joi_1.default.object({
|
|
40
|
+
to: addressSchema.required(),
|
|
41
|
+
});
|
|
42
|
+
exports.TransferWithMemoTransactionSchema = joi_1.default.object({
|
|
43
|
+
amount: joi_1.default.string().required(),
|
|
44
|
+
to: addressSchema.required(),
|
|
45
|
+
memo: joi_1.default.string().required(),
|
|
46
|
+
});
|
|
47
|
+
exports.StakeTransactionSchema = joi_1.default.object({
|
|
48
|
+
amountStaked: joi_1.default.string().required(),
|
|
49
|
+
hotkey: joi_1.default.string().required(),
|
|
50
|
+
netuid: joi_1.default.string().required(),
|
|
51
|
+
});
|
|
52
|
+
exports.UnstakeTransactionSchema = joi_1.default.object({
|
|
53
|
+
amountUnstaked: joi_1.default.string().required(),
|
|
54
|
+
hotkey: joi_1.default.string().required(),
|
|
55
|
+
netuid: joi_1.default.string().required(),
|
|
56
|
+
});
|
|
57
|
+
exports.TransferStakeTransactionSchema = joi_1.default.object({
|
|
58
|
+
destinationColdkey: addressSchema.required(),
|
|
59
|
+
hotkey: addressSchema.required(),
|
|
60
|
+
originNetuid: joi_1.default.string().required(),
|
|
61
|
+
destinationNetuid: joi_1.default.string().required(),
|
|
62
|
+
alphaAmount: joi_1.default.string().required(),
|
|
63
|
+
});
|
|
64
|
+
exports.MoveStakeTransactionSchema = joi_1.default.object({
|
|
65
|
+
originHotkey: addressSchema.required(),
|
|
66
|
+
destinationHotkey: addressSchema.required(),
|
|
67
|
+
originNetuid: joi_1.default.string().required(),
|
|
68
|
+
destinationNetuid: joi_1.default.string().required(),
|
|
69
|
+
alphaAmount: joi_1.default.string().required(),
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhuU2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90eG5TY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQXNCO0FBQ3RCLG9EQUE0QjtBQUU1QixNQUFNLGFBQWEsR0FBRyxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFbkUsUUFBQSxxQkFBcUIsR0FBRyxhQUFHLENBQUMsTUFBTSxDQUFDO0lBQzlDLE1BQU0sRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFO0lBQ2hDLFdBQVcsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3BDLFNBQVMsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2xDLFdBQVcsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3BDLFdBQVcsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3BDLFFBQVEsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2pDLGtCQUFrQixFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0MsU0FBUyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbEMsU0FBUyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbEMsS0FBSyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDOUIsR0FBRyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDN0IsQ0FBQyxDQUFDO0FBRVUsUUFBQSwrQkFBK0IsR0FBRyxh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ckMsaUJBQWlCLEVBQUUsYUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMxQyxXQUFXLEVBQUUsYUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgam9pIGZyb20gJ2pvaSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IGFkZHJlc3NTY2hlbWEgPSBqb2kuc3RyaW5nKCkuY3VzdG9tKChhZGRyKSA9PiBVdGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyKSk7XG5cbmV4cG9ydCBjb25zdCBCYXNlVHJhbnNhY3Rpb25TY2hlbWEgPSBqb2kub2JqZWN0KHtcbiAgc2VuZGVyOiBhZGRyZXNzU2NoZW1hLnJlcXVpcmVkKCksXG4gIGJsb2NrTnVtYmVyOiBqb2kubnVtYmVyKCkucmVxdWlyZWQoKSxcbiAgYmxvY2tIYXNoOiBqb2kuc3RyaW5nKCkucmVxdWlyZWQoKSxcbiAgZ2VuZXNpc0hhc2g6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICBzcGVjVmVyc2lvbjogam9pLm51bWJlcigpLnJlcXVpcmVkKCksXG4gIHNwZWNOYW1lOiBqb2kuc3RyaW5nKCkucmVxdWlyZWQoKSxcbiAgdHJhbnNhY3Rpb25WZXJzaW9uOiBqb2kubnVtYmVyKCkucmVxdWlyZWQoKSxcbiAgY2hhaW5OYW1lOiBqb2kuc3RyaW5nKCkucmVxdWlyZWQoKSxcbiAgZXJhUGVyaW9kOiBqb2kubnVtYmVyKCkucmVxdWlyZWQoKSxcbiAgbm9uY2U6IGpvaS5udW1iZXIoKS5yZXF1aXJlZCgpLFxuICB0aXA6IGpvaS5udW1iZXIoKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTaWduaW5nUGF5bG9hZFRyYW5zYWN0aW9uU2NoZW1hID0gam9pLm9iamVjdCh7XG4gIGVyYVBlcmlvZDogam9pLm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGJsb2NrSGFzaDogam9pLnN0cmluZygpLnJlcXVpcmVkKCksXG4gIG5vbmNlOiBqb2kubnVtYmVyKCkucmVxdWlyZWQoKSxcbiAgdGlwOiBqb2kubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2lnbmVkVHJhbnNhY3Rpb25TY2hlbWEgPSBqb2kub2JqZWN0KHtcbiAgc2VuZGVyOiBhZGRyZXNzU2NoZW1hLnJlcXVpcmVkKCksXG4gIG5vbmNlOiBqb2kubnVtYmVyKCkucmVxdWlyZWQoKSxcbiAgZXJhUGVyaW9kOiBqb2kubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdGlwOiBqb2kubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgVHJhbnNmZXJUcmFuc2FjdGlvblNjaGVtYSA9IGpvaS5vYmplY3Qoe1xuICBhbW91bnQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICB0bzogYWRkcmVzc1NjaGVtYS5yZXF1aXJlZCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBUcmFuc2ZlckFsbFRyYW5zYWN0aW9uU2NoZW1hID0gam9pLm9iamVjdCh7XG4gIHRvOiBhZGRyZXNzU2NoZW1hLnJlcXVpcmVkKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFRyYW5zZmVyV2l0aE1lbW9UcmFuc2FjdGlvblNjaGVtYSA9IGpvaS5vYmplY3Qoe1xuICBhbW91bnQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICB0bzogYWRkcmVzc1NjaGVtYS5yZXF1aXJlZCgpLFxuICBtZW1vOiBqb2kuc3RyaW5nKCkucmVxdWlyZWQoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU3Rha2VUcmFuc2FjdGlvblNjaGVtYSA9IGpvaS5vYmplY3Qoe1xuICBhbW91bnRTdGFrZWQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICBob3RrZXk6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICBuZXR1aWQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBVbnN0YWtlVHJhbnNhY3Rpb25TY2hlbWEgPSBqb2kub2JqZWN0KHtcbiAgYW1vdW50VW5zdGFrZWQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICBob3RrZXk6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICBuZXR1aWQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBUcmFuc2ZlclN0YWtlVHJhbnNhY3Rpb25TY2hlbWEgPSBqb2kub2JqZWN0KHtcbiAgZGVzdGluYXRpb25Db2xka2V5OiBhZGRyZXNzU2NoZW1hLnJlcXVpcmVkKCksXG4gIGhvdGtleTogYWRkcmVzc1NjaGVtYS5yZXF1aXJlZCgpLFxuICBvcmlnaW5OZXR1aWQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxuICBkZXN0aW5hdGlvbk5ldHVpZDogam9pLnN0cmluZygpLnJlcXVpcmVkKCksXG4gIGFscGhhQW1vdW50OiBqb2kuc3RyaW5nKCkucmVxdWlyZWQoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgTW92ZVN0YWtlVHJhbnNhY3Rpb25TY2hlbWEgPSBqb2kub2JqZWN0KHtcbiAgb3JpZ2luSG90a2V5OiBhZGRyZXNzU2NoZW1hLnJlcXVpcmVkKCksXG4gIGRlc3RpbmF0aW9uSG90a2V5OiBhZGRyZXNzU2NoZW1hLnJlcXVpcmVkKCksXG4gIG9yaWdpbk5ldHVpZDogam9pLnN0cmluZygpLnJlcXVpcmVkKCksXG4gIGRlc3RpbmF0aW9uTmV0dWlkOiBqb2kuc3RyaW5nKCkucmVxdWlyZWQoKSxcbiAgYWxwaGFBbW91bnQ6IGpvaS5zdHJpbmcoKS5yZXF1aXJlZCgpLFxufSk7XG4iXX0=
|