@bitgo-beta/sdk-coin-sol 2.4.3-beta.127 → 2.4.3-beta.1271
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/bigint-buffer-guard.d.ts +1 -0
- package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/src/bigint-buffer-guard.js +29 -0
- package/dist/src/config/token2022StaticConfig.d.ts +3 -0
- package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/src/config/token2022StaticConfig.js +50 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/lib/ataInitializationBuilder.d.ts.map +1 -1
- package/dist/src/lib/ataInitializationBuilder.js +60 -22
- package/dist/src/lib/closeAtaBuilder.d.ts +19 -0
- package/dist/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/src/lib/closeAtaBuilder.js +69 -0
- package/dist/src/lib/constants.d.ts +63 -8
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +73 -10
- package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/customInstructionBuilder.js +289 -0
- package/dist/src/lib/iface.d.ts +105 -5
- 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 +13 -10
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +48 -28
- package/dist/src/lib/instructionParamsFactory.d.ts +1 -1
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +521 -85
- package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/src/lib/keyPair.js +5 -5
- package/dist/src/lib/messages/index.d.ts +2 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +18 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/messages/messageBuilderFactory.js +19 -0
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +363 -95
- package/dist/src/lib/stakingActivateBuilder.d.ts +18 -0
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +34 -8
- package/dist/src/lib/stakingAuthorizeBuilder.js +7 -7
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +27 -1
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +82 -15
- package/dist/src/lib/stakingDelegateBuilder.js +9 -9
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +5 -5
- package/dist/src/lib/stakingWithdrawBuilder.js +6 -6
- package/dist/src/lib/token2022Config.d.ts +44 -0
- package/dist/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/src/lib/token2022Config.js +27 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +4 -1
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +87 -23
- package/dist/src/lib/transaction.d.ts +42 -6
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +185 -67
- package/dist/src/lib/transactionBuilder.d.ts +20 -3
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +106 -20
- package/dist/src/lib/transactionBuilderFactory.d.ts +19 -9
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +29 -10
- package/dist/src/lib/transferBuilder.js +4 -4
- package/dist/src/lib/transferBuilderV2.d.ts +14 -1
- package/dist/src/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/src/lib/transferBuilderV2.js +114 -11
- package/dist/src/lib/utils.d.ts +37 -6
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +194 -58
- package/dist/src/lib/walletInitializationBuilder.js +6 -6
- package/dist/src/sol.d.ts +67 -23
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +586 -90
- package/dist/src/solToken.d.ts +2 -1
- package/dist/src/solToken.d.ts.map +1 -1
- package/dist/src/solToken.js +6 -3
- package/dist/src/tsol.js +1 -1
- package/dist/test/fixtures/sol.d.ts +1152 -0
- package/dist/test/fixtures/sol.d.ts.map +1 -0
- package/dist/test/fixtures/sol.js +1433 -0
- package/dist/test/resources/sol.d.ts +238 -0
- package/dist/test/resources/sol.d.ts.map +1 -0
- package/dist/test/resources/sol.js +320 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.js +412 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.staking.js +1059 -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 +177 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/test/unit/sol.d.ts +2 -0
- package/dist/test/unit/sol.d.ts.map +1 -0
- package/dist/test/unit/sol.js +3065 -0
- package/dist/test/unit/solInstructionFactory.d.ts +2 -0
- package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/test/unit/solInstructionFactory.js +454 -0
- package/dist/test/unit/solToken.d.ts +2 -0
- package/dist/test/unit/solToken.d.ts.map +1 -0
- package/dist/test/unit/solToken.js +31 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +983 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +459 -0
- package/dist/test/unit/versionedTransaction.d.ts +2 -0
- package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/test/unit/versionedTransaction.js +205 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -11
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -353
|
@@ -0,0 +1,205 @@
|
|
|
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 src_1 = require("../../src");
|
|
41
|
+
const testData = __importStar(require("../resources/sol"));
|
|
42
|
+
const getBuilderFactory_1 = require("./getBuilderFactory");
|
|
43
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
44
|
+
const { VersionedTransaction } = require('@solana/web3.js');
|
|
45
|
+
describe('Sol Jupiter Swap Transaction', () => {
|
|
46
|
+
const walletKeyPair = new src_1.KeyPair(testData.authAccount);
|
|
47
|
+
const wallet = walletKeyPair.getKeys();
|
|
48
|
+
it('should preserve instructions and ALTs when building and signing', async function () {
|
|
49
|
+
// Jupiter Swap Transaction (Versioned)
|
|
50
|
+
const versionedTransaction = 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAFDTWoM5DBCGn7cn5aV56fomo6mhD2K1c5XYhQIan41E6dG9t06ox6DMdvVuBnSEATyN/8qIq246iO5aDm1jm82x4wM40FR8Q7xSZUpUtB0lbvelaZ46oRQ2GM9hWGMukHG1EUsA1R9ZO55ClUvNMyw8IQOrfRmu3ONG50oNeluT4LgaOacN+I4d0HStcu+oh0no4XXgVUwjzk5+egiUaQDkCCjXAlSDAb46ahLAfWeKOqzO/HC/z2WgRk8RS1yc6heMZzBbR3SPDwrNvWlCZGaETaixiH9ufdOJ823Gv+MnxH1SOu6TCsX1+TMskj94D3NElDpado8okFQbUuzaijU9oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAAAEedVb8jHAbu50xW7OaBUH/bGy3qP0jlECsc2iVrwTjwbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCp+mGpF4I4ZrV12bapJ7p61Babt3ty7HYDUKtMso38OYgHCgAFAooyBAAKAAkDoQ4BAAAAAAAIAgAFDAIAAAAwKyIAAAAAAAsFBQAgDAgJk/F7ZPSErnb/CQYABwAdCAwBAQs/HgAFDg0HIB0MDBwLJg8mEBIODSAdESYeDAwkJgIDBgsmGyYWGQ4EICUaJh4MDCQmGBcBCyIjDCEeBA0VExQfMtGYU5N8/tjpC0ANAwAAAAAAWqwAAAAAAAAyAAAAAAADAAAAJiwaAAMm5AwAAgoQJwIDDAMFAAABCQQpv5UHKk+/BN9xdZPnOLzMIScoFcJHGoDZ+fVVsNSEJQI0IwUAKA4CFyo9SDjsPdfWXAdMF0mu2+xZbw9rbR6rzNAEeFkLmyKwBGBmYWUAMHCJ6Oi0A1Qjpjp1Yv3xP+sPLm2qJ//TKZd5Z9KzjvEDwb3CA77DwOtKd1MCu6h4XJjC42yc8TcL92nhzFUR6HLW3XrAIZOvBo6Ki5CRjQOMk5Q=';
|
|
51
|
+
const originalDeserialized = VersionedTransaction.deserialize(Buffer.from(versionedTransaction, 'base64'));
|
|
52
|
+
const versionedInstructions = originalDeserialized.message.compiledInstructions.map((ix) => ({
|
|
53
|
+
programIdIndex: ix.programIdIndex,
|
|
54
|
+
accountKeyIndexes: ix.accountKeyIndexes,
|
|
55
|
+
data: bs58_1.default.encode(ix.data),
|
|
56
|
+
}));
|
|
57
|
+
const addressLookupTables = originalDeserialized.message.addressTableLookups?.map((lookup) => ({
|
|
58
|
+
accountKey: lookup.accountKey.toBase58(),
|
|
59
|
+
writableIndexes: lookup.writableIndexes,
|
|
60
|
+
readonlyIndexes: lookup.readonlyIndexes,
|
|
61
|
+
})) || [];
|
|
62
|
+
const staticAccountKeys = originalDeserialized.message.staticAccountKeys.map((key) => key.toBase58());
|
|
63
|
+
staticAccountKeys[0] = testData.authAccount.pub; // Replace fee payer with our test account
|
|
64
|
+
const versionedTransactionData = {
|
|
65
|
+
versionedInstructions,
|
|
66
|
+
addressLookupTables,
|
|
67
|
+
staticAccountKeys,
|
|
68
|
+
messageHeader: originalDeserialized.message.header,
|
|
69
|
+
};
|
|
70
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
71
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
72
|
+
// Build transaction from versioned transaction data
|
|
73
|
+
txBuilder.fromVersionedTransactionData(versionedTransactionData);
|
|
74
|
+
txBuilder.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
75
|
+
// Build unsigned transaction
|
|
76
|
+
const txUnsigned = (await txBuilder.build());
|
|
77
|
+
should_1.default.exist(txUnsigned);
|
|
78
|
+
txUnsigned.isVersionedTransaction().should.be.true();
|
|
79
|
+
should_1.default.exist(txUnsigned.toBroadcastFormat());
|
|
80
|
+
// Sign the transaction
|
|
81
|
+
txBuilder.sign({ key: wallet.prv });
|
|
82
|
+
const tx = (await txBuilder.build());
|
|
83
|
+
const rawTx = tx.toBroadcastFormat();
|
|
84
|
+
tx.isVersionedTransaction().should.be.true();
|
|
85
|
+
should_1.default.exist(rawTx);
|
|
86
|
+
const txBuilder2 = factory.getCustomInstructionBuilder();
|
|
87
|
+
txBuilder2.fromVersionedTransactionData(versionedTransactionData);
|
|
88
|
+
txBuilder2.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
89
|
+
const tx2 = await txBuilder2.build();
|
|
90
|
+
should_1.default.equal(tx2.signablePayload.toString('hex'), txUnsigned.signablePayload.toString('hex'));
|
|
91
|
+
should_1.default.equal(tx2.type, txUnsigned.type);
|
|
92
|
+
// Verify we can add signature manually
|
|
93
|
+
const signed = tx.signature[0];
|
|
94
|
+
const txBuilder3 = factory.getCustomInstructionBuilder();
|
|
95
|
+
txBuilder3.fromVersionedTransactionData(versionedTransactionData);
|
|
96
|
+
txBuilder3.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
97
|
+
await txBuilder3.addSignature({ pub: wallet.pub }, Buffer.from(bs58_1.default.decode(signed)));
|
|
98
|
+
const signedTx = await txBuilder3.build();
|
|
99
|
+
should_1.default.equal(signedTx.type, tx.type);
|
|
100
|
+
const rawSignedTx = signedTx.toBroadcastFormat();
|
|
101
|
+
should_1.default.equal(rawSignedTx, rawTx);
|
|
102
|
+
const signedDeserialized = VersionedTransaction.deserialize(Buffer.from(rawTx, 'base64'));
|
|
103
|
+
// Verify all instructions are preserved
|
|
104
|
+
const origInstructions = originalDeserialized.message.compiledInstructions;
|
|
105
|
+
const signedInstructions = signedDeserialized.message.compiledInstructions;
|
|
106
|
+
should_1.default.equal(origInstructions.length, signedInstructions.length, 'Number of instructions should match');
|
|
107
|
+
for (let i = 0; i < origInstructions.length; i++) {
|
|
108
|
+
should_1.default.equal(origInstructions[i].programIdIndex, signedInstructions[i].programIdIndex, `Instruction ${i}: programIdIndex should match`);
|
|
109
|
+
should_1.default.deepEqual(origInstructions[i].accountKeyIndexes, signedInstructions[i].accountKeyIndexes, `Instruction ${i}: accountKeyIndexes should match`);
|
|
110
|
+
should_1.default.equal(Buffer.from(origInstructions[i].data).toString('hex'), Buffer.from(signedInstructions[i].data).toString('hex'), `Instruction ${i}: data should match`);
|
|
111
|
+
}
|
|
112
|
+
// Verify all ALTs are preserved
|
|
113
|
+
const origALTs = originalDeserialized.message.addressTableLookups || [];
|
|
114
|
+
const signedALTs = signedDeserialized.message.addressTableLookups || [];
|
|
115
|
+
should_1.default.equal(origALTs.length, signedALTs.length, 'Number of ALTs should match');
|
|
116
|
+
for (let i = 0; i < origALTs.length; i++) {
|
|
117
|
+
should_1.default.equal(origALTs[i].accountKey.toBase58(), signedALTs[i].accountKey.toBase58(), `ALT ${i}: accountKey should match`);
|
|
118
|
+
should_1.default.deepEqual(origALTs[i].writableIndexes, signedALTs[i].writableIndexes, `ALT ${i}: writableIndexes should match`);
|
|
119
|
+
should_1.default.deepEqual(origALTs[i].readonlyIndexes, signedALTs[i].readonlyIndexes, `ALT ${i}: readonlyIndexes should match`);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
it('should automatically inject nonce advance instruction when using durable nonce with versioned transactions', async function () {
|
|
123
|
+
// Simple transaction with one memo instruction
|
|
124
|
+
const versionedTransactionData = {
|
|
125
|
+
versionedInstructions: [
|
|
126
|
+
{
|
|
127
|
+
programIdIndex: 1,
|
|
128
|
+
accountKeyIndexes: [0],
|
|
129
|
+
data: bs58_1.default.encode(Buffer.from('Hello Versioned Tx', 'utf-8')),
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
addressLookupTables: [],
|
|
133
|
+
staticAccountKeys: [testData.authAccount.pub, 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'],
|
|
134
|
+
messageHeader: {
|
|
135
|
+
numRequiredSignatures: 1,
|
|
136
|
+
numReadonlySignedAccounts: 0,
|
|
137
|
+
numReadonlyUnsignedAccounts: 0,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
const durableNonceParams = {
|
|
141
|
+
walletNonceAddress: 'GHtXQBsoZHVnNFa9YevAzxNzQBz7CV5hj6bSe3u52W9n',
|
|
142
|
+
authWalletAddress: '8Y7RM6JfcX4ASSNBkrkrmScq3Z9UWV4CJBwtfSNgqTN2',
|
|
143
|
+
};
|
|
144
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
145
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
146
|
+
// Providing durableNonceParams triggers automatic nonce advance injection
|
|
147
|
+
txBuilder.nonce(testData.blockHashes.validBlockHashes[0], durableNonceParams);
|
|
148
|
+
txBuilder.fromVersionedTransactionData(versionedTransactionData);
|
|
149
|
+
const tx = (await txBuilder.build());
|
|
150
|
+
const builtData = tx.getVersionedTransactionData();
|
|
151
|
+
should_1.default.exist(builtData);
|
|
152
|
+
// Nonce advance instruction should be prepended
|
|
153
|
+
builtData.versionedInstructions.length.should.equal(2);
|
|
154
|
+
const nonceInstruction = builtData.versionedInstructions[0];
|
|
155
|
+
nonceInstruction.accountKeyIndexes.length.should.equal(3);
|
|
156
|
+
// numRequiredSignatures should be updated to include nonce authority
|
|
157
|
+
const numSigners = builtData.messageHeader.numRequiredSignatures;
|
|
158
|
+
numSigners.should.equal(2);
|
|
159
|
+
// Both fee payer and nonce authority should be in signer section
|
|
160
|
+
const signerKeys = builtData.staticAccountKeys.slice(0, numSigners);
|
|
161
|
+
signerKeys.should.containEql(testData.authAccount.pub);
|
|
162
|
+
signerKeys.should.containEql(durableNonceParams.authWalletAddress);
|
|
163
|
+
// Fee payer must remain at index 0
|
|
164
|
+
builtData.staticAccountKeys[0].should.equal(testData.authAccount.pub);
|
|
165
|
+
// Required accounts for nonce advance should be added
|
|
166
|
+
builtData.staticAccountKeys.should.containEql(durableNonceParams.walletNonceAddress);
|
|
167
|
+
builtData.staticAccountKeys.should.containEql('11111111111111111111111111111111');
|
|
168
|
+
builtData.staticAccountKeys.should.containEql('SysvarRecentB1ockHashes11111111111111111111');
|
|
169
|
+
// Original instruction indices should be remapped after account reordering
|
|
170
|
+
const originalInstruction = builtData.versionedInstructions[1];
|
|
171
|
+
originalInstruction.programIdIndex.should.equal(builtData.staticAccountKeys.indexOf('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'));
|
|
172
|
+
originalInstruction.accountKeyIndexes[0].should.equal(builtData.staticAccountKeys.indexOf(testData.authAccount.pub));
|
|
173
|
+
});
|
|
174
|
+
it('should not inject nonce advance when using regular nonce (no durableNonceParams)', async function () {
|
|
175
|
+
const versionedTransactionData = {
|
|
176
|
+
versionedInstructions: [
|
|
177
|
+
{
|
|
178
|
+
programIdIndex: 1,
|
|
179
|
+
accountKeyIndexes: [0],
|
|
180
|
+
data: bs58_1.default.encode(Buffer.from('Hello', 'utf-8')),
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
addressLookupTables: [],
|
|
184
|
+
staticAccountKeys: [testData.authAccount.pub, 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'],
|
|
185
|
+
messageHeader: {
|
|
186
|
+
numRequiredSignatures: 1,
|
|
187
|
+
numReadonlySignedAccounts: 0,
|
|
188
|
+
numReadonlyUnsignedAccounts: 0,
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
192
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
193
|
+
// Regular nonce without durableNonceParams should not trigger injection
|
|
194
|
+
txBuilder.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
195
|
+
txBuilder.fromVersionedTransactionData(versionedTransactionData);
|
|
196
|
+
const tx = (await txBuilder.build());
|
|
197
|
+
const builtData = tx.getVersionedTransactionData();
|
|
198
|
+
should_1.default.exist(builtData);
|
|
199
|
+
// Transaction should remain unchanged
|
|
200
|
+
builtData.versionedInstructions.length.should.equal(1);
|
|
201
|
+
builtData.messageHeader.numRequiredSignatures.should.equal(1);
|
|
202
|
+
builtData.staticAccountKeys.length.should.equal(2);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbmVkVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyc2lvbmVkVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQWlEO0FBQ2pELDJEQUE2QztBQUM3QywyREFBd0Q7QUFDeEQsZ0RBQTBCO0FBQzFCLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTVELFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7SUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUV2QyxFQUFFLENBQUMsaUVBQWlFLEVBQUUsS0FBSztRQUN6RSx1Q0FBdUM7UUFDdkMsTUFBTSxvQkFBb0IsR0FDeEIsMG9DQUEwb0MsQ0FBQztRQUU3b0MsTUFBTSxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRTNHLE1BQU0scUJBQXFCLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRixjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWM7WUFDakMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLGlCQUFpQjtZQUN2QyxJQUFJLEVBQUUsY0FBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO1NBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUosTUFBTSxtQkFBbUIsR0FDdkIsb0JBQW9C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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXlQYWlyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuY29uc3QgeyBWZXJzaW9uZWRUcmFuc2FjdGlvbiB9ID0gcmVxdWlyZSgnQHNvbGFuYS93ZWIzLmpzJyk7XG5cbmRlc2NyaWJlKCdTb2wgSnVwaXRlciBTd2FwIFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICBjb25zdCB3YWxsZXRLZXlQYWlyID0gbmV3IEtleVBhaXIodGVzdERhdGEuYXV0aEFjY291bnQpO1xuICBjb25zdCB3YWxsZXQgPSB3YWxsZXRLZXlQYWlyLmdldEtleXMoKTtcblxuICBpdCgnc2hvdWxkIHByZXNlcnZlIGluc3RydWN0aW9ucyBhbmQgQUxUcyB3aGVuIGJ1aWxkaW5nIGFuZCBzaWduaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIC8vIEp1cGl0ZXIgU3dhcCBUcmFuc2FjdGlvbiAoVmVyc2lvbmVkKVxuICAgIGNvbnN0IHZlcnNpb25lZFRyYW5zYWN0aW9uID1cbiAgICAgICdBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQVFBRkRUV29NNURCQ0duN2NuNWFWNTZmb21vNm1oRDJLMWM1WFloUUlhbjQxRTZkRzl0MDZveDZETWR2VnVCblNFQVR5Ti84cUlxMjQ2aU81YURtMWptODJ4NHdNNDBGUjhRN3hTWlVwVXRCMGxidmVsYVo0Nm9SUTJHTTloV0dNdWtIRzFFVXNBMVI5Wk81NUNsVXZOTXl3OElRT3JmUm11M09ORzUwb05lbHVUNExnYU9hY04rSTRkMEhTdGN1K29oMG5vNFhYZ1ZVd2p6azUrZWdpVWFRRGtDQ2pYQWxTREFiNDZhaExBZldlS09xek8vSEMvejJXZ1JrOFJTMXljNmhlTVp6QmJSM1NQRHdyTnZXbENaR2FFVGFpeGlIOXVmZE9KODIzR3YrTW54SDFTT3U2VENzWDErVE1za2o5NEQzTkVsRHBhZG84b2tGUWJVdXphaWpVOW9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJeVhKWTlPSklueHV6MFFLUlNPRFlNTFdoT1oydjhRaEFTT2U5amI2ZmhaQXdaR2IrVWhGekwvN0syNmNzT2I1N3lNNWJ2Rjl4SnJMRU9iT2tBQUFBQUVlZFZiOGpIQWJ1NTB4VzdPYUJVSC9iR3kzcVAwamxFQ3NjMmlWcndUandiZDl1SFhaYUdUMmN2aFJzN3JlYXdjdElYdFgxczNrVHFNOVlWKy93Q3ArbUdwRjRJNFpyVjEyYmFwSjdwNjFCYWJ0M3R5N0hZRFVLdE1zbzM4T1lnSENnQUZBb295QkFBS0FBa0RvUTRCQUFBQUFBQUlBZ0FGREFJQUFBQXdLeUlBQUFBQUFBc0ZCUUFnREFnSmsvRjdaUFNFcm5iL0NRWUFCd0FkQ0F3QkFRcy9IZ0FGRGcwSElCME1EQndMSmc4bUVCSU9EU0FkRVNZZURBd2tKZ0lEQmdzbUd5WVdHUTRFSUNVYUpoNE1EQ1FtR0JjQkN5SWpEQ0VlQkEwVkV4UWZNdEdZVTVOOC90anBDMEFOQXdBQUFBQUFXcXdBQUFBQUFBQXlBQUFBQUFBREFBQUFKaXdhQUFNbTVBd0FBZ29RSndJRERBTUZBQUFCQ1FRcHY1VUhLaysvQk45eGRaUG5PTHpNSVNjb0ZjSkhHb0RaK2ZWVnNOU0VKUUkwSXdVQUtBNENGeW85U0Rqc1BkZldYQWRNRjBtdTIreFpidzlyYlI2cnpOQUVlRmtMbXlLd0JHQm1ZV1VBTUhDSjZPaTBBMVFqcGpwMVl2M3hQK3NQTG0ycUovL1RLWmQ1WjlLemp2RUR3YjNDQTc3RHdPdEtkMU1DdTZoNFhKakM0MnljOFRjTDkybmh6RlVSNkhMVzNYckFJWk92Qm82S2k1Q1JqUU9NazVRPSc7XG5cbiAgICBjb25zdCBvcmlnaW5hbERlc2VyaWFsaXplZCA9IFZlcnNpb25lZFRyYW5zYWN0aW9uLmRlc2VyaWFsaXplKEJ1ZmZlci5mcm9tKHZlcnNpb25lZFRyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuXG4gICAgY29uc3QgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zID0gb3JpZ2luYWxEZXNlcmlhbGl6ZWQubWVzc2FnZS5jb21waWxlZEluc3RydWN0aW9ucy5tYXAoKGl4KSA9PiAoe1xuICAgICAgcHJvZ3JhbUlkSW5kZXg6IGl4LnByb2dyYW1JZEluZGV4LFxuICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGl4LmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgZGF0YTogYmFzZTU4LmVuY29kZShpeC5kYXRhKSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBhZGRyZXNzTG9va3VwVGFibGVzID1cbiAgICAgIG9yaWdpbmFsRGVzZXJpYWxpemVkLm1lc3NhZ2UuYWRkcmVzc1RhYmxlTG9va3Vwcz8ubWFwKChsb29rdXApID0+ICh7XG4gICAgICAgIGFjY291bnRLZXk6IGxvb2t1cC5hY2NvdW50S2V5LnRvQmFzZTU4KCksXG4gICAgICAgIHdyaXRhYmxlSW5kZXhlczogbG9va3VwLndyaXRhYmxlSW5kZXhlcyxcbiAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBsb29rdXAucmVhZG9ubHlJbmRleGVzLFxuICAgICAgfSkpIHx8IFtdO1xuXG4gICAgY29uc3Qgc3RhdGljQWNjb3VudEtleXMgPSBvcmlnaW5hbERlc2VyaWFsaXplZC5tZXNzYWdlLnN0YXRpY0FjY291bnRLZXlzLm1hcCgoa2V5KSA9PiBrZXkudG9CYXNlNTgoKSk7XG4gICAgc3RhdGljQWNjb3VudEtleXNbMF0gPSB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWI7IC8vIFJlcGxhY2UgZmVlIHBheWVyIHdpdGggb3VyIHRlc3QgYWNjb3VudFxuXG4gICAgY29uc3QgdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhID0ge1xuICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLFxuICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlcyxcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzLFxuICAgICAgbWVzc2FnZUhlYWRlcjogb3JpZ2luYWxEZXNlcmlhbGl6ZWQubWVzc2FnZS5oZWFkZXIsXG4gICAgfTtcblxuICAgIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHNvbCcpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG5cbiAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiBmcm9tIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UodGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXSk7XG5cbiAgICAvLyBCdWlsZCB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHR4VW5zaWduZWQgPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIHNob3VsZC5leGlzdCh0eFVuc2lnbmVkKTtcbiAgICB0eFVuc2lnbmVkLmlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIHNob3VsZC5leGlzdCh0eFVuc2lnbmVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHR4LmlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIHNob3VsZC5leGlzdChyYXdUeCk7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKTtcbiAgICB0eEJ1aWxkZXIyLm5vbmNlKHRlc3REYXRhLmJsb2NrSGFzaGVzLnZhbGlkQmxvY2tIYXNoZXNbMF0pO1xuICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcblxuICAgIHNob3VsZC5lcXVhbCh0eDIuc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSwgdHhVbnNpZ25lZC5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBzaG91bGQuZXF1YWwodHgyLnR5cGUsIHR4VW5zaWduZWQudHlwZSk7XG5cbiAgICAvLyBWZXJpZnkgd2UgY2FuIGFkZCBzaWduYXR1cmUgbWFudWFsbHlcbiAgICBjb25zdCBzaWduZWQgPSB0eC5zaWduYXR1cmVbMF07XG4gICAgY29uc3QgdHhCdWlsZGVyMyA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyMy5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSk7XG4gICAgdHhCdWlsZGVyMy5ub25jZSh0ZXN0RGF0YS5ibG9ja0hhc2hlcy52YWxpZEJsb2NrSGFzaGVzWzBdKTtcbiAgICBhd2FpdCB0eEJ1aWxkZXIzLmFkZFNpZ25hdHVyZSh7IHB1Yjogd2FsbGV0LnB1YiB9LCBCdWZmZXIuZnJvbShiYXNlNTguZGVjb2RlKHNpZ25lZCkpKTtcblxuICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMy5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC50eXBlLCB0eC50eXBlKTtcblxuICAgIGNvbnN0IHJhd1NpZ25lZFR4ID0gc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzaG91bGQuZXF1YWwocmF3U2lnbmVkVHgsIHJhd1R4KTtcblxuICAgIGNvbnN0IHNpZ25lZERlc2VyaWFsaXplZCA9IFZlcnNpb25lZFRyYW5zYWN0aW9uLmRlc2VyaWFsaXplKEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0JykpO1xuXG4gICAgLy8gVmVyaWZ5IGFsbCBpbnN0cnVjdGlvbnMgYXJlIHByZXNlcnZlZFxuICAgIGNvbnN0IG9yaWdJbnN0cnVjdGlvbnMgPSBvcmlnaW5hbERlc2VyaWFsaXplZC5tZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zO1xuICAgIGNvbnN0IHNpZ25lZEluc3RydWN0aW9ucyA9IHNpZ25lZERlc2VyaWFsaXplZC5tZXNzYWdlLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zO1xuICAgIHNob3VsZC5lcXVhbChvcmlnSW5zdHJ1Y3Rpb25zLmxlbmd0aCwgc2lnbmVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCwgJ051bWJlciBvZiBpbnN0cnVjdGlvbnMgc2hvdWxkIG1hdGNoJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yaWdJbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgb3JpZ0luc3RydWN0aW9uc1tpXS5wcm9ncmFtSWRJbmRleCxcbiAgICAgICAgc2lnbmVkSW5zdHJ1Y3Rpb25zW2ldLnByb2dyYW1JZEluZGV4LFxuICAgICAgICBgSW5zdHJ1Y3Rpb24gJHtpfTogcHJvZ3JhbUlkSW5kZXggc2hvdWxkIG1hdGNoYFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIG9yaWdJbnN0cnVjdGlvbnNbaV0uYWNjb3VudEtleUluZGV4ZXMsXG4gICAgICAgIHNpZ25lZEluc3RydWN0aW9uc1tpXS5hY2NvdW50S2V5SW5kZXhlcyxcbiAgICAgICAgYEluc3RydWN0aW9uICR7aX06IGFjY291bnRLZXlJbmRleGVzIHNob3VsZCBtYXRjaGBcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIEJ1ZmZlci5mcm9tKG9yaWdJbnN0cnVjdGlvbnNbaV0uZGF0YSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBCdWZmZXIuZnJvbShzaWduZWRJbnN0cnVjdGlvbnNbaV0uZGF0YSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBgSW5zdHJ1Y3Rpb24gJHtpfTogZGF0YSBzaG91bGQgbWF0Y2hgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSBhbGwgQUxUcyBhcmUgcHJlc2VydmVkXG4gICAgY29uc3Qgb3JpZ0FMVHMgPSBvcmlnaW5hbERlc2VyaWFsaXplZC5tZXNzYWdlLmFkZHJlc3NUYWJsZUxvb2t1cHMgfHwgW107XG4gICAgY29uc3Qgc2lnbmVkQUxUcyA9IHNpZ25lZERlc2VyaWFsaXplZC5tZXNzYWdlLmFkZHJlc3NUYWJsZUxvb2t1cHMgfHwgW107XG4gICAgc2hvdWxkLmVxdWFsKG9yaWdBTFRzLmxlbmd0aCwgc2lnbmVkQUxUcy5sZW5ndGgsICdOdW1iZXIgb2YgQUxUcyBzaG91bGQgbWF0Y2gnKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpZ0FMVHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgb3JpZ0FMVHNbaV0uYWNjb3VudEtleS50b0Jhc2U1OCgpLFxuICAgICAgICBzaWduZWRBTFRzW2ldLmFjY291bnRLZXkudG9CYXNlNTgoKSxcbiAgICAgICAgYEFMVCAke2l9OiBhY2NvdW50S2V5IHNob3VsZCBtYXRjaGBcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICBvcmlnQUxUc1tpXS53cml0YWJsZUluZGV4ZXMsXG4gICAgICAgIHNpZ25lZEFMVHNbaV0ud3JpdGFibGVJbmRleGVzLFxuICAgICAgICBgQUxUICR7aX06IHdyaXRhYmxlSW5kZXhlcyBzaG91bGQgbWF0Y2hgXG4gICAgICApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgb3JpZ0FMVHNbaV0ucmVhZG9ubHlJbmRleGVzLFxuICAgICAgICBzaWduZWRBTFRzW2ldLnJlYWRvbmx5SW5kZXhlcyxcbiAgICAgICAgYEFMVCAke2l9OiByZWFkb25seUluZGV4ZXMgc2hvdWxkIG1hdGNoYFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYXV0b21hdGljYWxseSBpbmplY3Qgbm9uY2UgYWR2YW5jZSBpbnN0cnVjdGlvbiB3aGVuIHVzaW5nIGR1cmFibGUgbm9uY2Ugd2l0aCB2ZXJzaW9uZWQgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIC8vIFNpbXBsZSB0cmFuc2FjdGlvbiB3aXRoIG9uZSBtZW1vIGluc3RydWN0aW9uXG4gICAgY29uc3QgdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhID0ge1xuICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogMSxcbiAgICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogWzBdLFxuICAgICAgICAgIGRhdGE6IGJhc2U1OC5lbmNvZGUoQnVmZmVyLmZyb20oJ0hlbGxvIFZlcnNpb25lZCBUeCcsICd1dGYtOCcpKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhZGRyZXNzTG9va3VwVGFibGVzOiBbXSxcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBbdGVzdERhdGEuYXV0aEFjY291bnQucHViLCAnTWVtb1NxNGdxQUJBWEtiOTZxbkg4VHlzTmNXeE15V0NxWGdETEdtZmNIciddLFxuICAgICAgbWVzc2FnZUhlYWRlcjoge1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IDEsXG4gICAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IDAsXG4gICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50czogMCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGR1cmFibGVOb25jZVBhcmFtcyA9IHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJ0dIdFhRQnNvWkhWbk5GYTlZZXZBenhOelFCejdDVjVoajZiU2UzdTUyVzluJyxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2NxM1o5VVdWNENKQnd0ZlNOZ3FUTjInLFxuICAgIH07XG5cbiAgICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuXG4gICAgLy8gUHJvdmlkaW5nIGR1cmFibGVOb25jZVBhcmFtcyB0cmlnZ2VycyBhdXRvbWF0aWMgbm9uY2UgYWR2YW5jZSBpbmplY3Rpb25cbiAgICB0eEJ1aWxkZXIubm9uY2UodGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXSwgZHVyYWJsZU5vbmNlUGFyYW1zKTtcbiAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEpO1xuXG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IGJ1aWx0RGF0YSA9IHR4LmdldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSgpO1xuXG4gICAgc2hvdWxkLmV4aXN0KGJ1aWx0RGF0YSk7XG5cbiAgICAvLyBOb25jZSBhZHZhbmNlIGluc3RydWN0aW9uIHNob3VsZCBiZSBwcmVwZW5kZWRcbiAgICBidWlsdERhdGEhLnZlcnNpb25lZEluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIGNvbnN0IG5vbmNlSW5zdHJ1Y3Rpb24gPSBidWlsdERhdGEhLnZlcnNpb25lZEluc3RydWN0aW9uc1swXTtcbiAgICBub25jZUluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG5cbiAgICAvLyBudW1SZXF1aXJlZFNpZ25hdHVyZXMgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gaW5jbHVkZSBub25jZSBhdXRob3JpdHlcbiAgICBjb25zdCBudW1TaWduZXJzID0gYnVpbHREYXRhIS5tZXNzYWdlSGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgICBudW1TaWduZXJzLnNob3VsZC5lcXVhbCgyKTtcblxuICAgIC8vIEJvdGggZmVlIHBheWVyIGFuZCBub25jZSBhdXRob3JpdHkgc2hvdWxkIGJlIGluIHNpZ25lciBzZWN0aW9uXG4gICAgY29uc3Qgc2lnbmVyS2V5cyA9IGJ1aWx0RGF0YSEuc3RhdGljQWNjb3VudEtleXMuc2xpY2UoMCwgbnVtU2lnbmVycyk7XG4gICAgc2lnbmVyS2V5cy5zaG91bGQuY29udGFpbkVxbCh0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWIpO1xuICAgIHNpZ25lcktleXMuc2hvdWxkLmNvbnRhaW5FcWwoZHVyYWJsZU5vbmNlUGFyYW1zLmF1dGhXYWxsZXRBZGRyZXNzKTtcblxuICAgIC8vIEZlZSBwYXllciBtdXN0IHJlbWFpbiBhdCBpbmRleCAwXG4gICAgYnVpbHREYXRhIS5zdGF0aWNBY2NvdW50S2V5c1swXS5zaG91bGQuZXF1YWwodGVzdERhdGEuYXV0aEFjY291bnQucHViKTtcblxuICAgIC8vIFJlcXVpcmVkIGFjY291bnRzIGZvciBub25jZSBhZHZhbmNlIHNob3VsZCBiZSBhZGRlZFxuICAgIGJ1aWx0RGF0YSEuc3RhdGljQWNjb3VudEtleXMuc2hvdWxkLmNvbnRhaW5FcWwoZHVyYWJsZU5vbmNlUGFyYW1zLndhbGxldE5vbmNlQWRkcmVzcyk7XG4gICAgYnVpbHREYXRhIS5zdGF0aWNBY2NvdW50S2V5cy5zaG91bGQuY29udGFpbkVxbCgnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbiAgICBidWlsdERhdGEhLnN0YXRpY0FjY291bnRLZXlzLnNob3VsZC5jb250YWluRXFsKCdTeXN2YXJSZWNlbnRCMW9ja0hhc2hlczExMTExMTExMTExMTExMTExMTExJyk7XG5cbiAgICAvLyBPcmlnaW5hbCBpbnN0cnVjdGlvbiBpbmRpY2VzIHNob3VsZCBiZSByZW1hcHBlZCBhZnRlciBhY2NvdW50IHJlb3JkZXJpbmdcbiAgICBjb25zdCBvcmlnaW5hbEluc3RydWN0aW9uID0gYnVpbHREYXRhIS52ZXJzaW9uZWRJbnN0cnVjdGlvbnNbMV07XG4gICAgb3JpZ2luYWxJbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleC5zaG91bGQuZXF1YWwoXG4gICAgICBidWlsdERhdGEhLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoJ01lbW9TcTRncUFCQVhLYjk2cW5IOFR5c05jV3hNeVdDcVhnRExHbWZjSHInKVxuICAgICk7XG4gICAgb3JpZ2luYWxJbnN0cnVjdGlvbi5hY2NvdW50S2V5SW5kZXhlc1swXS5zaG91bGQuZXF1YWwoXG4gICAgICBidWlsdERhdGEhLnN0YXRpY0FjY291bnRLZXlzLmluZGV4T2YodGVzdERhdGEuYXV0aEFjY291bnQucHViKVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IGluamVjdCBub25jZSBhZHZhbmNlIHdoZW4gdXNpbmcgcmVndWxhciBub25jZSAobm8gZHVyYWJsZU5vbmNlUGFyYW1zKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB2ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgPSB7XG4gICAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiAxLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMF0sXG4gICAgICAgICAgZGF0YTogYmFzZTU4LmVuY29kZShCdWZmZXIuZnJvbSgnSGVsbG8nLCAndXRmLTgnKSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogW10sXG4gICAgICBzdGF0aWNBY2NvdW50S2V5czogW3Rlc3REYXRhLmF1dGhBY2NvdW50LnB1YiwgJ01lbW9TcTRncUFCQVhLYjk2cW5IOFR5c05jV3hNeVdDcVhnRExHbWZjSHInXSxcbiAgICAgIG1lc3NhZ2VIZWFkZXI6IHtcbiAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiAxLFxuICAgICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiAwLFxuICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IDAsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuXG4gICAgLy8gUmVndWxhciBub25jZSB3aXRob3V0IGR1cmFibGVOb25jZVBhcmFtcyBzaG91bGQgbm90IHRyaWdnZXIgaW5qZWN0aW9uXG4gICAgdHhCdWlsZGVyLm5vbmNlKHRlc3REYXRhLmJsb2NrSGFzaGVzLnZhbGlkQmxvY2tIYXNoZXNbMF0pO1xuICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSk7XG5cbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgY29uc3QgYnVpbHREYXRhID0gdHguZ2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKCk7XG5cbiAgICBzaG91bGQuZXhpc3QoYnVpbHREYXRhKTtcblxuICAgIC8vIFRyYW5zYWN0aW9uIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkXG4gICAgYnVpbHREYXRhIS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdERhdGEhLm1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLnNob3VsZC5lcXVhbCgxKTtcbiAgICBidWlsdERhdGEhLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gIH0pO1xufSk7XG4iXX0=
|