@bitgo-beta/sdk-coin-ton 1.0.1-beta.162 → 1.0.1-beta.1621
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/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/jettonToken.d.ts +19 -0
- package/dist/src/jettonToken.d.ts.map +1 -0
- package/dist/src/jettonToken.js +52 -0
- package/dist/src/lib/constants.d.ts +9 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +12 -0
- package/dist/src/lib/explainTransactionWasm.d.ts +22 -0
- package/dist/src/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/src/lib/explainTransactionWasm.js +61 -0
- package/dist/src/lib/iface.d.ts +17 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +29 -9
- package/dist/src/lib/keyPair.js +18 -8
- package/dist/src/lib/singleNominatorWithdrawBuilder.d.ts +17 -0
- package/dist/src/lib/singleNominatorWithdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/singleNominatorWithdrawBuilder.js +38 -0
- package/dist/src/lib/tokenTransaction.d.ts +16 -0
- package/dist/src/lib/tokenTransaction.d.ts.map +1 -0
- package/dist/src/lib/tokenTransaction.js +97 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +20 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +57 -0
- package/dist/src/lib/tonWhalesDepositBuilder.d.ts +12 -0
- package/dist/src/lib/tonWhalesDepositBuilder.d.ts.map +1 -0
- package/dist/src/lib/tonWhalesDepositBuilder.js +42 -0
- package/dist/src/lib/tonWhalesVestingDepositBuilder.d.ts +12 -0
- package/dist/src/lib/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
- package/dist/src/lib/tonWhalesVestingDepositBuilder.js +37 -0
- package/dist/src/lib/tonWhalesVestingWithdrawBuilder.d.ts +12 -0
- package/dist/src/lib/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/tonWhalesVestingWithdrawBuilder.js +37 -0
- package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts +30 -0
- package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
- package/dist/src/lib/tonWhalesWithdrawalBuilder.js +60 -0
- package/dist/src/lib/transaction.d.ts +20 -10
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +176 -45
- package/dist/src/lib/transactionBuilder.d.ts +27 -3
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +52 -5
- package/dist/src/lib/transactionBuilderFactory.d.ts +19 -1
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +78 -4
- package/dist/src/lib/transactionExplanation.d.ts +14 -0
- package/dist/src/lib/transactionExplanation.d.ts.map +1 -0
- package/dist/src/lib/transactionExplanation.js +3 -0
- package/dist/src/lib/transferBuilder.d.ts +1 -1
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +4 -2
- package/dist/src/lib/utils.d.ts +22 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +89 -4
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/ton.d.ts +27 -2
- package/dist/src/ton.d.ts.map +1 -1
- package/dist/src/ton.js +360 -32
- package/dist/src/tton.js +1 -1
- package/dist/test/resources/ton.d.ts +184 -0
- package/dist/test/resources/ton.d.ts.map +1 -0
- package/dist/test/resources/ton.js +208 -0
- package/dist/test/unit/explainTransactionWasm.d.ts +2 -0
- package/dist/test/unit/explainTransactionWasm.d.ts.map +1 -0
- package/dist/test/unit/explainTransactionWasm.js +147 -0
- package/dist/test/unit/jettonToken.d.ts +2 -0
- package/dist/test/unit/jettonToken.d.ts.map +1 -0
- package/dist/test/unit/jettonToken.js +341 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +55 -0
- package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/singleNominatorWithdrawBuilder.js +314 -0
- package/dist/test/unit/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/tokenTransferBuilder.js +262 -0
- package/dist/test/unit/ton.d.ts +2 -0
- package/dist/test/unit/ton.d.ts.map +1 -0
- package/dist/test/unit/ton.js +752 -0
- package/dist/test/unit/tonWhalesDepositBuilder.d.ts +2 -0
- package/dist/test/unit/tonWhalesDepositBuilder.d.ts.map +1 -0
- package/dist/test/unit/tonWhalesDepositBuilder.js +114 -0
- package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts +2 -0
- package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
- package/dist/test/unit/tonWhalesVestingDepositBuilder.js +136 -0
- package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/tonWhalesVestingWithdrawBuilder.js +136 -0
- package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts +2 -0
- package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
- package/dist/test/unit/tonWhalesWithdrawalBuilder.js +130 -0
- package/dist/test/unit/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transferBuilder.js +281 -0
- package/dist/test/unit/wasmCrossCompatibility.d.ts +2 -0
- package/dist/test/unit/wasmCrossCompatibility.d.ts.map +1 -0
- package/dist/test/unit/wasmCrossCompatibility.js +176 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -10
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -399
|
@@ -0,0 +1,147 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const wasm_ton_1 = require("@bitgo/wasm-ton");
|
|
41
|
+
const explainTransactionWasm_1 = require("../../src/lib/explainTransactionWasm");
|
|
42
|
+
const testData = __importStar(require("../resources/ton"));
|
|
43
|
+
describe('TON WASM explainTransaction', function () {
|
|
44
|
+
describe('explainTonTransaction', function () {
|
|
45
|
+
it('should explain a signed send transaction', function () {
|
|
46
|
+
const txBase64 = testData.signedSendTransaction.tx;
|
|
47
|
+
const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
|
|
48
|
+
explained.outputs.length.should.be.greaterThan(0);
|
|
49
|
+
explained.outputs[0].amount.should.equal(testData.signedSendTransaction.recipient.amount);
|
|
50
|
+
explained.outputs[0].address.should.equal(testData.signedSendTransaction.recipient.address);
|
|
51
|
+
explained.changeOutputs.should.be.an.Array();
|
|
52
|
+
explained.changeAmount.should.equal('0');
|
|
53
|
+
should_1.default.exist(explained.id);
|
|
54
|
+
});
|
|
55
|
+
it('should explain a signed token send transaction', function () {
|
|
56
|
+
const txBase64 = testData.signedTokenSendTransaction.tx;
|
|
57
|
+
const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
|
|
58
|
+
explained.outputs.length.should.be.greaterThan(0);
|
|
59
|
+
should_1.default.exist(explained.id);
|
|
60
|
+
});
|
|
61
|
+
it('should explain a single nominator withdraw transaction', function () {
|
|
62
|
+
const txBase64 = testData.signedSingleNominatorWithdrawTransaction.tx;
|
|
63
|
+
const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
|
|
64
|
+
should_1.default.exist(explained.id);
|
|
65
|
+
explained.id.should.equal(testData.signedSingleNominatorWithdrawTransaction.txId);
|
|
66
|
+
should_1.default.exist(explained.withdrawAmount);
|
|
67
|
+
explained.withdrawAmount.should.equal('932178112330000');
|
|
68
|
+
});
|
|
69
|
+
it('should explain a Ton Whales withdrawal transaction', function () {
|
|
70
|
+
const txBase64 = testData.signedTonWhalesWithdrawalTransaction.tx;
|
|
71
|
+
const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
|
|
72
|
+
should_1.default.exist(explained.id);
|
|
73
|
+
should_1.default.exist(explained.withdrawAmount);
|
|
74
|
+
});
|
|
75
|
+
it('should explain a Ton Whales full withdrawal transaction', function () {
|
|
76
|
+
const txBase64 = testData.signedTonWhalesFullWithdrawalTransaction.tx;
|
|
77
|
+
const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
|
|
78
|
+
should_1.default.exist(explained.id);
|
|
79
|
+
});
|
|
80
|
+
it('should respect toAddressBounceable=false', function () {
|
|
81
|
+
const txBase64 = testData.signedSendTransaction.tx;
|
|
82
|
+
const bounceable = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64, toAddressBounceable: true });
|
|
83
|
+
const nonBounceable = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64, toAddressBounceable: false });
|
|
84
|
+
bounceable.outputs[0].address.should.equal(testData.signedSendTransaction.recipient.address);
|
|
85
|
+
nonBounceable.outputs[0].address.should.equal(testData.signedSendTransaction.recipientBounceable.address);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('WASM Transaction signing flow', function () {
|
|
89
|
+
it('should produce correct signable payload from WASM Transaction', function () {
|
|
90
|
+
const txBase64 = testData.signedSendTransaction.tx;
|
|
91
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
|
|
92
|
+
const signablePayload = tx.signablePayload();
|
|
93
|
+
signablePayload.should.be.instanceOf(Uint8Array);
|
|
94
|
+
signablePayload.length.should.equal(32);
|
|
95
|
+
const expectedSignable = Buffer.from(testData.signedSendTransaction.signable, 'base64');
|
|
96
|
+
Buffer.from(signablePayload).toString('base64').should.equal(expectedSignable.toString('base64'));
|
|
97
|
+
});
|
|
98
|
+
it('should parse transaction and preserve bigint amounts', function () {
|
|
99
|
+
const txBase64 = testData.signedSendTransaction.tx;
|
|
100
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
|
|
101
|
+
const parsed = (0, wasm_ton_1.parseTransaction)(tx);
|
|
102
|
+
parsed.transactionType.should.equal('Transfer');
|
|
103
|
+
parsed.sendActions.length.should.be.greaterThan(0);
|
|
104
|
+
(typeof parsed.sendActions[0].amount).should.equal('bigint');
|
|
105
|
+
parsed.seqno.should.be.a.Number();
|
|
106
|
+
(typeof parsed.expireAt).should.equal('bigint');
|
|
107
|
+
});
|
|
108
|
+
it('should get transaction id', function () {
|
|
109
|
+
const txBase64 = testData.signedSendTransaction.tx;
|
|
110
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
|
|
111
|
+
tx.id.should.equal(testData.signedSendTransaction.txId);
|
|
112
|
+
});
|
|
113
|
+
it('should detect signed transaction via non-zero signature', function () {
|
|
114
|
+
const txBase64 = testData.signedSendTransaction.tx;
|
|
115
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
|
|
116
|
+
const parsed = (0, wasm_ton_1.parseTransaction)(tx);
|
|
117
|
+
parsed.signature.should.be.a.String();
|
|
118
|
+
parsed.signature.length.should.be.greaterThan(0);
|
|
119
|
+
parsed.signature.should.not.equal('0'.repeat(128));
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('WASM parseTransaction types', function () {
|
|
123
|
+
it('should parse Transfer type', function () {
|
|
124
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedSendTransaction.tx, 'base64'));
|
|
125
|
+
(0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('Transfer');
|
|
126
|
+
});
|
|
127
|
+
it('should parse TokenTransfer type', function () {
|
|
128
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedTokenSendTransaction.tx, 'base64'));
|
|
129
|
+
(0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('TokenTransfer');
|
|
130
|
+
});
|
|
131
|
+
it('should parse SingleNominatorWithdraw type with correct withdrawAmount', function () {
|
|
132
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedSingleNominatorWithdrawTransaction.tx, 'base64'));
|
|
133
|
+
const parsed = (0, wasm_ton_1.parseTransaction)(tx);
|
|
134
|
+
parsed.transactionType.should.equal('SingleNominatorWithdraw');
|
|
135
|
+
String(parsed.sendActions[0].withdrawAmount).should.equal('932178112330000');
|
|
136
|
+
});
|
|
137
|
+
it('should parse WhalesDeposit type', function () {
|
|
138
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedTonWhalesDepositTransaction.tx, 'base64'));
|
|
139
|
+
(0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('WhalesDeposit');
|
|
140
|
+
});
|
|
141
|
+
it('should parse WhalesWithdraw type', function () {
|
|
142
|
+
const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedTonWhalesWithdrawalTransaction.tx, 'base64'));
|
|
143
|
+
(0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('WhalesWithdraw');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uV2FzbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9leHBsYWluVHJhbnNhY3Rpb25XYXNtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhDQUFzRjtBQUN0RixpRkFBNkU7QUFDN0UsMkRBQTZDO0FBRTdDLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtJQUN0QyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1lBQzdDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBQSw4Q0FBcUIsRUFBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFdEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFGLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1RixTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFD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WUFDdEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtRQUN0QyxFQUFFLENBQUMsNEJBQTRCLEVBQUU7WUFDL0IsTUFBTSxFQUFFLEdBQUcsc0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLElBQUEsMkJBQWdCLEVBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUU7WUFDcEMsTUFBTSxFQUFFLEdBQUcsc0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZHLElBQUEsMkJBQWdCLEVBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUU7WUFDMUUsTUFBTSxFQUFFLEdBQUcsc0JBQWtCLENBQUMsU0FBUyxDQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQzVFLENBQUM7WUFDRixNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFnQixFQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtZQUNwQyxNQUFNLEVBQUUsR0FBRyxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDOUcsSUFBQSwyQkFBZ0IsRUFBQyxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLEVBQUUsR0FBRyxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDakgsSUFBQSwyQkFBZ0IsRUFBQyxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFdhc21Ub25UcmFuc2FjdGlvbiwgcGFyc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby93YXNtLXRvbic7XG5pbXBvcnQgeyBleHBsYWluVG9uVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL2V4cGxhaW5UcmFuc2FjdGlvbldhc20nO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5cbmRlc2NyaWJlKCdUT04gV0FTTSBleHBsYWluVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdleHBsYWluVG9uVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc2lnbmVkIHNlbmQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZCA9IGV4cGxhaW5Ub25UcmFuc2FjdGlvbih7IHR4QmFzZTY0IH0pO1xuXG4gICAgICBleHBsYWluZWQub3V0cHV0cy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgZXhwbGFpbmVkLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFtb3VudCk7XG4gICAgICBleHBsYWluZWQub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgZXhwbGFpbmVkLmNoYW5nZU91dHB1dHMuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICBleHBsYWluZWQuY2hhbmdlQW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KGV4cGxhaW5lZC5pZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBzaWduZWQgdG9rZW4gc2VuZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QmFzZTY0ID0gdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHg7XG4gICAgICBjb25zdCBleHBsYWluZWQgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCB9KTtcblxuICAgICAgZXhwbGFpbmVkLm91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICAgIHNob3VsZC5leGlzdChleHBsYWluZWQuaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc2luZ2xlIG5vbWluYXRvciB3aXRoZHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QmFzZTY0ID0gdGVzdERhdGEuc2lnbmVkU2luZ2xlTm9taW5hdG9yV2l0aGRyYXdUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZCA9IGV4cGxhaW5Ub25UcmFuc2FjdGlvbih7IHR4QmFzZTY0IH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZXhwbGFpbmVkLmlkKTtcbiAgICAgIGV4cGxhaW5lZC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkU2luZ2xlTm9taW5hdG9yV2l0aGRyYXdUcmFuc2FjdGlvbi50eElkKTtcbiAgICAgIHNob3VsZC5leGlzdChleHBsYWluZWQud2l0aGRyYXdBbW91bnQpO1xuICAgICAgZXhwbGFpbmVkLndpdGhkcmF3QW1vdW50IS5zaG91bGQuZXF1YWwoJzkzMjE3ODExMjMzMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgVG9uIFdoYWxlcyB3aXRoZHJhd2FsIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCYXNlNjQgPSB0ZXN0RGF0YS5zaWduZWRUb25XaGFsZXNXaXRoZHJhd2FsVHJhbnNhY3Rpb24udHg7XG4gICAgICBjb25zdCBleHBsYWluZWQgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGV4cGxhaW5lZC5pZCk7XG4gICAgICBzaG91bGQuZXhpc3QoZXhwbGFpbmVkLndpdGhkcmF3QW1vdW50KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIFRvbiBXaGFsZXMgZnVsbCB3aXRoZHJhd2FsIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCYXNlNjQgPSB0ZXN0RGF0YS5zaWduZWRUb25XaGFsZXNGdWxsV2l0aGRyYXdhbFRyYW5zYWN0aW9uLnR4O1xuICAgICAgY29uc3QgZXhwbGFpbmVkID0gZXhwbGFpblRvblRyYW5zYWN0aW9uKHsgdHhCYXNlNjQgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChleHBsYWluZWQuaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXNwZWN0IHRvQWRkcmVzc0JvdW5jZWFibGU9ZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IGJvdW5jZWFibGUgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCwgdG9BZGRyZXNzQm91bmNlYWJsZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IG5vbkJvdW5jZWFibGUgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCwgdG9BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UgfSk7XG5cbiAgICAgIGJvdW5jZWFibGUub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgbm9uQm91bmNlYWJsZS5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlLmFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV0FTTSBUcmFuc2FjdGlvbiBzaWduaW5nIGZsb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvcnJlY3Qgc2lnbmFibGUgcGF5bG9hZCBmcm9tIFdBU00gVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IHR4ID0gV2FzbVRvblRyYW5zYWN0aW9uLmZyb21CeXRlcyhCdWZmZXIuZnJvbSh0eEJhc2U2NCwgJ2Jhc2U2NCcpKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZCgpO1xuXG4gICAgICBzaWduYWJsZVBheWxvYWQuc2hvdWxkLmJlLmluc3RhbmNlT2YoVWludDhBcnJheSk7XG4gICAgICBzaWduYWJsZVBheWxvYWQubGVuZ3RoLnNob3VsZC5lcXVhbCgzMik7XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkU2lnbmFibGUgPSBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24uc2lnbmFibGUsICdiYXNlNjQnKTtcbiAgICAgIEJ1ZmZlci5mcm9tKHNpZ25hYmxlUGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLnNob3VsZC5lcXVhbChleHBlY3RlZFNpZ25hYmxlLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHRyYW5zYWN0aW9uIGFuZCBwcmVzZXJ2ZSBiaWdpbnQgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QmFzZTY0ID0gdGVzdERhdGEuc2lnbmVkU2VuZFRyYW5zYWN0aW9uLnR4O1xuICAgICAgY29uc3QgdHggPSBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHR4QmFzZTY0LCAnYmFzZTY0JykpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VUcmFuc2FjdGlvbih0eCk7XG5cbiAgICAgIHBhcnNlZC50cmFuc2FjdGlvblR5cGUuc2hvdWxkLmVxdWFsKCdUcmFuc2ZlcicpO1xuICAgICAgcGFyc2VkLnNlbmRBY3Rpb25zLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCk7XG4gICAgICAodHlwZW9mIHBhcnNlZC5zZW5kQWN0aW9uc1swXS5hbW91bnQpLnNob3VsZC5lcXVhbCgnYmlnaW50Jyk7XG4gICAgICBwYXJzZWQuc2Vxbm8uc2hvdWxkLmJlLmEuTnVtYmVyKCk7XG4gICAgICAodHlwZW9mIHBhcnNlZC5leHBpcmVBdCkuc2hvdWxkLmVxdWFsKCdiaWdpbnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRyYW5zYWN0aW9uIGlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCYXNlNjQgPSB0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24udHg7XG4gICAgICBjb25zdCB0eCA9IFdhc21Ub25UcmFuc2FjdGlvbi5mcm9tQnl0ZXMoQnVmZmVyLmZyb20odHhCYXNlNjQsICdiYXNlNjQnKSk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkU2VuZFRyYW5zYWN0aW9uLnR4SWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZXRlY3Qgc2lnbmVkIHRyYW5zYWN0aW9uIHZpYSBub24temVybyBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IHR4ID0gV2FzbVRvblRyYW5zYWN0aW9uLmZyb21CeXRlcyhCdWZmZXIuZnJvbSh0eEJhc2U2NCwgJ2Jhc2U2NCcpKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhbnNhY3Rpb24odHgpO1xuXG4gICAgICBwYXJzZWQuc2lnbmF0dXJlLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgcGFyc2VkLnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgcGFyc2VkLnNpZ25hdHVyZS5zaG91bGQubm90LmVxdWFsKCcwJy5yZXBlYXQoMTI4KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdXQVNNIHBhcnNlVHJhbnNhY3Rpb24gdHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBUcmFuc2ZlciB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eCwgJ2Jhc2U2NCcpKTtcbiAgICAgIHBhcnNlVHJhbnNhY3Rpb24odHgpLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1RyYW5zZmVyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIFRva2VuVHJhbnNmZXIgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gV2FzbVRvblRyYW5zYWN0aW9uLmZyb21CeXRlcyhCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eCwgJ2Jhc2U2NCcpKTtcbiAgICAgIHBhcnNlVHJhbnNhY3Rpb24odHgpLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1Rva2VuVHJhbnNmZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgU2luZ2xlTm9taW5hdG9yV2l0aGRyYXcgdHlwZSB3aXRoIGNvcnJlY3Qgd2l0aGRyYXdBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IFdhc21Ub25UcmFuc2FjdGlvbi5mcm9tQnl0ZXMoXG4gICAgICAgIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFNpbmdsZU5vbWluYXRvcldpdGhkcmF3VHJhbnNhY3Rpb24udHgsICdiYXNlNjQnKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhbnNhY3Rpb24odHgpO1xuICAgICAgcGFyc2VkLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1NpbmdsZU5vbWluYXRvcldpdGhkcmF3Jyk7XG4gICAgICBTdHJpbmcocGFyc2VkLnNlbmRBY3Rpb25zWzBdLndpdGhkcmF3QW1vdW50KS5zaG91bGQuZXF1YWwoJzkzMjE3ODExMjMzMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBXaGFsZXNEZXBvc2l0IHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IFdhc21Ub25UcmFuc2FjdGlvbi5mcm9tQnl0ZXMoQnVmZmVyLmZyb20odGVzdERhdGEuc2lnbmVkVG9uV2hhbGVzRGVwb3NpdFRyYW5zYWN0aW9uLnR4LCAnYmFzZTY0JykpO1xuICAgICAgcGFyc2VUcmFuc2FjdGlvbih0eCkudHJhbnNhY3Rpb25UeXBlLnNob3VsZC5lcXVhbCgnV2hhbGVzRGVwb3NpdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBXaGFsZXNXaXRoZHJhdyB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRvbldoYWxlc1dpdGhkcmF3YWxUcmFuc2FjdGlvbi50eCwgJ2Jhc2U2NCcpKTtcbiAgICAgIHBhcnNlVHJhbnNhY3Rpb24odHgpLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1doYWxlc1dpdGhkcmF3Jyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jettonToken.d.ts","sourceRoot":"","sources":["../../../test/unit/jettonToken.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,341 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const tonweb_1 = __importDefault(require("tonweb"));
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const sinon = __importStar(require("sinon"));
|
|
42
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
43
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
44
|
+
const src_1 = require("../../src");
|
|
45
|
+
const testData = __importStar(require("../resources/ton"));
|
|
46
|
+
describe('Jetton Tokens', function () {
|
|
47
|
+
let bitgo;
|
|
48
|
+
let testnetJettonToken;
|
|
49
|
+
let mainnetJettonToken;
|
|
50
|
+
const testnetTokenName = 'tton:ukwny-us';
|
|
51
|
+
const mainnetTokenName = 'ton:usdt';
|
|
52
|
+
const txPrebuildList = [
|
|
53
|
+
{
|
|
54
|
+
txHex: Buffer.from(testData.signedTokenSendTransaction.tx, 'base64').toString('hex'),
|
|
55
|
+
txInfo: {},
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
const txPrebuildBounceableList = [
|
|
59
|
+
{
|
|
60
|
+
txHex: Buffer.from(testData.signedTokenSendTransaction.txBounceable, 'base64').toString('hex'),
|
|
61
|
+
txInfo: {},
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
const txParamsList = [
|
|
65
|
+
{
|
|
66
|
+
recipients: [testData.signedTokenSendTransaction.recipient],
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
const txParamsBounceableList = [
|
|
70
|
+
{
|
|
71
|
+
recipients: [testData.signedTokenSendTransaction.recipientBounceable],
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
before(function () {
|
|
75
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
76
|
+
src_1.JettonToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
|
|
77
|
+
bitgo.safeRegister(name, coinConstructor);
|
|
78
|
+
});
|
|
79
|
+
bitgo.initializeTestVars();
|
|
80
|
+
testnetJettonToken = bitgo.coin(testnetTokenName);
|
|
81
|
+
mainnetJettonToken = bitgo.coin(mainnetTokenName);
|
|
82
|
+
});
|
|
83
|
+
it('should return constants for Testnet Ton token', function () {
|
|
84
|
+
testnetJettonToken.getChain().should.equal(testnetTokenName);
|
|
85
|
+
testnetJettonToken.getBaseChain().should.equal('tton');
|
|
86
|
+
testnetJettonToken.getFullName().should.equal('Ton Token');
|
|
87
|
+
testnetJettonToken.getBaseFactor().should.equal(1e9);
|
|
88
|
+
testnetJettonToken.type.should.equal(testnetTokenName);
|
|
89
|
+
testnetJettonToken.name.should.equal('Test Unknown TokenY-US');
|
|
90
|
+
testnetJettonToken.coin.should.equal('tton');
|
|
91
|
+
testnetJettonToken.network.should.equal('Testnet');
|
|
92
|
+
testnetJettonToken.contractAddress.should.equal('kQD8EQMavE1w6gvgMXUhN8hi7pSk4bKYM-W2dgkNqV54Y16Y');
|
|
93
|
+
testnetJettonToken.decimalPlaces.should.equal(9);
|
|
94
|
+
});
|
|
95
|
+
it('should return constants for Mainnet Ton token', function () {
|
|
96
|
+
mainnetJettonToken.getChain().should.equal(mainnetTokenName);
|
|
97
|
+
mainnetJettonToken.getBaseChain().should.equal('ton');
|
|
98
|
+
mainnetJettonToken.getFullName().should.equal('Ton Token');
|
|
99
|
+
mainnetJettonToken.getBaseFactor().should.equal(1e6);
|
|
100
|
+
mainnetJettonToken.type.should.equal(mainnetTokenName);
|
|
101
|
+
mainnetJettonToken.name.should.equal('Tether USD');
|
|
102
|
+
mainnetJettonToken.coin.should.equal('ton');
|
|
103
|
+
mainnetJettonToken.network.should.equal('Mainnet');
|
|
104
|
+
mainnetJettonToken.contractAddress.should.equal('EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs');
|
|
105
|
+
mainnetJettonToken.decimalPlaces.should.equal(6);
|
|
106
|
+
});
|
|
107
|
+
describe('Verify Jetton transaction: ', () => {
|
|
108
|
+
txParamsList.forEach((_, index) => {
|
|
109
|
+
const txParams = txParamsList[index];
|
|
110
|
+
const txPrebuild = txPrebuildList[index];
|
|
111
|
+
const txParamsBounceable = txParamsBounceableList[index];
|
|
112
|
+
const txPrebuildBounceable = txPrebuildBounceableList[index];
|
|
113
|
+
it('should succeed to verify transaction', async function () {
|
|
114
|
+
const verification = {};
|
|
115
|
+
const isTransactionVerified = await testnetJettonToken.verifyTransaction({
|
|
116
|
+
txParams,
|
|
117
|
+
txPrebuild,
|
|
118
|
+
verification,
|
|
119
|
+
});
|
|
120
|
+
isTransactionVerified.should.equal(true);
|
|
121
|
+
const isBounceableTransactionVerified = await testnetJettonToken.verifyTransaction({
|
|
122
|
+
txParams: txParamsBounceable,
|
|
123
|
+
txPrebuild: txPrebuildBounceable,
|
|
124
|
+
verification: {},
|
|
125
|
+
});
|
|
126
|
+
isBounceableTransactionVerified.should.equal(true);
|
|
127
|
+
});
|
|
128
|
+
it('should succeed to verify transaction when recipients amount are numbers', async function () {
|
|
129
|
+
const txParamsWithNumberAmounts = JSON.parse(JSON.stringify(txParams));
|
|
130
|
+
txParamsWithNumberAmounts.recipients[0].amount = 20000000;
|
|
131
|
+
const verification = {};
|
|
132
|
+
await testnetJettonToken
|
|
133
|
+
.verifyTransaction({
|
|
134
|
+
txParams: txParamsWithNumberAmounts,
|
|
135
|
+
txPrebuild,
|
|
136
|
+
verification,
|
|
137
|
+
})
|
|
138
|
+
.should.rejectedWith('Tx outputs does not match with expected txParams recipients');
|
|
139
|
+
});
|
|
140
|
+
it('should succeed to verify transaction when recipients amount are strings', async function () {
|
|
141
|
+
const txParamsWithNumberAmounts = JSON.parse(JSON.stringify(txParams));
|
|
142
|
+
txParamsWithNumberAmounts.recipients[0].amount = '20000000';
|
|
143
|
+
const verification = {};
|
|
144
|
+
await testnetJettonToken
|
|
145
|
+
.verifyTransaction({
|
|
146
|
+
txParams: txParamsWithNumberAmounts,
|
|
147
|
+
txPrebuild,
|
|
148
|
+
verification,
|
|
149
|
+
})
|
|
150
|
+
.should.rejectedWith('Tx outputs does not match with expected txParams recipients');
|
|
151
|
+
});
|
|
152
|
+
it('should succeed to verify transaction when recipients amounts are number and amount is same', async function () {
|
|
153
|
+
const verification = {};
|
|
154
|
+
await testnetJettonToken
|
|
155
|
+
.verifyTransaction({
|
|
156
|
+
txParams,
|
|
157
|
+
txPrebuild,
|
|
158
|
+
verification,
|
|
159
|
+
})
|
|
160
|
+
.should.resolvedWith(true);
|
|
161
|
+
});
|
|
162
|
+
it('should succeed to verify transaction when recipients amounts are string and amount is same', async function () {
|
|
163
|
+
const verification = {};
|
|
164
|
+
await testnetJettonToken
|
|
165
|
+
.verifyTransaction({
|
|
166
|
+
txParams,
|
|
167
|
+
txPrebuild,
|
|
168
|
+
verification,
|
|
169
|
+
})
|
|
170
|
+
.should.resolvedWith(true);
|
|
171
|
+
});
|
|
172
|
+
it('should succeed to verify transaction when recipient address are non bounceable', async function () {
|
|
173
|
+
const txParamsWithNumberAmounts = JSON.parse(JSON.stringify(txParams));
|
|
174
|
+
txParamsWithNumberAmounts.recipients[0].address = new tonweb_1.default.Address(txParamsWithNumberAmounts.recipients[0].address).toString(true, true, false);
|
|
175
|
+
const verification = {};
|
|
176
|
+
const isVerified = await testnetJettonToken.verifyTransaction({
|
|
177
|
+
txParams: txParamsWithNumberAmounts,
|
|
178
|
+
txPrebuild,
|
|
179
|
+
verification,
|
|
180
|
+
});
|
|
181
|
+
isVerified.should.equal(true);
|
|
182
|
+
});
|
|
183
|
+
it('should fail to verify transaction with invalid param', async function () {
|
|
184
|
+
const txPrebuild = {};
|
|
185
|
+
await testnetJettonToken
|
|
186
|
+
.verifyTransaction({
|
|
187
|
+
txParams,
|
|
188
|
+
txPrebuild,
|
|
189
|
+
})
|
|
190
|
+
.should.rejectedWith('missing required tx prebuild property txHex');
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
it('should succeed to verify transaction with recipient having memo', async function () {
|
|
194
|
+
const txParams = {
|
|
195
|
+
recipients: [testData.signedTokenSendTransactionForMemoId.recipient],
|
|
196
|
+
};
|
|
197
|
+
const txPrebuild = {
|
|
198
|
+
txHex: Buffer.from(testData.signedTokenSendTransactionForMemoId.tx, 'base64').toString('hex'),
|
|
199
|
+
txInfo: {},
|
|
200
|
+
};
|
|
201
|
+
const verification = {};
|
|
202
|
+
const isTransactionVerified = await testnetJettonToken.verifyTransaction({
|
|
203
|
+
txParams,
|
|
204
|
+
txPrebuild,
|
|
205
|
+
verification,
|
|
206
|
+
});
|
|
207
|
+
isTransactionVerified.should.equal(true);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe('Explain Jetton Transaction: ', () => {
|
|
211
|
+
it('should explain a jetton transfer transaction', async function () {
|
|
212
|
+
const explainedTransaction = (await testnetJettonToken.explainTransaction({
|
|
213
|
+
txHex: Buffer.from(testData.signedTokenSendTransaction.tx, 'base64').toString('hex'),
|
|
214
|
+
}));
|
|
215
|
+
explainedTransaction.should.deepEqual({
|
|
216
|
+
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'withdrawAmount'],
|
|
217
|
+
id: testData.signedTokenSendTransaction.txId,
|
|
218
|
+
outputs: [
|
|
219
|
+
{
|
|
220
|
+
address: testData.signedTokenSendTransaction.recipient.address,
|
|
221
|
+
amount: testData.signedTokenSendTransaction.recipient.amount,
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
outputAmount: testData.signedTokenSendTransaction.recipient.amount,
|
|
225
|
+
changeOutputs: [],
|
|
226
|
+
changeAmount: '0',
|
|
227
|
+
fee: { fee: 'UNKNOWN' },
|
|
228
|
+
withdrawAmount: undefined,
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
it('should explain a non-bounceable jetton transfer transaction', async function () {
|
|
232
|
+
const explainedTransaction = (await testnetJettonToken.explainTransaction({
|
|
233
|
+
txHex: Buffer.from(testData.signedTokenSendTransaction.txBounceable, 'base64').toString('hex'),
|
|
234
|
+
toAddressBounceable: false,
|
|
235
|
+
fromAddressBounceable: false,
|
|
236
|
+
}));
|
|
237
|
+
explainedTransaction.should.deepEqual({
|
|
238
|
+
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'withdrawAmount'],
|
|
239
|
+
id: testData.signedTokenSendTransaction.txIdBounceable,
|
|
240
|
+
outputs: [
|
|
241
|
+
{
|
|
242
|
+
address: testData.signedTokenSendTransaction.recipientBounceable.address,
|
|
243
|
+
amount: testData.signedTokenSendTransaction.recipientBounceable.amount,
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
outputAmount: testData.signedTokenSendTransaction.recipientBounceable.amount,
|
|
247
|
+
changeOutputs: [],
|
|
248
|
+
changeAmount: '0',
|
|
249
|
+
fee: { fee: 'UNKNOWN' },
|
|
250
|
+
withdrawAmount: undefined,
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
it('should fail to explain transaction with missing params', async function () {
|
|
254
|
+
try {
|
|
255
|
+
await testnetJettonToken.explainTransaction({});
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
should_1.default.equal(error.message, 'Invalid transaction');
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
it('should fail to explain transaction with invalid params', async function () {
|
|
262
|
+
try {
|
|
263
|
+
await testnetJettonToken.explainTransaction({ txHex: 'randomString' });
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
should_1.default.equal(error.message, 'Invalid transaction');
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe('Parse Jetton Transactions: ', () => {
|
|
271
|
+
const transactionsList = [testData.signedTokenSendTransaction.tx];
|
|
272
|
+
const transactionInputsResponseList = [
|
|
273
|
+
[
|
|
274
|
+
{
|
|
275
|
+
address: 'EQCqQzfyg0cZ-8t9v2YoHmFFxG5jgjvQRTZ2yeDjO5z5ZRy9',
|
|
276
|
+
amount: testData.tokenRecipients[0].amount,
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
];
|
|
280
|
+
const transactionInputsResponseBounceableList = [
|
|
281
|
+
[
|
|
282
|
+
{
|
|
283
|
+
address: testData.tokenSender.address,
|
|
284
|
+
amount: testData.tokenRecipients[0].amount,
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
];
|
|
288
|
+
const transactionOutputsResponseList = [
|
|
289
|
+
[
|
|
290
|
+
{
|
|
291
|
+
address: 'EQB-CM6DF-jpq9XVdiSdefAMU5KC1gpZuYBFp-Q65aUhnx5K',
|
|
292
|
+
amount: testData.tokenRecipients[0].amount,
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
];
|
|
296
|
+
const transactionOutputsResponseBounceableList = [
|
|
297
|
+
[
|
|
298
|
+
{
|
|
299
|
+
address: testData.tokenRecipients[0].address,
|
|
300
|
+
amount: testData.tokenRecipients[0].amount,
|
|
301
|
+
},
|
|
302
|
+
],
|
|
303
|
+
];
|
|
304
|
+
transactionsList.forEach((_, index) => {
|
|
305
|
+
const transaction = transactionsList[index];
|
|
306
|
+
const transactionInputsResponse = transactionInputsResponseList[index];
|
|
307
|
+
const transactionInputsResponseBounceable = transactionInputsResponseBounceableList[index];
|
|
308
|
+
const transactionOutputsResponse = transactionOutputsResponseList[index];
|
|
309
|
+
const transactionOutputsResponseBounceable = transactionOutputsResponseBounceableList[index];
|
|
310
|
+
it('should parse a TON transaction', async function () {
|
|
311
|
+
const parsedTransaction = await testnetJettonToken.parseTransaction({
|
|
312
|
+
txHex: Buffer.from(transaction, 'base64').toString('hex'),
|
|
313
|
+
});
|
|
314
|
+
parsedTransaction.should.deepEqual({
|
|
315
|
+
inputs: transactionInputsResponse,
|
|
316
|
+
outputs: transactionOutputsResponse,
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
it('should parse a non-bounceable TON transaction', async function () {
|
|
320
|
+
const parsedTransaction = await testnetJettonToken.parseTransaction({
|
|
321
|
+
txHex: Buffer.from(transaction, 'base64').toString('hex'),
|
|
322
|
+
toAddressBounceable: false,
|
|
323
|
+
fromAddressBounceable: false,
|
|
324
|
+
});
|
|
325
|
+
parsedTransaction.should.deepEqual({
|
|
326
|
+
inputs: transactionInputsResponseBounceable,
|
|
327
|
+
outputs: transactionOutputsResponseBounceable,
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
it('should fail to parse a TON transaction when explainTransaction response is undefined', async function () {
|
|
331
|
+
const stub = sinon.stub(src_1.Ton.prototype, 'explainTransaction');
|
|
332
|
+
stub.resolves(undefined);
|
|
333
|
+
await testnetJettonToken
|
|
334
|
+
.parseTransaction({ txHex: transaction })
|
|
335
|
+
.should.be.rejectedWith('invalid raw transaction');
|
|
336
|
+
stub.restore();
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamV0dG9uVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvamV0dG9uVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUUvQixtREFBK0Q7QUFDL0QsaURBQStDO0FBQy9DLG1DQUF5RTtBQUN6RSwyREFBNkM7QUFFN0MsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN4QixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxrQkFBa0IsQ0FBQztJQUN2QixJQUFJLGtCQUFrQixDQUFDO0lBQ3ZCLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO0lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0lBRXBDLE1BQU0sY0FBYyxHQUFHO1FBQ3JCO1lBQ0UsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3BGLE1BQU0sRUFBRSxFQUFFO1NBQ1g7S0FDRixDQUFDO0lBQ0YsTUFBTSx3QkFBd0IsR0FBRztRQUMvQjtZQUNFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM5RixNQUFNLEVBQUUsRUFBRTtTQUNYO0tBQ0YsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHO1FBQ25CO1lBQ0UsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQztTQUM1RDtLQUNGLENBQUM7SUFFRixNQUFNLHNCQUFzQixHQUFHO1FBQzdCO1lBQ0UsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEw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akIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVG9ud2ViIGZyb20gJ3RvbndlYic7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgSmV0dG9uVG9rZW4sIFRvbiwgVG9uUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5cbmRlc2NyaWJlKCdKZXR0b24gVG9rZW5zJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IHRlc3RuZXRKZXR0b25Ub2tlbjtcbiAgbGV0IG1haW5uZXRKZXR0b25Ub2tlbjtcbiAgY29uc3QgdGVzdG5ldFRva2VuTmFtZSA9ICd0dG9uOnVrd255LXVzJztcbiAgY29uc3QgbWFpbm5ldFRva2VuTmFtZSA9ICd0b246dXNkdCc7XG5cbiAgY29uc3QgdHhQcmVidWlsZExpc3QgPSBbXG4gICAge1xuICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdHhJbmZvOiB7fSxcbiAgICB9LFxuICBdO1xuICBjb25zdCB0eFByZWJ1aWxkQm91bmNlYWJsZUxpc3QgPSBbXG4gICAge1xuICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHR4SW5mbzoge30sXG4gICAgfSxcbiAgXTtcblxuICBjb25zdCB0eFBhcmFtc0xpc3QgPSBbXG4gICAge1xuICAgICAgcmVjaXBpZW50czogW3Rlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudF0sXG4gICAgfSxcbiAgXTtcblxuICBjb25zdCB0eFBhcmFtc0JvdW5jZWFibGVMaXN0ID0gW1xuICAgIHtcbiAgICAgIHJlY2lwaWVudHM6IFt0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlXSxcbiAgICB9LFxuICBdO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgSmV0dG9uVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgICBiaXRnby5zYWZlUmVnaXN0ZXIobmFtZSwgY29pbkNvbnN0cnVjdG9yKTtcbiAgICB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4gPSBiaXRnby5jb2luKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbiA9IGJpdGdvLmNvaW4obWFpbm5ldFRva2VuTmFtZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGNvbnN0YW50cyBmb3IgVGVzdG5ldCBUb24gdG9rZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgdGVzdG5ldEpldHRvblRva2VuLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5nZXRCYXNlQ2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0b24nKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1RvbiBUb2tlbicpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlOSk7XG4gICAgdGVzdG5ldEpldHRvblRva2VuLnR5cGUuc2hvdWxkLmVxdWFsKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5uYW1lLnNob3VsZC5lcXVhbCgnVGVzdCBVbmtub3duIFRva2VuWS1VUycpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5jb2luLnNob3VsZC5lcXVhbCgndHRvbicpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5uZXR3b3JrLnNob3VsZC5lcXVhbCgnVGVzdG5ldCcpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5jb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKCdrUUQ4RVFNYXZFMXc2Z3ZnTVhVaE44aGk3cFNrNGJLWU0tVzJkZ2tOcVY1NFkxNlknKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoOSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGNvbnN0YW50cyBmb3IgTWFpbm5ldCBUb24gdG9rZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKG1haW5uZXRUb2tlbk5hbWUpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbi5nZXRCYXNlQ2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RvbicpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVG9uIFRva2VuJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU2KTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4udHlwZS5zaG91bGQuZXF1YWwobWFpbm5ldFRva2VuTmFtZSk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLm5hbWUuc2hvdWxkLmVxdWFsKCdUZXRoZXIgVVNEJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmNvaW4uc2hvdWxkLmVxdWFsKCd0b24nKTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4ubmV0d29yay5zaG91bGQuZXF1YWwoJ01haW5uZXQnKTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4uY29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCgnRVFDeEU2bVV0UUpLRm5HZmFST1RLT3QxbFpiRGlpWDFrQ2l4UnY3TncySWRfc0RzJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDYpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IEpldHRvbiB0cmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIHR4UGFyYW1zTGlzdC5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB0eFBhcmFtc0xpc3RbaW5kZXhdO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHR4UHJlYnVpbGRMaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zQm91bmNlYWJsZSA9IHR4UGFyYW1zQm91bmNlYWJsZUxpc3RbaW5kZXhdO1xuICAgICAgY29uc3QgdHhQcmVidWlsZEJvdW5jZWFibGUgPSB0eFByZWJ1aWxkQm91bmNlYWJsZUxpc3RbaW5kZXhdO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGlzQm91bmNlYWJsZVRyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB0eFBhcmFtc0JvdW5jZWFibGUsXG4gICAgICAgICAgdHhQcmVidWlsZDogdHhQcmVidWlsZEJvdW5jZWFibGUsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc0JvdW5jZWFibGVUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdoZW4gcmVjaXBpZW50cyBhbW91bnQgYXJlIG51bWJlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHR4UGFyYW1zKSk7XG4gICAgICAgIHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMucmVjaXBpZW50c1swXS5hbW91bnQgPSAyMDAwMDAwMDtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50IGFyZSBzdHJpbmdzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0eFBhcmFtcykpO1xuICAgICAgICB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzLnJlY2lwaWVudHNbMF0uYW1vdW50ID0gJzIwMDAwMDAwJztcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50cyBhcmUgbnVtYmVyIGFuZCBhbW91bnQgaXMgc2FtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZXNvbHZlZFdpdGgodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50cyBhcmUgc3RyaW5nIGFuZCBhbW91bnQgaXMgc2FtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZXNvbHZlZFdpdGgodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudCBhZGRyZXNzIGFyZSBub24gYm91bmNlYWJsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHhQYXJhbXMpKTtcbiAgICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzWzBdLmFkZHJlc3MgPSBuZXcgVG9ud2ViLkFkZHJlc3MoXG4gICAgICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzWzBdLmFkZHJlc3NcbiAgICAgICAgKS50b1N0cmluZyh0cnVlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgICBjb25zdCBpc1ZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc1ZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBwYXJhbScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuICAgICAgICBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW5cbiAgICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCByZWNpcGllbnQgaGF2aW5nIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3Rlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uRm9yTWVtb0lkLnJlY2lwaWVudF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uRm9yTWVtb0lkLnR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0eEluZm86IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFeHBsYWluIEpldHRvbiBUcmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIGpldHRvbiB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogQnVmZmVyLmZyb20odGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KSkgYXMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3dpdGhkcmF3QW1vdW50J10sXG4gICAgICAgIGlkOiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eElkLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6ICdVTktOT1dOJyB9LFxuICAgICAgICB3aXRoZHJhd0Ftb3VudDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBub24tYm91bmNlYWJsZSBqZXR0b24gdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdG9BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UsXG4gICAgICAgIGZyb21BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UsXG4gICAgICB9KSkgYXMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3dpdGhkcmF3QW1vdW50J10sXG4gICAgICAgIGlkOiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eElkQm91bmNlYWJsZSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudEJvdW5jZWFibGUuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50Qm91bmNlYWJsZS5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlLmFtb3VudCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBmZWU6IHsgZmVlOiAnVU5LTk9XTicgfSxcbiAgICAgICAgd2l0aGRyYXdBbW91bnQ6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBtaXNzaW5nIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlbi5leHBsYWluVHJhbnNhY3Rpb24oe30pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGVycm9yLm1lc3NhZ2UsICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAncmFuZG9tU3RyaW5nJyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChlcnJvci5tZXNzYWdlLCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgSmV0dG9uIFRyYW5zYWN0aW9uczogJywgKCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uc0xpc3QgPSBbdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHhdO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ0VRQ3FRemZ5ZzBjWi04dDl2MllvSG1GRnhHNWpnanZRUlRaMnllRGpPNXo1WlJ5OScsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50b2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25JbnB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudG9rZW5TZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUxpc3QgPSBbXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiAnRVFCLUNNNkRGLWpwcTlYVmRpU2RlZkFNVTVLQzFncFp1WUJGcC1RNjVhVWhueDVLJyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50b2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuXG4gICAgdHJhbnNhY3Rpb25zTGlzdC5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbnNMaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2UgPSB0cmFuc2FjdGlvbklucHV0c1Jlc3BvbnNlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbklucHV0c1Jlc3BvbnNlQm91bmNlYWJsZSA9IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VCb3VuY2VhYmxlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZSA9IHRyYW5zYWN0aW9uT3V0cHV0c1Jlc3BvbnNlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGUgPSB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0W2luZGV4XTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSBhIFRPTiB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4ucGFyc2VUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRyYW5zYWN0aW9uLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcblxuICAgICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBpbnB1dHM6IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2UsXG4gICAgICAgICAgb3V0cHV0czogdHJhbnNhY3Rpb25PdXRwdXRzUmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFyc2UgYSBub24tYm91bmNlYWJsZSBUT04gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRyYW5zYWN0aW9uID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0b0FkZHJlc3NCb3VuY2VhYmxlOiBmYWxzZSxcbiAgICAgICAgICBmcm9tQWRkcmVzc0JvdW5jZWFibGU6IGZhbHNlLFxuICAgICAgICB9IGFzIFRvblBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTtcblxuICAgICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBpbnB1dHM6IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VCb3VuY2VhYmxlLFxuICAgICAgICAgIG91dHB1dHM6IHRyYW5zYWN0aW9uT3V0cHV0c1Jlc3BvbnNlQm91bmNlYWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHBhcnNlIGEgVE9OIHRyYW5zYWN0aW9uIHdoZW4gZXhwbGFpblRyYW5zYWN0aW9uIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3R1YiA9IHNpbm9uLnN0dWIoVG9uLnByb3RvdHlwZSwgJ2V4cGxhaW5UcmFuc2FjdGlvbicpO1xuICAgICAgICBzdHViLnJlc29sdmVzKHVuZGVmaW5lZCk7XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6IHRyYW5zYWN0aW9uIH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHN0dWIucmVzdG9yZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../test/unit/keyPair.ts"],"names":[],"mappings":""}
|