@bitgo/sdk-coin-cspr 1.0.1-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.eslintignore +4 -0
  2. package/.mocharc.yml +8 -0
  3. package/CHANGELOG.md +8 -0
  4. package/LICENSE +191 -0
  5. package/README.md +39 -0
  6. package/dist/src/cspr.d.ts +101 -0
  7. package/dist/src/cspr.d.ts.map +1 -0
  8. package/dist/src/cspr.js +293 -0
  9. package/dist/src/index.d.ts +4 -0
  10. package/dist/src/index.d.ts.map +1 -0
  11. package/dist/src/index.js +29 -0
  12. package/dist/src/lib/constants.d.ts +19 -0
  13. package/dist/src/lib/constants.d.ts.map +1 -0
  14. package/dist/src/lib/constants.js +28 -0
  15. package/dist/src/lib/delegateBuilder.d.ts +49 -0
  16. package/dist/src/lib/delegateBuilder.d.ts.map +1 -0
  17. package/dist/src/lib/delegateBuilder.js +111 -0
  18. package/dist/src/lib/ifaces.d.ts +69 -0
  19. package/dist/src/lib/ifaces.d.ts.map +1 -0
  20. package/dist/src/lib/ifaces.js +3 -0
  21. package/dist/src/lib/index.d.ts +6 -0
  22. package/dist/src/lib/index.d.ts.map +1 -0
  23. package/dist/src/lib/index.js +31 -0
  24. package/dist/src/lib/keyPair.d.ts +18 -0
  25. package/dist/src/lib/keyPair.d.ts.map +1 -0
  26. package/dist/src/lib/keyPair.js +75 -0
  27. package/dist/src/lib/transaction.d.ts +55 -0
  28. package/dist/src/lib/transaction.d.ts.map +1 -0
  29. package/dist/src/lib/transaction.js +227 -0
  30. package/dist/src/lib/transactionBuilder.d.ts +124 -0
  31. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  32. package/dist/src/lib/transactionBuilder.js +312 -0
  33. package/dist/src/lib/transactionBuilderFactory.d.ts +46 -0
  34. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  35. package/dist/src/lib/transactionBuilderFactory.js +98 -0
  36. package/dist/src/lib/transferBuilder.d.ts +39 -0
  37. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  38. package/dist/src/lib/transferBuilder.js +106 -0
  39. package/dist/src/lib/undelegateBuilder.d.ts +49 -0
  40. package/dist/src/lib/undelegateBuilder.d.ts.map +1 -0
  41. package/dist/src/lib/undelegateBuilder.js +111 -0
  42. package/dist/src/lib/utils.d.ts +188 -0
  43. package/dist/src/lib/utils.d.ts.map +1 -0
  44. package/dist/src/lib/utils.js +477 -0
  45. package/dist/src/lib/walletInitializationBuilder.d.ts +27 -0
  46. package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  47. package/dist/src/lib/walletInitializationBuilder.js +95 -0
  48. package/dist/src/tcspr.d.ts +11 -0
  49. package/dist/src/tcspr.d.ts.map +1 -0
  50. package/dist/src/tcspr.js +24 -0
  51. package/package.json +62 -0
@@ -0,0 +1,124 @@
1
+ import BigNumber from 'bignumber.js';
2
+ import { BaseCoin as CoinConfig } from '@bitgo/statics';
3
+ import { BaseAddress, BaseKey, BaseTransactionBuilder } from '@bitgo/sdk-core';
4
+ import { Transaction } from './transaction';
5
+ import { KeyPair } from './keyPair';
6
+ import { Fee, CasperModuleBytesTransaction, CasperTransferTransaction, CasperDelegateTransaction, SignatureData } from './ifaces';
7
+ export declare const DEFAULT_M = 3;
8
+ export declare const DEFAULT_N = 2;
9
+ export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
10
+ protected _source: BaseAddress;
11
+ protected _fee: Fee;
12
+ private _transaction;
13
+ protected _session: CasperTransferTransaction | CasperModuleBytesTransaction | CasperDelegateTransaction;
14
+ protected _expiration: number;
15
+ protected _multiSignerKeyPairs: KeyPair[];
16
+ protected _signatures: SignatureData[];
17
+ protected _chainName: string;
18
+ constructor(_coinConfig: Readonly<CoinConfig>);
19
+ /** @inheritdoc */
20
+ protected buildImplementation(): Promise<Transaction>;
21
+ /** @inheritdoc */
22
+ protected fromImplementation(rawTransaction: string): Transaction;
23
+ /** @inheritdoc */
24
+ protected signImplementation(key: BaseKey): Transaction;
25
+ /**
26
+ * Initialize the transaction builder fields using the decoded transaction data
27
+ *
28
+ * @param {Transaction} tx the transaction data
29
+ */
30
+ initBuilder(tx: Transaction): void;
31
+ /**
32
+ * Set the transaction fees
33
+ *
34
+ * @param {BaseFee} fee The maximum gas to pay
35
+ * @returns {TransactionBuilder} This transaction builder
36
+ */
37
+ fee(fee: Fee): this;
38
+ /**
39
+ * Set the transaction source
40
+ *
41
+ * @param {BaseAddress} address The source account
42
+ * @returns {TransactionBuilder} This transaction builder
43
+ */
44
+ source(address: BaseAddress): this;
45
+ /**
46
+ * Set the transaction expirationTime
47
+ *
48
+ * @param {string} expirationTime The transaction expirationTime
49
+ * @returns {TransactionBuilder} This transaction builder
50
+ */
51
+ expiration(expirationTime: number): this;
52
+ /**
53
+ * Set an external transaction signature
54
+ *
55
+ * @param {string} signature Hex encoded signature string
56
+ * @param {KeyPair} keyPair The public key keypair that was used to create the signature
57
+ * @returns {TransactionBuilder} This transaction builder
58
+ */
59
+ signature(signature: string, keyPair: KeyPair): this;
60
+ nodeChainName(chainName: string): this;
61
+ /** @inheritdoc */
62
+ validateAddress(address: BaseAddress): void;
63
+ /** @inheritdoc */
64
+ validateKey(key: BaseKey): void;
65
+ /** @inheritdoc */
66
+ validateRawTransaction(rawTransaction: string): void;
67
+ /** @inheritdoc */
68
+ validateTransaction(transaction?: Transaction): void;
69
+ /** @inheritdoc */
70
+ validateValue(value: BigNumber): void;
71
+ /**
72
+ * Validates that the mandatory fields are defined
73
+ */
74
+ validateMandatoryFields(): void;
75
+ /**
76
+ * Validates that the fee field is defined
77
+ */
78
+ private validateFee;
79
+ /**
80
+ * Validates that the source field is defined
81
+ */
82
+ private validateSource;
83
+ /**
84
+ * Validates that the given key is not already in this._multiSignerKeyPairs
85
+ *
86
+ * @param {BaseKey} key - The key to check
87
+ */
88
+ private checkDuplicatedKeys;
89
+ /** @inheritdoc */
90
+ protected get transaction(): Transaction;
91
+ /** @inheritdoc */
92
+ protected set transaction(transaction: Transaction);
93
+ /**
94
+ * Get the chain name for the coin environment
95
+ */
96
+ get chainName(): string;
97
+ /**
98
+ * Generate a DeployParams instance with the transaction data
99
+ *
100
+ * @returns {DeployUtil.DeployParams}
101
+ */
102
+ private getDeployParams;
103
+ /**
104
+ * Generate the session for the Deploy according to the transactionType.
105
+ *
106
+ * @returns {DeployUtil.ExecutableDeployItem}
107
+ */
108
+ private getSession;
109
+ /**
110
+ * Checks whether the transaction has the owner signature
111
+ *
112
+ * @param {string} pub - public key of the signer
113
+ * @returns {boolean} true if the pub key already signed th transaction
114
+ * @private
115
+ */
116
+ private isTransactionSignedByPub;
117
+ /**
118
+ * Add signatures to the transaction
119
+ *
120
+ * @private
121
+ */
122
+ private processSigning;
123
+ }
124
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAMvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,GAAG,EACH,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,EACd,MAAM,UAAU,CAAC;AAIlB,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC;IACpB,OAAO,CAAC,YAAY,CAAc;IAClC,SAAS,CAAC,QAAQ,EAAE,yBAAyB,GAAG,4BAA4B,GAAG,yBAAyB,CAAC;IACzG,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;IAC1C,SAAS,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;IACvC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAS7C,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAwB3D,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAQjE,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAUvD;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAalC;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAMnB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAMlC;;;;;OAKG;IACH,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAUxC;;;;;;OAMG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAcpD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQtC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAM3C,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAM/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAWpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAIpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC;;OAEG;IACH,uBAAuB,IAAI,IAAI;IAK/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAqB3B,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED;;OAEG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAID;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA2BlB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;;OAIG;IACH,OAAO,CAAC,cAAc;CAevB"}
@@ -0,0 +1,312 @@
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.TransactionBuilder = exports.DEFAULT_N = exports.DEFAULT_M = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const casper_js_sdk_1 = require("casper-js-sdk");
9
+ const lodash_1 = __importDefault(require("lodash"));
10
+ const sdk_core_1 = require("@bitgo/sdk-core");
11
+ const transaction_1 = require("./transaction");
12
+ const keyPair_1 = require("./keyPair");
13
+ const utils_1 = require("./utils");
14
+ const constants_1 = require("./constants");
15
+ exports.DEFAULT_M = 3;
16
+ exports.DEFAULT_N = 2;
17
+ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
18
+ constructor(_coinConfig) {
19
+ super(_coinConfig);
20
+ this.transaction = new transaction_1.Transaction(_coinConfig);
21
+ this._multiSignerKeyPairs = [];
22
+ this._signatures = [];
23
+ this._chainName = this.coinName() === 'cspr' ? constants_1.DEFAULT_CHAIN_NAMES.mainnet : constants_1.DEFAULT_CHAIN_NAMES.testnet;
24
+ }
25
+ // region Base Builder
26
+ /** @inheritdoc */
27
+ async buildImplementation() {
28
+ const deployParams = this.getDeployParams();
29
+ const session = this.getSession();
30
+ const payment = casper_js_sdk_1.DeployUtil.standardPayment(lodash_1.default.parseInt(this._fee.gasLimit));
31
+ let cTransaction = this.transaction.casperTx || casper_js_sdk_1.DeployUtil.makeDeploy(deployParams, session, payment);
32
+ // Cannot add arguments to an already signed deploy.
33
+ if (cTransaction.approvals.length === 0) {
34
+ this._session.extraArguments.forEach((extraArgument, extraArgumentName) => {
35
+ if (!cTransaction.session.getArgByName(extraArgumentName)) {
36
+ cTransaction = casper_js_sdk_1.DeployUtil.addArgToDeploy(cTransaction, extraArgumentName, extraArgument);
37
+ }
38
+ });
39
+ }
40
+ this.transaction.casperTx = cTransaction;
41
+ this.processSigning();
42
+ return this.transaction;
43
+ }
44
+ /** @inheritdoc */
45
+ fromImplementation(rawTransaction) {
46
+ const tx = new transaction_1.Transaction(this._coinConfig);
47
+ const jsonTransaction = JSON.parse(rawTransaction);
48
+ tx.casperTx = casper_js_sdk_1.DeployUtil.deployFromJson(jsonTransaction).unwrap();
49
+ this.initBuilder(tx);
50
+ return this.transaction;
51
+ }
52
+ /** @inheritdoc */
53
+ signImplementation(key) {
54
+ this.checkDuplicatedKeys(key);
55
+ const signer = new keyPair_1.KeyPair({ prv: key.key });
56
+ // Signing the transaction is an operation that relies on all the data being set,
57
+ // so we set the source here and leave the actual signing for the build step
58
+ this._multiSignerKeyPairs.push(signer);
59
+ return this.transaction;
60
+ }
61
+ /**
62
+ * Initialize the transaction builder fields using the decoded transaction data
63
+ *
64
+ * @param {Transaction} tx the transaction data
65
+ */
66
+ initBuilder(tx) {
67
+ this.transaction = tx;
68
+ this.transaction.loadPreviousSignatures();
69
+ const txData = tx.toJson();
70
+ this.fee(txData.fee);
71
+ this.source({ address: txData.from });
72
+ this.expiration(txData.expiration || constants_1.TRANSACTION_EXPIRATION);
73
+ }
74
+ // endregion
75
+ // region Common builder methods
76
+ /**
77
+ * Set the transaction fees
78
+ *
79
+ * @param {BaseFee} fee The maximum gas to pay
80
+ * @returns {TransactionBuilder} This transaction builder
81
+ */
82
+ fee(fee) {
83
+ this.validateValue(new bignumber_js_1.default(fee.gasLimit));
84
+ this._fee = fee;
85
+ return this;
86
+ }
87
+ /**
88
+ * Set the transaction source
89
+ *
90
+ * @param {BaseAddress} address The source account
91
+ * @returns {TransactionBuilder} This transaction builder
92
+ */
93
+ source(address) {
94
+ this.validateAddress(address);
95
+ this._source = address;
96
+ return this;
97
+ }
98
+ /**
99
+ * Set the transaction expirationTime
100
+ *
101
+ * @param {string} expirationTime The transaction expirationTime
102
+ * @returns {TransactionBuilder} This transaction builder
103
+ */
104
+ expiration(expirationTime) {
105
+ const transactionExpiration = new bignumber_js_1.default(expirationTime);
106
+ if (transactionExpiration.isNaN() || transactionExpiration.isGreaterThan(constants_1.TRANSACTION_EXPIRATION)) {
107
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction expiration');
108
+ }
109
+ this.validateValue(transactionExpiration);
110
+ this._expiration = transactionExpiration.toNumber();
111
+ return this;
112
+ }
113
+ /**
114
+ * Set an external transaction signature
115
+ *
116
+ * @param {string} signature Hex encoded signature string
117
+ * @param {KeyPair} keyPair The public key keypair that was used to create the signature
118
+ * @returns {TransactionBuilder} This transaction builder
119
+ */
120
+ signature(signature, keyPair) {
121
+ // if we already have a signature for this key pair, just update it
122
+ for (const oldSignature of this._signatures) {
123
+ if (oldSignature.keyPair.getKeys().pub === keyPair.getKeys().pub) {
124
+ oldSignature.signature = signature;
125
+ return this;
126
+ }
127
+ }
128
+ // otherwise add the new signature
129
+ this._signatures.push({ signature, keyPair });
130
+ return this;
131
+ }
132
+ nodeChainName(chainName) {
133
+ this._chainName = chainName;
134
+ return this;
135
+ }
136
+ // endregion
137
+ // region Validators
138
+ /** @inheritdoc */
139
+ validateAddress(address) {
140
+ if (!utils_1.isValidAddress(address.address)) {
141
+ throw new sdk_core_1.BuildTransactionError('Invalid address ' + address.address);
142
+ }
143
+ }
144
+ /** @inheritdoc */
145
+ validateKey(key) {
146
+ if (!new keyPair_1.KeyPair({ prv: key.key })) {
147
+ throw new sdk_core_1.BuildTransactionError('Invalid key');
148
+ }
149
+ }
150
+ /** @inheritdoc */
151
+ validateRawTransaction(rawTransaction) {
152
+ if (!rawTransaction) {
153
+ throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
154
+ }
155
+ try {
156
+ casper_js_sdk_1.DeployUtil.deployFromJson(JSON.parse(rawTransaction));
157
+ }
158
+ catch (e) {
159
+ throw new sdk_core_1.ParseTransactionError('There was an error parsing the JSON string');
160
+ }
161
+ }
162
+ /** @inheritdoc */
163
+ validateTransaction(transaction) {
164
+ this.validateMandatoryFields();
165
+ }
166
+ /** @inheritdoc */
167
+ validateValue(value) {
168
+ if (value.isLessThan(0)) {
169
+ throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
170
+ }
171
+ }
172
+ /**
173
+ * Validates that the mandatory fields are defined
174
+ */
175
+ validateMandatoryFields() {
176
+ this.validateFee();
177
+ this.validateSource();
178
+ }
179
+ /**
180
+ * Validates that the fee field is defined
181
+ */
182
+ validateFee() {
183
+ if (this._fee === undefined) {
184
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing fee');
185
+ }
186
+ if (!this._fee.gasLimit) {
187
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing gas limit');
188
+ }
189
+ try {
190
+ this.validateValue(new bignumber_js_1.default(this._fee.gasLimit));
191
+ }
192
+ catch (e) {
193
+ throw new sdk_core_1.BuildTransactionError('Invalid gas limit');
194
+ }
195
+ }
196
+ /**
197
+ * Validates that the source field is defined
198
+ */
199
+ validateSource() {
200
+ if (this._source === undefined) {
201
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing source');
202
+ }
203
+ this.validateAddress(this._source);
204
+ }
205
+ /**
206
+ * Validates that the given key is not already in this._multiSignerKeyPairs
207
+ *
208
+ * @param {BaseKey} key - The key to check
209
+ */
210
+ checkDuplicatedKeys(key) {
211
+ this._multiSignerKeyPairs.forEach((_sourceKeyPair) => {
212
+ if (_sourceKeyPair.getKeys().prv === key.key) {
213
+ throw new sdk_core_1.SigningError('Repeated sign: ' + key.key);
214
+ }
215
+ // Try to get extended keys in order to validate them
216
+ let xprv;
217
+ try {
218
+ xprv = _sourceKeyPair.getExtendedKeys().xprv;
219
+ }
220
+ catch (err) {
221
+ return;
222
+ }
223
+ if (xprv && xprv === key.key) {
224
+ throw new sdk_core_1.SigningError('Repeated sign: ' + key.key);
225
+ }
226
+ });
227
+ }
228
+ // endregion
229
+ // region Getters and Setters
230
+ /** @inheritdoc */
231
+ get transaction() {
232
+ return this._transaction;
233
+ }
234
+ /** @inheritdoc */
235
+ set transaction(transaction) {
236
+ this._transaction = transaction;
237
+ }
238
+ /**
239
+ * Get the chain name for the coin environment
240
+ */
241
+ get chainName() {
242
+ return this._chainName;
243
+ }
244
+ // endregion
245
+ // region auxiliaryMethods
246
+ /**
247
+ * Generate a DeployParams instance with the transaction data
248
+ *
249
+ * @returns {DeployUtil.DeployParams}
250
+ */
251
+ getDeployParams() {
252
+ const gasPrice = this._fee.gasPrice ? lodash_1.default.parseInt(this._fee.gasPrice) : undefined;
253
+ return new casper_js_sdk_1.DeployUtil.DeployParams(casper_js_sdk_1.CLPublicKey.fromHex(this._source.address), this._chainName, gasPrice, this._expiration || constants_1.TRANSACTION_EXPIRATION);
254
+ }
255
+ /**
256
+ * Generate the session for the Deploy according to the transactionType.
257
+ *
258
+ * @returns {DeployUtil.ExecutableDeployItem}
259
+ */
260
+ getSession() {
261
+ let session;
262
+ switch (this.transaction.type) {
263
+ case sdk_core_1.TransactionType.Send:
264
+ const transferSession = this._session;
265
+ session = casper_js_sdk_1.DeployUtil.ExecutableDeployItem.newTransferWithOptionalTransferId(transferSession.amount, transferSession.target, undefined, transferSession.id);
266
+ break;
267
+ case sdk_core_1.TransactionType.WalletInitialization:
268
+ case sdk_core_1.TransactionType.StakingLock:
269
+ case sdk_core_1.TransactionType.StakingUnlock:
270
+ const moduleBytesSession = this._session;
271
+ session = casper_js_sdk_1.DeployUtil.ExecutableDeployItem.newModuleBytes(moduleBytesSession.moduleBytes, moduleBytesSession.args);
272
+ break;
273
+ default:
274
+ throw new sdk_core_1.BuildTransactionError('Transaction Type error');
275
+ }
276
+ return session;
277
+ }
278
+ /**
279
+ * Checks whether the transaction has the owner signature
280
+ *
281
+ * @param {string} pub - public key of the signer
282
+ * @returns {boolean} true if the pub key already signed th transaction
283
+ * @private
284
+ */
285
+ isTransactionSignedByPub(pub) {
286
+ return (lodash_1.default.findIndex(this.transaction.casperTx.approvals, (approval) => {
287
+ const approvalSigner = utils_1.removeAlgoPrefixFromHexValue(approval.signer);
288
+ return approvalSigner === pub;
289
+ }) !== -1);
290
+ }
291
+ /**
292
+ * Add signatures to the transaction
293
+ *
294
+ * @private
295
+ */
296
+ processSigning() {
297
+ for (const keyPair of this._multiSignerKeyPairs) {
298
+ // Add signature if it's not already in the deploy
299
+ if (!this.isTransactionSignedByPub(keyPair.getKeys().pub)) {
300
+ this.transaction.sign(keyPair);
301
+ }
302
+ }
303
+ for (const { signature, keyPair } of this._signatures) {
304
+ // Add signature if it's not already in the deploy
305
+ if (!this.isTransactionSignedByPub(keyPair.getKeys().pub)) {
306
+ this.transaction.addSignature(signature, keyPair);
307
+ }
308
+ }
309
+ }
310
+ }
311
+ exports.TransactionBuilder = TransactionBuilder;
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQXFDO0FBRXJDLGlEQUFxRTtBQUNyRSxvREFBdUI7QUFDdkIsOENBU3lCO0FBQ3pCLCtDQUE0QztBQUM1Qyx1Q0FBb0M7QUFRcEMsbUNBQXVFO0FBQ3ZFLDJDQUEwRTtBQUU3RCxRQUFBLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFBLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBc0Isa0JBQW1CLFNBQVEsaUNBQXNCO0lBVXJFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQywrQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLCtCQUFtQixDQUFDLE9BQU8sQ0FBQztJQUMzRyxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNSLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxNQUFNLE9BQU8sR0FBRywwQkFBVSxDQUFDLGVBQWUsQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFM0Us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QU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNoQztTQUNGO1FBQ0QsS0FBSyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckQsa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDbkQ7U0FDRjtJQUNILENBQUM7Q0FFRjtBQWhXRCxnREFnV0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgRGVwbG95VXRpbCwgQ0xQdWJsaWNLZXkgYXMgUHVibGljS2V5IH0gZnJvbSAnY2FzcGVyLWpzLXNkayc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQmFzZUFkZHJlc3MsXG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQge1xuICBGZWUsXG4gIENhc3Blck1vZHVsZUJ5dGVzVHJhbnNhY3Rpb24sXG4gIENhc3BlclRyYW5zZmVyVHJhbnNhY3Rpb24sXG4gIENhc3BlckRlbGVnYXRlVHJhbnNhY3Rpb24sXG4gIFNpZ25hdHVyZURhdGEsXG59IGZyb20gJy4vaWZhY2VzJztcbmltcG9ydCB7IGlzVmFsaWRBZGRyZXNzLCByZW1vdmVBbGdvUHJlZml4RnJvbUhleFZhbHVlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBERUZBVUxUX0NIQUlOX05BTUVTLCBUUkFOU0FDVElPTl9FWFBJUkFUSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NID0gMztcbmV4cG9ydCBjb25zdCBERUZBVUxUX04gPSAyO1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX3NvdXJjZTogQmFzZUFkZHJlc3M7XG4gIHByb3RlY3RlZCBfZmVlOiBGZWU7XG4gIHByaXZhdGUgX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgcHJvdGVjdGVkIF9zZXNzaW9uOiBDYXNwZXJUcmFuc2ZlclRyYW5zYWN0aW9uIHwgQ2FzcGVyTW9kdWxlQnl0ZXNUcmFuc2FjdGlvbiB8IENhc3BlckRlbGVnYXRlVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfZXhwaXJhdGlvbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX211bHRpU2lnbmVyS2V5UGFpcnM6IEtleVBhaXJbXTtcbiAgcHJvdGVjdGVkIF9zaWduYXR1cmVzOiBTaWduYXR1cmVEYXRhW107XG4gIHByb3RlY3RlZCBfY2hhaW5OYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMgPSBbXTtcbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW107XG4gICAgdGhpcy5fY2hhaW5OYW1lID0gdGhpcy5jb2luTmFtZSgpID09PSAnY3NwcicgPyBERUZBVUxUX0NIQUlOX05BTUVTLm1haW5uZXQgOiBERUZBVUxUX0NIQUlOX05BTUVTLnRlc3RuZXQ7XG4gIH1cblxuICAvLyByZWdpb24gQmFzZSBCdWlsZGVyXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZGVwbG95UGFyYW1zID0gdGhpcy5nZXREZXBsb3lQYXJhbXMoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5nZXRTZXNzaW9uKCk7XG5cbiAgICBjb25zdCBwYXltZW50ID0gRGVwbG95VXRpbC5zdGFuZGFyZFBheW1lbnQoXy5wYXJzZUludCh0aGlzLl9mZWUuZ2FzTGltaXQpKTtcblxuICAgIGxldCBjVHJhbnNhY3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uLmNhc3BlclR4IHx8IERlcGxveVV0aWwubWFrZURlcGxveShkZXBsb3lQYXJhbXMsIHNlc3Npb24sIHBheW1lbnQpO1xuXG4gICAgLy8gQ2Fubm90IGFkZCBhcmd1bWVudHMgdG8gYW4gYWxyZWFkeSBzaWduZWQgZGVwbG95LlxuICAgIGlmIChjVHJhbnNhY3Rpb24uYXBwcm92YWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fc2Vzc2lvbi5leHRyYUFyZ3VtZW50cy5mb3JFYWNoKChleHRyYUFyZ3VtZW50LCBleHRyYUFyZ3VtZW50TmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWNUcmFuc2FjdGlvbi5zZXNzaW9uLmdldEFyZ0J5TmFtZShleHRyYUFyZ3VtZW50TmFtZSkpIHtcbiAgICAgICAgICBjVHJhbnNhY3Rpb24gPSBEZXBsb3lVdGlsLmFkZEFyZ1RvRGVwbG95KGNUcmFuc2FjdGlvbiwgZXh0cmFBcmd1bWVudE5hbWUsIGV4dHJhQXJndW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLmNhc3BlclR4ID0gY1RyYW5zYWN0aW9uO1xuXG4gICAgdGhpcy5wcm9jZXNzU2lnbmluZygpO1xuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIGNvbnN0IGpzb25UcmFuc2FjdGlvbiA9IEpTT04ucGFyc2UocmF3VHJhbnNhY3Rpb24pO1xuICAgIHR4LmNhc3BlclR4ID0gRGVwbG95VXRpbC5kZXBsb3lGcm9tSnNvbihqc29uVHJhbnNhY3Rpb24pLnVud3JhcCgpO1xuICAgIHRoaXMuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oa2V5OiBCYXNlS2V5KTogVHJhbnNhY3Rpb24ge1xuICAgIHRoaXMuY2hlY2tEdXBsaWNhdGVkS2V5cyhrZXkpO1xuICAgIGNvbnN0IHNpZ25lciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pO1xuXG4gICAgLy8gU2lnbmluZyB0aGUgdHJhbnNhY3Rpb24gaXMgYW4gb3BlcmF0aW9uIHRoYXQgcmVsaWVzIG9uIGFsbCB0aGUgZGF0YSBiZWluZyBzZXQsXG4gICAgLy8gc28gd2Ugc2V0IHRoZSBzb3VyY2UgaGVyZSBhbmQgbGVhdmUgdGhlIGFjdHVhbCBzaWduaW5nIGZvciB0aGUgYnVpbGQgc3RlcFxuICAgIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMucHVzaChzaWduZXIpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmllbGRzIHVzaW5nIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHggdGhlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0eDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmxvYWRQcmV2aW91c1NpZ25hdHVyZXMoKTtcbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0aGlzLmZlZSh0eERhdGEuZmVlKTtcbiAgICB0aGlzLnNvdXJjZSh7IGFkZHJlc3M6IHR4RGF0YS5mcm9tIH0pO1xuICAgIHRoaXMuZXhwaXJhdGlvbih0eERhdGEuZXhwaXJhdGlvbiB8fCBUUkFOU0FDVElPTl9FWFBJUkFUSU9OKTtcbiAgfVxuXG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8vIHJlZ2lvbiBDb21tb24gYnVpbGRlciBtZXRob2RzXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gZmVlc1xuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VGZWV9IGZlZSBUaGUgbWF4aW11bSBnYXMgdG8gcGF5XG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgZmVlKGZlZTogRmVlKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoZmVlLmdhc0xpbWl0KSk7XG4gICAgdGhpcy5fZmVlID0gZmVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gc291cmNlXG4gICAqXG4gICAqIEBwYXJhbSB7QmFzZUFkZHJlc3N9IGFkZHJlc3MgVGhlIHNvdXJjZSBhY2NvdW50XG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgc291cmNlKGFkZHJlc3M6IEJhc2VBZGRyZXNzKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7XG4gICAgdGhpcy5fc291cmNlID0gYWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGV4cGlyYXRpb25UaW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBpcmF0aW9uVGltZSBUaGUgdHJhbnNhY3Rpb24gZXhwaXJhdGlvblRpbWVcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBleHBpcmF0aW9uKGV4cGlyYXRpb25UaW1lOiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGlyYXRpb24gPSBuZXcgQmlnTnVtYmVyKGV4cGlyYXRpb25UaW1lKTtcbiAgICBpZiAodHJhbnNhY3Rpb25FeHBpcmF0aW9uLmlzTmFOKCkgfHwgdHJhbnNhY3Rpb25FeHBpcmF0aW9uLmlzR3JlYXRlclRoYW4oVFJBTlNBQ1RJT05fRVhQSVJBVElPTikpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24gZXhwaXJhdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUodHJhbnNhY3Rpb25FeHBpcmF0aW9uKTtcbiAgICB0aGlzLl9leHBpcmF0aW9uID0gdHJhbnNhY3Rpb25FeHBpcmF0aW9uLnRvTnVtYmVyKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGV4dGVybmFsIHRyYW5zYWN0aW9uIHNpZ25hdHVyZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIEhleCBlbmNvZGVkIHNpZ25hdHVyZSBzdHJpbmdcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIFRoZSBwdWJsaWMga2V5IGtleXBhaXIgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHNpZ25hdHVyZVxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZywga2V5UGFpcjogS2V5UGFpcik6IHRoaXMge1xuICAgIC8vIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHNpZ25hdHVyZSBmb3IgdGhpcyBrZXkgcGFpciwganVzdCB1cGRhdGUgaXRcbiAgICBmb3IgKGNvbnN0IG9sZFNpZ25hdHVyZSBvZiB0aGlzLl9zaWduYXR1cmVzKSB7XG4gICAgICBpZiAob2xkU2lnbmF0dXJlLmtleVBhaXIuZ2V0S2V5cygpLnB1YiA9PT0ga2V5UGFpci5nZXRLZXlzKCkucHViKSB7XG4gICAgICAgIG9sZFNpZ25hdHVyZS5zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSBhZGQgdGhlIG5ldyBzaWduYXR1cmVcbiAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goeyBzaWduYXR1cmUsIGtleVBhaXIgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBub2RlQ2hhaW5OYW1lKGNoYWluTmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fY2hhaW5OYW1lID0gY2hhaW5OYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcyk6IHZvaWQge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzICcgKyBhZGRyZXNzLmFkZHJlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUtleShrZXk6IEJhc2VLZXkpOiB2b2lkIHtcbiAgICBpZiAoIW5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGtleScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBlbXB0eScpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgRGVwbG95VXRpbC5kZXBsb3lGcm9tSnNvbihKU09OLnBhcnNlKHJhd1RyYW5zYWN0aW9uKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgdGhlIEpTT04gc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVNYW5kYXRvcnlGaWVsZHMoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuaXNMZXNzVGhhbigwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBtYW5kYXRvcnkgZmllbGRzIGFyZSBkZWZpbmVkXG4gICAqL1xuICB2YWxpZGF0ZU1hbmRhdG9yeUZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlRmVlKCk7XG4gICAgdGhpcy52YWxpZGF0ZVNvdXJjZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBmZWUgZmllbGQgaXMgZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZlZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgZmVlJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fZmVlLmdhc0xpbWl0KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGdhcyBsaW1pdCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIodGhpcy5fZmVlLmdhc0xpbWl0KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBnYXMgbGltaXQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHNvdXJjZSBmaWVsZCBpcyBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU291cmNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBzb3VyY2UnKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFkZHJlc3ModGhpcy5fc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBhbHJlYWR5IGluIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnNcbiAgICpcbiAgICogQHBhcmFtIHtCYXNlS2V5fSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRHVwbGljYXRlZEtleXMoa2V5OiBCYXNlS2V5KSB7XG4gICAgdGhpcy5fbXVsdGlTaWduZXJLZXlQYWlycy5mb3JFYWNoKChfc291cmNlS2V5UGFpcikgPT4ge1xuICAgICAgaWYgKF9zb3VyY2VLZXlQYWlyLmdldEtleXMoKS5wcnYgPT09IGtleS5rZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignUmVwZWF0ZWQgc2lnbjogJyArIGtleS5rZXkpO1xuICAgICAgfVxuICAgICAgLy8gVHJ5IHRvIGdldCBleHRlbmRlZCBrZXlzIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoZW1cbiAgICAgIGxldCB4cHJ2O1xuICAgICAgdHJ5IHtcbiAgICAgICAgeHBydiA9IF9zb3VyY2VLZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpLnhwcnY7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHhwcnYgJiYgeHBydiA9PT0ga2V5LmtleSkge1xuICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdSZXBlYXRlZCBzaWduOiAnICsga2V5LmtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlbmRyZWdpb25cblxuICAvLyByZWdpb24gR2V0dGVycyBhbmQgU2V0dGVyc1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWluIG5hbWUgZm9yIHRoZSBjb2luIGVudmlyb25tZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGFpbk5hbWU7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLy8gcmVnaW9uIGF1eGlsaWFyeU1ldGhvZHNcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgRGVwbG95UGFyYW1zIGluc3RhbmNlIHdpdGggdGhlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICpcbiAgICogQHJldHVybnMge0RlcGxveVV0aWwuRGVwbG95UGFyYW1zfVxuICAgKi9cbiAgcHJpdmF0ZSBnZXREZXBsb3lQYXJhbXMoKTogRGVwbG95VXRpbC5EZXBsb3lQYXJhbXMge1xuICAgIGNvbnN0IGdhc1ByaWNlID0gdGhpcy5fZmVlLmdhc1ByaWNlID8gXy5wYXJzZUludCh0aGlzLl9mZWUuZ2FzUHJpY2UpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBuZXcgRGVwbG95VXRpbC5EZXBsb3lQYXJhbXMoXG4gICAgICBQdWJsaWNLZXkuZnJvbUhleCh0aGlzLl9zb3VyY2UuYWRkcmVzcyksXG4gICAgICB0aGlzLl9jaGFpbk5hbWUsXG4gICAgICBnYXNQcmljZSxcbiAgICAgIHRoaXMuX2V4cGlyYXRpb24gfHwgVFJBTlNBQ1RJT05fRVhQSVJBVElPTlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIHNlc3Npb24gZm9yIHRoZSBEZXBsb3kgYWNjb3JkaW5nIHRvIHRoZSB0cmFuc2FjdGlvblR5cGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtEZXBsb3lVdGlsLkV4ZWN1dGFibGVEZXBsb3lJdGVtfVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZXNzaW9uKCk6IERlcGxveVV0aWwuRXhlY3V0YWJsZURlcGxveUl0ZW0ge1xuICAgIGxldCBzZXNzaW9uO1xuICAgIHN3aXRjaCAodGhpcy50cmFuc2FjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICBjb25zdCB0cmFuc2ZlclNlc3Npb24gPSB0aGlzLl9zZXNzaW9uIGFzIENhc3BlclRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIHNlc3Npb24gPSBEZXBsb3lVdGlsLkV4ZWN1dGFibGVEZXBsb3lJdGVtLm5ld1RyYW5zZmVyV2l0aE9wdGlvbmFsVHJhbnNmZXJJZChcbiAgICAgICAgICB0cmFuc2ZlclNlc3Npb24uYW1vdW50LFxuICAgICAgICAgIHRyYW5zZmVyU2Vzc2lvbi50YXJnZXQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYW5zZmVyU2Vzc2lvbi5pZFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2s6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrOlxuICAgICAgICBjb25zdCBtb2R1bGVCeXRlc1Nlc3Npb24gPSB0aGlzLl9zZXNzaW9uIGFzIENhc3Blck1vZHVsZUJ5dGVzVHJhbnNhY3Rpb247XG4gICAgICAgIHNlc3Npb24gPSBEZXBsb3lVdGlsLkV4ZWN1dGFibGVEZXBsb3lJdGVtLm5ld01vZHVsZUJ5dGVzKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzU2Vzc2lvbi5tb2R1bGVCeXRlcyxcbiAgICAgICAgICBtb2R1bGVCeXRlc1Nlc3Npb24uYXJnc1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIFR5cGUgZXJyb3InKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGhhcyB0aGUgb3duZXIgc2lnbmF0dXJlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWIgLSBwdWJsaWMga2V5IG9mIHRoZSBzaWduZXJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHB1YiBrZXkgYWxyZWFkeSBzaWduZWQgdGggdHJhbnNhY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgaXNUcmFuc2FjdGlvblNpZ25lZEJ5UHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIF8uZmluZEluZGV4KHRoaXMudHJhbnNhY3Rpb24uY2FzcGVyVHguYXBwcm92YWxzLCAoYXBwcm92YWwpID0+IHtcbiAgICAgICAgY29uc3QgYXBwcm92YWxTaWduZXIgPSByZW1vdmVBbGdvUHJlZml4RnJvbUhleFZhbHVlKGFwcHJvdmFsLnNpZ25lcik7XG4gICAgICAgIHJldHVybiBhcHByb3ZhbFNpZ25lciA9PT0gcHViO1xuICAgICAgfSkgIT09IC0xXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc2lnbmF0dXJlcyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1NpZ25pbmcoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMpIHtcbiAgICAgIC8vIEFkZCBzaWduYXR1cmUgaWYgaXQncyBub3QgYWxyZWFkeSBpbiB0aGUgZGVwbG95XG4gICAgICBpZiAoIXRoaXMuaXNUcmFuc2FjdGlvblNpZ25lZEJ5UHViKGtleVBhaXIuZ2V0S2V5cygpLnB1YikpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgc2lnbmF0dXJlLCBrZXlQYWlyIH0gb2YgdGhpcy5fc2lnbmF0dXJlcykge1xuICAgICAgLy8gQWRkIHNpZ25hdHVyZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBkZXBsb3lcbiAgICAgIGlmICghdGhpcy5pc1RyYW5zYWN0aW9uU2lnbmVkQnlQdWIoa2V5UGFpci5nZXRLZXlzKCkucHViKSkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLmFkZFNpZ25hdHVyZShzaWduYXR1cmUsIGtleVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBlbmRyZWdpb25cbn1cbiJdfQ==
@@ -0,0 +1,46 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo/statics';
2
+ import { BaseTransactionBuilderFactory } from '@bitgo/sdk-core';
3
+ import { WalletInitializationBuilder } from './walletInitializationBuilder';
4
+ import { TransferBuilder } from './transferBuilder';
5
+ import { TransactionBuilder } from './transactionBuilder';
6
+ import { Transaction } from './transaction';
7
+ import { DelegateBuilder } from './delegateBuilder';
8
+ import { UndelegateBuilder } from './undelegateBuilder';
9
+ export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
10
+ constructor(_coinConfig: Readonly<CoinConfig>);
11
+ /** @inheritdoc */
12
+ getWalletInitializationBuilder(tx?: Transaction): WalletInitializationBuilder;
13
+ /**
14
+ * Initialize an undelegate builder
15
+ *
16
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
17
+ * @returns {UndelegateBuilder} the builder initialized
18
+ */
19
+ getUndelegateBuilder(tx?: Transaction): UndelegateBuilder;
20
+ /**
21
+ * Initialize an delegate builder
22
+ *
23
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
24
+ * @returns {DelegateBuilder} the builder initialized
25
+ */
26
+ getDelegateBuilder(tx?: Transaction): DelegateBuilder;
27
+ /** @inheritDoc */
28
+ getTransferBuilder(tx?: Transaction): TransferBuilder;
29
+ /** @inheritDoc */
30
+ from(raw: string): TransactionBuilder;
31
+ /**
32
+ * Initialize the builder with the given transaction
33
+ *
34
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
35
+ * @param {TransactionBuilder} builder - the builder to be initialized
36
+ * @returns {TransactionBuilder} the builder initialized
37
+ */
38
+ private initializeBuilder;
39
+ /**
40
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
41
+ *
42
+ * @param {any} rawTransaction - Transaction in any format
43
+ */
44
+ private validateRawTransaction;
45
+ }
46
+ //# sourceMappingURL=transactionBuilderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EACL,6BAA6B,EAI9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,yBAA0B,SAAQ,6BAA6B;gBAC9D,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,kBAAkB;IAClB,8BAA8B,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,2BAA2B;IAI7E;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,iBAAiB;IAIzD;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD,kBAAkB;IAClB,kBAAkB,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,eAAe;IAIrD,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAyBrC;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;CAU/B"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransactionBuilderFactory = void 0;
4
+ const casper_js_sdk_1 = require("casper-js-sdk");
5
+ const sdk_core_1 = require("@bitgo/sdk-core");
6
+ const walletInitializationBuilder_1 = require("./walletInitializationBuilder");
7
+ const transferBuilder_1 = require("./transferBuilder");
8
+ const transaction_1 = require("./transaction");
9
+ const utils_1 = require("./utils");
10
+ const delegateBuilder_1 = require("./delegateBuilder");
11
+ const undelegateBuilder_1 = require("./undelegateBuilder");
12
+ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ }
16
+ /** @inheritdoc */
17
+ getWalletInitializationBuilder(tx) {
18
+ return this.initializeBuilder(tx, new walletInitializationBuilder_1.WalletInitializationBuilder(this._coinConfig));
19
+ }
20
+ /**
21
+ * Initialize an undelegate builder
22
+ *
23
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
24
+ * @returns {UndelegateBuilder} the builder initialized
25
+ */
26
+ getUndelegateBuilder(tx) {
27
+ return this.initializeBuilder(tx, new undelegateBuilder_1.UndelegateBuilder(this._coinConfig));
28
+ }
29
+ /**
30
+ * Initialize an delegate builder
31
+ *
32
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
33
+ * @returns {DelegateBuilder} the builder initialized
34
+ */
35
+ getDelegateBuilder(tx) {
36
+ return this.initializeBuilder(tx, new delegateBuilder_1.DelegateBuilder(this._coinConfig));
37
+ }
38
+ /** @inheritDoc */
39
+ getTransferBuilder(tx) {
40
+ return this.initializeBuilder(tx, new transferBuilder_1.TransferBuilder(this._coinConfig));
41
+ }
42
+ /** @inheritDoc */
43
+ from(raw) {
44
+ this.validateRawTransaction(raw);
45
+ const tx = new transaction_1.Transaction(this._coinConfig);
46
+ const deployJson = JSON.parse(raw);
47
+ try {
48
+ tx.casperTx = casper_js_sdk_1.DeployUtil.deployFromJson(deployJson).unwrap();
49
+ }
50
+ catch (e) {
51
+ throw new sdk_core_1.InvalidTransactionError('Invalid transaction: ' + e);
52
+ }
53
+ const casperDeployType = utils_1.getDeployType(tx.casperTx.session);
54
+ switch (casperDeployType) {
55
+ case sdk_core_1.TransactionType.Send:
56
+ return this.getTransferBuilder(tx);
57
+ case sdk_core_1.TransactionType.WalletInitialization:
58
+ return this.getWalletInitializationBuilder(tx);
59
+ case sdk_core_1.TransactionType.StakingLock:
60
+ return this.getDelegateBuilder(tx);
61
+ case sdk_core_1.TransactionType.StakingUnlock:
62
+ return this.getUndelegateBuilder(tx);
63
+ default:
64
+ throw new sdk_core_1.InvalidTransactionError('Invalid transaction ' + tx.casperTx);
65
+ }
66
+ }
67
+ /**
68
+ * Initialize the builder with the given transaction
69
+ *
70
+ * @param {Transaction | undefined} tx - the transaction used to initialize the builder
71
+ * @param {TransactionBuilder} builder - the builder to be initialized
72
+ * @returns {TransactionBuilder} the builder initialized
73
+ */
74
+ initializeBuilder(tx, builder) {
75
+ if (tx) {
76
+ builder.initBuilder(tx);
77
+ }
78
+ return builder;
79
+ }
80
+ /**
81
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
82
+ *
83
+ * @param {any} rawTransaction - Transaction in any format
84
+ */
85
+ validateRawTransaction(rawTransaction) {
86
+ if (!rawTransaction) {
87
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction: Undefined');
88
+ }
89
+ try {
90
+ JSON.parse(rawTransaction);
91
+ }
92
+ catch (e) {
93
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction format');
94
+ }
95
+ }
96
+ }
97
+ exports.TransactionBuilderFactory = TransactionBuilderFactory;
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpREFBMkM7QUFDM0MsOENBS3lCO0FBQ3pCLCtFQUE0RTtBQUM1RSx1REFBb0Q7QUFFcEQsK0NBQTRDO0FBQzVDLG1DQUF3QztBQUN4Qyx1REFBb0Q7QUFDcEQsMkRBQXdEO0FBRXhELE1BQWEseUJBQTBCLFNBQVEsd0NBQTZCO0lBQzFFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsOEJBQThCLENBQUMsRUFBZ0I7UUFDN0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLElBQUkseURBQTJCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsb0JBQW9CLENBQUMsRUFBZ0I7UUFDbkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLElBQUkscUNBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsRUFBZ0I7UUFDakMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLElBQUksaUNBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGtCQUFrQixDQUFDLEVBQWdCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxJQUFJLGlDQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLENBQUMsR0FBVztRQUNkLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSTtZQUNGLEVBQUUsQ0FBQyxRQUFRLEdBQUcsMEJBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDOUQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNoRTtRQUVELE1BQU0sZ0JBQWdCLEdBQUcscUJBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVELFFBQVEsZ0JBQWdCLEVBQUU7WUFDeEIsS0FBSywwQkFBZSxDQUFDLElBQUk7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLEtBQUssMEJBQWUsQ0FBQyxvQkFBb0I7Z0JBQ3ZDLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssMEJBQWUsQ0FBQyxXQUFXO2dCQUM5QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQyxLQUFLLDBCQUFlLENBQUMsYUFBYTtnQkFDaEMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkM7Z0JBQ0UsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzRTtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxpQkFBaUIsQ0FBK0IsRUFBMkIsRUFBRSxPQUFVO1FBQzdGLElBQUksRUFBRSxFQUFFO1lBQ04sT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssc0JBQXNCLENBQUMsY0FBc0I7UUFDbkQsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixNQUFNLElBQUksZ0NBQXFCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RTtRQUNELElBQUk7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzVCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLElBQUksZ0NBQXFCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7Q0FDRjtBQTFGRCw4REEwRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgRGVwbG95VXRpbCB9IGZyb20gJ2Nhc3Blci1qcy1zZGsnO1xuaW1wb3J0IHtcbiAgQmFzZVRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlciB9IGZyb20gJy4vd2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4vdHJhbnNmZXJCdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBnZXREZXBsb3lUeXBlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZWxlZ2F0ZUJ1aWxkZXIgfSBmcm9tICcuL2RlbGVnYXRlQnVpbGRlcic7XG5pbXBvcnQgeyBVbmRlbGVnYXRlQnVpbGRlciB9IGZyb20gJy4vdW5kZWxlZ2F0ZUJ1aWxkZXInO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcih0eD86IFRyYW5zYWN0aW9uKTogV2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplQnVpbGRlcih0eCwgbmV3IFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhbiB1bmRlbGVnYXRlIGJ1aWxkZXJcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZH0gdHggLSB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBidWlsZGVyXG4gICAqIEByZXR1cm5zIHtVbmRlbGVnYXRlQnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIGdldFVuZGVsZWdhdGVCdWlsZGVyKHR4PzogVHJhbnNhY3Rpb24pOiBVbmRlbGVnYXRlQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZUJ1aWxkZXIodHgsIG5ldyBVbmRlbGVnYXRlQnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhbiBkZWxlZ2F0ZSBidWlsZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb24gfCB1bmRlZmluZWR9IHR4IC0gdGhlIHRyYW5zYWN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgYnVpbGRlclxuICAgKiBAcmV0dXJucyB7RGVsZWdhdGVCdWlsZGVyfSB0aGUgYnVpbGRlciBpbml0aWFsaXplZFxuICAgKi9cbiAgZ2V0RGVsZWdhdGVCdWlsZGVyKHR4PzogVHJhbnNhY3Rpb24pOiBEZWxlZ2F0ZUJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVCdWlsZGVyKHR4LCBuZXcgRGVsZWdhdGVCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRUcmFuc2ZlckJ1aWxkZXIodHg/OiBUcmFuc2FjdGlvbik6IFRyYW5zZmVyQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZUJ1aWxkZXIodHgsIG5ldyBUcmFuc2ZlckJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZykpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGZyb20ocmF3OiBzdHJpbmcpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXcpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIGNvbnN0IGRlcGxveUpzb24gPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgdHJ5IHtcbiAgICAgIHR4LmNhc3BlclR4ID0gRGVwbG95VXRpbC5kZXBsb3lGcm9tSnNvbihkZXBsb3lKc29uKS51bndyYXAoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246ICcgKyBlKTtcbiAgICB9XG5cbiAgICBjb25zdCBjYXNwZXJEZXBsb3lUeXBlID0gZ2V0RGVwbG95VHlwZSh0eC5jYXNwZXJUeC5zZXNzaW9uKTtcbiAgICBzd2l0Y2ggKGNhc3BlckRlcGxveVR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zZmVyQnVpbGRlcih0eCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKHR4KTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdMb2NrOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWxlZ2F0ZUJ1aWxkZXIodHgpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jazpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VW5kZWxlZ2F0ZUJ1aWxkZXIodHgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uICcgKyB0eC5jYXNwZXJUeCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJ1aWxkZXIgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZH0gdHggLSB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBidWlsZGVyXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25CdWlsZGVyfSBidWlsZGVyIC0gdGhlIGJ1aWxkZXIgdG8gYmUgaW5pdGlhbGl6ZWRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uQnVpbGRlcn0gdGhlIGJ1aWxkZXIgaW5pdGlhbGl6ZWRcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUJ1aWxkZXI8VCBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlcj4odHg6IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkLCBidWlsZGVyOiBUKTogVCB7XG4gICAgaWYgKHR4KSB7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gcmF3VHJhbnNhY3Rpb24gLSBUcmFuc2FjdGlvbiBpbiBhbnkgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZykge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIEpTT04ucGFyc2UocmF3VHJhbnNhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uIGZvcm1hdCcpO1xuICAgIH1cbiAgfVxufVxuIl19