@bitgo-beta/sdk-coin-flrp 1.0.1-beta.3 → 1.0.1-beta.300

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 (109) hide show
  1. package/dist/src/flrp.d.ts +75 -61
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +276 -134
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +188 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +273 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +215 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +180 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +49 -34
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +159 -33
  25. package/dist/src/lib/iface.d.ts +50 -22
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +13 -14
  28. package/dist/src/lib/index.d.ts +7 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +16 -2
  31. package/dist/src/lib/keyPair.d.ts +5 -5
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +15 -9
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +43 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
  37. package/dist/src/lib/transaction.d.ts +51 -0
  38. package/dist/src/lib/transaction.d.ts.map +1 -0
  39. package/dist/src/lib/transaction.js +373 -0
  40. package/dist/src/lib/transactionBuilder.d.ts +107 -0
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transactionBuilder.js +210 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +57 -0
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  45. package/dist/src/lib/transactionBuilderFactory.js +148 -0
  46. package/dist/src/lib/utils.d.ts +78 -102
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +220 -246
  49. package/dist/test/resources/account.d.ts +51 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +54 -0
  52. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  53. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInC.js +34 -0
  55. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  56. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/exportInP.js +140 -0
  58. package/dist/test/resources/transactionData/importInC.d.ts +27 -0
  59. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInC.js +44 -0
  61. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  62. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  63. package/dist/test/resources/transactionData/importInP.js +58 -0
  64. package/dist/test/unit/flrp.js +490 -20
  65. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  66. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  67. package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
  68. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  69. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  70. package/dist/test/unit/lib/exportInPTxBuilder.js +121 -0
  71. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  72. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  73. package/dist/test/unit/lib/importInCTxBuilder.js +47 -0
  74. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  75. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  76. package/dist/test/unit/lib/importInPTxBuilder.js +73 -0
  77. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  78. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  79. package/dist/test/unit/lib/keyPair.js +158 -0
  80. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  81. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  82. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  83. package/dist/test/unit/lib/utils.d.ts +2 -0
  84. package/dist/test/unit/lib/utils.d.ts.map +1 -0
  85. package/dist/test/unit/lib/utils.js +453 -0
  86. package/dist/tsconfig.tsbuildinfo +1 -1
  87. package/package.json +16 -11
  88. package/.eslintignore +0 -5
  89. package/.eslintrc.json +0 -7
  90. package/.mocharc.yml +0 -8
  91. package/CHANGELOG.md +0 -0
  92. package/dist/src/iface.d.ts +0 -25
  93. package/dist/src/iface.d.ts.map +0 -1
  94. package/dist/src/iface.js +0 -3
  95. package/dist/src/lib/constants.d.ts +0 -11
  96. package/dist/src/lib/constants.d.ts.map +0 -1
  97. package/dist/src/lib/constants.js +0 -17
  98. package/dist/src/lib/errors.d.ts +0 -8
  99. package/dist/src/lib/errors.d.ts.map +0 -1
  100. package/dist/src/lib/errors.js +0 -19
  101. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  102. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  103. package/dist/src/lib/exportInCTxBuilder.js +0 -164
  104. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  105. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  106. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  107. package/dist/test/unit/smoke.d.ts +0 -2
  108. package/dist/test/unit/smoke.d.ts.map +0 -1
  109. package/dist/test/unit/smoke.js +0 -9
@@ -0,0 +1,210 @@
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 = void 0;
7
+ const flarejs_1 = require("@flarenetwork/flarejs");
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const keyPair_1 = require("./keyPair");
10
+ const transaction_1 = require("./transaction");
11
+ const utils_1 = __importDefault(require("./utils"));
12
+ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ this.recoverSigner = false;
16
+ this._signer = [];
17
+ this._transaction = new transaction_1.Transaction(_coinConfig);
18
+ }
19
+ /**
20
+ * Initialize the transaction builder fields using the decoded transaction data
21
+ *
22
+ * @param {Transaction} tx the transaction data
23
+ * @returns itself
24
+ */
25
+ initBuilder(tx) {
26
+ const baseTx = tx.tx.baseTx;
27
+ // Validate network and blockchain IDs match
28
+ if (baseTx.NetworkId.value() !== this._transaction._networkID ||
29
+ baseTx.BlockchainId.value() !== this._transaction._blockchainID) {
30
+ throw new Error('Network or blockchain ID mismatch');
31
+ }
32
+ this._transaction.setTransaction(tx);
33
+ return this;
34
+ }
35
+ // region Validators
36
+ /**
37
+ * Validates the threshold for multi-signature transactions
38
+ * @param threshold - Number of required signatures
39
+ */
40
+ validateThreshold(threshold) {
41
+ if (!threshold || threshold !== 2) {
42
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: threshold must be set to 2');
43
+ }
44
+ }
45
+ /**
46
+ * Validates a single UTXO object
47
+ * @param value - UTXO to validate
48
+ */
49
+ validateUtxo(value) {
50
+ const requiredFields = ['outputID', 'amount', 'txid', 'outputidx'];
51
+ for (const field of requiredFields) {
52
+ if (!value.hasOwnProperty(field)) {
53
+ throw new sdk_core_1.BuildTransactionError(`UTXO missing required field: ${field}`);
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Validates an array of UTXOs
59
+ * @param values - Array of UTXOs to validate
60
+ */
61
+ validateUtxos(values) {
62
+ if (values.length === 0) {
63
+ throw new sdk_core_1.BuildTransactionError('UTXOs array cannot be empty');
64
+ }
65
+ values.forEach(this.validateUtxo);
66
+ }
67
+ /**
68
+ * Validates the locktime value
69
+ * @param locktime - Timestamp after which the output can be spent
70
+ */
71
+ validateLocktime(locktime) {
72
+ if (locktime < BigInt(0)) {
73
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: locktime must be 0 or higher');
74
+ }
75
+ }
76
+ // endregion
77
+ /**
78
+ * Sets the threshold for multi-signature transactions
79
+ * @param value - Number of required signatures
80
+ */
81
+ threshold(value) {
82
+ this.validateThreshold(value);
83
+ this._transaction._threshold = value;
84
+ return this;
85
+ }
86
+ /**
87
+ * Sets the locktime for the transaction
88
+ * @param value - Timestamp after which the output can be spent
89
+ */
90
+ locktime(value) {
91
+ this.validateLocktime(BigInt(value));
92
+ this._transaction._locktime = BigInt(value);
93
+ return this;
94
+ }
95
+ /**
96
+ * Enables recovery mode for the transaction
97
+ * @param recoverSigner - Whether to use recovery signing
98
+ */
99
+ recoverMode(recoverSigner = true) {
100
+ this.recoverSigner = recoverSigner;
101
+ return this;
102
+ }
103
+ /**
104
+ * Sets the sender's public key(s)
105
+ * @param senderPubKey - Public key or array of public keys
106
+ */
107
+ fromPubKey(senderPubKey) {
108
+ const pubKeys = Array.isArray(senderPubKey) ? senderPubKey : [senderPubKey];
109
+ this._transaction._fromAddresses = pubKeys.map((addr) => utils_1.default.parseAddress(addr));
110
+ return this;
111
+ }
112
+ /**
113
+ * Sets the UTXOs for the transaction
114
+ * @param value - Array of UTXOs to use
115
+ */
116
+ utxos(value) {
117
+ this.validateUtxos(value);
118
+ this._transaction._utxos = value;
119
+ return this;
120
+ }
121
+ /** @inheritdoc */
122
+ fromImplementation(rawTransaction) {
123
+ try {
124
+ // Parse the raw transaction using Flare's PVM serialization
125
+ const [tx] = flarejs_1.pvmSerial.AddPermissionlessValidatorTx.fromBytes(Buffer.from(rawTransaction, 'hex'), flarejs_1.avmSerial.getAVMManager().getDefaultCodec());
126
+ this.initBuilder(tx);
127
+ return this._transaction;
128
+ }
129
+ catch (e) {
130
+ throw new sdk_core_1.BuildTransactionError(`Failed to parse raw transaction: ${e.message}`);
131
+ }
132
+ }
133
+ /**
134
+ * Check the buffer has 32 byte long.
135
+ * @param chainID
136
+ */
137
+ validateChainId(chainID) {
138
+ if (chainID.length !== 32) {
139
+ throw new sdk_core_1.BuildTransactionError('Chain id are 32 byte size');
140
+ }
141
+ }
142
+ /** @inheritdoc */
143
+ get transaction() {
144
+ return this._transaction;
145
+ }
146
+ set transaction(transaction) {
147
+ this._transaction = transaction;
148
+ }
149
+ /**
150
+ * Check that fee is greater than 0.
151
+ * @param {bigint} fee
152
+ */
153
+ validateFee(fee) {
154
+ if (fee <= BigInt(0)) {
155
+ throw new sdk_core_1.BuildTransactionError('Fee must be greater than 0');
156
+ }
157
+ }
158
+ /** @inheritdoc */
159
+ validateKey({ key }) {
160
+ try {
161
+ new keyPair_1.KeyPair({ prv: key });
162
+ }
163
+ catch (e) {
164
+ throw new sdk_core_1.BuildTransactionError('Invalid key');
165
+ }
166
+ }
167
+ /** @inheritdoc */
168
+ validateTransaction(transaction) {
169
+ // throw new NotImplementedError('validateTransaction not implemented');
170
+ }
171
+ /** @inheritdoc */
172
+ validateValue(value) {
173
+ if (value.isLessThan(0)) {
174
+ throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
175
+ }
176
+ }
177
+ /** @inheritdoc */
178
+ validateAddress(address, addressFormat) {
179
+ if (!utils_1.default.isValidAddress(address.address)) {
180
+ throw new sdk_core_1.BuildTransactionError('Invalid address');
181
+ }
182
+ }
183
+ /**
184
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
185
+ *
186
+ * @param rawTransaction Transaction in any format
187
+ */
188
+ validateRawTransaction(rawTransaction) {
189
+ utils_1.default.validateRawTransaction(rawTransaction);
190
+ }
191
+ /** @inheritdoc */
192
+ signImplementation({ key }) {
193
+ this._signer.push(new keyPair_1.KeyPair({ prv: key }));
194
+ return this.transaction;
195
+ }
196
+ hasSigner() {
197
+ return this._signer !== undefined && this._signer.length > 0;
198
+ }
199
+ /**
200
+ * Check the amount is positive.
201
+ * @param amount
202
+ */
203
+ validateAmount(amount) {
204
+ if (amount <= BigInt(0)) {
205
+ throw new sdk_core_1.BuildTransactionError('Amount must be greater than 0');
206
+ }
207
+ }
208
+ }
209
+ exports.TransactionBuilder = TransactionBuilder;
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQXlFO0FBQ3pFLG1EQUEyRztBQUczRyx1Q0FBb0M7QUFDcEMsK0NBQTRDO0FBQzVDLG9EQUE0QjtBQUc1QixNQUFzQixrQkFBbUIsU0FBUSxpQ0FBc0I7SUFLckUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFKWCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN6QixZQUFPLEdBQWMsRUFBRSxDQUFDO1FBSTdCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxFQUFNO1FBQ2hCLE1BQU0sTUFBTSxHQUFLLEVBQWlCLENBQUMsRUFBNkMsQ0FBQyxNQUFNLENBQUM7UUFFeEYsNENBQTRDO1FBQzVDLElBQ0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVU7WUFDekQsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFDL0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFNBQWlCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFB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YXZtU2VyaWFsLCBwdm1TZXJpYWwsIFVuc2lnbmVkVHggfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciwgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBCYXNlS2V5LCBCYXNlQWRkcmVzcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuICBwdWJsaWMgX3NpZ25lcjogS2V5UGFpcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZpZWxkcyB1c2luZyB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHR4IHRoZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIGl0c2VsZlxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFR4KTogdGhpcyB7XG4gICAgY29uc3QgYmFzZVR4ID0gKCh0eCBhcyBVbnNpZ25lZFR4KS50eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuYmFzZVR4O1xuXG4gICAgLy8gVmFsaWRhdGUgbmV0d29yayBhbmQgYmxvY2tjaGFpbiBJRHMgbWF0Y2hcbiAgICBpZiAoXG4gICAgICBiYXNlVHguTmV0d29ya0lkLnZhbHVlKCkgIT09IHRoaXMuX3RyYW5zYWN0aW9uLl9uZXR3b3JrSUQgfHxcbiAgICAgIGJhc2VUeC5CbG9ja2NoYWluSWQudmFsdWUoKSAhPT0gdGhpcy5fdHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXR3b3JrIG9yIGJsb2NrY2hhaW4gSUQgbWlzbWF0Y2gnKTtcbiAgICB9XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih0eCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyByZWdpb24gVmFsaWRhdG9yc1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSB0aHJlc2hvbGQgZm9yIG11bHRpLXNpZ25hdHVyZSB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHRocmVzaG9sZCAtIE51bWJlciBvZiByZXF1aXJlZCBzaWduYXR1cmVzXG4gICAqL1xuICB2YWxpZGF0ZVRocmVzaG9sZCh0aHJlc2hvbGQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhyZXNob2xkIHx8IHRocmVzaG9sZCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogdGhyZXNob2xkIG11c3QgYmUgc2V0IHRvIDInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgc2luZ2xlIFVUWE8gb2JqZWN0XG4gICAqIEBwYXJhbSB2YWx1ZSAtIFVUWE8gdG8gdmFsaWRhdGVcbiAgICovXG4gIHZhbGlkYXRlVXR4byh2YWx1ZTogRGVjb2RlZFV0eG9PYmopOiB2b2lkIHtcbiAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IFsnb3V0cHV0SUQnLCAnYW1vdW50JywgJ3R4aWQnLCAnb3V0cHV0aWR4J107XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiByZXF1aXJlZEZpZWxkcykge1xuICAgICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgVVRYTyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiAke2ZpZWxkfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gYXJyYXkgb2YgVVRYT3NcbiAgICogQHBhcmFtIHZhbHVlcyAtIEFycmF5IG9mIFVUWE9zIHRvIHZhbGlkYXRlXG4gICAqL1xuICB2YWxpZGF0ZVV0eG9zKHZhbHVlczogRGVjb2RlZFV0eG9PYmpbXSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVVFhPcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgdmFsdWVzLmZvckVhY2godGhpcy52YWxpZGF0ZVV0eG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbG9ja3RpbWUgdmFsdWVcbiAgICogQHBhcmFtIGxvY2t0aW1lIC0gVGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBvdXRwdXQgY2FuIGJlIHNwZW50XG4gICAqL1xuICB2YWxpZGF0ZUxvY2t0aW1lKGxvY2t0aW1lOiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAobG9ja3RpbWUgPCBCaWdJbnQoMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGxvY2t0aW1lIG11c3QgYmUgMCBvciBoaWdoZXInKTtcbiAgICB9XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRocmVzaG9sZCBmb3IgbXVsdGktc2lnbmF0dXJlIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0gdmFsdWUgLSBOdW1iZXIgb2YgcmVxdWlyZWQgc2lnbmF0dXJlc1xuICAgKi9cbiAgdGhyZXNob2xkKHZhbHVlOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlVGhyZXNob2xkKHZhbHVlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fdGhyZXNob2xkID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbG9ja3RpbWUgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIG91dHB1dCBjYW4gYmUgc3BlbnRcbiAgICovXG4gIGxvY2t0aW1lKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlTG9ja3RpbWUoQmlnSW50KHZhbHVlKSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX2xvY2t0aW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIHJlY292ZXJ5IG1vZGUgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcmVjb3ZlclNpZ25lciAtIFdoZXRoZXIgdG8gdXNlIHJlY292ZXJ5IHNpZ25pbmdcbiAgICovXG4gIHJlY292ZXJNb2RlKHJlY292ZXJTaWduZXIgPSB0cnVlKTogdGhpcyB7XG4gICAgdGhpcy5yZWNvdmVyU2lnbmVyID0gcmVjb3ZlclNpZ25lcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZW5kZXIncyBwdWJsaWMga2V5KHMpXG4gICAqIEBwYXJhbSBzZW5kZXJQdWJLZXkgLSBQdWJsaWMga2V5IG9yIGFycmF5IG9mIHB1YmxpYyBrZXlzXG4gICAqL1xuICBmcm9tUHViS2V5KHNlbmRlclB1YktleTogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBwdWJLZXlzID0gQXJyYXkuaXNBcnJheShzZW5kZXJQdWJLZXkpID8gc2VuZGVyUHViS2V5IDogW3NlbmRlclB1YktleV07XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgPSBwdWJLZXlzLm1hcCgoYWRkcikgPT4gdXRpbHMucGFyc2VBZGRyZXNzKGFkZHIpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBVVFhPcyBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFycmF5IG9mIFVUWE9zIHRvIHVzZVxuICAgKi9cbiAgdXR4b3ModmFsdWU6IERlY29kZWRVdHhvT2JqW10pOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlVXR4b3ModmFsdWUpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLl91dHhvcyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICB0cnkge1xuICAgICAgLy8gUGFyc2UgdGhlIHJhdyB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZSdzIFBWTSBzZXJpYWxpemF0aW9uXG4gICAgICBjb25zdCBbdHhdID0gcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguZnJvbUJ5dGVzKFxuICAgICAgICBCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2hleCcpLFxuICAgICAgICBhdm1TZXJpYWwuZ2V0QVZNTWFuYWdlcigpLmdldERlZmF1bHRDb2RlYygpXG4gICAgICApO1xuICAgICAgdGhpcy5pbml0QnVpbGRlcih0eCk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIHBhcnNlIHJhdyB0cmFuc2FjdGlvbjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzcGVjaWZpYyB0cmFuc2FjdGlvbiBidWlsZGVyc1xuICAgKiBCdWlsZHMgdGhlIGFjdHVhbCB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgYnVpbGRlcidzIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgYnVmZmVyIGhhcyAzMiBieXRlIGxvbmcuXG4gICAqIEBwYXJhbSBjaGFpbklEXG4gICAqL1xuICB2YWxpZGF0ZUNoYWluSWQoY2hhaW5JRDogQnVmZmVyKTogdm9pZCB7XG4gICAgaWYgKGNoYWluSUQubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQ2hhaW4gaWQgYXJlIDMyIGJ5dGUgc2l6ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhhdCBmZWUgaXMgZ3JlYXRlciB0aGFuIDAuXG4gICAqIEBwYXJhbSB7YmlnaW50fSBmZWVcbiAgICovXG4gIHZhbGlkYXRlRmVlKGZlZTogYmlnaW50KTogdm9pZCB7XG4gICAgaWYgKGZlZSA8PSBCaWdJbnQoMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ZlZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlS2V5KHsga2V5IH06IEJhc2VLZXkpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGtleScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uPzogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICAvLyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigndmFsaWRhdGVUcmFuc2FjdGlvbiBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuaXNMZXNzVGhhbigwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcywgYWRkcmVzc0Zvcm1hdD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIGluIGFueSBmb3JtYXRcbiAgICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oeyBrZXkgfTogQmFzZUtleSk6IFRyYW5zYWN0aW9uIHtcbiAgICB0aGlzLl9zaWduZXIucHVzaChuZXcgS2V5UGFpcih7IHBydjoga2V5IH0pKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIGhhc1NpZ25lcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmVyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fc2lnbmVyLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIGFtb3VudCBpcyBwb3NpdGl2ZS5cbiAgICogQHBhcmFtIGFtb3VudFxuICAgKi9cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IEJpZ0ludCgwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,57 @@
1
+ import { BaseTransactionBuilderFactory } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { TransactionBuilder } from './transactionBuilder';
4
+ import { ExportInPTxBuilder } from './ExportInPTxBuilder';
5
+ import { ImportInPTxBuilder } from './ImportInPTxBuilder';
6
+ import { ExportInCTxBuilder } from './ExportInCTxBuilder';
7
+ import { ImportInCTxBuilder } from './ImportInCTxBuilder';
8
+ export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
9
+ constructor(_coinConfig: Readonly<CoinConfig>);
10
+ /**
11
+ * Extract credentials from remaining bytes after transaction using FlareJS codec.
12
+ * This is the proper way to parse credentials - using the codec's UnpackPrefix method.
13
+ * @param credentialBytes Remaining bytes after the transaction (starts with numCredentials)
14
+ * @param codec The FlareJS codec to use for unpacking
15
+ * @returns Array of parsed credentials
16
+ */
17
+ private extractCredentialsWithCodec;
18
+ /**
19
+ * Parse a raw transaction buffer using the specified VM manager.
20
+ * @param rawBuffer The raw transaction buffer
21
+ * @param vmType The VM type to use for parsing ('EVM' or 'PVM')
22
+ * @returns Parsed transaction and credentials, or null if parsing fails
23
+ */
24
+ private parseWithVM;
25
+ /**
26
+ * Create the appropriate transaction builder based on transaction type.
27
+ * @param tx The parsed transaction
28
+ * @param rawBuffer The raw transaction buffer
29
+ * @param credentials The extracted credentials
30
+ * @param isEVM Whether this is an EVM transaction
31
+ * @returns The appropriate transaction builder
32
+ */
33
+ private createBuilder;
34
+ /** @inheritdoc */
35
+ from(raw: string): TransactionBuilder;
36
+ /** @inheritdoc */
37
+ getTransferBuilder(): TransactionBuilder;
38
+ /**
39
+ * Export Cross chain transfer
40
+ */
41
+ getExportInPBuilder(): ExportInPTxBuilder;
42
+ /**
43
+ * Import Cross chain transfer
44
+ */
45
+ getImportInPBuilder(): ImportInPTxBuilder;
46
+ /**
47
+ * Import in C chain Cross chain transfer
48
+ */
49
+ getImportInCBuilder(): ImportInCTxBuilder;
50
+ /**
51
+ * Export in C chain Cross chain transfer
52
+ */
53
+ getExportInCBuilder(): ExportInCTxBuilder;
54
+ /** @inheritdoc */
55
+ getWalletInitializationBuilder(): TransactionBuilder;
56
+ }
57
+ //# sourceMappingURL=transactionBuilderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAgB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,qBAAa,yBAA0B,SAAQ,6BAA6B;gBAC9D,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;;;OAMG;IACH,OAAO,CAAC,2BAA2B;IAwBnC;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAgCrB,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAkBrC,kBAAkB;IAClB,kBAAkB,IAAI,kBAAkB;IAIxC;;OAEG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC;;OAEG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC;;OAEG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC;;OAEG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC,kBAAkB;IAClB,8BAA8B,IAAI,kBAAkB;CAGrD"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TransactionBuilderFactory = void 0;
7
+ const flarejs_1 = require("@flarenetwork/flarejs");
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const ExportInPTxBuilder_1 = require("./ExportInPTxBuilder");
10
+ const ImportInPTxBuilder_1 = require("./ImportInPTxBuilder");
11
+ const ExportInCTxBuilder_1 = require("./ExportInCTxBuilder");
12
+ const ImportInCTxBuilder_1 = require("./ImportInCTxBuilder");
13
+ const utils_1 = __importDefault(require("./utils"));
14
+ class TransactionBuilderFactory extends sdk_core_1.BaseTransactionBuilderFactory {
15
+ constructor(_coinConfig) {
16
+ super(_coinConfig);
17
+ }
18
+ /**
19
+ * Extract credentials from remaining bytes after transaction using FlareJS codec.
20
+ * This is the proper way to parse credentials - using the codec's UnpackPrefix method.
21
+ * @param credentialBytes Remaining bytes after the transaction (starts with numCredentials)
22
+ * @param codec The FlareJS codec to use for unpacking
23
+ * @returns Array of parsed credentials
24
+ */
25
+ extractCredentialsWithCodec(credentialBytes, codec) {
26
+ const credentials = [];
27
+ if (credentialBytes.length < 4) {
28
+ return credentials;
29
+ }
30
+ // Skip the first 4 bytes (numCredentials as Int type)
31
+ // The codec doesn't know about this Int, so we skip it manually
32
+ let remainingBytes = credentialBytes.slice(4);
33
+ let moreCredentials = true;
34
+ do {
35
+ try {
36
+ const [credential, rest] = codec.UnpackPrefix(remainingBytes);
37
+ credentials.push(credential);
38
+ remainingBytes = rest;
39
+ }
40
+ catch {
41
+ moreCredentials = false;
42
+ }
43
+ } while (remainingBytes.length > 0 && moreCredentials);
44
+ return credentials;
45
+ }
46
+ /**
47
+ * Parse a raw transaction buffer using the specified VM manager.
48
+ * @param rawBuffer The raw transaction buffer
49
+ * @param vmType The VM type to use for parsing ('EVM' or 'PVM')
50
+ * @returns Parsed transaction and credentials, or null if parsing fails
51
+ */
52
+ parseWithVM(rawBuffer, vmType) {
53
+ try {
54
+ const manager = flarejs_1.utils.getManagerForVM(vmType);
55
+ const [codec, txBytes] = manager.getCodecFromBuffer(rawBuffer);
56
+ const [tx, credentialBytes] = codec.UnpackPrefix(txBytes);
57
+ const credentials = credentialBytes.length > 4 ? this.extractCredentialsWithCodec(credentialBytes, codec) : [];
58
+ return { tx, credentials };
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ /**
65
+ * Create the appropriate transaction builder based on transaction type.
66
+ * @param tx The parsed transaction
67
+ * @param rawBuffer The raw transaction buffer
68
+ * @param credentials The extracted credentials
69
+ * @param isEVM Whether this is an EVM transaction
70
+ * @returns The appropriate transaction builder
71
+ */
72
+ createBuilder(tx, rawBuffer, credentials, isEVM) {
73
+ if (isEVM) {
74
+ if (ExportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(tx._type)) {
75
+ const builder = this.getExportInCBuilder();
76
+ builder.initBuilder(tx, rawBuffer, credentials);
77
+ return builder;
78
+ }
79
+ if (ImportInCTxBuilder_1.ImportInCTxBuilder.verifyTxType(tx._type)) {
80
+ const builder = this.getImportInCBuilder();
81
+ builder.initBuilder(tx, rawBuffer, credentials);
82
+ return builder;
83
+ }
84
+ }
85
+ else {
86
+ if (ImportInPTxBuilder_1.ImportInPTxBuilder.verifyTxType(tx._type)) {
87
+ const builder = this.getImportInPBuilder();
88
+ builder.initBuilder(tx, rawBuffer, credentials);
89
+ return builder;
90
+ }
91
+ if (ExportInPTxBuilder_1.ExportInPTxBuilder.verifyTxType(tx._type)) {
92
+ const builder = this.getExportInPBuilder();
93
+ builder.initBuilder(tx, rawBuffer, credentials);
94
+ return builder;
95
+ }
96
+ }
97
+ throw new sdk_core_1.NotSupported('Transaction type not supported');
98
+ }
99
+ /** @inheritdoc */
100
+ from(raw) {
101
+ utils_1.default.validateRawTransaction(raw);
102
+ const rawBuffer = Buffer.from(utils_1.default.removeHexPrefix(raw), 'hex');
103
+ // Try EVM first, then fall back to PVM
104
+ const evmResult = this.parseWithVM(rawBuffer, 'EVM');
105
+ if (evmResult) {
106
+ return this.createBuilder(evmResult.tx, rawBuffer, evmResult.credentials, true);
107
+ }
108
+ const pvmResult = this.parseWithVM(rawBuffer, 'PVM');
109
+ if (pvmResult) {
110
+ return this.createBuilder(pvmResult.tx, rawBuffer, pvmResult.credentials, false);
111
+ }
112
+ throw new sdk_core_1.NotSupported('Transaction type not supported');
113
+ }
114
+ /** @inheritdoc */
115
+ getTransferBuilder() {
116
+ throw new sdk_core_1.NotSupported('Transfer is not supported in P Chain');
117
+ }
118
+ /**
119
+ * Export Cross chain transfer
120
+ */
121
+ getExportInPBuilder() {
122
+ return new ExportInPTxBuilder_1.ExportInPTxBuilder(this._coinConfig);
123
+ }
124
+ /**
125
+ * Import Cross chain transfer
126
+ */
127
+ getImportInPBuilder() {
128
+ return new ImportInPTxBuilder_1.ImportInPTxBuilder(this._coinConfig);
129
+ }
130
+ /**
131
+ * Import in C chain Cross chain transfer
132
+ */
133
+ getImportInCBuilder() {
134
+ return new ImportInCTxBuilder_1.ImportInCTxBuilder(this._coinConfig);
135
+ }
136
+ /**
137
+ * Export in C chain Cross chain transfer
138
+ */
139
+ getExportInCBuilder() {
140
+ return new ExportInCTxBuilder_1.ExportInCTxBuilder(this._coinConfig);
141
+ }
142
+ /** @inheritdoc */
143
+ getWalletInitializationBuilder() {
144
+ throw new sdk_core_1.NotSupported('Wallet initialization is not needed');
145
+ }
146
+ }
147
+ exports.TransactionBuilderFactory = TransactionBuilderFactory;
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBOEY7QUFDOUYsbURBQW1GO0FBR25GLDZEQUEwRDtBQUMxRCw2REFBMEQ7QUFDMUQsNkRBQTBEO0FBQzFELDZEQUEwRDtBQUUxRCxvREFBNEI7QUFNNUIsTUFBYSx5QkFBMEIsU0FBUSx3Q0FBNkI7SUFDMUUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLDJCQUEyQixDQUFDLGVBQTJCLEVBQUUsS0FBWTtRQUMzRSxNQUFNLFdBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQ3JDLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELGdFQUFnRTtRQUNoRSxJQUFJLGNBQWMsR0FBZSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksZUFBZSxHQUFHLElBQUksQ0FBQztRQUUzQixHQUFHLENBQUM7WUFDRixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFhLGNBQWMsQ0FBQyxDQUFDO2dCQUMxRSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QixjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQyxRQUFRLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGVBQWUsRUFBRTtR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SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlscyBhcyBGbGFyZVV0aWxzLCBldm1TZXJpYWwsIHB2bVNlcmlhbCwgQ3JlZGVudGlhbCB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgTm90U3VwcG9ydGVkIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgRXhwb3J0SW5QVHhCdWlsZGVyIH0gZnJvbSAnLi9FeHBvcnRJblBUeEJ1aWxkZXInO1xuaW1wb3J0IHsgSW1wb3J0SW5QVHhCdWlsZGVyIH0gZnJvbSAnLi9JbXBvcnRJblBUeEJ1aWxkZXInO1xuaW1wb3J0IHsgRXhwb3J0SW5DVHhCdWlsZGVyIH0gZnJvbSAnLi9FeHBvcnRJbkNUeEJ1aWxkZXInO1xuaW1wb3J0IHsgSW1wb3J0SW5DVHhCdWlsZGVyIH0gZnJvbSAnLi9JbXBvcnRJbkNUeEJ1aWxkZXInO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBDb2RlYyB7XG4gIFVucGFja1ByZWZpeDxUPihieXRlczogVWludDhBcnJheSk6IFtULCBVaW50OEFycmF5XTtcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGNyZWRlbnRpYWxzIGZyb20gcmVtYWluaW5nIGJ5dGVzIGFmdGVyIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMgY29kZWMuXG4gICAqIFRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gcGFyc2UgY3JlZGVudGlhbHMgLSB1c2luZyB0aGUgY29kZWMncyBVbnBhY2tQcmVmaXggbWV0aG9kLlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbEJ5dGVzIFJlbWFpbmluZyBieXRlcyBhZnRlciB0aGUgdHJhbnNhY3Rpb24gKHN0YXJ0cyB3aXRoIG51bUNyZWRlbnRpYWxzKVxuICAgKiBAcGFyYW0gY29kZWMgVGhlIEZsYXJlSlMgY29kZWMgdG8gdXNlIGZvciB1bnBhY2tpbmdcbiAgICogQHJldHVybnMgQXJyYXkgb2YgcGFyc2VkIGNyZWRlbnRpYWxzXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RDcmVkZW50aWFsc1dpdGhDb2RlYyhjcmVkZW50aWFsQnl0ZXM6IFVpbnQ4QXJyYXksIGNvZGVjOiBDb2RlYyk6IENyZWRlbnRpYWxbXSB7XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IFtdO1xuICAgIGlmIChjcmVkZW50aWFsQnl0ZXMubGVuZ3RoIDwgNCkge1xuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIFNraXAgdGhlIGZpcnN0IDQgYnl0ZXMgKG51bUNyZWRlbnRpYWxzIGFzIEludCB0eXBlKVxuICAgIC8vIFRoZSBjb2RlYyBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBJbnQsIHNvIHdlIHNraXAgaXQgbWFudWFsbHlcbiAgICBsZXQgcmVtYWluaW5nQnl0ZXM6IFVpbnQ4QXJyYXkgPSBjcmVkZW50aWFsQnl0ZXMuc2xpY2UoNCk7XG4gICAgbGV0IG1vcmVDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbY3JlZGVudGlhbCwgcmVzdF0gPSBjb2RlYy5VbnBhY2tQcmVmaXg8Q3JlZGVudGlhbD4ocmVtYWluaW5nQnl0ZXMpO1xuICAgICAgICBjcmVkZW50aWFscy5wdXNoKGNyZWRlbnRpYWwpO1xuICAgICAgICByZW1haW5pbmdCeXRlcyA9IHJlc3Q7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbW9yZUNyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSB3aGlsZSAocmVtYWluaW5nQnl0ZXMubGVuZ3RoID4gMCAmJiBtb3JlQ3JlZGVudGlhbHMpO1xuXG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGEgcmF3IHRyYW5zYWN0aW9uIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIFZNIG1hbmFnZXIuXG4gICAqIEBwYXJhbSByYXdCdWZmZXIgVGhlIHJhdyB0cmFuc2FjdGlvbiBidWZmZXJcbiAgICogQHBhcmFtIHZtVHlwZSBUaGUgVk0gdHlwZSB0byB1c2UgZm9yIHBhcnNpbmcgKCdFVk0nIG9yICdQVk0nKVxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gYW5kIGNyZWRlbnRpYWxzLCBvciBudWxsIGlmIHBhcnNpbmcgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgcGFyc2VXaXRoVk0oXG4gICAgcmF3QnVmZmVyOiBCdWZmZXIsXG4gICAgdm1UeXBlOiAnRVZNJyB8ICdQVk0nXG4gICk6IHsgdHg6IFNlcmlhbGl6ZWRUeDsgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSB9IHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1hbmFnZXIgPSBGbGFyZVV0aWxzLmdldE1hbmFnZXJGb3JWTSh2bVR5cGUpO1xuICAgICAgY29uc3QgW2NvZGVjLCB0eEJ5dGVzXSA9IG1hbmFnZXIuZ2V0Q29kZWNGcm9tQnVmZmVyKHJhd0J1ZmZlcik7XG4gICAgICBjb25zdCBbdHgsIGNyZWRlbnRpYWxCeXRlc10gPSAoY29kZWMgYXMgQ29kZWMpLlVucGFja1ByZWZpeDxTZXJpYWxpemVkVHg+KHR4Qnl0ZXMpO1xuXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9XG4gICAgICAgIGNyZWRlbnRpYWxCeXRlcy5sZW5ndGggPiA0ID8gdGhpcy5leHRyYWN0Q3JlZGVudGlhbHNXaXRoQ29kZWMoY3JlZGVudGlhbEJ5dGVzLCBjb2RlYyBhcyBDb2RlYykgOiBbXTtcblxuICAgICAgcmV0dXJuIHsgdHgsIGNyZWRlbnRpYWxzIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2FjdGlvbiBidWlsZGVyIGJhc2VkIG9uIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSB0eCBUaGUgcGFyc2VkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSByYXdCdWZmZXIgVGhlIHJhdyB0cmFuc2FjdGlvbiBidWZmZXJcbiAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFRoZSBleHRyYWN0ZWQgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIGlzRVZNIFdoZXRoZXIgdGhpcyBpcyBhbiBFVk0gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgVGhlIGFwcHJvcHJpYXRlIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQnVpbGRlcihcbiAgICB0eDogU2VyaWFsaXplZFR4LFxuICAgIHJhd0J1ZmZlcjogQnVmZmVyLFxuICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10sXG4gICAgaXNFVk06IGJvb2xlYW5cbiAgKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICBpZiAoaXNFVk0pIHtcbiAgICAgIGlmIChFeHBvcnRJbkNUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4Ll90eXBlKSkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gdGhpcy5nZXRFeHBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHggYXMgZXZtU2VyaWFsLkV4cG9ydFR4LCByYXdCdWZmZXIsIGNyZWRlbnRpYWxzKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgICB9XG4gICAgICBpZiAoSW1wb3J0SW5DVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eC5fdHlwZSkpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IHRoaXMuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4IGFzIGV2bVNlcmlhbC5JbXBvcnRUeCwgcmF3QnVmZmVyLCBjcmVkZW50aWFscyk7XG4gICAgICAgIHJldHVybiBidWlsZGVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoSW1wb3J0SW5QVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eC5fdHlwZSkpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IHRoaXMuZ2V0SW1wb3J0SW5QQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4IGFzIHB2bVNlcmlhbC5JbXBvcnRUeCwgcmF3QnVmZmVyLCBjcmVkZW50aWFscyk7XG4gICAgICAgIHJldHVybiBidWlsZGVyO1xuICAgICAgfVxuICAgICAgaWYgKEV4cG9ydEluUFR4QnVpbGRlci52ZXJpZnlUeFR5cGUodHguX3R5cGUpKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmdldEV4cG9ydEluUEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCBhcyBwdm1TZXJpYWwuRXhwb3J0VHgsIHJhd0J1ZmZlciwgY3JlZGVudGlhbHMpO1xuICAgICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnVHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZnJvbShyYXc6IHN0cmluZyk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXcpO1xuICAgIGNvbnN0IHJhd0J1ZmZlciA9IEJ1ZmZlci5mcm9tKHV0aWxzLnJlbW92ZUhleFByZWZpeChyYXcpLCAnaGV4Jyk7XG5cbiAgICAvLyBUcnkgRVZNIGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byBQVk1cbiAgICBjb25zdCBldm1SZXN1bHQgPSB0aGlzLnBhcnNlV2l0aFZNKHJhd0J1ZmZlciwgJ0VWTScpO1xuICAgIGlmIChldm1SZXN1bHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUJ1aWxkZXIoZXZtUmVzdWx0LnR4LCByYXdCdWZmZXIsIGV2bVJlc3VsdC5jcmVkZW50aWFscywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHZtUmVzdWx0ID0gdGhpcy5wYXJzZVdpdGhWTShyYXdCdWZmZXIsICdQVk0nKTtcbiAgICBpZiAocHZtUmVzdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVCdWlsZGVyKHB2bVJlc3VsdC50eCwgcmF3QnVmZmVyLCBwdm1SZXN1bHQuY3JlZGVudGlhbHMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXRUcmFuc2ZlckJ1aWxkZXIoKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2ZlciBpcyBub3Qgc3VwcG9ydGVkIGluIFAgQ2hhaW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgQ3Jvc3MgY2hhaW4gdHJhbnNmZXJcbiAgICovXG4gIGdldEV4cG9ydEluUEJ1aWxkZXIoKTogRXhwb3J0SW5QVHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEV4cG9ydEluUFR4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgQ3Jvc3MgY2hhaW4gdHJhbnNmZXJcbiAgICovXG4gIGdldEltcG9ydEluUEJ1aWxkZXIoKTogSW1wb3J0SW5QVHhCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEltcG9ydEluUFR4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgaW4gQyBjaGFpbiBDcm9zcyBjaGFpbiB0cmFuc2ZlclxuICAgKi9cbiAgZ2V0SW1wb3J0SW5DQnVpbGRlcigpOiBJbXBvcnRJbkNUeEJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgSW1wb3J0SW5DVHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBpbiBDIGNoYWluIENyb3NzIGNoYWluIHRyYW5zZmVyXG4gICAqL1xuICBnZXRFeHBvcnRJbkNCdWlsZGVyKCk6IEV4cG9ydEluQ1R4QnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBFeHBvcnRJbkNUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnV2FsbGV0IGluaXRpYWxpemF0aW9uIGlzIG5vdCBuZWVkZWQnKTtcbiAgfVxufVxuIl19