@bitgo-beta/sdk-coin-avaxp 0.0.0-semantic-release-managed

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.json +7 -0
  3. package/.mocharc.yml +8 -0
  4. package/CHANGELOG.md +1091 -0
  5. package/LICENSE +191 -0
  6. package/README.md +39 -0
  7. package/dist/src/avaxp.d.ts +91 -0
  8. package/dist/src/avaxp.d.ts.map +1 -0
  9. package/dist/src/avaxp.js +343 -0
  10. package/dist/src/iface.d.ts +42 -0
  11. package/dist/src/iface.d.ts.map +1 -0
  12. package/dist/src/iface.js +3 -0
  13. package/dist/src/index.d.ts +6 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +45 -0
  16. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +21 -0
  17. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/atomicInCTransactionBuilder.js +49 -0
  19. package/dist/src/lib/atomicTransactionBuilder.d.ts +38 -0
  20. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/atomicTransactionBuilder.js +129 -0
  22. package/dist/src/lib/delegatorTxBuilder.d.ts +95 -0
  23. package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/delegatorTxBuilder.js +285 -0
  25. package/dist/src/lib/deprecatedTransaction.d.ts +98 -0
  26. package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
  27. package/dist/src/lib/deprecatedTransaction.js +344 -0
  28. package/dist/src/lib/deprecatedTransactionBuilder.d.ts +114 -0
  29. package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
  31. package/dist/src/lib/errors.d.ts +8 -0
  32. package/dist/src/lib/errors.d.ts.map +1 -0
  33. package/dist/src/lib/errors.js +19 -0
  34. package/dist/src/lib/exportInCTxBuilder.d.ts +55 -0
  35. package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/exportInCTxBuilder.js +159 -0
  37. package/dist/src/lib/exportTxBuilder.d.ts +33 -0
  38. package/dist/src/lib/exportTxBuilder.d.ts.map +1 -0
  39. package/dist/src/lib/exportTxBuilder.js +88 -0
  40. package/dist/src/lib/iface.d.ts +68 -0
  41. package/dist/src/lib/iface.d.ts.map +1 -0
  42. package/dist/src/lib/iface.js +20 -0
  43. package/dist/src/lib/importInCTxBuilder.d.ts +44 -0
  44. package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
  45. package/dist/src/lib/importInCTxBuilder.js +131 -0
  46. package/dist/src/lib/importTxBuilder.d.ts +18 -0
  47. package/dist/src/lib/importTxBuilder.d.ts.map +1 -0
  48. package/dist/src/lib/importTxBuilder.js +67 -0
  49. package/dist/src/lib/index.d.ts +11 -0
  50. package/dist/src/lib/index.d.ts.map +1 -0
  51. package/dist/src/lib/index.js +37 -0
  52. package/dist/src/lib/keyPair.d.ts +58 -0
  53. package/dist/src/lib/keyPair.d.ts.map +1 -0
  54. package/dist/src/lib/keyPair.js +150 -0
  55. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +154 -0
  56. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/permissionlessValidatorTxBuilder.js +452 -0
  58. package/dist/src/lib/transaction.d.ts +78 -0
  59. package/dist/src/lib/transaction.d.ts.map +1 -0
  60. package/dist/src/lib/transaction.js +254 -0
  61. package/dist/src/lib/transactionBuilder.d.ts +71 -0
  62. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transactionBuilder.js +138 -0
  64. package/dist/src/lib/transactionBuilderFactory.d.ts +57 -0
  65. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  66. package/dist/src/lib/transactionBuilderFactory.js +178 -0
  67. package/dist/src/lib/utils.d.ts +184 -0
  68. package/dist/src/lib/utils.d.ts.map +1 -0
  69. package/dist/src/lib/utils.js +378 -0
  70. package/dist/src/lib/utxoEngine.d.ts +53 -0
  71. package/dist/src/lib/utxoEngine.d.ts.map +1 -0
  72. package/dist/src/lib/utxoEngine.js +112 -0
  73. package/dist/src/lib/validatorTxBuilder.d.ts +37 -0
  74. package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
  75. package/dist/src/lib/validatorTxBuilder.js +69 -0
  76. package/dist/src/register.d.ts +3 -0
  77. package/dist/src/register.d.ts.map +1 -0
  78. package/dist/src/register.js +11 -0
  79. package/dist/src/tavaxp.d.ts +9 -0
  80. package/dist/src/tavaxp.d.ts.map +1 -0
  81. package/dist/src/tavaxp.js +14 -0
  82. package/dist/test/resources/avaxp.d.ts +259 -0
  83. package/dist/test/resources/avaxp.d.ts.map +1 -0
  84. package/dist/test/resources/avaxp.js +1093 -0
  85. package/dist/test/resources/errors.d.ts +19 -0
  86. package/dist/test/resources/errors.d.ts.map +1 -0
  87. package/dist/test/resources/errors.js +22 -0
  88. package/dist/test/resources/keychains.d.ts +18 -0
  89. package/dist/test/resources/keychains.d.ts.map +1 -0
  90. package/dist/test/resources/keychains.js +30 -0
  91. package/dist/test/resources/tx/exportC.d.ts +14 -0
  92. package/dist/test/resources/tx/exportC.d.ts.map +1 -0
  93. package/dist/test/resources/tx/exportC.js +21 -0
  94. package/dist/test/resources/tx/importC.d.ts +29 -0
  95. package/dist/test/resources/tx/importC.d.ts.map +1 -0
  96. package/dist/test/resources/tx/importC.js +42 -0
  97. package/dist/test/resources/tx/importP.d.ts +29 -0
  98. package/dist/test/resources/tx/importP.d.ts.map +1 -0
  99. package/dist/test/resources/tx/importP.js +42 -0
  100. package/dist/test/unit/avaxp.d.ts +2 -0
  101. package/dist/test/unit/avaxp.d.ts.map +1 -0
  102. package/dist/test/unit/avaxp.js +732 -0
  103. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts +2 -0
  104. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts.map +1 -0
  105. package/dist/test/unit/lib/exportC2PTxBuilder.js +125 -0
  106. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +2 -0
  107. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +1 -0
  108. package/dist/test/unit/lib/exportP2CTxBuilder.js +183 -0
  109. package/dist/test/unit/lib/importC2PTxBuilder.d.ts +2 -0
  110. package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +1 -0
  111. package/dist/test/unit/lib/importC2PTxBuilder.js +99 -0
  112. package/dist/test/unit/lib/importP2CTxBuilder.d.ts +2 -0
  113. package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +1 -0
  114. package/dist/test/unit/lib/importP2CTxBuilder.js +137 -0
  115. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  116. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  117. package/dist/test/unit/lib/keyPair.js +186 -0
  118. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
  119. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  120. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +341 -0
  121. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  122. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  123. package/dist/test/unit/lib/signFlowTestSuit.js +80 -0
  124. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  125. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  126. package/dist/test/unit/lib/transactionBuilderFactory.js +179 -0
  127. package/dist/test/unit/lib/utils.d.ts +2 -0
  128. package/dist/test/unit/lib/utils.d.ts.map +1 -0
  129. package/dist/test/unit/lib/utils.js +83 -0
  130. package/dist/test/unit/lib/utxoEngine.d.ts +2 -0
  131. package/dist/test/unit/lib/utxoEngine.d.ts.map +1 -0
  132. package/dist/test/unit/lib/utxoEngine.js +168 -0
  133. package/dist/test/unit/lib/validateTxBuilder.d.ts +2 -0
  134. package/dist/test/unit/lib/validateTxBuilder.d.ts.map +1 -0
  135. package/dist/test/unit/lib/validateTxBuilder.js +327 -0
  136. package/dist/tsconfig.tsbuildinfo +1 -0
  137. package/package.json +63 -0
@@ -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.DeprecatedTransactionBuilder = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const deprecatedTransaction_1 = require("./deprecatedTransaction");
9
+ const keyPair_1 = require("./keyPair");
10
+ const avalanche_1 = require("avalanche");
11
+ const utils_1 = __importDefault(require("./utils"));
12
+ const platformvm_1 = require("avalanche/dist/apis/platformvm");
13
+ class DeprecatedTransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
14
+ constructor(_coinConfig) {
15
+ super(_coinConfig);
16
+ this._signer = [];
17
+ this.recoverSigner = false;
18
+ this._transaction = new deprecatedTransaction_1.DeprecatedTransaction(_coinConfig);
19
+ }
20
+ /**
21
+ * Initialize the transaction builder fields using the decoded transaction data
22
+ *
23
+ * @param {DeprecatedTx} tx the transaction data
24
+ * @returns itself
25
+ */
26
+ initBuilder(tx) {
27
+ const baseTx = tx.getUnsignedTx().getTransaction();
28
+ if (baseTx.getNetworkID() !== this._transaction._networkID ||
29
+ !baseTx.getBlockchainID().equals(this._transaction._blockchainID)) {
30
+ throw new Error('Network or blockchain is not equals');
31
+ }
32
+ this._transaction.setTransaction(tx);
33
+ return this;
34
+ }
35
+ /** @inheritdoc */
36
+ fromImplementation(rawTransaction) {
37
+ const tx = new platformvm_1.Tx();
38
+ tx.fromBuffer(avalanche_1.Buffer.from(rawTransaction, 'hex'));
39
+ this.initBuilder(tx);
40
+ return this.transaction;
41
+ }
42
+ /** @inheritdoc */
43
+ async buildImplementation() {
44
+ this.buildAvaxTransaction();
45
+ this.transaction.setTransactionType(this.transactionType);
46
+ if (this.hasSigner) {
47
+ this._signer.forEach((keyPair) => this.transaction.sign(keyPair));
48
+ }
49
+ return this.transaction;
50
+ }
51
+ // region Getters and Setters
52
+ /**
53
+ * When using recovery key must be set here
54
+ * TODO: STLX-17317 recovery key signing
55
+ * @param {boolean} true if it's recovery signer, default true.
56
+ */
57
+ recoverMode(recoverSigner = true) {
58
+ this.recoverSigner = recoverSigner;
59
+ return this;
60
+ }
61
+ /**
62
+ * Threshold is an int that names the number of unique signatures required to spend the output.
63
+ * Must be less than or equal to the length of Addresses.
64
+ * @param {number}
65
+ */
66
+ threshold(value) {
67
+ this.validateThreshold(value);
68
+ this._transaction._threshold = value;
69
+ return this;
70
+ }
71
+ /**
72
+ * Locktime is a long that contains the unix timestamp that this output can be spent after.
73
+ * The unix timestamp is specific to the second.
74
+ * @param value
75
+ */
76
+ locktime(value) {
77
+ this.validateLocktime(new avalanche_1.BN(value));
78
+ this._transaction._locktime = new avalanche_1.BN(value);
79
+ return this;
80
+ }
81
+ /**
82
+ * fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output.
83
+ * @param {string | stirng[]} senderPubKey
84
+ */
85
+ fromPubKey(senderPubKey) {
86
+ const pubKeys = senderPubKey instanceof Array ? senderPubKey : [senderPubKey];
87
+ this._transaction._fromAddresses = pubKeys.map(utils_1.default.parseAddress);
88
+ return this;
89
+ }
90
+ /**
91
+ * List of UTXO required as inputs.
92
+ * A UTXO is a standalone representation of a transaction output.
93
+ *
94
+ * @param {DecodedUtxoObj[]} list of UTXOS
95
+ */
96
+ utxos(value) {
97
+ this.validateUtxos(value);
98
+ this._transaction._utxos = value;
99
+ return this;
100
+ }
101
+ /**
102
+ * Getter for know if build should sign
103
+ */
104
+ get hasSigner() {
105
+ return this._signer !== undefined && this._signer.length > 0;
106
+ }
107
+ /** @inheritdoc */
108
+ get transaction() {
109
+ return this._transaction;
110
+ }
111
+ set transaction(transaction) {
112
+ this._transaction = transaction;
113
+ }
114
+ /** @inheritdoc */
115
+ signImplementation({ key }) {
116
+ this._signer.push(new keyPair_1.KeyPair({ prv: key }));
117
+ return this.transaction;
118
+ }
119
+ // endregion
120
+ // region Validators
121
+ /**
122
+ * Validates the threshold
123
+ * @param threshold
124
+ */
125
+ validateThreshold(threshold) {
126
+ if (!threshold || threshold !== 2) {
127
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: threshold must be set to 2');
128
+ }
129
+ }
130
+ /**
131
+ * Validates locktime
132
+ * @param locktime
133
+ */
134
+ validateLocktime(locktime) {
135
+ if (!locktime || locktime.lt(new avalanche_1.BN(0))) {
136
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: locktime must be 0 or higher');
137
+ }
138
+ }
139
+ /** @inheritdoc */
140
+ validateAddress(address, addressFormat) {
141
+ if (!utils_1.default.isValidAddress(address.address)) {
142
+ throw new sdk_core_1.BuildTransactionError('Invalid address');
143
+ }
144
+ }
145
+ /** @inheritdoc */
146
+ validateKey({ key }) {
147
+ if (!new keyPair_1.KeyPair({ prv: key })) {
148
+ throw new sdk_core_1.BuildTransactionError('Invalid key');
149
+ }
150
+ }
151
+ /**
152
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
153
+ * It overrides abstract method from BaseTransactionBuilder
154
+ *
155
+ * @param rawTransaction Transaction in any format
156
+ */
157
+ validateRawTransaction(rawTransaction) {
158
+ utils_1.default.validateRawTransaction(rawTransaction);
159
+ }
160
+ /** @inheritdoc */
161
+ validateTransaction(transaction) {
162
+ // throw new NotImplementedError('validateTransaction not implemented');
163
+ }
164
+ /** @inheritdoc */
165
+ validateValue(value) {
166
+ if (value.isLessThan(0)) {
167
+ throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
168
+ }
169
+ }
170
+ /**
171
+ * Check the list of UTXOS is empty and check each UTXO.
172
+ * @param values
173
+ */
174
+ validateUtxos(values) {
175
+ if (values.length === 0) {
176
+ throw new sdk_core_1.BuildTransactionError("Utxos can't be empty array");
177
+ }
178
+ values.forEach(this.validateUtxo);
179
+ }
180
+ /**
181
+ * Check the UTXO has expected fields.
182
+ * @param UTXO
183
+ */
184
+ validateUtxo(value) {
185
+ ['outputID', 'amount', 'txid', 'outputidx'].forEach((field) => {
186
+ if (!value.hasOwnProperty(field))
187
+ throw new sdk_core_1.BuildTransactionError(`Utxos required ${field}`);
188
+ });
189
+ }
190
+ /**
191
+ * Check the amount is positive.
192
+ * @param amount
193
+ */
194
+ validateAmount(amount) {
195
+ if (amount.lten(0)) {
196
+ throw new sdk_core_1.BuildTransactionError('Amount must be greater than 0');
197
+ }
198
+ }
199
+ /**
200
+ * Check the buffer has 32 byte long.
201
+ * @param chainID
202
+ */
203
+ validateChainId(chainID) {
204
+ if (chainID.length !== 32) {
205
+ throw new sdk_core_1.BuildTransactionError('Chain id are 32 byte size');
206
+ }
207
+ }
208
+ }
209
+ exports.DeprecatedTransactionBuilder = DeprecatedTransactionBuilder;
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwcmVjYXRlZFRyYW5zYWN0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZGVwcmVjYXRlZFRyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxtREFPOEI7QUFDOUIsbUVBQWdFO0FBQ2hFLHVDQUFvQztBQUNwQyx5Q0FBcUQ7QUFDckQsb0RBQTRCO0FBRTVCLCtEQUE2RDtBQUU3RCxNQUFzQiw0QkFBNkIsU0FBUSxpQ0FBc0I7SUFLL0UsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFKZCxZQUFPLEdBQWMsRUFBRSxDQUFDO1FBQ3JCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBSTlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSw2Q0FBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsRUFBZ0I7UUFDMUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25ELElBQ0UsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVTtZQUN0RCxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFDakUsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1Isa0JBQWtCLENBQUMsY0FBc0I7UUFDakQsTUFBTSxFQUFFLEdBQUcsSUFBSSxlQUFLLEVBQUUsQ0FBQztRQUN2QixF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aW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7XG4gIEJhc2VBZGRyZXNzLFxuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgQmFzZVRyYW5zYWN0aW9uLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBEZXByZWNhdGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2RlcHJlY2F0ZWRUcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZWNvZGVkVXR4b09iaiwgRGVwcmVjYXRlZFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBUeCBhcyBQVk1UeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvcGxhdGZvcm12bSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZXByZWNhdGVkVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX3RyYW5zYWN0aW9uOiBEZXByZWNhdGVkVHJhbnNhY3Rpb247XG4gIHB1YmxpYyBfc2lnbmVyOiBLZXlQYWlyW10gPSBbXTtcbiAgcHJvdGVjdGVkIHJlY292ZXJTaWduZXIgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgRGVwcmVjYXRlZFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZpZWxkcyB1c2luZyB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7RGVwcmVjYXRlZFR4fSB0eCB0aGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyBpdHNlbGZcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBEZXByZWNhdGVkVHgpOiB0aGlzIHtcbiAgICBjb25zdCBiYXNlVHggPSB0eC5nZXRVbnNpZ25lZFR4KCkuZ2V0VHJhbnNhY3Rpb24oKTtcbiAgICBpZiAoXG4gICAgICBiYXNlVHguZ2V0TmV0d29ya0lEKCkgIT09IHRoaXMuX3RyYW5zYWN0aW9uLl9uZXR3b3JrSUQgfHxcbiAgICAgICFiYXNlVHguZ2V0QmxvY2tjaGFpbklEKCkuZXF1YWxzKHRoaXMuX3RyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgb3IgYmxvY2tjaGFpbiBpcyBub3QgZXF1YWxzJyk7XG4gICAgfVxuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBEZXByZWNhdGVkVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFBWTVR4KCk7XG4gICAgdHguZnJvbUJ1ZmZlcihCdWZmZXJBdmF4LmZyb20ocmF3VHJhbnNhY3Rpb24sICdoZXgnKSk7XG4gICAgdGhpcy5pbml0QnVpbGRlcih0eCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxEZXByZWNhdGVkVHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmJ1aWxkQXZheFRyYW5zYWN0aW9uKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIGlmICh0aGlzLmhhc1NpZ25lcikge1xuICAgICAgdGhpcy5fc2lnbmVyLmZvckVhY2goKGtleVBhaXIpID0+IHRoaXMudHJhbnNhY3Rpb24uc2lnbihrZXlQYWlyKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXZheCB0cmFuc2FjdGlvbi4gdHJhbnNhY3Rpb24gZmllbGQgaXMgY2hhbmdlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZEF2YXhUcmFuc2FjdGlvbigpOiB2b2lkO1xuXG4gIC8vIHJlZ2lvbiBHZXR0ZXJzIGFuZCBTZXR0ZXJzXG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHJlY292ZXJ5IGtleSBtdXN0IGJlIHNldCBoZXJlXG4gICAqIFRPRE86IFNUTFgtMTczMTcgcmVjb3Zlcnkga2V5IHNpZ25pbmdcbiAgICogQHBhcmFtIHtib29sZWFufSB0cnVlIGlmIGl0J3MgcmVjb3Zlcnkgc2lnbmVyLCBkZWZhdWx0IHRydWUuXG4gICAqL1xuICBwdWJsaWMgcmVjb3Zlck1vZGUocmVjb3ZlclNpZ25lciA9IHRydWUpOiB0aGlzIHtcbiAgICB0aGlzLnJlY292ZXJTaWduZXIgPSByZWNvdmVyU2lnbmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocmVzaG9sZCBpcyBhbiBpbnQgdGhhdCBuYW1lcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBzaWduYXR1cmVzIHJlcXVpcmVkIHRvIHNwZW5kIHRoZSBvdXRwdXQuXG4gICAqIE11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgQWRkcmVzc2VzLlxuICAgKiBAcGFyYW0ge251bWJlcn1cbiAgICovXG4gIHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVRocmVzaG9sZCh2YWx1ZSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2t0aW1lIGlzIGEgbG9uZyB0aGF0IGNvbnRhaW5zIHRoZSB1bml4IHRpbWVzdGFtcCB0aGF0IHRoaXMgb3V0cHV0IGNhbiBiZSBzcGVudCBhZnRlci5cbiAgICogVGhlIHVuaXggdGltZXN0YW1wIGlzIHNwZWNpZmljIHRvIHRoZSBzZWNvbmQuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgbG9ja3RpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVMb2NrdGltZShuZXcgQk4odmFsdWUpKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSBuZXcgQk4odmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGZyb21QdWJLZXkgaXMgYSBsaXN0IG9mIHVuaXF1ZSBhZGRyZXNzZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwcml2YXRlIGtleXMgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVuZCB0aGlzIG91dHB1dC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdGlybmdbXX0gc2VuZGVyUHViS2V5XG4gICAqL1xuICBmcm9tUHViS2V5KHNlbmRlclB1YktleTogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBwdWJLZXlzID0gc2VuZGVyUHViS2V5IGluc3RhbmNlb2YgQXJyYXkgPyBzZW5kZXJQdWJLZXkgOiBbc2VuZGVyUHViS2V5XTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IHB1YktleXMubWFwKHV0aWxzLnBhcnNlQWRkcmVzcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBvZiBVVFhPIHJlcXVpcmVkIGFzIGlucHV0cy5cbiAgICogQSBVVFhPIGlzIGEgc3RhbmRhbG9uZSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIHtEZWNvZGVkVXR4b09ialtdfSBsaXN0IG9mIFVUWE9TXG4gICAqL1xuICB1dHhvcyh2YWx1ZTogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVVdHhvcyh2YWx1ZSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX3V0eG9zID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBrbm93IGlmIGJ1aWxkIHNob3VsZCBzaWduXG4gICAqL1xuICBnZXQgaGFzU2lnbmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zaWduZXIubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uKCk6IERlcHJlY2F0ZWRUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldCB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbjogRGVwcmVjYXRlZFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKHsga2V5IH06IEJhc2VLZXkpOiBCYXNlVHJhbnNhY3Rpb24ge1xuICAgIHRoaXMuX3NpZ25lci5wdXNoKG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSkpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8vIGVuZHJlZ2lvblxuICAvLyByZWdpb24gVmFsaWRhdG9yc1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRocmVzaG9sZFxuICAgKiBAcGFyYW0gdGhyZXNob2xkXG4gICAqL1xuICB2YWxpZGF0ZVRocmVzaG9sZCh0aHJlc2hvbGQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhyZXNob2xkIHx8IHRocmVzaG9sZCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogdGhyZXNob2xkIG11c3QgYmUgc2V0IHRvIDInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGxvY2t0aW1lXG4gICAqIEBwYXJhbSBsb2NrdGltZVxuICAgKi9cbiAgdmFsaWRhdGVMb2NrdGltZShsb2NrdGltZTogQk4pOiB2b2lkIHtcbiAgICBpZiAoIWxvY2t0aW1lIHx8IGxvY2t0aW1lLmx0KG5ldyBCTigwKSkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGxvY2t0aW1lIG11c3QgYmUgMCBvciBoaWdoZXInKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IEJhc2VBZGRyZXNzLCBhZGRyZXNzRm9ybWF0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoeyBrZXkgfTogQmFzZUtleSk6IHZvaWQge1xuICAgIGlmICghbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBrZXknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKiBJdCBvdmVycmlkZXMgYWJzdHJhY3QgbWV0aG9kIGZyb20gQmFzZVRyYW5zYWN0aW9uQnVpbGRlclxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gaW4gYW55IGZvcm1hdFxuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbj86IERlcHJlY2F0ZWRUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIC8vIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCd2YWxpZGF0ZVRyYW5zYWN0aW9uIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVmFsdWUodmFsdWU6IEJpZ051bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuKDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIGxpc3Qgb2YgVVRYT1MgaXMgZW1wdHkgYW5kIGNoZWNrIGVhY2ggVVRYTy5cbiAgICogQHBhcmFtIHZhbHVlc1xuICAgKi9cbiAgdmFsaWRhdGVVdHhvcyh2YWx1ZXM6IERlY29kZWRVdHhvT2JqW10pOiB2b2lkIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcIlV0eG9zIGNhbid0IGJlIGVtcHR5IGFycmF5XCIpO1xuICAgIH1cbiAgICB2YWx1ZXMuZm9yRWFjaCh0aGlzLnZhbGlkYXRlVXR4byk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIFVUWE8gaGFzIGV4cGVjdGVkIGZpZWxkcy5cbiAgICogQHBhcmFtIFVUWE9cbiAgICovXG4gIHZhbGlkYXRlVXR4byh2YWx1ZTogRGVjb2RlZFV0eG9PYmopOiB2b2lkIHtcbiAgICBbJ291dHB1dElEJywgJ2Ftb3VudCcsICd0eGlkJywgJ291dHB1dGlkeCddLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlLmhhc093blByb3BlcnR5KGZpZWxkKSkgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgVXR4b3MgcmVxdWlyZWQgJHtmaWVsZH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgYW1vdW50IGlzIHBvc2l0aXZlLlxuICAgKiBAcGFyYW0gYW1vdW50XG4gICAqL1xuICB2YWxpZGF0ZUFtb3VudChhbW91bnQ6IEJOKTogdm9pZCB7XG4gICAgaWYgKGFtb3VudC5sdGVuKDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgYnVmZmVyIGhhcyAzMiBieXRlIGxvbmcuXG4gICAqIEBwYXJhbSBjaGFpbklEXG4gICAqL1xuICB2YWxpZGF0ZUNoYWluSWQoY2hhaW5JRDogQnVmZmVyQXZheCk6IHZvaWQge1xuICAgIGlmIChjaGFpbklELmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0NoYWluIGlkIGFyZSAzMiBieXRlIHNpemUnKTtcbiAgICB9XG4gIH1cblxuICAvLyBlbmRyZWdpb25cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ import { BuildTransactionError } from '@bitgo-beta/sdk-core';
2
+ export declare class AddressValidationError extends BuildTransactionError {
3
+ constructor(malformedAddress: string);
4
+ }
5
+ export declare class InvalidFeeError extends BuildTransactionError {
6
+ constructor(type?: string, expectedType?: string);
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,qBAAa,sBAAuB,SAAQ,qBAAqB;gBACnD,gBAAgB,EAAE,MAAM;CAIrC;AAED,qBAAa,eAAgB,SAAQ,qBAAqB;gBAC5C,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAIjD"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvalidFeeError = exports.AddressValidationError = void 0;
4
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
5
+ class AddressValidationError extends sdk_core_1.BuildTransactionError {
6
+ constructor(malformedAddress) {
7
+ super(`The address '${malformedAddress}' is not a well-formed dot address`);
8
+ this.name = AddressValidationError.name;
9
+ }
10
+ }
11
+ exports.AddressValidationError = AddressValidationError;
12
+ class InvalidFeeError extends sdk_core_1.BuildTransactionError {
13
+ constructor(type, expectedType) {
14
+ super(`The specified type: "${type}" is not valid. Please provide the type: "${expectedType}"`);
15
+ this.name = InvalidFeeError.name;
16
+ }
17
+ }
18
+ exports.InvalidFeeError = InvalidFeeError;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQTZEO0FBRTdELE1BQWEsc0JBQXVCLFNBQVEsZ0NBQXFCO0lBQy9ELFlBQVksZ0JBQXdCO1FBQ2xDLEtBQUssQ0FBQyxnQkFBZ0IsZ0JBQWdCLG9DQUFvQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBTEQsd0RBS0M7QUFFRCxNQUFhLGVBQWdCLFNBQVEsZ0NBQXFCO0lBQ3hELFlBQVksSUFBYSxFQUFFLFlBQXFCO1FBQzlDLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSw2Q0FBNkMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNoRyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBTEQsMENBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBBZGRyZXNzVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgQnVpbGRUcmFuc2FjdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IobWFsZm9ybWVkQWRkcmVzczogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRoZSBhZGRyZXNzICcke21hbGZvcm1lZEFkZHJlc3N9JyBpcyBub3QgYSB3ZWxsLWZvcm1lZCBkb3QgYWRkcmVzc2ApO1xuICAgIHRoaXMubmFtZSA9IEFkZHJlc3NWYWxpZGF0aW9uRXJyb3IubmFtZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZEZlZUVycm9yIGV4dGVuZHMgQnVpbGRUcmFuc2FjdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IodHlwZT86IHN0cmluZywgZXhwZWN0ZWRUeXBlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRoZSBzcGVjaWZpZWQgdHlwZTogXCIke3R5cGV9XCIgaXMgbm90IHZhbGlkLiBQbGVhc2UgcHJvdmlkZSB0aGUgdHlwZTogXCIke2V4cGVjdGVkVHlwZX1cImApO1xuICAgIHRoaXMubmFtZSA9IEludmFsaWRGZWVFcnJvci5uYW1lO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,55 @@
1
+ import { TransactionType } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { BN } from 'avalanche';
4
+ import { ExportTx } from 'avalanche/dist/apis/evm';
5
+ import { AtomicInCTransactionBuilder } from './atomicInCTransactionBuilder';
6
+ import { DeprecatedTransaction } from './deprecatedTransaction';
7
+ import { DecodedUtxoObj, DeprecatedBaseTx, DeprecatedTx } from './iface';
8
+ export declare class ExportInCTxBuilder extends AtomicInCTransactionBuilder {
9
+ private _amount;
10
+ private _nonce;
11
+ constructor(_coinConfig: Readonly<CoinConfig>);
12
+ /**
13
+ * Utxos are not required in Export Tx in C-Chain.
14
+ * Override utxos to prevent used by throwing a error.
15
+ *
16
+ * @param {DecodedUtxoObj[]} value ignored
17
+ */
18
+ utxos(value: DecodedUtxoObj[]): this;
19
+ /**
20
+ * Amount is a long that specifies the quantity of the asset that this output owns. Must be positive.
21
+ * The transaction output amount add a fixed fee that will be paid upon import.
22
+ *
23
+ * @param {BN | string} amount The withdrawal amount
24
+ */
25
+ amount(amount: BN | string): this;
26
+ /**
27
+ * Set the nonce of C-Chain sender address
28
+ *
29
+ * @param {number | string} nonce - number that can be only used once
30
+ */
31
+ nonce(nonce: number | string): this;
32
+ /**
33
+ * Export tx target P wallet.
34
+ *
35
+ * @param pAddresses
36
+ */
37
+ to(pAddresses: string | string[]): this;
38
+ protected get transactionType(): TransactionType;
39
+ initBuilder(tx: DeprecatedTx): this;
40
+ static verifyTxType(baseTx: DeprecatedBaseTx): baseTx is ExportTx;
41
+ verifyTxType(baseTx: DeprecatedBaseTx): baseTx is ExportTx;
42
+ /**
43
+ * Build the export in C-chain transaction
44
+ * @protected
45
+ */
46
+ protected buildAvaxTransaction(): void;
47
+ /** @inheritdoc */
48
+ protected fromImplementation(rawTransaction: string): DeprecatedTransaction;
49
+ /**
50
+ * Check the amount is positive.
51
+ * @param amount
52
+ */
53
+ validateNonce(nonce: BN): void;
54
+ }
55
+ //# sourceMappingURL=exportInCTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportInCTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/exportInCTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,EAAE,EAAwB,MAAM,WAAW,CAAC;AACrD,OAAO,EAKL,QAAQ,EAKT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGzE,qBAAa,kBAAmB,SAAQ,2BAA2B;IACjE,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,MAAM,CAAK;gBAEP,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAIpC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI;IAOjC;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOnC;;;;OAIG;IACH,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMvC,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAgDnC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,QAAQ;IAIjE,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,QAAQ;IAI1D;;;OAGG;IACH,SAAS,CAAC,oBAAoB,IAAI,IAAI;IA2DtC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,qBAAqB;IAO3E;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI;CAK/B"}
@@ -0,0 +1,159 @@
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.ExportInCTxBuilder = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const avalanche_1 = require("avalanche");
9
+ const evm_1 = require("avalanche/dist/apis/evm");
10
+ const atomicInCTransactionBuilder_1 = require("./atomicInCTransactionBuilder");
11
+ const utils_1 = __importDefault(require("./utils"));
12
+ class ExportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransactionBuilder {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ }
16
+ /**
17
+ * Utxos are not required in Export Tx in C-Chain.
18
+ * Override utxos to prevent used by throwing a error.
19
+ *
20
+ * @param {DecodedUtxoObj[]} value ignored
21
+ */
22
+ utxos(value) {
23
+ throw new sdk_core_1.BuildTransactionError('utxos are not required in Export Tx in C-Chain');
24
+ }
25
+ /**
26
+ * Amount is a long that specifies the quantity of the asset that this output owns. Must be positive.
27
+ * The transaction output amount add a fixed fee that will be paid upon import.
28
+ *
29
+ * @param {BN | string} amount The withdrawal amount
30
+ */
31
+ amount(amount) {
32
+ const amountBN = avalanche_1.BN.isBN(amount) ? amount : new avalanche_1.BN(amount);
33
+ this.validateAmount(amountBN);
34
+ this._amount = amountBN;
35
+ return this;
36
+ }
37
+ /**
38
+ * Set the nonce of C-Chain sender address
39
+ *
40
+ * @param {number | string} nonce - number that can be only used once
41
+ */
42
+ nonce(nonce) {
43
+ const nonceBN = new avalanche_1.BN(nonce);
44
+ this.validateNonce(nonceBN);
45
+ this._nonce = nonceBN;
46
+ return this;
47
+ }
48
+ /**
49
+ * Export tx target P wallet.
50
+ *
51
+ * @param pAddresses
52
+ */
53
+ to(pAddresses) {
54
+ const pubKeys = pAddresses instanceof Array ? pAddresses : pAddresses.split('~');
55
+ this.transaction._to = pubKeys.map(utils_1.default.parseAddress);
56
+ return this;
57
+ }
58
+ get transactionType() {
59
+ return sdk_core_1.TransactionType.Export;
60
+ }
61
+ initBuilder(tx) {
62
+ const baseTx = tx.getUnsignedTx().getTransaction();
63
+ if (baseTx.getNetworkID() !== this.transaction._networkID ||
64
+ !baseTx.getBlockchainID().equals(this.transaction._blockchainID)) {
65
+ throw new Error('Network or blockchain is not equals');
66
+ }
67
+ if (!this.verifyTxType(baseTx)) {
68
+ throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
69
+ }
70
+ // The outputs is a multisign P-Chain address result.
71
+ // It's expected to have only one outputs to the destination P-Chain address.
72
+ const outputs = baseTx.getExportedOutputs();
73
+ if (outputs.length !== 1) {
74
+ throw new sdk_core_1.BuildTransactionError('Transaction can have one output');
75
+ }
76
+ const output = outputs[0];
77
+ if (!output.getAssetID().equals(this.transaction._assetId)) {
78
+ throw new Error('AssetID are not equals');
79
+ }
80
+ // The inputs is not an utxo.
81
+ // It's expected to have only one input form C-Chain address.
82
+ const inputs = baseTx.getInputs();
83
+ if (inputs.length !== 1) {
84
+ throw new sdk_core_1.BuildTransactionError('Transaction can have one inputs');
85
+ }
86
+ const input = inputs[0];
87
+ this.transaction._to = output.getOutput().getAddresses();
88
+ const inputAmount = new avalanche_1.BN(input.amount);
89
+ const outputAmount = output.getOutput().getAmount();
90
+ const fee = inputAmount.sub(outputAmount);
91
+ this._amount = outputAmount;
92
+ this.transaction._fee.feeRate = fee.toNumber() - Number(this.fixedFee);
93
+ this.transaction._fee.fee = fee.toString();
94
+ this.transaction._fee.size = 1;
95
+ this.transaction._fromAddresses = [input.getAddress()];
96
+ this._nonce = new avalanche_1.BN(input.nonce);
97
+ this.transaction.setTransaction(tx);
98
+ return this;
99
+ }
100
+ static verifyTxType(baseTx) {
101
+ return baseTx.getTypeID() === evm_1.EVMConstants.EXPORTTX;
102
+ }
103
+ verifyTxType(baseTx) {
104
+ return ExportInCTxBuilder.verifyTxType(baseTx);
105
+ }
106
+ /**
107
+ * Build the export in C-chain transaction
108
+ * @protected
109
+ */
110
+ buildAvaxTransaction() {
111
+ // if tx has credentials, tx shouldn't change
112
+ if (this.transaction.hasCredentials)
113
+ return;
114
+ if (this._amount === undefined) {
115
+ throw new Error('amount is required');
116
+ }
117
+ if (this.transaction._fromAddresses.length !== 1) {
118
+ throw new Error('sender is one and required');
119
+ }
120
+ if (this.transaction._to.length === 0) {
121
+ throw new Error('to is required');
122
+ }
123
+ if (!this.transaction._fee.feeRate) {
124
+ throw new Error('fee rate is required');
125
+ }
126
+ if (!this._nonce === undefined) {
127
+ throw new Error('nonce is required');
128
+ }
129
+ const txFee = Number(this.fixedFee);
130
+ const fee = this.transaction._fee.feeRate + txFee;
131
+ this.transaction._fee.fee = fee.toString();
132
+ this.transaction._fee.size = 1;
133
+ const input = new evm_1.EVMInput(this.transaction._fromAddresses[0], this._amount.addn(fee), this.transaction._assetId, this._nonce);
134
+ input.addSignatureIdx(0, this.transaction._fromAddresses[0]);
135
+ this.transaction.setTransaction(new evm_1.Tx(new evm_1.UnsignedTx(new evm_1.ExportTx(this.transaction._networkID, this.transaction._blockchainID, this._externalChainId, [input], [
136
+ new evm_1.TransferableOutput(this.transaction._assetId, new evm_1.SECPTransferOutput(this._amount, this.transaction._to, this.transaction._locktime, this.transaction._threshold)),
137
+ ])),
138
+ // TODO(BG-56700): Improve canSign by check in addresses in empty credentials match signer
139
+ [(0, evm_1.SelectCredentialClass)(input.getCredentialID(), [''].map(utils_1.default.createSig))]));
140
+ }
141
+ /** @inheritdoc */
142
+ fromImplementation(rawTransaction) {
143
+ const tx = new evm_1.Tx();
144
+ tx.fromBuffer(avalanche_1.Buffer.from(rawTransaction, 'hex'));
145
+ this.initBuilder(tx);
146
+ return this.transaction;
147
+ }
148
+ /**
149
+ * Check the amount is positive.
150
+ * @param amount
151
+ */
152
+ validateNonce(nonce) {
153
+ if (nonce.ltn(0)) {
154
+ throw new sdk_core_1.BuildTransactionError('Nonce must be greater or equal than 0');
155
+ }
156
+ }
157
+ }
158
+ exports.ExportInCTxBuilder = ExportInCTxBuilder;
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQTRGO0FBRTVGLHlDQUFxRDtBQUNyRCxpREFVaUM7QUFDakMsK0VBQTRFO0FBRzVFLG9EQUE0QjtBQUU1QixNQUFhLGtCQUFtQixTQUFRLHlEQUEyQjtJQUlqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsS0FBdUI7UUFDM0IsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQW1CO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLGNBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLEtBQXNCO1FBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksY0FBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQyxVQUE2QjtRQUM5QixNQUFNLE9BQU8sR0FBRyxVQUFVLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFnQjtRQUMxQixNQUFNLE1BQU0sR0FBcUIsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JFLElBQ0UsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtZQUNyRCxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFDaEUsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksdUJBQVksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFFRCxxREFBcUQ7UUFDckQsNkVBQTZFO1FBQzdFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksZ0NBQXFCLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELDZCQUE2QjtRQUM3Qiw2REFBNkQ7UUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksZ0NBQXFCLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6RCxNQUFNLFdBQVcsR0FBRyxJQUFJLGNBQUUsQ0FBRSxLQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUksTUFBTSxDQUFDLFNBQVMsRUFBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksY0FBRSxDQUFFLEtBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQXdCO1FBQzFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLGtCQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3RELENBQUM7SUFFRCxZQUFZLENBQUMsTUFBd0I7UUFDbkMsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNPLG9CQUFvQjtRQUM1Qiw2Q0FBNkM7UUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7WUFBRSxPQUFPO1FBQzVDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFcEMsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFFL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxjQUFRLENBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQ3pCLElBQUksQ0FBQyxNQUFNLENBQ1osQ0FBQztRQUNGLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQzdCLElBQUksUUFBSyxDQUNQLElBQUksZ0JBQVUsQ0FDWixJQUFJLGNBQVEsQ0FDVixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQzlCLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsQ0FBQyxLQUFLLENBQUMsRUFDUDtZQUNFLElBQUksd0JBQWtCLENBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUN6QixJQUFJLHdCQUFrQixDQUNwQixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQzVCLENBQ0Y7U0FDRixDQUNGLENBQ0Y7UUFDRCwyRkFBMkY7UUFDM0YsQ0FBQyxJQUFBLDJCQUFxQixFQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUM1RSxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCO0lBQ1Isa0JBQWtCLENBQUMsY0FBc0I7UUFDakQsTUFBTSxFQUFFLEdBQUcsSUFBSSxRQUFLLEVBQUUsQ0FBQztRQUN2QixFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsS0FBUztRQUNyQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksZ0NBQXFCLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbE1ELGdEQWtNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCTiwgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IHtcbiAgQW1vdW50T3V0cHV0LFxuICBFVk1Db25zdGFudHMsXG4gIEVWTUlucHV0LFxuICBUeCBhcyBFVk1UeCxcbiAgRXhwb3J0VHgsXG4gIFNFQ1BUcmFuc2Zlck91dHB1dCxcbiAgU2VsZWN0Q3JlZGVudGlhbENsYXNzLFxuICBUcmFuc2ZlcmFibGVPdXRwdXQsXG4gIFVuc2lnbmVkVHgsXG59IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvZXZtJztcbmltcG9ydCB7IEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vYXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IERlcHJlY2F0ZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vZGVwcmVjYXRlZFRyYW5zYWN0aW9uJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBEZXByZWNhdGVkQmFzZVR4LCBEZXByZWNhdGVkVHggfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEV4cG9ydEluQ1R4QnVpbGRlciBleHRlbmRzIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX2Ftb3VudDogQk47XG4gIHByaXZhdGUgX25vbmNlOiBCTjtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogVXR4b3MgYXJlIG5vdCByZXF1aXJlZCBpbiBFeHBvcnQgVHggaW4gQy1DaGFpbi5cbiAgICogT3ZlcnJpZGUgdXR4b3MgdG8gcHJldmVudCB1c2VkIGJ5IHRocm93aW5nIGEgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSB7RGVjb2RlZFV0eG9PYmpbXX0gdmFsdWUgaWdub3JlZFxuICAgKi9cbiAgdXR4b3ModmFsdWU6IERlY29kZWRVdHhvT2JqW10pOiB0aGlzIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCd1dHhvcyBhcmUgbm90IHJlcXVpcmVkIGluIEV4cG9ydCBUeCBpbiBDLUNoYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogQW1vdW50IGlzIGEgbG9uZyB0aGF0IHNwZWNpZmllcyB0aGUgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IHRoYXQgdGhpcyBvdXRwdXQgb3ducy4gTXVzdCBiZSBwb3NpdGl2ZS5cbiAgICogVGhlIHRyYW5zYWN0aW9uIG91dHB1dCBhbW91bnQgYWRkIGEgZml4ZWQgZmVlIHRoYXQgd2lsbCBiZSBwYWlkIHVwb24gaW1wb3J0LlxuICAgKlxuICAgKiBAcGFyYW0ge0JOIHwgc3RyaW5nfSBhbW91bnQgVGhlIHdpdGhkcmF3YWwgYW1vdW50XG4gICAqL1xuICBhbW91bnQoYW1vdW50OiBCTiB8IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGFtb3VudEJOID0gQk4uaXNCTihhbW91bnQpID8gYW1vdW50IDogbmV3IEJOKGFtb3VudCk7XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudChhbW91bnRCTik7XG4gICAgdGhpcy5fYW1vdW50ID0gYW1vdW50Qk47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBub25jZSBvZiBDLUNoYWluIHNlbmRlciBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBub25jZSAtIG51bWJlciB0aGF0IGNhbiBiZSBvbmx5IHVzZWQgb25jZVxuICAgKi9cbiAgbm9uY2Uobm9uY2U6IG51bWJlciB8IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IG5vbmNlQk4gPSBuZXcgQk4obm9uY2UpO1xuICAgIHRoaXMudmFsaWRhdGVOb25jZShub25jZUJOKTtcbiAgICB0aGlzLl9ub25jZSA9IG5vbmNlQk47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHR4IHRhcmdldCBQIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBBZGRyZXNzZXNcbiAgICovXG4gIHRvKHBBZGRyZXNzZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgY29uc3QgcHViS2V5cyA9IHBBZGRyZXNzZXMgaW5zdGFuY2VvZiBBcnJheSA/IHBBZGRyZXNzZXMgOiBwQWRkcmVzc2VzLnNwbGl0KCd+Jyk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdG8gPSBwdWJLZXlzLm1hcCh1dGlscy5wYXJzZUFkZHJlc3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBEZXByZWNhdGVkVHgpOiB0aGlzIHtcbiAgICBjb25zdCBiYXNlVHg6IERlcHJlY2F0ZWRCYXNlVHggPSB0eC5nZXRVbnNpZ25lZFR4KCkuZ2V0VHJhbnNhY3Rpb24oKTtcbiAgICBpZiAoXG4gICAgICBiYXNlVHguZ2V0TmV0d29ya0lEKCkgIT09IHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCB8fFxuICAgICAgIWJhc2VUeC5nZXRCbG9ja2NoYWluSUQoKS5lcXVhbHModGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklEKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXR3b3JrIG9yIGJsb2NrY2hhaW4gaXMgbm90IGVxdWFscycpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUoYmFzZVR4KSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnVHJhbnNhY3Rpb24gY2Fubm90IGJlIHBhcnNlZCBvciBoYXMgYW4gdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZScpO1xuICAgIH1cblxuICAgIC8vIFRoZSBvdXRwdXRzIGlzIGEgbXVsdGlzaWduIFAtQ2hhaW4gYWRkcmVzcyByZXN1bHQuXG4gICAgLy8gSXQncyBleHBlY3RlZCB0byBoYXZlIG9ubHkgb25lIG91dHB1dHMgdG8gdGhlIGRlc3RpbmF0aW9uIFAtQ2hhaW4gYWRkcmVzcy5cbiAgICBjb25zdCBvdXRwdXRzID0gYmFzZVR4LmdldEV4cG9ydGVkT3V0cHV0cygpO1xuICAgIGlmIChvdXRwdXRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gY2FuIGhhdmUgb25lIG91dHB1dCcpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzWzBdO1xuXG4gICAgaWYgKCFvdXRwdXQuZ2V0QXNzZXRJRCgpLmVxdWFscyh0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NldElEIGFyZSBub3QgZXF1YWxzJyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGlucHV0cyBpcyBub3QgYW4gdXR4by5cbiAgICAvLyBJdCdzIGV4cGVjdGVkIHRvIGhhdmUgb25seSBvbmUgaW5wdXQgZm9ybSBDLUNoYWluIGFkZHJlc3MuXG4gICAgY29uc3QgaW5wdXRzID0gYmFzZVR4LmdldElucHV0cygpO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW4gaGF2ZSBvbmUgaW5wdXRzJyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzWzBdO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdG8gPSBvdXRwdXQuZ2V0T3V0cHV0KCkuZ2V0QWRkcmVzc2VzKCk7XG4gICAgY29uc3QgaW5wdXRBbW91bnQgPSBuZXcgQk4oKGlucHV0IGFzIGFueSkuYW1vdW50KTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSAob3V0cHV0LmdldE91dHB1dCgpIGFzIEFtb3VudE91dHB1dCkuZ2V0QW1vdW50KCk7XG4gICAgY29uc3QgZmVlID0gaW5wdXRBbW91bnQuc3ViKG91dHB1dEFtb3VudCk7XG4gICAgdGhpcy5fYW1vdW50ID0gb3V0cHV0QW1vdW50O1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWVSYXRlID0gZmVlLnRvTnVtYmVyKCkgLSBOdW1iZXIodGhpcy5maXhlZEZlZSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSA9IGZlZS50b1N0cmluZygpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5zaXplID0gMTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gW2lucHV0LmdldEFkZHJlc3MoKV07XG5cbiAgICB0aGlzLl9ub25jZSA9IG5ldyBCTigoaW5wdXQgYXMgYW55KS5ub25jZSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih0eCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgdmVyaWZ5VHhUeXBlKGJhc2VUeDogRGVwcmVjYXRlZEJhc2VUeCk6IGJhc2VUeCBpcyBFeHBvcnRUeCB7XG4gICAgcmV0dXJuIGJhc2VUeC5nZXRUeXBlSUQoKSA9PT0gRVZNQ29uc3RhbnRzLkVYUE9SVFRYO1xuICB9XG5cbiAgdmVyaWZ5VHhUeXBlKGJhc2VUeDogRGVwcmVjYXRlZEJhc2VUeCk6IGJhc2VUeCBpcyBFeHBvcnRUeCB7XG4gICAgcmV0dXJuIEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUoYmFzZVR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgZXhwb3J0IGluIEMtY2hhaW4gdHJhbnNhY3Rpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkQXZheFRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIGlmIHR4IGhhcyBjcmVkZW50aWFscywgdHggc2hvdWxkbid0IGNoYW5nZVxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmhhc0NyZWRlbnRpYWxzKSByZXR1cm47XG4gICAgaWYgKHRoaXMuX2Ftb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Ftb3VudCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2VuZGVyIGlzIG9uZSBhbmQgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX3RvLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0byBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWVSYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZlZSByYXRlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fbm9uY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub25jZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCB0eEZlZSA9IE51bWJlcih0aGlzLmZpeGVkRmVlKTtcblxuICAgIGNvbnN0IGZlZTogbnVtYmVyID0gdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZVJhdGUgKyB0eEZlZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gZmVlLnRvU3RyaW5nKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZmVlLnNpemUgPSAxO1xuXG4gICAgY29uc3QgaW5wdXQgPSBuZXcgRVZNSW5wdXQoXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzWzBdLFxuICAgICAgdGhpcy5fYW1vdW50LmFkZG4oZmVlKSxcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsXG4gICAgICB0aGlzLl9ub25jZVxuICAgICk7XG4gICAgaW5wdXQuYWRkU2lnbmF0dXJlSWR4KDAsIHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNbMF0pO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihcbiAgICAgIG5ldyBFVk1UeChcbiAgICAgICAgbmV3IFVuc2lnbmVkVHgoXG4gICAgICAgICAgbmV3IEV4cG9ydFR4KFxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lELFxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELFxuICAgICAgICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkLFxuICAgICAgICAgICAgW2lucHV0XSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgbmV3IFRyYW5zZmVyYWJsZU91dHB1dChcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLFxuICAgICAgICAgICAgICAgIG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgICAgICAgICAgICB0aGlzLl9hbW91bnQsXG4gICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl90byxcbiAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lLFxuICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgLy8gVE9ETyhCRy01NjcwMCk6ICBJbXByb3ZlIGNhblNpZ24gYnkgY2hlY2sgaW4gYWRkcmVzc2VzIGluIGVtcHR5IGNyZWRlbnRpYWxzIG1hdGNoIHNpZ25lclxuICAgICAgICBbU2VsZWN0Q3JlZGVudGlhbENsYXNzKGlucHV0LmdldENyZWRlbnRpYWxJRCgpLCBbJyddLm1hcCh1dGlscy5jcmVhdGVTaWcpKV1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IERlcHJlY2F0ZWRUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHggPSBuZXcgRVZNVHgoKTtcbiAgICB0eC5mcm9tQnVmZmVyKEJ1ZmZlckF2YXguZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2hleCcpKTtcbiAgICB0aGlzLmluaXRCdWlsZGVyKHR4KTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgYW1vdW50IGlzIHBvc2l0aXZlLlxuICAgKiBAcGFyYW0gYW1vdW50XG4gICAqL1xuICB2YWxpZGF0ZU5vbmNlKG5vbmNlOiBCTik6IHZvaWQge1xuICAgIGlmIChub25jZS5sdG4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vbmNlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0aGFuIDAnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
+ import { TransactionType } from '@bitgo-beta/sdk-core';
3
+ import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
4
+ import { ExportTx, TransferableOutput } from 'avalanche/dist/apis/platformvm';
5
+ import { BN } from 'avalanche';
6
+ import { DeprecatedTx, DeprecatedBaseTx } from './iface';
7
+ export declare class ExportTxBuilder extends AtomicTransactionBuilder {
8
+ private _amount;
9
+ constructor(_coinConfig: Readonly<CoinConfig>);
10
+ protected get transactionType(): TransactionType;
11
+ /**
12
+ * Amount is a long that specifies the quantity of the asset that this output owns. Must be positive.
13
+ *
14
+ * @param {BN | string} amount The withdrawal amount
15
+ */
16
+ amount(value: BN | string): this;
17
+ /** @inheritdoc */
18
+ initBuilder(tx: DeprecatedTx): this;
19
+ static verifyTxType(baseTx: DeprecatedBaseTx): baseTx is ExportTx;
20
+ verifyTxType(baseTx: DeprecatedBaseTx): baseTx is ExportTx;
21
+ /**
22
+ * Create the internal avalanche transaction.
23
+ * @protected
24
+ */
25
+ protected buildAvaxTransaction(): void;
26
+ /**
27
+ * Create the ExportedOut where the recipient address are the sender.
28
+ * Later a importTx should complete the operations signing with the same keys.
29
+ * @protected
30
+ */
31
+ protected exportedOutputs(): TransferableOutput[];
32
+ }
33
+ //# sourceMappingURL=exportTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/exportTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,QAAQ,EAGR,kBAAkB,EAGnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAI/B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEzD,qBAAa,eAAgB,SAAQ,wBAAwB;IAC3D,OAAO,CAAC,OAAO,CAAK;gBAER,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI;IAOhC,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IA2BnC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,QAAQ;IAIjE,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,QAAQ;IAI1D;;;OAGG;IACH,SAAS,CAAC,oBAAoB,IAAI,IAAI;IAsBtC;;;;OAIG;IACH,SAAS,CAAC,eAAe,IAAI,kBAAkB,EAAE;CAalD"}