@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.
- package/.eslintignore +5 -0
- package/.eslintrc.json +7 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +1091 -0
- package/LICENSE +191 -0
- package/README.md +39 -0
- package/dist/src/avaxp.d.ts +91 -0
- package/dist/src/avaxp.d.ts.map +1 -0
- package/dist/src/avaxp.js +343 -0
- package/dist/src/iface.d.ts +42 -0
- package/dist/src/iface.d.ts.map +1 -0
- package/dist/src/iface.js +3 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +21 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/atomicInCTransactionBuilder.js +49 -0
- package/dist/src/lib/atomicTransactionBuilder.d.ts +38 -0
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/atomicTransactionBuilder.js +129 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts +95 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +285 -0
- package/dist/src/lib/deprecatedTransaction.d.ts +98 -0
- package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransaction.js +344 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts +114 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
- package/dist/src/lib/errors.d.ts +8 -0
- package/dist/src/lib/errors.d.ts.map +1 -0
- package/dist/src/lib/errors.js +19 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +55 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/exportInCTxBuilder.js +159 -0
- package/dist/src/lib/exportTxBuilder.d.ts +33 -0
- package/dist/src/lib/exportTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/exportTxBuilder.js +88 -0
- package/dist/src/lib/iface.d.ts +68 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +20 -0
- package/dist/src/lib/importInCTxBuilder.d.ts +44 -0
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInCTxBuilder.js +131 -0
- package/dist/src/lib/importTxBuilder.d.ts +18 -0
- package/dist/src/lib/importTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importTxBuilder.js +67 -0
- package/dist/src/lib/index.d.ts +11 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +37 -0
- package/dist/src/lib/keyPair.d.ts +58 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +150 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +154 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +452 -0
- package/dist/src/lib/transaction.d.ts +78 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +254 -0
- package/dist/src/lib/transactionBuilder.d.ts +71 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +138 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +57 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +178 -0
- package/dist/src/lib/utils.d.ts +184 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +378 -0
- package/dist/src/lib/utxoEngine.d.ts +53 -0
- package/dist/src/lib/utxoEngine.d.ts.map +1 -0
- package/dist/src/lib/utxoEngine.js +112 -0
- package/dist/src/lib/validatorTxBuilder.d.ts +37 -0
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +69 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +11 -0
- package/dist/src/tavaxp.d.ts +9 -0
- package/dist/src/tavaxp.d.ts.map +1 -0
- package/dist/src/tavaxp.js +14 -0
- package/dist/test/resources/avaxp.d.ts +259 -0
- package/dist/test/resources/avaxp.d.ts.map +1 -0
- package/dist/test/resources/avaxp.js +1093 -0
- package/dist/test/resources/errors.d.ts +19 -0
- package/dist/test/resources/errors.d.ts.map +1 -0
- package/dist/test/resources/errors.js +22 -0
- package/dist/test/resources/keychains.d.ts +18 -0
- package/dist/test/resources/keychains.d.ts.map +1 -0
- package/dist/test/resources/keychains.js +30 -0
- package/dist/test/resources/tx/exportC.d.ts +14 -0
- package/dist/test/resources/tx/exportC.d.ts.map +1 -0
- package/dist/test/resources/tx/exportC.js +21 -0
- package/dist/test/resources/tx/importC.d.ts +29 -0
- package/dist/test/resources/tx/importC.d.ts.map +1 -0
- package/dist/test/resources/tx/importC.js +42 -0
- package/dist/test/resources/tx/importP.d.ts +29 -0
- package/dist/test/resources/tx/importP.d.ts.map +1 -0
- package/dist/test/resources/tx/importP.js +42 -0
- package/dist/test/unit/avaxp.d.ts +2 -0
- package/dist/test/unit/avaxp.d.ts.map +1 -0
- package/dist/test/unit/avaxp.js +732 -0
- package/dist/test/unit/lib/exportC2PTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportC2PTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportC2PTxBuilder.js +125 -0
- package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportP2CTxBuilder.js +183 -0
- package/dist/test/unit/lib/importC2PTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importC2PTxBuilder.js +99 -0
- package/dist/test/unit/lib/importP2CTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importP2CTxBuilder.js +137 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +186 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +341 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +80 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +179 -0
- package/dist/test/unit/lib/utils.d.ts +2 -0
- package/dist/test/unit/lib/utils.d.ts.map +1 -0
- package/dist/test/unit/lib/utils.js +83 -0
- package/dist/test/unit/lib/utxoEngine.d.ts +2 -0
- package/dist/test/unit/lib/utxoEngine.d.ts.map +1 -0
- package/dist/test/unit/lib/utxoEngine.js +168 -0
- package/dist/test/unit/lib/validateTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/validateTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/validateTxBuilder.js +327 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Utils = void 0;
|
|
37
|
+
const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
|
|
38
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
39
|
+
const avalanche_1 = require("avalanche");
|
|
40
|
+
const platformvm_1 = require("avalanche/dist/apis/platformvm");
|
|
41
|
+
const keychain_1 = require("avalanche/dist/apis/platformvm/keychain");
|
|
42
|
+
const common_1 = require("avalanche/dist/common");
|
|
43
|
+
const utils_1 = require("avalanche/dist/utils");
|
|
44
|
+
const createHash = __importStar(require("create-hash"));
|
|
45
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
46
|
+
const iface_1 = require("./iface");
|
|
47
|
+
class Utils {
|
|
48
|
+
constructor() {
|
|
49
|
+
this.binTools = avalanche_1.BinTools.getInstance();
|
|
50
|
+
this.cb58Decode = this.binTools.cb58Decode;
|
|
51
|
+
this.cb58Encode = this.binTools.cb58Encode;
|
|
52
|
+
this.stringToBuffer = this.binTools.stringToBuffer;
|
|
53
|
+
this.bufferToString = this.binTools.bufferToString;
|
|
54
|
+
this.NodeIDStringToBuffer = utils_1.NodeIDStringToBuffer;
|
|
55
|
+
this.addressToString = this.binTools.addressToString;
|
|
56
|
+
this.parseAddress = (pub) => this.binTools.stringToAddress(pub);
|
|
57
|
+
}
|
|
58
|
+
includeIn(walletAddresses, otxoOutputAddresses) {
|
|
59
|
+
return walletAddresses.map((a) => otxoOutputAddresses.includes(a)).reduce((a, b) => a && b, true);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Checks if it is a valid address no illegal characters
|
|
63
|
+
*
|
|
64
|
+
* @param {string} address - address to be validated
|
|
65
|
+
* @returns {boolean} - the validation result
|
|
66
|
+
*/
|
|
67
|
+
/** @inheritdoc */
|
|
68
|
+
isValidAddress(address) {
|
|
69
|
+
const addressArr = Array.isArray(address) ? address : address.split('~');
|
|
70
|
+
for (const address of addressArr) {
|
|
71
|
+
if (!this.isValidAddressRegex(address)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
isValidAddressRegex(address) {
|
|
78
|
+
return /^(^P||NodeID)-[a-zA-Z0-9]+$/.test(address);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Checks if it is a valid blockId with length 66 including 0x
|
|
82
|
+
*
|
|
83
|
+
* @param {string} hash - blockId to be validated
|
|
84
|
+
* @returns {boolean} - the validation result
|
|
85
|
+
*/
|
|
86
|
+
/** @inheritdoc */
|
|
87
|
+
isValidBlockId(hash) {
|
|
88
|
+
return this.binTools.isCB58(hash) && this.binTools.b58ToBuffer(hash).length === 36;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Checks if the string is a valid protocol public key or
|
|
92
|
+
* extended public key.
|
|
93
|
+
*
|
|
94
|
+
* @param {string} pub - the public key to be validated
|
|
95
|
+
* @returns {boolean} - the validation result
|
|
96
|
+
*/
|
|
97
|
+
isValidPublicKey(pub) {
|
|
98
|
+
if ((0, sdk_core_1.isValidXpub)(pub))
|
|
99
|
+
return true;
|
|
100
|
+
let pubBuf;
|
|
101
|
+
if (pub.length === 50) {
|
|
102
|
+
try {
|
|
103
|
+
pubBuf = utils.cb58Decode(pub);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
if (pub.length !== 66 && pub.length !== 130)
|
|
111
|
+
return false;
|
|
112
|
+
const firstByte = pub.slice(0, 2);
|
|
113
|
+
// uncompressed public key
|
|
114
|
+
if (pub.length === 130 && firstByte !== '04')
|
|
115
|
+
return false;
|
|
116
|
+
// compressed public key
|
|
117
|
+
if (pub.length === 66 && firstByte !== '02' && firstByte !== '03')
|
|
118
|
+
return false;
|
|
119
|
+
if (!this.allHexChars(pub))
|
|
120
|
+
return false;
|
|
121
|
+
pubBuf = avalanche_1.Buffer.from(pub, 'hex');
|
|
122
|
+
}
|
|
123
|
+
// validate the public key
|
|
124
|
+
try {
|
|
125
|
+
secp256k1_1.secp256k1.ProjectivePoint.fromHex(pubBuf.toString('hex'));
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Returns whether or not the string is a valid protocol private key, or extended
|
|
134
|
+
* private key.
|
|
135
|
+
*
|
|
136
|
+
* The protocol key format is described in the @stacks/transactions npm package, in the
|
|
137
|
+
* createStacksPrivateKey function:
|
|
138
|
+
* https://github.com/blockstack/stacks.js/blob/master/packages/transactions/src/keys.ts#L125
|
|
139
|
+
*
|
|
140
|
+
* @param {string} prv - the private key (or extended private key) to be validated
|
|
141
|
+
* @returns {boolean} - the validation result
|
|
142
|
+
*/
|
|
143
|
+
isValidPrivateKey(prv) {
|
|
144
|
+
if ((0, sdk_core_1.isValidXprv)(prv))
|
|
145
|
+
return true;
|
|
146
|
+
if (prv.length !== 64 && prv.length !== 66)
|
|
147
|
+
return false;
|
|
148
|
+
if (prv.length === 66 && prv.slice(64) !== '01')
|
|
149
|
+
return false;
|
|
150
|
+
return this.allHexChars(prv);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Returns whether or not the string is a composed of hex chars only
|
|
154
|
+
*
|
|
155
|
+
* @param {string} maybe - the string to be validated
|
|
156
|
+
* @returns {boolean} - the validation result
|
|
157
|
+
*/
|
|
158
|
+
allHexChars(maybe) {
|
|
159
|
+
return /^(0x){0,1}([0-9a-f])+$/i.test(maybe);
|
|
160
|
+
}
|
|
161
|
+
/** @inheritdoc */
|
|
162
|
+
isValidSignature(signature) {
|
|
163
|
+
throw new sdk_core_1.NotImplementedError('isValidSignature not implemented');
|
|
164
|
+
}
|
|
165
|
+
/** @inheritdoc */
|
|
166
|
+
isValidTransactionId(txId) {
|
|
167
|
+
throw new sdk_core_1.NotImplementedError('isValidTransactionId not implemented');
|
|
168
|
+
}
|
|
169
|
+
getCredentials(tx) {
|
|
170
|
+
return tx.getIns().map((ins) => (0, platformvm_1.SelectCredentialClass)(ins.getInput().getCredentialID()));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Avaxp wrapper to create signature and return it for credentials using Avalanche's buffer
|
|
174
|
+
* @param network
|
|
175
|
+
* @param message
|
|
176
|
+
* @param prv
|
|
177
|
+
* @return signature
|
|
178
|
+
*/
|
|
179
|
+
createSignatureAvaxBuffer(network, message, prv) {
|
|
180
|
+
const ky = new keychain_1.KeyPair(network.hrp, network.networkID.toString());
|
|
181
|
+
ky.importKey(prv);
|
|
182
|
+
return ky.sign(message);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Avaxp wrapper to create signature and return it for credentials
|
|
186
|
+
* @param network
|
|
187
|
+
* @param message
|
|
188
|
+
* @param prv
|
|
189
|
+
* @return signature
|
|
190
|
+
*/
|
|
191
|
+
createSignature(network, message, prv) {
|
|
192
|
+
return Buffer.from(this.createSignatureAvaxBuffer(network, avalanche_1.Buffer.from(message), avalanche_1.Buffer.from(prv)));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Avaxp wrapper to verify signature using Avalanche's buffer
|
|
196
|
+
* @param network
|
|
197
|
+
* @param message
|
|
198
|
+
* @param signature
|
|
199
|
+
* @param prv
|
|
200
|
+
* @return true if it's verify successful
|
|
201
|
+
*/
|
|
202
|
+
verifySignatureAvaxBuffer(network, message, signature, prv) {
|
|
203
|
+
const ky = new keychain_1.KeyPair(network.hrp, network.networkID.toString());
|
|
204
|
+
ky.importKey(prv);
|
|
205
|
+
return ky.verify(message, signature);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Avaxp wrapper to verify signature
|
|
209
|
+
* @param network
|
|
210
|
+
* @param message
|
|
211
|
+
* @param signature
|
|
212
|
+
* @param prv
|
|
213
|
+
* @return true if it's verify successful
|
|
214
|
+
*/
|
|
215
|
+
verifySignature(network, message, signature, prv) {
|
|
216
|
+
return this.verifySignatureAvaxBuffer(network, avalanche_1.Buffer.from(message), avalanche_1.Buffer.from(signature), avalanche_1.Buffer.from(prv));
|
|
217
|
+
}
|
|
218
|
+
createSig(sigHex) {
|
|
219
|
+
const sig = new common_1.Signature();
|
|
220
|
+
sig.fromBuffer(avalanche_1.Buffer.from(sigHex.padStart(130, '0'), 'hex'));
|
|
221
|
+
return sig;
|
|
222
|
+
}
|
|
223
|
+
createNewSig(sigHex) {
|
|
224
|
+
const buffer = avalanche_1.Buffer.from(sigHex.padStart(130, '0'), 'hex');
|
|
225
|
+
return new avalanchejs_1.Signature(buffer);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Avaxp wrapper to recovery signature using Avalanche's buffer
|
|
229
|
+
* @param network
|
|
230
|
+
* @param message
|
|
231
|
+
* @param signature
|
|
232
|
+
* @return
|
|
233
|
+
*/
|
|
234
|
+
recoverySignatureAvaxBuffer(network, message, signature) {
|
|
235
|
+
const ky = new keychain_1.KeyPair(network.hrp, network.networkID.toString());
|
|
236
|
+
return ky.recover(message, signature);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Avaxp wrapper to verify signature
|
|
240
|
+
* @param network
|
|
241
|
+
* @param message
|
|
242
|
+
* @param signature
|
|
243
|
+
* @return true if it's verify successful
|
|
244
|
+
*/
|
|
245
|
+
recoverySignature(network, message, signature) {
|
|
246
|
+
return Buffer.from(this.recoverySignatureAvaxBuffer(network, avalanche_1.Buffer.from(message), avalanche_1.Buffer.from(signature)));
|
|
247
|
+
}
|
|
248
|
+
sha256(buf) {
|
|
249
|
+
return createHash.default('sha256').update(buf).digest();
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
253
|
+
* It's to reuse in TransactionBuilder and TransactionBuilderFactory
|
|
254
|
+
*
|
|
255
|
+
* @param rawTransaction Transaction as hex string
|
|
256
|
+
*/
|
|
257
|
+
validateRawTransaction(rawTransaction) {
|
|
258
|
+
if (!rawTransaction) {
|
|
259
|
+
throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
|
|
260
|
+
}
|
|
261
|
+
if (!utils.allHexChars(rawTransaction)) {
|
|
262
|
+
throw new sdk_core_1.ParseTransactionError('Raw transaction is not hex string');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Check if tx is for the blockchainId
|
|
267
|
+
*
|
|
268
|
+
* @param {DeprecatedTx} tx
|
|
269
|
+
* @param {string} blockchainId
|
|
270
|
+
* @returns true if tx is for blockchainId
|
|
271
|
+
*/
|
|
272
|
+
isTransactionOf(tx, blockchainId) {
|
|
273
|
+
return utils.cb58Encode(tx.getUnsignedTx().getTransaction().getBlockchainID()) === blockchainId;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Check if Output is from PVM.
|
|
277
|
+
* Output could be EVM or PVM output.
|
|
278
|
+
* @param {DeprecatedOutput} output
|
|
279
|
+
* @returns {boolean} output is DeprecatedTransferableOutput
|
|
280
|
+
*/
|
|
281
|
+
deprecatedIsTransferableOutput(output) {
|
|
282
|
+
return 'getOutput' in output;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Check if Output is from PVM.
|
|
286
|
+
* Output could be EVM or PVM output.
|
|
287
|
+
* @param {Output} output
|
|
288
|
+
* @returns {boolean} output is TransferableOutput
|
|
289
|
+
*/
|
|
290
|
+
isTransferableOutput(output) {
|
|
291
|
+
return output?._type === avalanchejs_1.TypeSymbols.TransferableOutput;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Return a mapper function to that network address representation.
|
|
295
|
+
* @param network required to stringify addresses
|
|
296
|
+
* @return mapper function
|
|
297
|
+
*/
|
|
298
|
+
deprecatedMapOutputToEntry(network) {
|
|
299
|
+
return (output) => {
|
|
300
|
+
if (this.deprecatedIsTransferableOutput(output)) {
|
|
301
|
+
const amountOutput = output.getOutput();
|
|
302
|
+
const address = amountOutput
|
|
303
|
+
.getAddresses()
|
|
304
|
+
.map((a) => this.addressToString(network.hrp, network.alias, a))
|
|
305
|
+
.sort()
|
|
306
|
+
.join(iface_1.ADDRESS_SEPARATOR);
|
|
307
|
+
return {
|
|
308
|
+
value: amountOutput.getAmount().toString(),
|
|
309
|
+
address,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
const evmOutput = output;
|
|
314
|
+
return {
|
|
315
|
+
// it should be evmOuput.getAmount(), but it returns a 0.
|
|
316
|
+
value: new avalanche_1.BN(evmOutput.amount).toString(),
|
|
317
|
+
// C-Chain address.
|
|
318
|
+
address: '0x' + evmOutput.getAddressString(),
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Return a mapper function to that network address representation.
|
|
325
|
+
* @param network required to stringify addresses
|
|
326
|
+
* @return mapper function
|
|
327
|
+
*/
|
|
328
|
+
mapOutputToEntry(network) {
|
|
329
|
+
return (output) => {
|
|
330
|
+
if (this.isTransferableOutput(output)) {
|
|
331
|
+
const outputAmount = output.amount();
|
|
332
|
+
const address = output.output
|
|
333
|
+
.getOwners()
|
|
334
|
+
.map((a) => this.addressToString(network.hrp, network.alias, avalanche_1.Buffer.from(a)))
|
|
335
|
+
.sort()
|
|
336
|
+
.join(iface_1.ADDRESS_SEPARATOR);
|
|
337
|
+
return {
|
|
338
|
+
value: outputAmount.toString(),
|
|
339
|
+
address,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
throw new Error('Invalid output type');
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* remove hex prefix (0x)
|
|
349
|
+
* @param hex string
|
|
350
|
+
* @returns hex without 0x
|
|
351
|
+
*/
|
|
352
|
+
removeHexPrefix(hex) {
|
|
353
|
+
if (hex.startsWith('0x')) {
|
|
354
|
+
return hex.substring(2);
|
|
355
|
+
}
|
|
356
|
+
return hex;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Outputidx convert from number (as string) to buffer.
|
|
360
|
+
* @param {string} outputidx number
|
|
361
|
+
* @return {BufferAvax} buffer of size 4 with that number value
|
|
362
|
+
*/
|
|
363
|
+
outputidxNumberToBuffer(outputidx) {
|
|
364
|
+
return avalanche_1.Buffer.from(Number(outputidx).toString(16).padStart(8, '0'), 'hex');
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Outputidx buffer to number (as string)
|
|
368
|
+
* @param {BufferAvax} outputidx
|
|
369
|
+
* @return {string} outputidx number
|
|
370
|
+
*/
|
|
371
|
+
outputidxBufferToNumber(outputidx) {
|
|
372
|
+
return parseInt(outputidx.toString('hex'), 16).toString();
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
exports.Utils = Utils;
|
|
376
|
+
const utils = new Utils();
|
|
377
|
+
exports.default = utils;
|
|
378
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBEQUF1SDtBQUN2SCxtREFROEI7QUFFOUIseUNBQStEO0FBRS9ELCtEQUt3QztBQUN4QyxzRUFBaUY7QUFDakYsa0RBQWtEO0FBRWxELGdEQUE0RDtBQUM1RCx3REFBMEM7QUFDMUMsdURBQW9EO0FBQ3BELG1DQUFvRjtBQUVwRixNQUFhLEtBQUs7SUFBbEI7UUFDVSxhQUFRLEdBQUcsb0JBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxlQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDdEMsZUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQ3RDLG1CQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDOUMsbUJBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBRyw0QkFBb0IsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBZ0ZoRCxpQkFBWSxHQUFHLENBQUMsR0FBVyxFQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQWtSeEYsQ0FBQztJQWhXUSxTQUFTLENBQUMsZUFBeUIsRUFBRSxtQkFBNkI7UUFDdkUsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElB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O1lBQ3pCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHVCQUF1QixDQUFDLFNBQWlCO1FBQ3ZDLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsU0FBcUI7UUFDM0MsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0NBQ0Y7QUF6V0Qsc0JBeVdDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUUxQixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYXR1cmUgYXMgQXZheFNpZ25hdHVyZSwgVHJhbnNmZXJhYmxlT3V0cHV0LCBUcmFuc2Zlck91dHB1dCwgVHlwZVN5bWJvbHMgfSBmcm9tICdAYml0Z28tZm9ya3MvYXZhbGFuY2hlanMnO1xuaW1wb3J0IHtcbiAgQmFzZVV0aWxzLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIGlzVmFsaWRYcHJ2LFxuICBpc1ZhbGlkWHB1YixcbiAgTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBdmFsYW5jaGVOZXR3b3JrIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCaW5Ub29scywgQk4sIEJ1ZmZlciBhcyBCdWZmZXJBdmF4IH0gZnJvbSAnYXZhbGFuY2hlJztcbmltcG9ydCB7IEVWTU91dHB1dCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvZXZtJztcbmltcG9ydCB7XG4gIEFtb3VudE91dHB1dCxcbiAgQmFzZVR4LFxuICBUcmFuc2ZlcmFibGVPdXRwdXQgYXMgRGVwcmVjYXRlZFRyYW5zZmVyYWJsZU91dHB1dCxcbiAgU2VsZWN0Q3JlZGVudGlhbENsYXNzLFxufSBmcm9tICdhdmFsYW5jaGUvZGlzdC9hcGlzL3BsYXRmb3Jtdm0nO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBLZXlQYWlyQXZheCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvcGxhdGZvcm12bS9rZXljaGFpbic7XG5pbXBvcnQgeyBTaWduYXR1cmUgfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9jb21tb24nO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2NvbW1vbi9jcmVkZW50aWFscyc7XG5pbXBvcnQgeyBOb2RlSURTdHJpbmdUb0J1ZmZlciB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L3V0aWxzJztcbmltcG9ydCAqIGFzIGNyZWF0ZUhhc2ggZnJvbSAnY3JlYXRlLWhhc2gnO1xuaW1wb3J0IHsgc2VjcDI1NmsxIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9zZWNwMjU2azEnO1xuaW1wb3J0IHsgQUREUkVTU19TRVBBUkFUT1IsIERlcHJlY2F0ZWRPdXRwdXQsIERlcHJlY2F0ZWRUeCwgT3V0cHV0IH0gZnJvbSAnLi9pZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIHByaXZhdGUgYmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuICBwdWJsaWMgY2I1OERlY29kZSA9IHRoaXMuYmluVG9vbHMuY2I1OERlY29kZTtcbiAgcHVibGljIGNiNThFbmNvZGUgPSB0aGlzLmJpblRvb2xzLmNiNThFbmNvZGU7XG4gIHB1YmxpYyBzdHJpbmdUb0J1ZmZlciA9IHRoaXMuYmluVG9vbHMuc3RyaW5nVG9CdWZmZXI7XG4gIHB1YmxpYyBidWZmZXJUb1N0cmluZyA9IHRoaXMuYmluVG9vbHMuYnVmZmVyVG9TdHJpbmc7XG4gIHB1YmxpYyBOb2RlSURTdHJpbmdUb0J1ZmZlciA9IE5vZGVJRFN0cmluZ1RvQnVmZmVyO1xuICBwdWJsaWMgYWRkcmVzc1RvU3RyaW5nID0gdGhpcy5iaW5Ub29scy5hZGRyZXNzVG9TdHJpbmc7XG5cbiAgcHVibGljIGluY2x1ZGVJbih3YWxsZXRBZGRyZXNzZXM6IHN0cmluZ1tdLCBvdHhvT3V0cHV0QWRkcmVzc2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3YWxsZXRBZGRyZXNzZXMubWFwKChhKSA9PiBvdHhvT3V0cHV0QWRkcmVzc2VzLmluY2x1ZGVzKGEpKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYiwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGl0IGlzIGEgdmFsaWQgYWRkcmVzcyBubyBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFkZHJlc3NBcnI6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShhZGRyZXNzKSA/IGFkZHJlc3MgOiBhZGRyZXNzLnNwbGl0KCd+Jyk7XG5cbiAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgYWRkcmVzc0Fycikge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzUmVnZXgoYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQWRkcmVzc1JlZ2V4KGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXiheUHx8Tm9kZUlEKS1bYS16QS1aMC05XSskLy50ZXN0KGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBpdCBpcyBhIHZhbGlkIGJsb2NrSWQgd2l0aCBsZW5ndGggNjYgaW5jbHVkaW5nIDB4XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIC0gYmxvY2tJZCB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmluVG9vbHMuaXNDQjU4KGhhc2gpICYmIHRoaXMuYmluVG9vbHMuYjU4VG9CdWZmZXIoaGFzaCkubGVuZ3RoID09PSAzNjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIHB1YmxpYyBrZXkgb3JcbiAgICogZXh0ZW5kZWQgcHVibGljIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YiAtIHRoZSAgcHVibGljIGtleSB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkUHVibGljS2V5KHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzVmFsaWRYcHViKHB1YikpIHJldHVybiB0cnVlO1xuXG4gICAgbGV0IHB1YkJ1ZjtcbiAgICBpZiAocHViLmxlbmd0aCA9PT0gNTApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHB1YkJ1ZiA9IHV0aWxzLmNiNThEZWNvZGUocHViKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwdWIubGVuZ3RoICE9PSA2NiAmJiBwdWIubGVuZ3RoICE9PSAxMzApIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZmlyc3RCeXRlID0gcHViLnNsaWNlKDAsIDIpO1xuXG4gICAgICAvLyB1bmNvbXByZXNzZWQgcHVibGljIGtleVxuICAgICAgaWYgKHB1Yi5sZW5ndGggPT09IDEzMCAmJiBmaXJzdEJ5dGUgIT09ICcwNCcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gY29tcHJlc3NlZCBwdWJsaWMga2V5XG4gICAgICBpZiAocHViLmxlbmd0aCA9PT0gNjYgJiYgZmlyc3RCeXRlICE9PSAnMDInICYmIGZpcnN0Qnl0ZSAhPT0gJzAzJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuYWxsSGV4Q2hhcnMocHViKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcHViQnVmID0gQnVmZmVyQXZheC5mcm9tKHB1YiwgJ2hleCcpO1xuICAgIH1cbiAgICAvLyB2YWxpZGF0ZSB0aGUgcHVibGljIGtleVxuICAgIHRyeSB7XG4gICAgICBzZWNwMjU2azEuUHJvamVjdGl2ZVBvaW50LmZyb21IZXgocHViQnVmLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhcnNlQWRkcmVzcyA9IChwdWI6IHN0cmluZyk6IEJ1ZmZlckF2YXggPT4gdGhpcy5iaW5Ub29scy5zdHJpbmdUb0FkZHJlc3MocHViKTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgcHJvdG9jb2wgcHJpdmF0ZSBrZXksIG9yIGV4dGVuZGVkXG4gICAqIHByaXZhdGUga2V5LlxuICAgKlxuICAgKiBUaGUgcHJvdG9jb2wga2V5IGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlIEBzdGFja3MvdHJhbnNhY3Rpb25zIG5wbSBwYWNrYWdlLCBpbiB0aGVcbiAgICogY3JlYXRlU3RhY2tzUHJpdmF0ZUtleSBmdW5jdGlvbjpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2Jsb2Nrc3RhY2svc3RhY2tzLmpzL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3RyYW5zYWN0aW9ucy9zcmMva2V5cy50cyNMMTI1XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgKG9yIGV4dGVuZGVkIHByaXZhdGUga2V5KSB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1ZhbGlkWHBydihwcnYpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChwcnYubGVuZ3RoICE9PSA2NCAmJiBwcnYubGVuZ3RoICE9PSA2NikgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHBydi5sZW5ndGggPT09IDY2ICYmIHBydi5zbGljZSg2NCkgIT09ICcwMScpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLmFsbEhleENoYXJzKHBydik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgY29tcG9zZWQgb2YgaGV4IGNoYXJzIG9ubHlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heWJlIC0gdGhlICBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgYWxsSGV4Q2hhcnMobWF5YmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXigweCl7MCwxfShbMC05YS1mXSkrJC9pLnRlc3QobWF5YmUpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFNpZ25hdHVyZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFRyYW5zYWN0aW9uSWQgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBnZXRDcmVkZW50aWFscyh0eDogQmFzZVR4KTogQ3JlZGVudGlhbFtdIHtcbiAgICByZXR1cm4gdHguZ2V0SW5zKCkubWFwKChpbnMpID0+IFNlbGVjdENyZWRlbnRpYWxDbGFzcyhpbnMuZ2V0SW5wdXQoKS5nZXRDcmVkZW50aWFsSUQoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF2YXhwIHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFscyB1c2luZyBBdmFsYW5jaGUncyBidWZmZXJcbiAgICogQHBhcmFtIG5ldHdvcmtcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIHNpZ25hdHVyZVxuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlQXZheEJ1ZmZlcihuZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrLCBtZXNzYWdlOiBCdWZmZXJBdmF4LCBwcnY6IEJ1ZmZlckF2YXgpOiBCdWZmZXJBdmF4IHtcbiAgICBjb25zdCBreSA9IG5ldyBLZXlQYWlyQXZheChuZXR3b3JrLmhycCwgbmV0d29yay5uZXR3b3JrSUQudG9TdHJpbmcoKSk7XG4gICAga3kuaW1wb3J0S2V5KHBydik7XG4gICAgcmV0dXJuIGt5LnNpZ24obWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQXZheHAgd3JhcHBlciB0byBjcmVhdGUgc2lnbmF0dXJlIGFuZCByZXR1cm4gaXQgZm9yIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSBuZXR3b3JrXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBwcnZcbiAgICogQHJldHVybiBzaWduYXR1cmVcbiAgICovXG4gIGNyZWF0ZVNpZ25hdHVyZShuZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrLCBtZXNzYWdlOiBCdWZmZXIsIHBydjogQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5jcmVhdGVTaWduYXR1cmVBdmF4QnVmZmVyKG5ldHdvcmssIEJ1ZmZlckF2YXguZnJvbShtZXNzYWdlKSwgQnVmZmVyQXZheC5mcm9tKHBydikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdmF4cCB3cmFwcGVyIHRvIHZlcmlmeSBzaWduYXR1cmUgdXNpbmcgQXZhbGFuY2hlJ3MgYnVmZmVyXG4gICAqIEBwYXJhbSBuZXR3b3JrXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIHRydWUgaWYgaXQncyB2ZXJpZnkgc3VjY2Vzc2Z1bFxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlQXZheEJ1ZmZlcihcbiAgICBuZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrLFxuICAgIG1lc3NhZ2U6IEJ1ZmZlckF2YXgsXG4gICAgc2lnbmF0dXJlOiBCdWZmZXJBdmF4LFxuICAgIHBydjogQnVmZmVyQXZheFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBreSA9IG5ldyBLZXlQYWlyQXZheChuZXR3b3JrLmhycCwgbmV0d29yay5uZXR3b3JrSUQudG9TdHJpbmcoKSk7XG4gICAga3kuaW1wb3J0S2V5KHBydik7XG4gICAgcmV0dXJuIGt5LnZlcmlmeShtZXNzYWdlLCBzaWduYXR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF2YXhwIHdyYXBwZXIgdG8gdmVyaWZ5IHNpZ25hdHVyZVxuICAgKiBAcGFyYW0gbmV0d29ya1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlXG4gICAqIEBwYXJhbSBwcnZcbiAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgdmVyaWZ5IHN1Y2Nlc3NmdWxcbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShuZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrLCBtZXNzYWdlOiBCdWZmZXIsIHNpZ25hdHVyZTogQnVmZmVyLCBwcnY6IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZlcmlmeVNpZ25hdHVyZUF2YXhCdWZmZXIoXG4gICAgICBuZXR3b3JrLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKG1lc3NhZ2UpLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHNpZ25hdHVyZSksXG4gICAgICBCdWZmZXJBdmF4LmZyb20ocHJ2KVxuICAgICk7XG4gIH1cblxuICBjcmVhdGVTaWcoc2lnSGV4OiBzdHJpbmcpOiBTaWduYXR1cmUge1xuICAgIGNvbnN0IHNpZyA9IG5ldyBTaWduYXR1cmUoKTtcbiAgICBzaWcuZnJvbUJ1ZmZlcihCdWZmZXJBdmF4LmZyb20oc2lnSGV4LnBhZFN0YXJ0KDEzMCwgJzAnKSwgJ2hleCcpKTtcbiAgICByZXR1cm4gc2lnO1xuICB9XG5cbiAgY3JlYXRlTmV3U2lnKHNpZ0hleDogc3RyaW5nKTogQXZheFNpZ25hdHVyZSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyQXZheC5mcm9tKHNpZ0hleC5wYWRTdGFydCgxMzAsICcwJyksICdoZXgnKTtcbiAgICByZXR1cm4gbmV3IEF2YXhTaWduYXR1cmUoYnVmZmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdmF4cCB3cmFwcGVyIHRvIHJlY292ZXJ5IHNpZ25hdHVyZSB1c2luZyBBdmFsYW5jaGUncyBidWZmZXJcbiAgICogQHBhcmFtIG5ldHdvcmtcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHNpZ25hdHVyZVxuICAgKiBAcmV0dXJuXG4gICAqL1xuICByZWNvdmVyeVNpZ25hdHVyZUF2YXhCdWZmZXIobmV0d29yazogQXZhbGFuY2hlTmV0d29yaywgbWVzc2FnZTogQnVmZmVyQXZheCwgc2lnbmF0dXJlOiBCdWZmZXJBdmF4KTogQnVmZmVyQXZheCB7XG4gICAgY29uc3Qga3kgPSBuZXcgS2V5UGFpckF2YXgobmV0d29yay5ocnAsIG5ldHdvcmsubmV0d29ya0lELnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBreS5yZWNvdmVyKG1lc3NhZ2UsIHNpZ25hdHVyZSk7XG4gIH1cblxuICAvKipcbiAgICogQXZheHAgd3JhcHBlciB0byB2ZXJpZnkgc2lnbmF0dXJlXG4gICAqIEBwYXJhbSBuZXR3b3JrXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBzaWduYXR1cmVcbiAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgdmVyaWZ5IHN1Y2Nlc3NmdWxcbiAgICovXG4gIHJlY292ZXJ5U2lnbmF0dXJlKG5ldHdvcms6IEF2YWxhbmNoZU5ldHdvcmssIG1lc3NhZ2U6IEJ1ZmZlciwgc2lnbmF0dXJlOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLnJlY292ZXJ5U2lnbmF0dXJlQXZheEJ1ZmZlcihuZXR3b3JrLCBCdWZmZXJBdmF4LmZyb20obWVzc2FnZSksIEJ1ZmZlckF2YXguZnJvbShzaWduYXR1cmUpKSk7XG4gIH1cblxuICBzaGEyNTYoYnVmOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaC5kZWZhdWx0KCdzaGEyNTYnKS51cGRhdGUoYnVmKS5kaWdlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgcmF3IHRyYW5zYWN0aW9uIGhhcyBhIHZhbGlkIGZvcm1hdCBpbiB0aGUgYmxvY2tjaGFpbiBjb250ZXh0LCB0aHJvdyBvdGhlcndpc2UuXG4gICAqIEl0J3MgdG8gcmV1c2UgaW4gVHJhbnNhY3Rpb25CdWlsZGVyIGFuZCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5XG4gICAqXG4gICAqIEBwYXJhbSByYXdUcmFuc2FjdGlvbiBUcmFuc2FjdGlvbiBhcyBoZXggc3RyaW5nXG4gICAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBpZiAoIXV0aWxzLmFsbEhleENoYXJzKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIG5vdCBoZXggc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHR4IGlzIGZvciB0aGUgYmxvY2tjaGFpbklkXG4gICAqXG4gICAqIEBwYXJhbSB7RGVwcmVjYXRlZFR4fSB0eFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmxvY2tjaGFpbklkXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHggaXMgZm9yIGJsb2NrY2hhaW5JZFxuICAgKi9cbiAgaXNUcmFuc2FjdGlvbk9mKHR4OiBEZXByZWNhdGVkVHgsIGJsb2NrY2hhaW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmNiNThFbmNvZGUoKHR4IGFzIERlcHJlY2F0ZWRUeCkuZ2V0VW5zaWduZWRUeCgpLmdldFRyYW5zYWN0aW9uKCkuZ2V0QmxvY2tjaGFpbklEKCkpID09PSBibG9ja2NoYWluSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgT3V0cHV0IGlzIGZyb20gUFZNLlxuICAgKiBPdXRwdXQgY291bGQgYmUgRVZNIG9yIFBWTSBvdXRwdXQuXG4gICAqIEBwYXJhbSB7RGVwcmVjYXRlZE91dHB1dH0gb3V0cHV0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSBvdXRwdXQgaXMgRGVwcmVjYXRlZFRyYW5zZmVyYWJsZU91dHB1dFxuICAgKi9cbiAgZGVwcmVjYXRlZElzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dDogRGVwcmVjYXRlZE91dHB1dCk6IG91dHB1dCBpcyBEZXByZWNhdGVkVHJhbnNmZXJhYmxlT3V0cHV0IHtcbiAgICByZXR1cm4gJ2dldE91dHB1dCcgaW4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIE91dHB1dCBpcyBmcm9tIFBWTS5cbiAgICogT3V0cHV0IGNvdWxkIGJlIEVWTSBvciBQVk0gb3V0cHV0LlxuICAgKiBAcGFyYW0ge091dHB1dH0gb3V0cHV0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSBvdXRwdXQgaXMgVHJhbnNmZXJhYmxlT3V0cHV0XG4gICAqL1xuICBpc1RyYW5zZmVyYWJsZU91dHB1dChvdXRwdXQ6IE91dHB1dCk6IG91dHB1dCBpcyBUcmFuc2ZlcmFibGVPdXRwdXQge1xuICAgIHJldHVybiBvdXRwdXQ/Ll90eXBlID09PSBUeXBlU3ltYm9scy5UcmFuc2ZlcmFibGVPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWFwcGVyIGZ1bmN0aW9uIHRvIHRoYXQgbmV0d29yayBhZGRyZXNzIHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gbmV0d29yayByZXF1aXJlZCB0byBzdHJpbmdpZnkgYWRkcmVzc2VzXG4gICAqIEByZXR1cm4gbWFwcGVyIGZ1bmN0aW9uXG4gICAqL1xuICBkZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeShuZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrKTogKERlcHJlY2F0ZWRPdXRwdXQpID0+IEVudHJ5IHtcbiAgICByZXR1cm4gKG91dHB1dDogRGVwcmVjYXRlZE91dHB1dCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVwcmVjYXRlZElzVHJhbnNmZXJhYmxlT3V0cHV0KG91dHB1dCkpIHtcbiAgICAgICAgY29uc3QgYW1vdW50T3V0cHV0ID0gb3V0cHV0LmdldE91dHB1dCgpIGFzIEFtb3VudE91dHB1dDtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGFtb3VudE91dHB1dFxuICAgICAgICAgIC5nZXRBZGRyZXNzZXMoKVxuICAgICAgICAgIC5tYXAoKGEpID0+IHRoaXMuYWRkcmVzc1RvU3RyaW5nKG5ldHdvcmsuaHJwLCBuZXR3b3JrLmFsaWFzLCBhKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiBhbW91bnRPdXRwdXQuZ2V0QW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXZtT3V0cHV0ID0gb3V0cHV0IGFzIEVWTU91dHB1dDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAvLyBpdCBzaG91bGQgYmUgZXZtT3VwdXQuZ2V0QW1vdW50KCksIGJ1dCBpdCByZXR1cm5zIGEgMC5cbiAgICAgICAgICB2YWx1ZTogbmV3IEJOKChldm1PdXRwdXQgYXMgYW55KS5hbW91bnQpLnRvU3RyaW5nKCksXG4gICAgICAgICAgLy8gQy1DaGFpbiBhZGRyZXNzLlxuICAgICAgICAgIGFkZHJlc3M6ICcweCcgKyBldm1PdXRwdXQuZ2V0QWRkcmVzc1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWFwcGVyIGZ1bmN0aW9uIHRvIHRoYXQgbmV0d29yayBhZGRyZXNzIHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gbmV0d29yayByZXF1aXJlZCB0byBzdHJpbmdpZnkgYWRkcmVzc2VzXG4gICAqIEByZXR1cm4gbWFwcGVyIGZ1bmN0aW9uXG4gICAqL1xuICBtYXBPdXRwdXRUb0VudHJ5KG5ldHdvcms6IEF2YWxhbmNoZU5ldHdvcmspOiAoT3V0cHV0KSA9PiBFbnRyeSB7XG4gICAgcmV0dXJuIChvdXRwdXQ6IE91dHB1dCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNUcmFuc2ZlcmFibGVPdXRwdXQob3V0cHV0KSkge1xuICAgICAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBvdXRwdXQuYW1vdW50KCk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSAob3V0cHV0Lm91dHB1dCBhcyBUcmFuc2Zlck91dHB1dClcbiAgICAgICAgICAuZ2V0T3duZXJzKClcbiAgICAgICAgICAubWFwKChhKSA9PiB0aGlzLmFkZHJlc3NUb1N0cmluZyhuZXR3b3JrLmhycCwgbmV0d29yay5hbGlhcywgQnVmZmVyQXZheC5mcm9tKGEpKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiBvdXRwdXRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG91dHB1dCB0eXBlJyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgaGV4IHByZWZpeCAoMHgpXG4gICAqIEBwYXJhbSBoZXggc3RyaW5nXG4gICAqIEByZXR1cm5zIGhleCB3aXRob3V0IDB4XG4gICAqL1xuICByZW1vdmVIZXhQcmVmaXgoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChoZXguc3RhcnRzV2l0aCgnMHgnKSkge1xuICAgICAgcmV0dXJuIGhleC5zdWJzdHJpbmcoMik7XG4gICAgfVxuICAgIHJldHVybiBoZXg7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0aWR4IGNvbnZlcnQgZnJvbSBudW1iZXIgKGFzIHN0cmluZykgdG8gYnVmZmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3V0cHV0aWR4IG51bWJlclxuICAgKiBAcmV0dXJuIHtCdWZmZXJBdmF4fSBidWZmZXIgb2Ygc2l6ZSA0IHdpdGggdGhhdCBudW1iZXIgdmFsdWVcbiAgICovXG4gIG91dHB1dGlkeE51bWJlclRvQnVmZmVyKG91dHB1dGlkeDogc3RyaW5nKTogQnVmZmVyQXZheCB7XG4gICAgcmV0dXJuIEJ1ZmZlckF2YXguZnJvbShOdW1iZXIob3V0cHV0aWR4KS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgJzAnKSwgJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dGlkeCBidWZmZXIgdG8gbnVtYmVyIChhcyBzdHJpbmcpXG4gICAqIEBwYXJhbSB7QnVmZmVyQXZheH0gb3V0cHV0aWR4XG4gICAqIEByZXR1cm4ge3N0cmluZ30gb3V0cHV0aWR4IG51bWJlclxuICAgKi9cbiAgb3V0cHV0aWR4QnVmZmVyVG9OdW1iZXIob3V0cHV0aWR4OiBCdWZmZXJBdmF4KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGFyc2VJbnQob3V0cHV0aWR4LnRvU3RyaW5nKCdoZXgnKSwgMTYpLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DecodedUtxoObj } from './iface';
|
|
2
|
+
import { BN, Buffer as BufferAvax } from 'avalanche';
|
|
3
|
+
import { Signature } from 'avalanche/dist/common';
|
|
4
|
+
import { StandardTransferableInput } from 'avalanche/dist/common/input';
|
|
5
|
+
import { avaxSerial } from '@bitgo-forks/avalanchejs';
|
|
6
|
+
export interface InputData {
|
|
7
|
+
amount: BN;
|
|
8
|
+
txidBuf: BufferAvax;
|
|
9
|
+
outputIdx: BufferAvax;
|
|
10
|
+
signaturesIdx: number[];
|
|
11
|
+
signatures: Signature[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Inputs can be controlled but outputs get reordered in transactions
|
|
15
|
+
* In order to make sure that the mapping is always correct we create an addressIndex which matches to the appropriate
|
|
16
|
+
* signatureIdx
|
|
17
|
+
* @param {StandardTransferableInput[]} utxos as transaction ins.
|
|
18
|
+
* @returns the list of UTXOs
|
|
19
|
+
*/
|
|
20
|
+
export declare function deprecatedRecoverUtxos(utxos: StandardTransferableInput[]): DecodedUtxoObj[];
|
|
21
|
+
/**
|
|
22
|
+
* Inputs can be controlled but outputs get reordered in transactions
|
|
23
|
+
* In order to make sure that the mapping is always correct we create an addressIndex which matches to the appropriate
|
|
24
|
+
* signatureIdx
|
|
25
|
+
* @param {avaxSerial.TransferableInput[]} utxos as transaction ins.
|
|
26
|
+
* @returns the list of UTXOs
|
|
27
|
+
*/
|
|
28
|
+
export declare function recoverUtxos(utxos: avaxSerial.TransferableInput[]): DecodedUtxoObj[];
|
|
29
|
+
/**
|
|
30
|
+
* Convert Utxos into inputs data. Input Objects changes regarding chains. This method return a plain object to be mapped late in chain input.
|
|
31
|
+
* Sender is a list of owners address and utxo address must contains all of them.
|
|
32
|
+
* Signers is a list of sender cut it in threshold size. Firsts senders are the signers.
|
|
33
|
+
*
|
|
34
|
+
* Output always get reordered we want to make sure we can always add signatures in the correct location.
|
|
35
|
+
* Signatures array store signers address of the expected signature. Tx sign replace the address for the signature.
|
|
36
|
+
* So the location of the signatures is guaranteed.
|
|
37
|
+
*
|
|
38
|
+
* To find the correct location for the signature, we use the output's addresses to create the signatureIdx in the order that we desire
|
|
39
|
+
* 0: user key, 1: hsm key, 2: recovery key
|
|
40
|
+
*
|
|
41
|
+
* @param utxos
|
|
42
|
+
* @param sender array of addresses
|
|
43
|
+
* @param threshold number of signatures required
|
|
44
|
+
* @return {
|
|
45
|
+
* inputs: InputData[];
|
|
46
|
+
* amount: BN;
|
|
47
|
+
* } as total amount and inputs with signatures as signers address to be replaced.
|
|
48
|
+
*/
|
|
49
|
+
export declare function utxoToInput(utxos: DecodedUtxoObj[], sender: BufferAvax[], threshold?: number): {
|
|
50
|
+
inputs: InputData[];
|
|
51
|
+
amount: BN;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=utxoEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxoEngine.d.ts","sourceRoot":"","sources":["../../../src/lib/utxoEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA6B,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,OAAO,EAAuB,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,EAAE,CAAC;IACX,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,yBAAyB,EAAE,GAAG,cAAc,EAAE,CAiB3F;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,iBAAiB,EAAE,GAAG,cAAc,EAAE,CAiBpF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,cAAc,EAAE,EACvB,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,SAAI,GACZ;IACD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,EAAE,CAAC;CACZ,CAuCA"}
|
|
@@ -0,0 +1,112 @@
|
|
|
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.deprecatedRecoverUtxos = deprecatedRecoverUtxos;
|
|
7
|
+
exports.recoverUtxos = recoverUtxos;
|
|
8
|
+
exports.utxoToInput = utxoToInput;
|
|
9
|
+
const iface_1 = require("./iface");
|
|
10
|
+
const avalanche_1 = require("avalanche");
|
|
11
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
12
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
13
|
+
/**
|
|
14
|
+
* Inputs can be controlled but outputs get reordered in transactions
|
|
15
|
+
* In order to make sure that the mapping is always correct we create an addressIndex which matches to the appropriate
|
|
16
|
+
* signatureIdx
|
|
17
|
+
* @param {StandardTransferableInput[]} utxos as transaction ins.
|
|
18
|
+
* @returns the list of UTXOs
|
|
19
|
+
*/
|
|
20
|
+
function deprecatedRecoverUtxos(utxos) {
|
|
21
|
+
return utxos.map((utxo) => {
|
|
22
|
+
const secpInput = utxo.getInput();
|
|
23
|
+
// use the same addressesIndex as existing ones in the inputs
|
|
24
|
+
const addressesIndex = secpInput.getSigIdxs().map((s) => s.toBuffer().readUInt32BE(0));
|
|
25
|
+
return {
|
|
26
|
+
outputID: iface_1.SECP256K1_Transfer_Output,
|
|
27
|
+
outputidx: utils_1.default.outputidxBufferToNumber(utxo.getOutputIdx()),
|
|
28
|
+
txid: utils_1.default.cb58Encode(utxo.getTxID()),
|
|
29
|
+
amount: secpInput.getAmount().toString(),
|
|
30
|
+
threshold: addressesIndex.length,
|
|
31
|
+
addresses: [], // this is empty since the inputs from deserialized transaction don't contain addresses
|
|
32
|
+
addressesIndex,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Inputs can be controlled but outputs get reordered in transactions
|
|
38
|
+
* In order to make sure that the mapping is always correct we create an addressIndex which matches to the appropriate
|
|
39
|
+
* signatureIdx
|
|
40
|
+
* @param {avaxSerial.TransferableInput[]} utxos as transaction ins.
|
|
41
|
+
* @returns the list of UTXOs
|
|
42
|
+
*/
|
|
43
|
+
function recoverUtxos(utxos) {
|
|
44
|
+
return utxos.map((utxo) => {
|
|
45
|
+
const input = utxo.input;
|
|
46
|
+
// use the same addressesIndex as existing ones in the inputs
|
|
47
|
+
const addressesIndex = utxo.sigIndicies();
|
|
48
|
+
return {
|
|
49
|
+
outputID: iface_1.SECP256K1_Transfer_Output,
|
|
50
|
+
outputidx: utxo.utxoID.outputIdx.value().toString(),
|
|
51
|
+
txid: utxo.utxoID.txID.value(),
|
|
52
|
+
amount: input.amount().toString(),
|
|
53
|
+
threshold: addressesIndex.length,
|
|
54
|
+
addresses: [], // this is empty since the inputs from deserialized transaction don't contain addresses
|
|
55
|
+
addressesIndex,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Convert Utxos into inputs data. Input Objects changes regarding chains. This method return a plain object to be mapped late in chain input.
|
|
61
|
+
* Sender is a list of owners address and utxo address must contains all of them.
|
|
62
|
+
* Signers is a list of sender cut it in threshold size. Firsts senders are the signers.
|
|
63
|
+
*
|
|
64
|
+
* Output always get reordered we want to make sure we can always add signatures in the correct location.
|
|
65
|
+
* Signatures array store signers address of the expected signature. Tx sign replace the address for the signature.
|
|
66
|
+
* So the location of the signatures is guaranteed.
|
|
67
|
+
*
|
|
68
|
+
* To find the correct location for the signature, we use the output's addresses to create the signatureIdx in the order that we desire
|
|
69
|
+
* 0: user key, 1: hsm key, 2: recovery key
|
|
70
|
+
*
|
|
71
|
+
* @param utxos
|
|
72
|
+
* @param sender array of addresses
|
|
73
|
+
* @param threshold number of signatures required
|
|
74
|
+
* @return {
|
|
75
|
+
* inputs: InputData[];
|
|
76
|
+
* amount: BN;
|
|
77
|
+
* } as total amount and inputs with signatures as signers address to be replaced.
|
|
78
|
+
*/
|
|
79
|
+
function utxoToInput(utxos, sender, threshold = 2) {
|
|
80
|
+
// amount spent so far
|
|
81
|
+
let currentTotal = new avalanche_1.BN(0);
|
|
82
|
+
const inputs = utxos
|
|
83
|
+
.filter((utxo) => utxo && utxo.outputID === iface_1.SECP256K1_Transfer_Output)
|
|
84
|
+
.map((utxo) => {
|
|
85
|
+
// validate the utxos
|
|
86
|
+
const utxoAddresses = utxo.addresses.map((a) => utils_1.default.parseAddress(a));
|
|
87
|
+
const addressesIndex = sender.map((a) => utxoAddresses.findIndex((u) => a.equals(u)));
|
|
88
|
+
// addressesIndex should never have a mismatch
|
|
89
|
+
if (addressesIndex.includes(-1)) {
|
|
90
|
+
throw new sdk_core_1.BuildTransactionError('Addresses are inconsistent: ' + utxo.txid);
|
|
91
|
+
}
|
|
92
|
+
if (utxo.threshold !== threshold) {
|
|
93
|
+
throw new sdk_core_1.BuildTransactionError('Threshold is inconsistent');
|
|
94
|
+
}
|
|
95
|
+
const txidBuf = utils_1.default.cb58Decode(utxo.txid);
|
|
96
|
+
const amount = new avalanche_1.BN(utxo.amount);
|
|
97
|
+
const outputIdx = utils_1.default.outputidxNumberToBuffer(utxo.outputidx);
|
|
98
|
+
currentTotal = currentTotal.add(amount);
|
|
99
|
+
const signers = addressesIndex
|
|
100
|
+
.slice(0, threshold)
|
|
101
|
+
.map((utxoIndex, senderIndex) => ({ utxoIndex, senderIndex }))
|
|
102
|
+
.sort((a, b) => a.utxoIndex - b.utxoIndex);
|
|
103
|
+
const signatures = signers.map(({ senderIndex }) =>
|
|
104
|
+
// TODO(BG-56700): Improve canSign by check in addresses in empty credentials match signer
|
|
105
|
+
// HSM require empty signature.
|
|
106
|
+
utils_1.default.createSig(senderIndex == 1 ? '' : sender[senderIndex].toString('hex')));
|
|
107
|
+
const signaturesIdx = signers.map(({ utxoIndex }) => utxoIndex);
|
|
108
|
+
return { amount, txidBuf, outputIdx, signaturesIdx, signatures };
|
|
109
|
+
});
|
|
110
|
+
return { inputs, amount: currentTotal };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXR4b0VuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdXR4b0VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVCQSx3REFpQkM7QUFTRCxvQ0FpQkM7QUFzQkQsa0NBOENDO0FBdElELG1DQUFvRTtBQUNwRSx5Q0FBcUQ7QUFFckQsb0RBQTRCO0FBQzVCLG1EQUE2RDtBQVk3RDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxLQUFrQztJQUN2RSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUF5QixDQUFDO1FBRXpELDZEQUE2RDtRQUM3RCxNQUFNLGNBQWMsR0FBYSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakcsT0FBTztZQUNMLFFBQVEsRUFBRSxpQ0FBeUI7WUFDbkMsU0FBUyxFQUFFLGVBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0QsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ3hDLFNBQVMsRUFBRSxjQUFjLENBQUMsTUFBTTtZQUNoQyxTQUFTLEVBQUUsRUFBRSxFQUFFLHVGQUF1RjtZQUN0RyxjQUFjO1NBQ2YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFlBQVksQ0FBQyxLQUFxQztJQUNoRSxPQUFPLEtBQUssQ0FBQyxHQUFHLENB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QUMsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFO1FBQ2pELDJGQUEyRjtRQUMzRiwrQkFBK0I7UUFDL0IsZUFBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDN0UsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBCTiwgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvY29tbW9uJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFN0YW5kYXJkQW1vdW50SW5wdXQsIFN0YW5kYXJkVHJhbnNmZXJhYmxlSW5wdXQgfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9jb21tb24vaW5wdXQnO1xuaW1wb3J0IHsgYXZheFNlcmlhbCB9IGZyb20gJ0BiaXRnby1mb3Jrcy9hdmFsYW5jaGVqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXREYXRhIHtcbiAgYW1vdW50OiBCTjtcbiAgdHhpZEJ1ZjogQnVmZmVyQXZheDtcbiAgb3V0cHV0SWR4OiBCdWZmZXJBdmF4O1xuICBzaWduYXR1cmVzSWR4OiBudW1iZXJbXTtcbiAgc2lnbmF0dXJlczogU2lnbmF0dXJlW107XG59XG5cbi8qKlxuICogSW5wdXRzIGNhbiBiZSBjb250cm9sbGVkIGJ1dCBvdXRwdXRzIGdldCByZW9yZGVyZWQgaW4gdHJhbnNhY3Rpb25zXG4gKiBJbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbWFwcGluZyBpcyBhbHdheXMgY29ycmVjdCB3ZSBjcmVhdGUgYW4gYWRkcmVzc0luZGV4IHdoaWNoIG1hdGNoZXMgdG8gdGhlIGFwcHJvcHJpYXRlXG4gKiBzaWduYXR1cmVJZHhcbiAqIEBwYXJhbSB7U3RhbmRhcmRUcmFuc2ZlcmFibGVJbnB1dFtdfSB1dHhvcyBhcyB0cmFuc2FjdGlvbiBpbnMuXG4gKiBAcmV0dXJucyB0aGUgbGlzdCBvZiBVVFhPc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlZFJlY292ZXJVdHhvcyh1dHhvczogU3RhbmRhcmRUcmFuc2ZlcmFibGVJbnB1dFtdKTogRGVjb2RlZFV0eG9PYmpbXSB7XG4gIHJldHVybiB1dHhvcy5tYXAoKHV0eG8pID0+IHtcbiAgICBjb25zdCBzZWNwSW5wdXQgPSB1dHhvLmdldElucHV0KCkgYXMgU3RhbmRhcmRBbW91bnRJbnB1dDtcblxuICAgIC8vIHVzZSB0aGUgc2FtZSBhZGRyZXNzZXNJbmRleCBhcyBleGlzdGluZyBvbmVzIGluIHRoZSBpbnB1dHNcbiAgICBjb25zdCBhZGRyZXNzZXNJbmRleDogbnVtYmVyW10gPSBzZWNwSW5wdXQuZ2V0U2lnSWR4cygpLm1hcCgocykgPT4gcy50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgwKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3V0cHV0SUQ6IFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsXG4gICAgICBvdXRwdXRpZHg6IHV0aWxzLm91dHB1dGlkeEJ1ZmZlclRvTnVtYmVyKHV0eG8uZ2V0T3V0cHV0SWR4KCkpLFxuICAgICAgdHhpZDogdXRpbHMuY2I1OEVuY29kZSh1dHhvLmdldFR4SUQoKSksXG4gICAgICBhbW91bnQ6IHNlY3BJbnB1dC5nZXRBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgdGhyZXNob2xkOiBhZGRyZXNzZXNJbmRleC5sZW5ndGgsXG4gICAgICBhZGRyZXNzZXM6IFtdLCAvLyB0aGlzIGlzIGVtcHR5IHNpbmNlIHRoZSBpbnB1dHMgZnJvbSBkZXNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gZG9uJ3QgY29udGFpbiBhZGRyZXNzZXNcbiAgICAgIGFkZHJlc3Nlc0luZGV4LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIElucHV0cyBjYW4gYmUgY29udHJvbGxlZCBidXQgb3V0cHV0cyBnZXQgcmVvcmRlcmVkIGluIHRyYW5zYWN0aW9uc1xuICogSW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1hcHBpbmcgaXMgYWx3YXlzIGNvcnJlY3Qgd2UgY3JlYXRlIGFuIGFkZHJlc3NJbmRleCB3aGljaCBtYXRjaGVzIHRvIHRoZSBhcHByb3ByaWF0ZVxuICogc2lnbmF0dXJlSWR4XG4gKiBAcGFyYW0ge2F2YXhTZXJpYWwuVHJhbnNmZXJhYmxlSW5wdXRbXX0gdXR4b3MgYXMgdHJhbnNhY3Rpb24gaW5zLlxuICogQHJldHVybnMgdGhlIGxpc3Qgb2YgVVRYT3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY292ZXJVdHhvcyh1dHhvczogYXZheFNlcmlhbC5UcmFuc2ZlcmFibGVJbnB1dFtdKTogRGVjb2RlZFV0eG9PYmpbXSB7XG4gIHJldHVybiB1dHhvcy5tYXAoKHV0eG8pID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IHV0eG8uaW5wdXQ7XG5cbiAgICAvLyB1c2UgdGhlIHNhbWUgYWRkcmVzc2VzSW5kZXggYXMgZXhpc3Rpbmcgb25lcyBpbiB0aGUgaW5wdXRzXG4gICAgY29uc3QgYWRkcmVzc2VzSW5kZXg6IG51bWJlcltdID0gdXR4by5zaWdJbmRpY2llcygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG91dHB1dElEOiBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LFxuICAgICAgb3V0cHV0aWR4OiB1dHhvLnV0eG9JRC5vdXRwdXRJZHgudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgdHhpZDogdXR4by51dHhvSUQudHhJRC52YWx1ZSgpLFxuICAgICAgYW1vdW50OiBpbnB1dC5hbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgdGhyZXNob2xkOiBhZGRyZXNzZXNJbmRleC5sZW5ndGgsXG4gICAgICBhZGRyZXNzZXM6IFtdLCAvLyB0aGlzIGlzIGVtcHR5IHNpbmNlIHRoZSBpbnB1dHMgZnJvbSBkZXNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gZG9uJ3QgY29udGFpbiBhZGRyZXNzZXNcbiAgICAgIGFkZHJlc3Nlc0luZGV4LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgVXR4b3MgaW50byBpbnB1dHMgZGF0YS4gSW5wdXQgT2JqZWN0cyBjaGFuZ2VzIHJlZ2FyZGluZyBjaGFpbnMuIFRoaXMgbWV0aG9kIHJldHVybiBhIHBsYWluIG9iamVjdCB0byBiZSBtYXBwZWQgbGF0ZSBpbiBjaGFpbiBpbnB1dC5cbiAqIFNlbmRlciBpcyBhIGxpc3Qgb2Ygb3duZXJzIGFkZHJlc3MgYW5kIHV0eG8gYWRkcmVzcyBtdXN0IGNvbnRhaW5zIGFsbCBvZiB0aGVtLlxuICogU2lnbmVycyBpcyBhIGxpc3Qgb2Ygc2VuZGVyIGN1dCBpdCBpbiB0aHJlc2hvbGQgc2l6ZS4gRmlyc3RzIHNlbmRlcnMgYXJlIHRoZSBzaWduZXJzLlxuICpcbiAqIE91dHB1dCBhbHdheXMgZ2V0IHJlb3JkZXJlZCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gYWx3YXlzIGFkZCBzaWduYXR1cmVzIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uLlxuICogU2lnbmF0dXJlcyBhcnJheSBzdG9yZSBzaWduZXJzIGFkZHJlc3Mgb2YgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZS4gVHggc2lnbiByZXBsYWNlIHRoZSBhZGRyZXNzIGZvciB0aGUgc2lnbmF0dXJlLlxuICogU28gdGhlIGxvY2F0aW9uIG9mIHRoZSBzaWduYXR1cmVzIGlzIGd1YXJhbnRlZWQuXG4gKlxuICogVG8gZmluZCB0aGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgdGhlIHNpZ25hdHVyZSwgd2UgdXNlIHRoZSBvdXRwdXQncyBhZGRyZXNzZXMgdG8gY3JlYXRlIHRoZSBzaWduYXR1cmVJZHggaW4gdGhlIG9yZGVyIHRoYXQgd2UgZGVzaXJlXG4gKiAwOiB1c2VyIGtleSwgMTogaHNtIGtleSwgMjogcmVjb3Zlcnkga2V5XG4gKlxuICogQHBhcmFtIHV0eG9zXG4gKiBAcGFyYW0gc2VuZGVyIGFycmF5IG9mIGFkZHJlc3Nlc1xuICogQHBhcmFtIHRocmVzaG9sZCBudW1iZXIgb2Ygc2lnbmF0dXJlcyByZXF1aXJlZFxuICogQHJldHVybiB7XG4gKiAgIGlucHV0czogSW5wdXREYXRhW107XG4gKiAgIGFtb3VudDogQk47XG4gKiB9IGFzIHRvdGFsIGFtb3VudCBhbmQgaW5wdXRzIHdpdGggc2lnbmF0dXJlcyBhcyBzaWduZXJzIGFkZHJlc3MgdG8gYmUgcmVwbGFjZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dHhvVG9JbnB1dChcbiAgdXR4b3M6IERlY29kZWRVdHhvT2JqW10sXG4gIHNlbmRlcjogQnVmZmVyQXZheFtdLFxuICB0aHJlc2hvbGQgPSAyXG4pOiB7XG4gIGlucHV0czogSW5wdXREYXRhW107XG4gIGFtb3VudDogQk47XG59IHtcbiAgLy8gYW1vdW50IHNwZW50IHNvIGZhclxuICBsZXQgY3VycmVudFRvdGFsOiBCTiA9IG5ldyBCTigwKTtcblxuICBjb25zdCBpbnB1dHMgPSB1dHhvc1xuICAgIC5maWx0ZXIoKHV0eG8pID0+IHV0eG8gJiYgdXR4by5vdXRwdXRJRCA9PT0gU0VDUDI1NksxX1RyYW5zZmVyX091dHB1dClcbiAgICAubWFwKCh1dHhvKSA9PiB7XG4gICAgICAvLyB2YWxpZGF0ZSB0aGUgdXR4b3NcbiAgICAgIGNvbnN0IHV0eG9BZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXSA9IHV0eG8uYWRkcmVzc2VzLm1hcCgoYSkgPT4gdXRpbHMucGFyc2VBZGRyZXNzKGEpKTtcbiAgICAgIGNvbnN0IGFkZHJlc3Nlc0luZGV4ID0gc2VuZGVyLm1hcCgoYSkgPT4gdXR4b0FkZHJlc3Nlcy5maW5kSW5kZXgoKHUpID0+IGEuZXF1YWxzKHUpKSk7XG4gICAgICAvLyBhZGRyZXNzZXNJbmRleCBzaG91bGQgbmV2ZXIgaGF2ZSBhIG1pc21hdGNoXG4gICAgICBpZiAoYWRkcmVzc2VzSW5kZXguaW5jbHVkZXMoLTEpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0FkZHJlc3NlcyBhcmUgaW5jb25zaXN0ZW50OiAnICsgdXR4by50eGlkKTtcbiAgICAgIH1cbiAgICAgIGlmICh1dHhvLnRocmVzaG9sZCAhPT0gdGhyZXNob2xkKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RocmVzaG9sZCBpcyBpbmNvbnNpc3RlbnQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHhpZEJ1ZjogQnVmZmVyQXZheCA9IHV0aWxzLmNiNThEZWNvZGUodXR4by50eGlkKTtcbiAgICAgIGNvbnN0IGFtb3VudDogQk4gPSBuZXcgQk4odXR4by5hbW91bnQpO1xuICAgICAgY29uc3Qgb3V0cHV0SWR4OiBCdWZmZXJBdmF4ID0gdXRpbHMub3V0cHV0aWR4TnVtYmVyVG9CdWZmZXIodXR4by5vdXRwdXRpZHgpO1xuXG4gICAgICBjdXJyZW50VG90YWwgPSBjdXJyZW50VG90YWwuYWRkKGFtb3VudCk7XG5cbiAgICAgIGNvbnN0IHNpZ25lcnMgPSBhZGRyZXNzZXNJbmRleFxuICAgICAgICAuc2xpY2UoMCwgdGhyZXNob2xkKVxuICAgICAgICAubWFwKCh1dHhvSW5kZXgsIHNlbmRlckluZGV4KSA9PiAoeyB1dHhvSW5kZXgsIHNlbmRlckluZGV4IH0pKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS51dHhvSW5kZXggLSBiLnV0eG9JbmRleCk7XG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gc2lnbmVycy5tYXAoKHsgc2VuZGVySW5kZXggfSkgPT5cbiAgICAgICAgLy8gVE9ETyhCRy01NjcwMCk6ICBJbXByb3ZlIGNhblNpZ24gYnkgY2hlY2sgaW4gYWRkcmVzc2VzIGluIGVtcHR5IGNyZWRlbnRpYWxzIG1hdGNoIHNpZ25lclxuICAgICAgICAvLyBIU00gcmVxdWlyZSBlbXB0eSBzaWduYXR1cmUuXG4gICAgICAgIHV0aWxzLmNyZWF0ZVNpZyhzZW5kZXJJbmRleCA9PSAxID8gJycgOiBzZW5kZXJbc2VuZGVySW5kZXhdLnRvU3RyaW5nKCdoZXgnKSlcbiAgICAgICk7XG4gICAgICBjb25zdCBzaWduYXR1cmVzSWR4ID0gc2lnbmVycy5tYXAoKHsgdXR4b0luZGV4IH0pID0+IHV0eG9JbmRleCk7XG5cbiAgICAgIHJldHVybiB7IGFtb3VudCwgdHhpZEJ1Ziwgb3V0cHV0SWR4LCBzaWduYXR1cmVzSWR4LCBzaWduYXR1cmVzIH07XG4gICAgfSk7XG5cbiAgcmV0dXJuIHsgaW5wdXRzLCBhbW91bnQ6IGN1cnJlbnRUb3RhbCB9O1xufVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { DelegatorTxBuilder } from './delegatorTxBuilder';
|
|
2
|
+
import { BaseCoin } from '@bitgo-beta/statics';
|
|
3
|
+
import { AddValidatorTx } from 'avalanche/dist/apis/platformvm';
|
|
4
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
5
|
+
import { DeprecatedTx, DeprecatedBaseTx } from './iface';
|
|
6
|
+
export declare class ValidatorTxBuilder extends DelegatorTxBuilder {
|
|
7
|
+
protected _delegationFeeRate: number;
|
|
8
|
+
/**
|
|
9
|
+
* @param coinConfig
|
|
10
|
+
*/
|
|
11
|
+
constructor(coinConfig: Readonly<BaseCoin>);
|
|
12
|
+
/**
|
|
13
|
+
* get transaction type
|
|
14
|
+
* @protected
|
|
15
|
+
*/
|
|
16
|
+
protected get transactionType(): TransactionType;
|
|
17
|
+
/**
|
|
18
|
+
* set the delegationFeeRate
|
|
19
|
+
* @param value number
|
|
20
|
+
*/
|
|
21
|
+
delegationFeeRate(value: number): this;
|
|
22
|
+
/**
|
|
23
|
+
* Validate that the delegation fee is at least the minDelegationFee
|
|
24
|
+
* @param delegationFeeRate number
|
|
25
|
+
*/
|
|
26
|
+
validateDelegationFeeRate(delegationFeeRate: number): void;
|
|
27
|
+
/** @inheritdoc */
|
|
28
|
+
initBuilder(tx: DeprecatedTx): this;
|
|
29
|
+
static verifyTxType(baseTx: DeprecatedBaseTx): baseTx is AddValidatorTx;
|
|
30
|
+
verifyTxType(baseTx: DeprecatedBaseTx): baseTx is AddValidatorTx;
|
|
31
|
+
/**
|
|
32
|
+
* Build the validator transaction
|
|
33
|
+
* @protected
|
|
34
|
+
*/
|
|
35
|
+
protected buildAvaxTransaction(): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=validatorTxBuilder.d.ts.map
|