@bitgo-beta/sdk-coin-near 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +32 -0
- package/LICENSE +191 -0
- package/README.md +30 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +16 -0
- package/dist/src/lib/constants.d.ts +12 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +15 -0
- package/dist/src/lib/contractCallWrapper.d.ts +33 -0
- package/dist/src/lib/contractCallWrapper.d.ts.map +1 -0
- package/dist/src/lib/contractCallWrapper.js +68 -0
- package/dist/src/lib/errors.d.ts +5 -0
- package/dist/src/lib/errors.d.ts.map +1 -0
- package/dist/src/lib/errors.js +12 -0
- package/dist/src/lib/iface.d.ts +40 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +8 -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 +41 -0
- package/dist/src/lib/keyPair.d.ts +25 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +72 -0
- package/dist/src/lib/stakingActivateBuilder.d.ts +32 -0
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingActivateBuilder.js +90 -0
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +32 -0
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingDeactivateBuilder.js +89 -0
- package/dist/src/lib/stakingWithdrawBuilder.d.ts +32 -0
- package/dist/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingWithdrawBuilder.js +89 -0
- package/dist/src/lib/transaction.d.ts +90 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +368 -0
- package/dist/src/lib/transactionBuilder.d.ts +89 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +216 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +30 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +71 -0
- package/dist/src/lib/transferBuilder.d.ts +26 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +72 -0
- package/dist/src/lib/utils.d.ts +42 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +85 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts +12 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/walletInitializationBuilder.js +20 -0
- package/dist/src/near.d.ts +169 -0
- package/dist/src/near.d.ts.map +1 -0
- package/dist/src/near.js +471 -0
- package/dist/src/tnear.d.ts +7 -0
- package/dist/src/tnear.d.ts.map +1 -0
- package/dist/src/tnear.js +11 -0
- package/package.json +61 -0
package/dist/src/near.js
ADDED
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @prettier
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
8
|
+
}) : (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
o[k2] = m[k];
|
|
11
|
+
}));
|
|
12
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
13
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
14
|
+
}) : function(o, v) {
|
|
15
|
+
o["default"] = v;
|
|
16
|
+
});
|
|
17
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
18
|
+
if (mod && mod.__esModule) return mod;
|
|
19
|
+
var result = {};
|
|
20
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
21
|
+
__setModuleDefault(result, mod);
|
|
22
|
+
return result;
|
|
23
|
+
};
|
|
24
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
25
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
26
|
+
};
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.Near = void 0;
|
|
29
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
30
|
+
const _ = __importStar(require("lodash"));
|
|
31
|
+
const base58 = __importStar(require("bs58"));
|
|
32
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
33
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
34
|
+
const nearAPI = __importStar(require("near-api-js"));
|
|
35
|
+
const request = __importStar(require("superagent"));
|
|
36
|
+
const lib_1 = require("./lib");
|
|
37
|
+
const utils_1 = __importDefault(require("./lib/utils"));
|
|
38
|
+
class Near extends sdk_core_1.BaseCoin {
|
|
39
|
+
constructor(bitgo, staticsCoin) {
|
|
40
|
+
super(bitgo);
|
|
41
|
+
this.network = this.bitgo.getEnv() === 'prod' ? 'main' : 'test';
|
|
42
|
+
if (!staticsCoin) {
|
|
43
|
+
throw new Error('missing required constructor parameter staticsCoin');
|
|
44
|
+
}
|
|
45
|
+
this._staticsCoin = staticsCoin;
|
|
46
|
+
}
|
|
47
|
+
static createInstance(bitgo, staticsCoin) {
|
|
48
|
+
return new Near(bitgo, staticsCoin);
|
|
49
|
+
}
|
|
50
|
+
allowsAccountConsolidations() {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Flag indicating if this coin supports TSS wallets.
|
|
55
|
+
* @returns {boolean} True if TSS Wallets can be created for this coin
|
|
56
|
+
*/
|
|
57
|
+
supportsTss() {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
getMPCAlgorithm() {
|
|
61
|
+
return 'eddsa';
|
|
62
|
+
}
|
|
63
|
+
supportsStaking() {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
getChain() {
|
|
67
|
+
return this._staticsCoin.name;
|
|
68
|
+
}
|
|
69
|
+
getBaseChain() {
|
|
70
|
+
return this.getChain();
|
|
71
|
+
}
|
|
72
|
+
getFamily() {
|
|
73
|
+
return this._staticsCoin.family;
|
|
74
|
+
}
|
|
75
|
+
getFullName() {
|
|
76
|
+
return this._staticsCoin.fullName;
|
|
77
|
+
}
|
|
78
|
+
getBaseFactor() {
|
|
79
|
+
return Math.pow(10, this._staticsCoin.decimalPlaces);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Flag for sending value of 0
|
|
83
|
+
* @returns {boolean} True if okay to send 0 value, false otherwise
|
|
84
|
+
*/
|
|
85
|
+
valuelessTransferAllowed() {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate ed25519 key pair
|
|
90
|
+
*
|
|
91
|
+
* @param seed
|
|
92
|
+
* @returns {Object} object with generated pub, prv
|
|
93
|
+
*/
|
|
94
|
+
generateKeyPair(seed) {
|
|
95
|
+
const keyPair = seed ? new lib_1.KeyPair({ seed }) : new lib_1.KeyPair();
|
|
96
|
+
const keys = keyPair.getKeys();
|
|
97
|
+
if (!keys.prv) {
|
|
98
|
+
throw new Error('Missing prv in key generation.');
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
pub: keys.pub,
|
|
102
|
+
prv: keys.prv,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Return boolean indicating whether input is valid public key for the coin.
|
|
107
|
+
*
|
|
108
|
+
* @param {String} pub the pub to be checked
|
|
109
|
+
* @returns {Boolean} is it valid?
|
|
110
|
+
*/
|
|
111
|
+
isValidPub(pub) {
|
|
112
|
+
return utils_1.default.isValidPublicKey(pub);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Return boolean indicating whether the supplied private key is a valid near private key
|
|
116
|
+
*
|
|
117
|
+
* @param {String} prv the prv to be checked
|
|
118
|
+
* @returns {Boolean} is it valid?
|
|
119
|
+
*/
|
|
120
|
+
isValidPrv(prv) {
|
|
121
|
+
return utils_1.default.isValidPrivateKey(prv);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Return boolean indicating whether input is valid public key for the coin
|
|
125
|
+
*
|
|
126
|
+
* @param {String} address the pub to be checked
|
|
127
|
+
* @returns {Boolean} is it valid?
|
|
128
|
+
*/
|
|
129
|
+
isValidAddress(address) {
|
|
130
|
+
return utils_1.default.isValidAddress(address);
|
|
131
|
+
}
|
|
132
|
+
/** @inheritDoc */
|
|
133
|
+
async signMessage(key, message) {
|
|
134
|
+
const nearKeypair = new lib_1.KeyPair({ prv: key.prv });
|
|
135
|
+
if (Buffer.isBuffer(message)) {
|
|
136
|
+
message = base58.encode(message);
|
|
137
|
+
}
|
|
138
|
+
return Buffer.from(nearKeypair.signMessage(message));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Explain/parse transaction
|
|
142
|
+
* @param params
|
|
143
|
+
*/
|
|
144
|
+
async explainTransaction(params) {
|
|
145
|
+
const factory = this.getBuilder();
|
|
146
|
+
let rebuiltTransaction;
|
|
147
|
+
const txRaw = params.txPrebuild.txHex;
|
|
148
|
+
try {
|
|
149
|
+
const transactionBuilder = factory.from(txRaw);
|
|
150
|
+
rebuiltTransaction = await transactionBuilder.build();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw new Error('Invalid transaction');
|
|
154
|
+
}
|
|
155
|
+
return rebuiltTransaction.explainTransaction();
|
|
156
|
+
}
|
|
157
|
+
verifySignTransactionParams(params) {
|
|
158
|
+
const prv = params.prv;
|
|
159
|
+
const txHex = params.txPrebuild.txHex;
|
|
160
|
+
if (_.isUndefined(txHex)) {
|
|
161
|
+
throw new Error('missing txPrebuild parameter');
|
|
162
|
+
}
|
|
163
|
+
if (!_.isString(txHex)) {
|
|
164
|
+
throw new Error(`txPrebuild must be an object, got type ${typeof txHex}`);
|
|
165
|
+
}
|
|
166
|
+
if (_.isUndefined(prv)) {
|
|
167
|
+
throw new Error('missing prv parameter to sign transaction');
|
|
168
|
+
}
|
|
169
|
+
if (!_.isString(prv)) {
|
|
170
|
+
throw new Error(`prv must be a string, got type ${typeof prv}`);
|
|
171
|
+
}
|
|
172
|
+
if (!_.has(params.txPrebuild, 'key')) {
|
|
173
|
+
throw new Error('missing public key parameter to sign transaction');
|
|
174
|
+
}
|
|
175
|
+
// if we are receiving addresses do not try to convert them
|
|
176
|
+
const signer = !utils_1.default.isValidAddress(params.txPrebuild.key)
|
|
177
|
+
? new lib_1.KeyPair({ pub: params.txPrebuild.key }).getAddress()
|
|
178
|
+
: params.txPrebuild.key;
|
|
179
|
+
return { txHex, prv, signer };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Assemble keychain and half-sign prebuilt transaction
|
|
183
|
+
*
|
|
184
|
+
* @param params
|
|
185
|
+
* @param params.txPrebuild {TransactionPrebuild} prebuild object returned by platform
|
|
186
|
+
* @param params.prv {String} user prv
|
|
187
|
+
* @param callback
|
|
188
|
+
* @returns {Bluebird<SignedTransaction>}
|
|
189
|
+
*/
|
|
190
|
+
async signTransaction(params) {
|
|
191
|
+
const factory = this.getBuilder();
|
|
192
|
+
const txBuilder = factory.from(params.txPrebuild.txHex);
|
|
193
|
+
txBuilder.sign({ key: params.prv });
|
|
194
|
+
const transaction = await txBuilder.build();
|
|
195
|
+
if (!transaction) {
|
|
196
|
+
throw new Error('Invalid transaction');
|
|
197
|
+
}
|
|
198
|
+
const serializedTx = transaction.toBroadcastFormat();
|
|
199
|
+
return {
|
|
200
|
+
txHex: serializedTx,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Builds a funds recovery transaction without BitGo
|
|
205
|
+
* @param params
|
|
206
|
+
*/
|
|
207
|
+
async recover(params) {
|
|
208
|
+
// TODO(BG-51092): This looks like a common part which can be extracted out too
|
|
209
|
+
/* ***************** START **************************************/
|
|
210
|
+
if (_.isUndefined(params.userKey)) {
|
|
211
|
+
throw new Error('missing userKey');
|
|
212
|
+
}
|
|
213
|
+
if (_.isUndefined(params.backupKey)) {
|
|
214
|
+
throw new Error('missing backupKey');
|
|
215
|
+
}
|
|
216
|
+
if (_.isUndefined(params.bitgoKey)) {
|
|
217
|
+
throw new Error('missing backupKey');
|
|
218
|
+
}
|
|
219
|
+
if (_.isUndefined(params.walletPassphrase) && !params.userKey.startsWith('xpub')) {
|
|
220
|
+
throw new Error('missing wallet passphrase');
|
|
221
|
+
}
|
|
222
|
+
if (_.isUndefined(params.recoveryDestination) || !this.isValidAddress(params.recoveryDestination)) {
|
|
223
|
+
throw new Error('invalid recoveryDestination');
|
|
224
|
+
}
|
|
225
|
+
// Clean up whitespace from entered values
|
|
226
|
+
const userKey = params.userKey.replace(/\s/g, '');
|
|
227
|
+
const backupKey = params.backupKey.replace(/\s/g, '');
|
|
228
|
+
const bitgoKey = params.bitgoKey.replace(/\s/g, '');
|
|
229
|
+
// Decrypt private keys from KeyCard values
|
|
230
|
+
let userPrv;
|
|
231
|
+
if (!userKey.startsWith('xpub') && !userKey.startsWith('xprv')) {
|
|
232
|
+
try {
|
|
233
|
+
userPrv = this.bitgo.decrypt({
|
|
234
|
+
input: userKey,
|
|
235
|
+
password: params.walletPassphrase,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (e) {
|
|
239
|
+
throw new Error(`Error decrypting user keychain: ${e.message}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/** TODO BG-52419 Implement Codec for parsing */
|
|
243
|
+
const userSigningMaterial = JSON.parse(userPrv);
|
|
244
|
+
let backupPrv;
|
|
245
|
+
try {
|
|
246
|
+
backupPrv = this.bitgo.decrypt({
|
|
247
|
+
input: backupKey,
|
|
248
|
+
password: params.walletPassphrase,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
throw new Error(`Error decrypting backup keychain: ${e.message}`);
|
|
253
|
+
}
|
|
254
|
+
const backupSigningMaterial = JSON.parse(backupPrv);
|
|
255
|
+
/* ********************** END ***********************************/
|
|
256
|
+
const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
|
|
257
|
+
const accountId = MPC.deriveUnhardened(bitgoKey, `m/0`).slice(0, 64);
|
|
258
|
+
const bs58EncodedPublicKey = nearAPI.utils.serialize.base_encode(new Uint8Array(Buffer.from(accountId, 'hex')));
|
|
259
|
+
const { storageAmountPerByte, transferCost, receiptConfig } = await this.getProtocolConfig();
|
|
260
|
+
const availableBalance = new bignumber_js_1.default(await this.getAccountBalance(accountId, storageAmountPerByte));
|
|
261
|
+
const { nonce, blockHash } = await this.getAccessKey({ accountId, bs58EncodedPublicKey });
|
|
262
|
+
const gasPrice = await this.getGasPrice(blockHash);
|
|
263
|
+
const gasPriceFirstBlock = new bignumber_js_1.default(gasPrice);
|
|
264
|
+
const gasPriceSecondBlock = gasPriceFirstBlock.multipliedBy(1.05);
|
|
265
|
+
const totalGasRequired = new bignumber_js_1.default(transferCost.sendSir)
|
|
266
|
+
.plus(receiptConfig.sendSir)
|
|
267
|
+
.multipliedBy(gasPriceFirstBlock)
|
|
268
|
+
.plus(new bignumber_js_1.default(transferCost.execution).plus(receiptConfig.execution).multipliedBy(gasPriceSecondBlock));
|
|
269
|
+
// adding some padding to make sure the gas doesn't go below required gas by network
|
|
270
|
+
const totalGasWithPadding = totalGasRequired.multipliedBy(1.5);
|
|
271
|
+
const feeReserve = bignumber_js_1.default(statics_1.Networks[this.network].near.feeReserve);
|
|
272
|
+
const storageReserve = bignumber_js_1.default(statics_1.Networks[this.network].near.storageReserve);
|
|
273
|
+
const netAmount = availableBalance.minus(totalGasWithPadding).minus(feeReserve).minus(storageReserve).toFixed();
|
|
274
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
|
|
275
|
+
const txBuilder = factory
|
|
276
|
+
.getTransferBuilder()
|
|
277
|
+
.sender(accountId, accountId)
|
|
278
|
+
.nonce(nonce)
|
|
279
|
+
.receiverId(params.recoveryDestination)
|
|
280
|
+
.recentBlockHash(blockHash)
|
|
281
|
+
.amount(netAmount);
|
|
282
|
+
const unsignedTransaction = (await txBuilder.build());
|
|
283
|
+
// add signature
|
|
284
|
+
const signatureHex = await sdk_core_1.EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, 'm/0', unsignedTransaction);
|
|
285
|
+
const publicKeyObj = { pub: accountId };
|
|
286
|
+
txBuilder.addSignature(publicKeyObj, signatureHex);
|
|
287
|
+
const signedTransaction = await txBuilder.build();
|
|
288
|
+
const serializedTx = signedTransaction.toBroadcastFormat();
|
|
289
|
+
return { serializedTx: serializedTx };
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Make a request to one of the public EOS nodes available
|
|
293
|
+
* @param params.payload
|
|
294
|
+
*/
|
|
295
|
+
async getDataFromNode(params) {
|
|
296
|
+
const nodeUrls = this.getPublicNodeUrls();
|
|
297
|
+
for (const nodeUrl of nodeUrls) {
|
|
298
|
+
try {
|
|
299
|
+
return await request.post(nodeUrl).send(params.payload);
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
console.debug(e);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
throw new Error(`Unable to call endpoint: '/' from nodes: ${_.join(nodeUrls, ', ')}`);
|
|
306
|
+
}
|
|
307
|
+
async getAccessKey({ accountId, bs58EncodedPublicKey, }) {
|
|
308
|
+
const response = await this.getDataFromNode({
|
|
309
|
+
payload: {
|
|
310
|
+
jsonrpc: '2.0',
|
|
311
|
+
id: 'dontcare',
|
|
312
|
+
method: 'query',
|
|
313
|
+
params: {
|
|
314
|
+
request_type: 'view_access_key',
|
|
315
|
+
finality: 'final',
|
|
316
|
+
account_id: accountId,
|
|
317
|
+
public_key: bs58EncodedPublicKey,
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
if (response.status !== 200) {
|
|
322
|
+
throw new Error('Account not found');
|
|
323
|
+
}
|
|
324
|
+
const accessKey = response.body.result;
|
|
325
|
+
return { nonce: ++accessKey.nonce, blockHash: accessKey.block_hash };
|
|
326
|
+
}
|
|
327
|
+
async getAccountBalance(accountId, storageAmountPerByte) {
|
|
328
|
+
const response = await this.getDataFromNode({
|
|
329
|
+
payload: {
|
|
330
|
+
jsonrpc: '2.0',
|
|
331
|
+
id: 'dontcare',
|
|
332
|
+
method: 'query',
|
|
333
|
+
params: {
|
|
334
|
+
request_type: 'view_account',
|
|
335
|
+
finality: 'final',
|
|
336
|
+
account_id: accountId,
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
if (response.status !== 200) {
|
|
341
|
+
throw new Error('Account not found');
|
|
342
|
+
}
|
|
343
|
+
const account = response.body.result;
|
|
344
|
+
const costPerByte = new bignumber_js_1.default(storageAmountPerByte);
|
|
345
|
+
const stateStaked = new bignumber_js_1.default(account.storage_usage).multipliedBy(costPerByte);
|
|
346
|
+
const staked = new bignumber_js_1.default(account.locked);
|
|
347
|
+
const totalBalance = new bignumber_js_1.default(account.amount).plus(staked);
|
|
348
|
+
const availableBalance = totalBalance.minus(bignumber_js_1.default.max(staked, stateStaked));
|
|
349
|
+
return availableBalance.toString();
|
|
350
|
+
}
|
|
351
|
+
async getProtocolConfig() {
|
|
352
|
+
const response = await this.getDataFromNode({
|
|
353
|
+
payload: {
|
|
354
|
+
jsonrpc: '2.0',
|
|
355
|
+
id: 'dontcare',
|
|
356
|
+
method: 'EXPERIMENTAL_protocol_config',
|
|
357
|
+
params: {
|
|
358
|
+
finality: 'final',
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
if (response.status !== 200) {
|
|
363
|
+
throw new Error('Account not found');
|
|
364
|
+
}
|
|
365
|
+
const config = response.body.result;
|
|
366
|
+
const storageAmountPerByte = config.runtime_config.storage_amount_per_byte;
|
|
367
|
+
const transferCostFromNetwork = config.runtime_config.transaction_costs.action_creation_config.transfer_cost;
|
|
368
|
+
const transferCost = {
|
|
369
|
+
sendSir: transferCostFromNetwork.send_sir,
|
|
370
|
+
sendNotSir: transferCostFromNetwork.send_not_sir,
|
|
371
|
+
execution: transferCostFromNetwork.execution,
|
|
372
|
+
};
|
|
373
|
+
const receiptConfigFromNetwork = config.runtime_config.transaction_costs.action_receipt_creation_config;
|
|
374
|
+
const receiptConfig = {
|
|
375
|
+
sendSir: receiptConfigFromNetwork.send_sir,
|
|
376
|
+
sendNotSir: receiptConfigFromNetwork.send_not_sir,
|
|
377
|
+
execution: receiptConfigFromNetwork.execution,
|
|
378
|
+
};
|
|
379
|
+
return { storageAmountPerByte, transferCost, receiptConfig };
|
|
380
|
+
}
|
|
381
|
+
async getGasPrice(blockHash) {
|
|
382
|
+
const response = await this.getDataFromNode({
|
|
383
|
+
payload: {
|
|
384
|
+
jsonrpc: '2.0',
|
|
385
|
+
id: 'dontcare',
|
|
386
|
+
method: 'gas_price',
|
|
387
|
+
params: [blockHash],
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
if (response.status !== 200) {
|
|
391
|
+
throw new Error('Account not found');
|
|
392
|
+
}
|
|
393
|
+
return response.body.result.gas_price;
|
|
394
|
+
}
|
|
395
|
+
getPublicNodeUrls() {
|
|
396
|
+
return sdk_core_1.Environments[this.bitgo.getEnv()].nearNodeUrls;
|
|
397
|
+
}
|
|
398
|
+
async parseTransaction(params) {
|
|
399
|
+
const transactionExplanation = await this.explainTransaction({
|
|
400
|
+
txPrebuild: params.txPrebuild,
|
|
401
|
+
publicKey: params.publicKey,
|
|
402
|
+
feeInfo: params.feeInfo,
|
|
403
|
+
});
|
|
404
|
+
if (!transactionExplanation) {
|
|
405
|
+
throw new Error('Invalid transaction');
|
|
406
|
+
}
|
|
407
|
+
const nearTransaction = transactionExplanation;
|
|
408
|
+
if (nearTransaction.outputs.length <= 0) {
|
|
409
|
+
return {
|
|
410
|
+
inputs: [],
|
|
411
|
+
outputs: [],
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
const senderAddress = nearTransaction.outputs[0].address;
|
|
415
|
+
const feeAmount = new bignumber_js_1.default(nearTransaction.fee.fee === '' ? '0' : nearTransaction.fee.fee);
|
|
416
|
+
// assume 1 sender, who is also the fee payer
|
|
417
|
+
const inputs = [
|
|
418
|
+
{
|
|
419
|
+
address: senderAddress,
|
|
420
|
+
amount: new bignumber_js_1.default(nearTransaction.outputAmount).plus(feeAmount).toFixed(),
|
|
421
|
+
},
|
|
422
|
+
];
|
|
423
|
+
const outputs = nearTransaction.outputs.map((output) => {
|
|
424
|
+
return {
|
|
425
|
+
address: output.address,
|
|
426
|
+
amount: new bignumber_js_1.default(output.amount).toFixed(),
|
|
427
|
+
};
|
|
428
|
+
});
|
|
429
|
+
return {
|
|
430
|
+
inputs,
|
|
431
|
+
outputs,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
isWalletAddress(params) {
|
|
435
|
+
throw new sdk_core_1.MethodNotImplementedError();
|
|
436
|
+
}
|
|
437
|
+
async verifyTransaction(params) {
|
|
438
|
+
var _a;
|
|
439
|
+
let totalAmount = new bignumber_js_1.default(0);
|
|
440
|
+
const coinConfig = statics_1.coins.get(this.getChain());
|
|
441
|
+
const { txPrebuild: txPrebuild, txParams: txParams } = params;
|
|
442
|
+
const transaction = new lib_1.Transaction(coinConfig);
|
|
443
|
+
const rawTx = txPrebuild.txHex;
|
|
444
|
+
if (!rawTx) {
|
|
445
|
+
throw new Error('missing required tx prebuild property txHex');
|
|
446
|
+
}
|
|
447
|
+
transaction.fromRawTransaction(rawTx);
|
|
448
|
+
const explainedTx = transaction.explainTransaction();
|
|
449
|
+
// users do not input recipients for consolidation requests as they are generated by the server
|
|
450
|
+
if (txParams.recipients !== undefined) {
|
|
451
|
+
const filteredRecipients = (_a = txParams.recipients) === null || _a === void 0 ? void 0 : _a.map((recipient) => _.pick(recipient, ['address', 'amount']));
|
|
452
|
+
const filteredOutputs = explainedTx.outputs.map((output) => _.pick(output, ['address', 'amount']));
|
|
453
|
+
if (!_.isEqual(filteredOutputs, filteredRecipients)) {
|
|
454
|
+
throw new Error('Tx outputs does not match with expected txParams recipients');
|
|
455
|
+
}
|
|
456
|
+
for (const recipients of txParams.recipients) {
|
|
457
|
+
totalAmount = totalAmount.plus(recipients.amount);
|
|
458
|
+
}
|
|
459
|
+
if (!totalAmount.isEqualTo(explainedTx.outputAmount)) {
|
|
460
|
+
throw new Error('Tx total amount does not match with expected total amount field');
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return true;
|
|
464
|
+
}
|
|
465
|
+
getBuilder() {
|
|
466
|
+
return new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getBaseChain()));
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
exports.Near = Near;
|
|
470
|
+
Near.initialized = false;
|
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILGdFQUFxQztBQUNyQywwQ0FBNEI7QUFDNUIsNkNBQStCO0FBQy9CLGlEQUErRjtBQUUvRixtREFtQjhCO0FBQzlCLHFEQUF1QztBQUN2QyxvREFBc0M7QUFFdEMsK0JBQXVGO0FBQ3ZGLHdEQUFvQztBQWtGcEMsTUFBYSxJQUFLLFNBQVEsbUJBQVE7SUFFaEMsWUFBWSxLQUFnQixFQUFFLFdBQXVDO1FBQ25FLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQVVMLFlBQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFUbkUsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBTUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO0lBQ2hDLENB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LFFBQVEsQ0FBQyxVQUFVLDBDQUFFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdHLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbkcsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQzthQUNoRjtZQUNELEtBQUssTUFBTSxVQUFVLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDNUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7YUFDcEY7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDOztBQXhmSCxvQkF5ZkM7QUE5ZWtCLGdCQUFXLEdBQUcsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuXG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBiYXNlNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgeyBOZXR3b3JrcywgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBDb2luRmFtaWx5LCBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5pbXBvcnQge1xuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEtleVBhaXIsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBFZGRzYSxcbiAgUHVibGljS2V5LFxuICBFbnZpcm9ubWVudHMsXG4gIE1QQ0FsZ29yaXRobSxcbiAgRUREU0FNZXRob2RzLFxuICBFRERTQU1ldGhvZFR5cGVzLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBuZWFyQVBJIGZyb20gJ25lYXItYXBpLWpzJztcbmltcG9ydCAqIGFzIHJlcXVlc3QgZnJvbSAnc3VwZXJhZ2VudCc7XG5cbmltcG9ydCB7IEtleVBhaXIgYXMgTmVhcktleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IG5lYXJVdGlscyBmcm9tICcuL2xpYi91dGlscyc7XG5leHBvcnQgaW50ZXJmYWNlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgZXh0ZW5kcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEhleDogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgYmxvY2tIYXNoOiBzdHJpbmc7XG4gIG5vbmNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xuICBmZWVJbmZvOiB7XG4gICAgZmVlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpZWRUcmFuc2FjdGlvblBhcmFtZXRlcnMge1xuICB0eEhleDogc3RyaW5nO1xuICBwcnY6IHN0cmluZztcbiAgc2lnbmVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmVhclBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIGV4dGVuZHMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgcHVibGljS2V5OiBzdHJpbmc7XG4gIGZlZUluZm86IHtcbiAgICBmZWU6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlY292ZXJ5T3B0aW9ucyB7XG4gIHVzZXJLZXk6IHN0cmluZzsgLy8gQm94IEFcbiAgYmFja3VwS2V5OiBzdHJpbmc7IC8vIEJveCBCXG4gIGJpdGdvS2V5OiBzdHJpbmc7IC8vIEJveCBDXG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAga3JzUHJvdmlkZXI/OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5lYXJUeCB7XG4gIHNlcmlhbGl6ZWRUeDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTmVhclR4QnVpbGRlclBhcmFtc0Zyb21Ob2RlIHtcbiAgbm9uY2U6IG51bWJlcjtcbiAgYmxvY2tIYXNoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOZWFyRmVlQ29uZmlnIHtcbiAgc2VuZFNpcjogbnVtYmVyO1xuICBzZW5kTm90U2lyOiBudW1iZXI7XG4gIGV4ZWN1dGlvbjogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUHJvdG9jb2xDb25maWdPdXRwdXQge1xuICBzdG9yYWdlQW1vdW50UGVyQnl0ZTogbnVtYmVyO1xuICB0cmFuc2ZlckNvc3Q6IE5lYXJGZWVDb25maWc7XG4gIHJlY2VpcHRDb25maWc6IE5lYXJGZWVDb25maWc7XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25JbnB1dCA9IFRyYW5zYWN0aW9uT3V0cHV0O1xuXG5leHBvcnQgaW50ZXJmYWNlIE5lYXJQYXJzZWRUcmFuc2FjdGlvbiBleHRlbmRzIFBhcnNlZFRyYW5zYWN0aW9uIHtcbiAgLy8gdG90YWwgYXNzZXRzIGJlaW5nIG1vdmVkLCBpbmNsdWRpbmcgZmVlc1xuICBpbnB1dHM6IFRyYW5zYWN0aW9uSW5wdXRbXTtcblxuICAvLyB3aGVyZSBhc3NldHMgYXJlIG1vdmVkIHRvXG4gIG91dHB1dHM6IFRyYW5zYWN0aW9uT3V0cHV0W107XG59XG5cbmV4cG9ydCB0eXBlIE5lYXJUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcblxuZXhwb3J0IGNsYXNzIE5lYXIgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBNUEM6IEVkZHNhO1xuICBwcm90ZWN0ZWQgbmV0d29yayA9IHRoaXMuYml0Z28uZ2V0RW52KCkgPT09ICdwcm9kJyA/ICdtYWluJyA6ICd0ZXN0JztcblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgTmVhcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIGNvaW4gc3VwcG9ydHMgVFNTIHdhbGxldHMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFRTUyBXYWxsZXRzIGNhbiBiZSBjcmVhdGVkIGZvciB0aGlzIGNvaW5cbiAgICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuICdlZGRzYSc7XG4gIH1cblxuICBzdXBwb3J0c1N0YWtpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgZ2V0QmFzZUNoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hhaW4oKTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IGFueSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIHZhbHVlIG9mIDBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgb2theSB0byBzZW5kIDAgdmFsdWUsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBlZDI1NTE5IGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIsIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBOZWFyS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgTmVhcktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5lYXJVdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdXBwbGllZCBwcml2YXRlIGtleSBpcyBhIHZhbGlkIG5lYXIgcHJpdmF0ZSBrZXlcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBydiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFBydihwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuZWFyVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkocHJ2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFkZHJlc3MgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuZWFyVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5OiBLZXlQYWlyLCBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IG5lYXJLZXlwYWlyID0gbmV3IE5lYXJLZXlQYWlyKHsgcHJ2OiBrZXkucHJ2IH0pO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIobWVzc2FnZSkpIHtcbiAgICAgIG1lc3NhZ2UgPSBiYXNlNTguZW5jb2RlKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShuZWFyS2V5cGFpci5zaWduTWVzc2FnZShtZXNzYWdlKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbi9wYXJzZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxOZWFyVHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBsZXQgcmVidWlsdFRyYW5zYWN0aW9uOiBCYXNlVHJhbnNhY3Rpb247XG4gICAgY29uc3QgdHhSYXcgPSBwYXJhbXMudHhQcmVidWlsZC50eEhleDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbkJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhSYXcpO1xuICAgICAgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNhY3Rpb25CdWlsZGVyLmJ1aWxkKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgdmVyaWZ5U2lnblRyYW5zYWN0aW9uUGFyYW1zKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFZlcmlmaWVkVHJhbnNhY3Rpb25QYXJhbWV0ZXJzIHtcbiAgICBjb25zdCBwcnYgPSBwYXJhbXMucHJ2O1xuXG4gICAgY29uc3QgdHhIZXggPSBwYXJhbXMudHhQcmVidWlsZC50eEhleDtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgdHlwZSAke3R5cGVvZiB0eEhleH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHJ2IHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcHJ2IG11c3QgYmUgYSBzdHJpbmcsIGdvdCB0eXBlICR7dHlwZW9mIHBydn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKHBhcmFtcy50eFByZWJ1aWxkLCAna2V5JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwdWJsaWMga2V5IHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIHJlY2VpdmluZyBhZGRyZXNzZXMgZG8gbm90IHRyeSB0byBjb252ZXJ0IHRoZW1cbiAgICBjb25zdCBzaWduZXIgPSAhbmVhclV0aWxzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy50eFByZWJ1aWxkLmtleSlcbiAgICAgID8gbmV3IE5lYXJLZXlQYWlyKHsgcHViOiBwYXJhbXMudHhQcmVidWlsZC5rZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICA6IHBhcmFtcy50eFByZWJ1aWxkLmtleTtcbiAgICByZXR1cm4geyB0eEhleCwgcHJ2LCBzaWduZXIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkIHtUcmFuc2FjdGlvblByZWJ1aWxkfSBwcmVidWlsZCBvYmplY3QgcmV0dXJuZWQgYnkgcGxhdGZvcm1cbiAgICogQHBhcmFtIHBhcmFtcy5wcnYge1N0cmluZ30gdXNlciBwcnZcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtCbHVlYmlyZDxTaWduZWRUcmFuc2FjdGlvbj59XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocGFyYW1zLnR4UHJlYnVpbGQudHhIZXgpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBwYXJhbXMucHJ2IH0pO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBCYXNlVHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIGlmICghdHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9ICh0cmFuc2FjdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb24pLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhIZXg6IHNlcmlhbGl6ZWRUeCxcbiAgICB9IGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPE5lYXJUeD4ge1xuICAgIC8vIFRPRE8oQkctNTEwOTIpOiBUaGlzIGxvb2tzIGxpa2UgYSBjb21tb24gcGFydCB3aGljaCBjYW4gYmUgZXh0cmFjdGVkIG91dCB0b29cbiAgICAvKiAqKioqKioqKioqKioqKioqKiBTVEFSVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlcktleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cEtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYml0Z29LZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgd2hpdGVzcGFjZSBmcm9tIGVudGVyZWQgdmFsdWVzXG4gICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAvLyBEZWNyeXB0IHByaXZhdGUga2V5cyBmcm9tIEtleUNhcmQgdmFsdWVzXG4gICAgbGV0IHVzZXJQcnY7XG4gICAgaWYgKCF1c2VyS2V5LnN0YXJ0c1dpdGgoJ3hwdWInKSAmJiAhdXNlcktleS5zdGFydHNXaXRoKCd4cHJ2JykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiB1c2VyS2V5LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyB1c2VyIGtleWNoYWluOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIFRPRE8gQkctNTI0MTkgSW1wbGVtZW50IENvZGVjIGZvciBwYXJzaW5nICovXG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UodXNlclBydikgYXMgRUREU0FNZXRob2RUeXBlcy5Vc2VyU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgbGV0IGJhY2t1cFBydjtcbiAgICB0cnkge1xuICAgICAgYmFja3VwUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IGJhY2t1cEtleSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIGJhY2t1cCBrZXljaGFpbjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UoYmFja3VwUHJ2KSBhcyBFRERTQU1ldGhvZFR5cGVzLkJhY2t1cFNpZ25pbmdNYXRlcmlhbDtcbiAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqIEVORCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgY29uc3QgYWNjb3VudElkID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGBtLzBgKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYnM1OEVuY29kZWRQdWJsaWNLZXkgPSBuZWFyQVBJLnV0aWxzLnNlcmlhbGl6ZS5iYXNlX2VuY29kZShuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShhY2NvdW50SWQsICdoZXgnKSkpO1xuICAgIGNvbnN0IHsgc3RvcmFnZUFtb3VudFBlckJ5dGUsIHRyYW5zZmVyQ29zdCwgcmVjZWlwdENvbmZpZyB9ID0gYXdhaXQgdGhpcy5nZXRQcm90b2NvbENvbmZpZygpO1xuICAgIGNvbnN0IGF2YWlsYWJsZUJhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKGF3YWl0IHRoaXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBzdG9yYWdlQW1vdW50UGVyQnl0ZSkpO1xuICAgIGNvbnN0IHsgbm9uY2UsIGJsb2NrSGFzaCB9ID0gYXdhaXQgdGhpcy5nZXRBY2Nlc3NLZXkoeyBhY2NvdW50SWQsIGJzNThFbmNvZGVkUHVibGljS2V5IH0pO1xuICAgIGNvbnN0IGdhc1ByaWNlID0gYXdhaXQgdGhpcy5nZXRHYXNQcmljZShibG9ja0hhc2gpO1xuICAgIGNvbnN0IGdhc1ByaWNlRmlyc3RCbG9jayA9IG5ldyBCaWdOdW1iZXIoZ2FzUHJpY2UpO1xuICAgIGNvbnN0IGdhc1ByaWNlU2Vjb25kQmxvY2sgPSBnYXNQcmljZUZpcnN0QmxvY2subXVsdGlwbGllZEJ5KDEuMDUpO1xuICAgIGNvbnN0IHRvdGFsR2FzUmVxdWlyZWQgPSBuZXcgQmlnTnVtYmVyKHRyYW5zZmVyQ29zdC5zZW5kU2lyKVxuICAgICAgLnBsdXMocmVjZWlwdENvbmZpZy5zZW5kU2lyKVxuICAgICAgLm11bHRpcGxpZWRCeShnYXNQcmljZUZpcnN0QmxvY2spXG4gICAgICAucGx1cyhuZXcgQmlnTnVtYmVyKHRyYW5zZmVyQ29zdC5leGVjdXRpb24pLnBsdXMocmVjZWlwdENvbmZpZy5leGVjdXRpb24pLm11bHRpcGxpZWRCeShnYXNQcmljZVNlY29uZEJsb2NrKSk7XG4gICAgLy8gYWRkaW5nIHNvbWUgcGFkZGluZyB0byBtYWtlIHN1cmUgdGhlIGdhcyBkb2Vzbid0IGdvIGJlbG93IHJlcXVpcmVkIGdhcyBieSBuZXR3b3JrXG4gICAgY29uc3QgdG90YWxHYXNXaXRoUGFkZGluZyA9IHRvdGFsR2FzUmVxdWlyZWQubXVsdGlwbGllZEJ5KDEuNSk7XG4gICAgY29uc3QgZmVlUmVzZXJ2ZSA9IEJpZ051bWJlcihOZXR3b3Jrc1t0aGlzLm5ldHdvcmtdLm5lYXIuZmVlUmVzZXJ2ZSk7XG4gICAgY29uc3Qgc3RvcmFnZVJlc2VydmUgPSBCaWdOdW1iZXIoTmV0d29ya3NbdGhpcy5uZXR3b3JrXS5uZWFyLnN0b3JhZ2VSZXNlcnZlKTtcbiAgICBjb25zdCBuZXRBbW91bnQgPSBhdmFpbGFibGVCYWxhbmNlLm1pbnVzKHRvdGFsR2FzV2l0aFBhZGRpbmcpLm1pbnVzKGZlZVJlc2VydmUpLm1pbnVzKHN0b3JhZ2VSZXNlcnZlKS50b0ZpeGVkKCk7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgIC5zZW5kZXIoYWNjb3VudElkLCBhY2NvdW50SWQpXG4gICAgICAubm9uY2Uobm9uY2UpXG4gICAgICAucmVjZWl2ZXJJZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbilcbiAgICAgIC5yZWNlbnRCbG9ja0hhc2goYmxvY2tIYXNoKVxuICAgICAgLmFtb3VudChuZXRBbW91bnQpO1xuICAgIGNvbnN0IHVuc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgLy8gYWRkIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ25hdHVyZUhleCA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLFxuICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLFxuICAgICAgJ20vMCcsXG4gICAgICB1bnNpZ25lZFRyYW5zYWN0aW9uXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaWNLZXlPYmogPSB7IHB1YjogYWNjb3VudElkIH07XG4gICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZShwdWJsaWNLZXlPYmogYXMgUHVibGljS2V5LCBzaWduYXR1cmVIZXgpO1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICByZXR1cm4geyBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSByZXF1ZXN0IHRvIG9uZSBvZiB0aGUgcHVibGljIEVPUyBub2RlcyBhdmFpbGFibGVcbiAgICogQHBhcmFtIHBhcmFtcy5wYXlsb2FkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0RGF0YUZyb21Ob2RlKHBhcmFtczogeyBwYXlsb2FkPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSk6IFByb21pc2U8cmVxdWVzdC5SZXNwb25zZT4ge1xuICAgIGNvbnN0IG5vZGVVcmxzID0gdGhpcy5nZXRQdWJsaWNOb2RlVXJscygpO1xuICAgIGZvciAoY29uc3Qgbm9kZVVybCBvZiBub2RlVXJscykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucG9zdChub2RlVXJsKS5zZW5kKHBhcmFtcy5wYXlsb2FkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY2FsbCBlbmRwb2ludDogJy8nIGZyb20gbm9kZXM6ICR7Xy5qb2luKG5vZGVVcmxzLCAnLCAnKX1gKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRBY2Nlc3NLZXkoe1xuICAgIGFjY291bnRJZCxcbiAgICBiczU4RW5jb2RlZFB1YmxpY0tleSxcbiAgfToge1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgIGJzNThFbmNvZGVkUHVibGljS2V5OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPE5lYXJUeEJ1aWxkZXJQYXJhbXNGcm9tTm9kZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbU5vZGUoe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6ICdkb250Y2FyZScsXG4gICAgICAgIG1ldGhvZDogJ3F1ZXJ5JyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcmVxdWVzdF90eXBlOiAndmlld19hY2Nlc3Nfa2V5JyxcbiAgICAgICAgICBmaW5hbGl0eTogJ2ZpbmFsJyxcbiAgICAgICAgICBhY2NvdW50X2lkOiBhY2NvdW50SWQsXG4gICAgICAgICAgcHVibGljX2tleTogYnM1OEVuY29kZWRQdWJsaWNLZXksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2NvdW50IG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICBjb25zdCBhY2Nlc3NLZXkgPSByZXNwb25zZS5ib2R5LnJlc3VsdDtcbiAgICByZXR1cm4geyBub25jZTogKythY2Nlc3NLZXkubm9uY2UsIGJsb2NrSGFzaDogYWNjZXNzS2V5LmJsb2NrX2hhc2ggfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQ6IHN0cmluZywgc3RvcmFnZUFtb3VudFBlckJ5dGU6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldERhdGFGcm9tTm9kZSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogJ2RvbnRjYXJlJyxcbiAgICAgICAgbWV0aG9kOiAncXVlcnknLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICByZXF1ZXN0X3R5cGU6ICd2aWV3X2FjY291bnQnLFxuICAgICAgICAgIGZpbmFsaXR5OiAnZmluYWwnLFxuICAgICAgICAgIGFjY291bnRfaWQ6IGFjY291bnRJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY291bnQgbm90IGZvdW5kJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudCA9IHJlc3BvbnNlLmJvZHkucmVzdWx0O1xuICAgIGNvbnN0IGNvc3RQZXJCeXRlID0gbmV3IEJpZ051bWJlcihzdG9yYWdlQW1vdW50UGVyQnl0ZSk7XG4gICAgY29uc3Qgc3RhdGVTdGFrZWQgPSBuZXcgQmlnTnVtYmVyKGFjY291bnQuc3RvcmFnZV91c2FnZSkubXVsdGlwbGllZEJ5KGNvc3RQZXJCeXRlKTtcbiAgICBjb25zdCBzdGFrZWQgPSBuZXcgQmlnTnVtYmVyKGFjY291bnQubG9ja2VkKTtcbiAgICBjb25zdCB0b3RhbEJhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKGFjY291bnQuYW1vdW50KS5wbHVzKHN0YWtlZCk7XG4gICAgY29uc3QgYXZhaWxhYmxlQmFsYW5jZSA9IHRvdGFsQmFsYW5jZS5taW51cyhCaWdOdW1iZXIubWF4KHN0YWtlZCwgc3RhdGVTdGFrZWQpKTtcbiAgICByZXR1cm4gYXZhaWxhYmxlQmFsYW5jZS50b1N0cmluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFByb3RvY29sQ29uZmlnKCk6IFByb21pc2U8UHJvdG9jb2xDb25maWdPdXRwdXQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAnZG9udGNhcmUnLFxuICAgICAgICBtZXRob2Q6ICdFWFBFUklNRU5UQUxfcHJvdG9jb2xfY29uZmlnJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZmluYWxpdHk6ICdmaW5hbCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2NvdW50IG5vdCBmb3VuZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IHJlc3BvbnNlLmJvZHkucmVzdWx0O1xuICAgIGNvbnN0IHN0b3JhZ2VBbW91bnRQZXJCeXRlID0gY29uZmlnLnJ1bnRpbWVfY29uZmlnLnN0b3JhZ2VfYW1vdW50X3Blcl9ieXRlO1xuICAgIGNvbnN0IHRyYW5zZmVyQ29zdEZyb21OZXR3b3JrID0gY29uZmlnLnJ1bnRpbWVfY29uZmlnLnRyYW5zYWN0aW9uX2Nvc3RzLmFjdGlvbl9jcmVhdGlvbl9jb25maWcudHJhbnNmZXJfY29zdDtcbiAgICBjb25zdCB0cmFuc2ZlckNvc3Q6IE5lYXJGZWVDb25maWcgPSB7XG4gICAgICBzZW5kU2lyOiB0cmFuc2ZlckNvc3RGcm9tTmV0d29yay5zZW5kX3NpcixcbiAgICAgIHNlbmROb3RTaXI6IHRyYW5zZmVyQ29zdEZyb21OZXR3b3JrLnNlbmRfbm90X3NpcixcbiAgICAgIGV4ZWN1dGlvbjogdHJhbnNmZXJDb3N0RnJvbU5ldHdvcmsuZXhlY3V0aW9uLFxuICAgIH07XG5cbiAgICBjb25zdCByZWNlaXB0Q29uZmlnRnJvbU5ldHdvcmsgPSBjb25maWcucnVudGltZV9jb25maWcudHJhbnNhY3Rpb25fY29zdHMuYWN0aW9uX3JlY2VpcHRfY3JlYXRpb25fY29uZmlnO1xuICAgIGNvbnN0IHJlY2VpcHRDb25maWc6IE5lYXJGZWVDb25maWcgPSB7XG4gICAgICBzZW5kU2lyOiByZWNlaXB0Q29uZmlnRnJvbU5ldHdvcmsuc2VuZF9zaXIsXG4gICAgICBzZW5kTm90U2lyOiByZWNlaXB0Q29uZmlnRnJvbU5ldHdvcmsuc2VuZF9ub3Rfc2lyLFxuICAgICAgZXhlY3V0aW9uOiByZWNlaXB0Q29uZmlnRnJvbU5ldHdvcmsuZXhlY3V0aW9uLFxuICAgIH07XG4gICAgcmV0dXJuIHsgc3RvcmFnZUFtb3VudFBlckJ5dGUsIHRyYW5zZmVyQ29zdCwgcmVjZWlwdENvbmZpZyB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEdhc1ByaWNlKGJsb2NrSGFzaDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAnZG9udGNhcmUnLFxuICAgICAgICBtZXRob2Q6ICdnYXNfcHJpY2UnLFxuICAgICAgICBwYXJhbXM6IFtibG9ja0hhc2hdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWNjb3VudCBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkucmVzdWx0Lmdhc19wcmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQdWJsaWNOb2RlVXJscygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS5uZWFyTm9kZVVybHM7XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogTmVhclBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxOZWFyUGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhQcmVidWlsZDogcGFyYW1zLnR4UHJlYnVpbGQsXG4gICAgICBwdWJsaWNLZXk6IHBhcmFtcy5wdWJsaWNLZXksXG4gICAgICBmZWVJbmZvOiBwYXJhbXMuZmVlSW5mbyxcbiAgICB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmVhclRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBOZWFyVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgICBpZiAobmVhclRyYW5zYWN0aW9uLm91dHB1dHMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlucHV0czogW10sXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gbmVhclRyYW5zYWN0aW9uLm91dHB1dHNbMF0uYWRkcmVzcztcbiAgICBjb25zdCBmZWVBbW91bnQgPSBuZXcgQmlnTnVtYmVyKG5lYXJUcmFuc2FjdGlvbi5mZWUuZmVlID09PSAnJyA/ICcwJyA6IG5lYXJUcmFuc2FjdGlvbi5mZWUuZmVlKTtcblxuICAgIC8vIGFzc3VtZSAxIHNlbmRlciwgd2hvIGlzIGFsc28gdGhlIGZlZSBwYXllclxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG5lYXJUcmFuc2FjdGlvbi5vdXRwdXRBbW91bnQpLnBsdXMoZmVlQW1vdW50KS50b0ZpeGVkKCksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvbk91dHB1dFtdID0gbmVhclRyYW5zYWN0aW9uLm91dHB1dHMubWFwKChvdXRwdXQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIob3V0cHV0LmFtb3VudCkudG9GaXhlZCgpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCB0b3RhbEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpO1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZDogdHhQcmVidWlsZCwgdHhQYXJhbXM6IHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbkNvbmZpZyk7XG4gICAgY29uc3QgcmF3VHggPSB0eFByZWJ1aWxkLnR4SGV4O1xuICAgIGlmICghcmF3VHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uLmZyb21SYXdUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgY29uc3QgZXhwbGFpbmVkVHggPSB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIHVzZXJzIGRvIG5vdCBpbnB1dCByZWNpcGllbnRzIGZvciBjb25zb2xpZGF0aW9uIHJlcXVlc3RzIGFzIHRoZXkgYXJlIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZmlsdGVyZWRSZWNpcGllbnRzID0gdHhQYXJhbXMucmVjaXBpZW50cz8ubWFwKChyZWNpcGllbnQpID0+IF8ucGljayhyZWNpcGllbnQsIFsnYWRkcmVzcycsICdhbW91bnQnXSkpO1xuICAgICAgY29uc3QgZmlsdGVyZWRPdXRwdXRzID0gZXhwbGFpbmVkVHgub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gXy5waWNrKG91dHB1dCwgWydhZGRyZXNzJywgJ2Ftb3VudCddKSk7XG5cbiAgICAgIGlmICghXy5pc0VxdWFsKGZpbHRlcmVkT3V0cHV0cywgZmlsdGVyZWRSZWNpcGllbnRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHJlY2lwaWVudHMgb2YgdHhQYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgICB0b3RhbEFtb3VudCA9IHRvdGFsQW1vdW50LnBsdXMocmVjaXBpZW50cy5hbW91bnQpO1xuICAgICAgfVxuICAgICAgaWYgKCF0b3RhbEFtb3VudC5pc0VxdWFsVG8oZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHRvdGFsIGFtb3VudCBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHRvdGFsIGFtb3VudCBmaWVsZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRlcigpOiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
2
|
+
import { BitGoBase } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import { Near } from './near';
|
|
4
|
+
export declare class TNear extends Near {
|
|
5
|
+
constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=tnear.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tnear.d.ts","sourceRoot":"","sources":["../../src/tnear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,qBAAa,KAAM,SAAQ,IAAI;gBACjB,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;CAGtE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TNear = void 0;
|
|
4
|
+
const near_1 = require("./near");
|
|
5
|
+
class TNear extends near_1.Near {
|
|
6
|
+
constructor(bitgo, staticsCoin) {
|
|
7
|
+
super(bitgo, staticsCoin);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.TNear = TNear;
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG5lYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG5lYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsaUNBQThCO0FBRTlCLE1BQWEsS0FBTSxTQUFRLFdBQUk7SUFDN0IsWUFBWSxLQUFnQixFQUFFLFdBQXVDO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBSkQsc0JBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IE5lYXIgfSBmcm9tICcuL25lYXInO1xuXG5leHBvcnQgY2xhc3MgVE5lYXIgZXh0ZW5kcyBOZWFyIHtcbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxufVxuIl19
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bitgo-beta/sdk-coin-near",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "BitGo SDK coin library for Near",
|
|
5
|
+
"main": "./dist/src/index.js",
|
|
6
|
+
"types": "./dist/src/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "yarn tsc --build --incremental --verbose .",
|
|
9
|
+
"fmt": "prettier --write .",
|
|
10
|
+
"check-fmt": "prettier --check .",
|
|
11
|
+
"clean": "rm -r ./dist",
|
|
12
|
+
"lint": "eslint --quiet .",
|
|
13
|
+
"prepare": "npm run build",
|
|
14
|
+
"test": "npm run coverage",
|
|
15
|
+
"coverage": "nyc -- npm run unit-test",
|
|
16
|
+
"unit-test": "mocha"
|
|
17
|
+
},
|
|
18
|
+
"author": "BitGo SDK Team <sdkteam@bitgo.com>",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=14 <17"
|
|
22
|
+
},
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/BitGo/BitGoJS.git",
|
|
26
|
+
"directory": "modules/sdk-coin-near"
|
|
27
|
+
},
|
|
28
|
+
"lint-staged": {
|
|
29
|
+
"*.{js,ts}": [
|
|
30
|
+
"yarn prettier --write",
|
|
31
|
+
"yarn eslint --fix"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"nyc": {
|
|
38
|
+
"extension": [
|
|
39
|
+
".ts"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@bitgo-beta/sdk-core": "^1.1.0",
|
|
44
|
+
"@bitgo-beta/statics": "^7.0.0",
|
|
45
|
+
"@stablelib/hex": "^1.0.0",
|
|
46
|
+
"bignumber.js": "^9.0.0",
|
|
47
|
+
"bn.js": "^5.2.1",
|
|
48
|
+
"bs58": "^4.0.1",
|
|
49
|
+
"js-sha256": "^0.9.0",
|
|
50
|
+
"lodash": "^4.17.14",
|
|
51
|
+
"near-api-js": "^0.44.2",
|
|
52
|
+
"superagent": "^3.8.3",
|
|
53
|
+
"tweetnacl": "^1.0.3"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@bitgo-beta/sdk-api": "^1.1.0",
|
|
57
|
+
"@bitgo-beta/sdk-test": "^1.0.1",
|
|
58
|
+
"@types/lodash": "^4.14.121"
|
|
59
|
+
},
|
|
60
|
+
"gitHead": "3856d480cfc4866bdf8b3dae79804be4dbdb517a"
|
|
61
|
+
}
|