@bitgo-beta/sdk-coin-sol 7.6.4-beta.709 → 7.6.4-beta.710

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +36 -1
  2. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -1
  3. package/dist/cjs/src/lib/confidentialTransferBuilder.js +100 -1
  4. package/dist/cjs/src/lib/transaction.d.ts +22 -0
  5. package/dist/cjs/src/lib/transaction.d.ts.map +1 -1
  6. package/dist/cjs/src/lib/transaction.js +48 -2
  7. package/dist/cjs/src/lib/transactionBuilder.d.ts +7 -1
  8. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -1
  9. package/dist/cjs/src/lib/transactionBuilder.js +9 -1
  10. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  11. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  12. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
  13. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  14. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  15. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
  16. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  17. package/dist/esm/lib/confidentialTransferBuilder.d.ts +36 -1
  18. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -1
  19. package/dist/esm/lib/confidentialTransferBuilder.js +101 -2
  20. package/dist/esm/lib/transaction.d.ts +22 -0
  21. package/dist/esm/lib/transaction.d.ts.map +1 -1
  22. package/dist/esm/lib/transaction.js +48 -2
  23. package/dist/esm/lib/transactionBuilder.d.ts +7 -1
  24. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -1
  25. package/dist/esm/lib/transactionBuilder.js +9 -1
  26. package/package.json +8 -8
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ require("should");
37
+ const src_1 = require("../../../src");
38
+ const testData = __importStar(require("../../resources/sol"));
39
+ const getBuilderFactory_1 = require("../getBuilderFactory");
40
+ describe('Solana Confidential Transfer Builder - v1', () => {
41
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
42
+ const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
43
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
44
+ const mintAddress = testData.associatedTokenAccountsForSol2022.mintId;
45
+ const tokenAddress = testData.associatedTokenAccountsForSol2022.accounts[0].ata;
46
+ const destinationTokenAddress = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
47
+ const authorityAddress = account.pub;
48
+ const zeroBytes36 = '00'.repeat(36);
49
+ const zeroBytes64 = '00'.repeat(64);
50
+ const proofDataHex = '00'.repeat(320);
51
+ const v1Config = {
52
+ computeUnitLimit: 200000,
53
+ heapSize: 32768,
54
+ loadedAccountsDataSizeLimit: 65536,
55
+ priorityFee: 5000,
56
+ };
57
+ const ctBuilder = () => {
58
+ const txBuilder = factory.getConfidentialTransferBuilder();
59
+ txBuilder.nonce(recentBlockHash);
60
+ txBuilder.sender(account.pub);
61
+ txBuilder.sign({ key: account.prv });
62
+ return txBuilder;
63
+ };
64
+ const addTransfer = (builder) => {
65
+ builder
66
+ .applyPendingBalance({
67
+ tokenAddress,
68
+ authorityAddress,
69
+ expectedPendingBalanceCreditCounter: '2',
70
+ newDecryptableAvailableBalance: zeroBytes36,
71
+ })
72
+ .verifyEqualityProof({ proofData: proofDataHex })
73
+ .verifyValidityProof({ proofData: proofDataHex })
74
+ .verifyRangeProof({ proofData: '00'.repeat(1000) })
75
+ .confidentialTransfer({
76
+ sourceTokenAddress: tokenAddress,
77
+ mintAddress,
78
+ destinationTokenAddress,
79
+ authorityAddress,
80
+ newSourceDecryptableAvailableBalance: zeroBytes36,
81
+ transferAmountAuditorCiphertextLo: zeroBytes64,
82
+ transferAmountAuditorCiphertextHi: zeroBytes64,
83
+ equalityProofInstructionOffset: 1,
84
+ ciphertextValidityProofInstructionOffset: 2,
85
+ rangeProofInstructionOffset: 3,
86
+ });
87
+ };
88
+ it('should build a v1 confidential transfer transaction (0x81 prefix, within 4096 bytes)', async () => {
89
+ const builder = ctBuilder();
90
+ addTransfer(builder);
91
+ builder.version(1).transactionConfig(v1Config);
92
+ const tx = await builder.build();
93
+ tx.isVersionedTransaction().should.equal(true);
94
+ tx.v1TransactionBytes.should.be.an.instanceOf(Uint8Array);
95
+ const rawTx = tx.toBroadcastFormat();
96
+ const wire = Buffer.from(rawTx, 'base64');
97
+ // v1 version byte prefix
98
+ wire[0].should.equal(0x81);
99
+ // within the v1 wire size limit
100
+ wire.length.should.be.lessThanOrEqual(4096);
101
+ // config preserved in the decoded v1 message
102
+ });
103
+ it('should require transactionConfig when version(1) is set', async () => {
104
+ const builder = ctBuilder();
105
+ addTransfer(builder);
106
+ builder.version(1);
107
+ await builder.build().should.be.rejectedWith(/transactionConfig is required/);
108
+ });
109
+ it('should reject v1 transactions that exceed the 4096-byte wire limit at broadcast', async () => {
110
+ const builder = ctBuilder();
111
+ addTransfer(builder);
112
+ builder.version(1).transactionConfig(v1Config);
113
+ const tx = await builder.build();
114
+ const rawTx = tx.toBroadcastFormat();
115
+ // Force an oversized v1 payload by padding the wire bytes past the limit.
116
+ const wire = Buffer.from(rawTx, 'base64');
117
+ const oversized = Buffer.concat([wire, Buffer.alloc(4097)]);
118
+ oversized[0].should.equal(0x81);
119
+ // Broadcast the oversized v1 tx through Sol.prototype.broadcastTransaction with an RPC
120
+ // stub that must not be reached - the size guard short-circuits before the RPC call.
121
+ const coin = { getDataFromNode: () => Promise.reject(new Error('RPC should not be reached')) };
122
+ await src_1.Sol.prototype.broadcastTransaction
123
+ .call(coin, { serializedSignedTransaction: oversized.toString('base64') })
124
+ .should.be.rejectedWith(/exceeds the 4096-byte size limit/);
125
+ });
126
+ it('should leave the non-v1 path unchanged (v0/legacy default)', async () => {
127
+ const builder = ctBuilder();
128
+ builder.configureAccount({
129
+ tokenAddress,
130
+ mintAddress,
131
+ authorityAddress,
132
+ decryptableZeroBalance: zeroBytes36,
133
+ maximumPendingBalanceCreditCounter: '65536',
134
+ proofInstructionOffset: 1,
135
+ });
136
+ const tx = await builder.build();
137
+ const rawTx = tx.toBroadcastFormat();
138
+ // legacy transaction does not carry the 0x81 v1 prefix
139
+ Buffer.from(rawTx, 'base64')[0].should.not.equal(0x81);
140
+ tx.isVersionedTransaction().should.equal(false);
141
+ src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
142
+ });
143
+ });
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJWMS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvY29uZmlkZW50aWFsVHJhbnNmZXJWMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQixzQ0FBZ0U7QUFDaEUsOERBQWdEO0FBQ2hELDREQUF5RDtBQUV6RCxRQUFRLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO0lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BGLE1BQU0sZUFBZSxHQUFHLDhDQUE4QyxDQUFDO0lBRXZFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQUM7SUFDdEUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDaEYsTUFBTSx1QkFBdUIsR0FBRyw4Q0FBOEMsQ0FBQztJQUMvRSxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFFckMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEMsTUFBTSxRQUFRLEdBQUc7UUFDZixnQkFBZ0IsRUFBRSxN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QUFDO0lBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUN2QixZQUFZO1lBQ1osV0FBVztZQUNYLGdCQUFnQjtZQUNoQixzQkFBc0IsRUFBRSxXQUFXO1lBQ25DLGtDQUFrQyxFQUFFLE9BQU87WUFDM0Msc0JBQXNCLEVBQUUsQ0FBQztTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBSSxFQUFrQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdEQsdURBQXVEO1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELEVBQWtCLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLFdBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXlQYWlyLCBTb2wsIFRyYW5zYWN0aW9uLCBVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuXG5kZXNjcmliZSgnU29sYW5hIENvbmZpZGVudGlhbCBUcmFuc2ZlciBCdWlsZGVyIC0gdjEnLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgnc29sJyk7XG4gIGNvbnN0IGFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXSkuZ2V0S2V5cygpO1xuICBjb25zdCByZWNlbnRCbG9ja0hhc2ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuXG4gIGNvbnN0IG1pbnRBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLm1pbnRJZDtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MgPSAnRU5uOGEydEdNUzliUjVYVjdzbUdISnZOZ3preXhKbW5EMmVVdlF4WTVqU1AnO1xuICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gYWNjb3VudC5wdWI7XG5cbiAgY29uc3QgemVyb0J5dGVzMzYgPSAnMDAnLnJlcGVhdCgzNik7XG4gIGNvbnN0IHplcm9CeXRlczY0ID0gJzAwJy5yZXBlYXQoNjQpO1xuICBjb25zdCBwcm9vZkRhdGFIZXggPSAnMDAnLnJlcGVhdCgzMjApO1xuXG4gIGNvbnN0IHYxQ29uZmlnID0ge1xuICAgIGNvbXB1dGVVbml0TGltaXQ6IDIwMF8wMDAsXG4gICAgaGVhcFNpemU6IDMyXzc2OCxcbiAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IDY1XzUzNixcbiAgICBwcmlvcml0eUZlZTogNV8wMDAsXG4gIH07XG5cbiAgY29uc3QgY3RCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYWRkVHJhbnNmZXIgPSAoYnVpbGRlcjogUmV0dXJuVHlwZTx0eXBlb2YgY3RCdWlsZGVyPikgPT4ge1xuICAgIGJ1aWxkZXJcbiAgICAgIC5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzInLFxuICAgICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgfSlcbiAgICAgIC52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlWYWxpZGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDMsXG4gICAgICB9KTtcbiAgfTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgdjEgY29uZmlkZW50aWFsIHRyYW5zZmVyIHRyYW5zYWN0aW9uICgweDgxIHByZWZpeCwgd2l0aGluIDQwOTYgYnl0ZXMpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICBhZGRUcmFuc2ZlcihidWlsZGVyKTtcbiAgICBidWlsZGVyLnZlcnNpb24oMSkudHJhbnNhY3Rpb25Db25maWcodjFDb25maWcpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAodHggYXMgVHJhbnNhY3Rpb24pLmlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgKHR4IGFzIFRyYW5zYWN0aW9uKS52MVRyYW5zYWN0aW9uQnl0ZXMhLnNob3VsZC5iZS5hbi5pbnN0YW5jZU9mKFVpbnQ4QXJyYXkpO1xuXG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHdpcmUgPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpO1xuXG4gICAgLy8gdjEgdmVyc2lvbiBieXRlIHByZWZpeFxuICAgIHdpcmVbMF0uc2hvdWxkLmVxdWFsKDB4ODEpO1xuICAgIC8vIHdpdGhpbiB0aGUgdjEgd2lyZSBzaXplIGxpbWl0XG4gICAgd2lyZS5sZW5ndGguc2hvdWxkLmJlLmxlc3NUaGFuT3JFcXVhbCg0MDk2KTtcblxuICAgIC8vIGNvbmZpZyBwcmVzZXJ2ZWQgaW4gdGhlIGRlY29kZWQgdjEgbWVzc2FnZVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlcXVpcmUgdHJhbnNhY3Rpb25Db25maWcgd2hlbiB2ZXJzaW9uKDEpIGlzIHNldCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgYWRkVHJhbnNmZXIoYnVpbGRlcik7XG4gICAgYnVpbGRlci52ZXJzaW9uKDEpO1xuXG4gICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3RyYW5zYWN0aW9uQ29uZmlnIGlzIHJlcXVpcmVkLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IHYxIHRyYW5zYWN0aW9ucyB0aGF0IGV4Y2VlZCB0aGUgNDA5Ni1ieXRlIHdpcmUgbGltaXQgYXQgYnJvYWRjYXN0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICBhZGRUcmFuc2ZlcihidWlsZGVyKTtcbiAgICBidWlsZGVyLnZlcnNpb24oMSkudHJhbnNhY3Rpb25Db25maWcodjFDb25maWcpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcmF3VHggPSAodHggYXMgVHJhbnNhY3Rpb24pLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAvLyBGb3JjZSBhbiBvdmVyc2l6ZWQgdjEgcGF5bG9hZCBieSBwYWRkaW5nIHRoZSB3aXJlIGJ5dGVzIHBhc3QgdGhlIGxpbWl0LlxuICAgIGNvbnN0IHdpcmUgPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG92ZXJzaXplZCA9IEJ1ZmZlci5jb25jYXQoW3dpcmUsIEJ1ZmZlci5hbGxvYyg0MDk3KV0pO1xuICAgIG92ZXJzaXplZFswXS5zaG91bGQuZXF1YWwoMHg4MSk7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIG92ZXJzaXplZCB2MSB0eCB0aHJvdWdoIFNvbC5wcm90b3R5cGUuYnJvYWRjYXN0VHJhbnNhY3Rpb24gd2l0aCBhbiBSUENcbiAgICAvLyBzdHViIHRoYXQgbXVzdCBub3QgYmUgcmVhY2hlZCAtIHRoZSBzaXplIGd1YXJkIHNob3J0LWNpcmN1aXRzIGJlZm9yZSB0aGUgUlBDIGNhbGwuXG4gICAgY29uc3QgY29pbiA9IHsgZ2V0RGF0YUZyb21Ob2RlOiAoKSA9PiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1JQQyBzaG91bGQgbm90IGJlIHJlYWNoZWQnKSkgfSBhcyB1bmtub3duIGFzIFNvbDtcbiAgICBhd2FpdCAoU29sLnByb3RvdHlwZS5icm9hZGNhc3RUcmFuc2FjdGlvbiBhcyAob3B0czogeyBzZXJpYWxpemVkU2lnbmVkVHJhbnNhY3Rpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPG5ldmVyPilcbiAgICAgIC5jYWxsKGNvaW4sIHsgc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uOiBvdmVyc2l6ZWQudG9TdHJpbmcoJ2Jhc2U2NCcpIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZXhjZWVkcyB0aGUgNDA5Ni1ieXRlIHNpemUgbGltaXQvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBsZWF2ZSB0aGUgbm9uLXYxIHBhdGggdW5jaGFuZ2VkICh2MC9sZWdhY3kgZGVmYXVsdCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICBtaW50QWRkcmVzcyxcbiAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcmF3VHggPSAodHggYXMgVHJhbnNhY3Rpb24pLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgLy8gbGVnYWN5IHRyYW5zYWN0aW9uIGRvZXMgbm90IGNhcnJ5IHRoZSAweDgxIHYxIHByZWZpeFxuICAgIEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0JylbMF0uc2hvdWxkLm5vdC5lcXVhbCgweDgxKTtcbiAgICAodHggYXMgVHJhbnNhY3Rpb24pLmlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=confidentialTransferV1Ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidentialTransferV1Ops.d.ts","sourceRoot":"","sources":["../../../../../test/unit/transactionBuilder/confidentialTransferV1Ops.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ require("should");
37
+ const src_1 = require("../../../src");
38
+ const testData = __importStar(require("../../resources/sol"));
39
+ const getBuilderFactory_1 = require("../getBuilderFactory");
40
+ describe('Solana Confidential Transfer Builder - v1 per-op', () => {
41
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
42
+ const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
43
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
44
+ const mintAddress = testData.associatedTokenAccountsForSol2022.mintId;
45
+ const tokenAddress = testData.associatedTokenAccountsForSol2022.accounts[0].ata;
46
+ const destinationTokenAddress = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
47
+ const authorityAddress = account.pub;
48
+ const zeroBytes36 = '00'.repeat(36);
49
+ const zeroBytes64 = '00'.repeat(64);
50
+ const proofDataHex = '00'.repeat(320);
51
+ const v1Config = {
52
+ computeUnitLimit: 200000,
53
+ heapSize: 32768,
54
+ loadedAccountsDataSizeLimit: 65536,
55
+ priorityFee: 5000,
56
+ };
57
+ const ctBuilder = () => {
58
+ const b = factory.getConfidentialTransferBuilder();
59
+ b.nonce(recentBlockHash).sender(account.pub).sign({ key: account.prv });
60
+ return b;
61
+ };
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ const toV1 = (b) => b.version(1).transactionConfig(v1Config);
64
+ const assertV1 = (tx) => {
65
+ const wire = Buffer.from(tx.toBroadcastFormat(), 'base64');
66
+ wire[0].should.equal(0x81);
67
+ wire.length.should.be.lessThanOrEqual(4096);
68
+ tx.v1MessageBytes.should.be.an.instanceOf(Uint8Array);
69
+ };
70
+ it('should build a Deposit as a valid v1 transaction', async () => {
71
+ const b = ctBuilder();
72
+ b.confidentialDeposit({ tokenAddress, mintAddress, authorityAddress, amount: '1000000', decimals: 6 });
73
+ const tx = await toV1(b).build();
74
+ assertV1(tx);
75
+ });
76
+ it('should build a Withdraw (with equality + range proofs) as a valid v1 transaction', async () => {
77
+ const b = ctBuilder();
78
+ b.confidentialWithdraw({
79
+ tokenAddress,
80
+ mintAddress,
81
+ authorityAddress,
82
+ amount: '500000',
83
+ decimals: 6,
84
+ newDecryptableAvailableBalance: zeroBytes36,
85
+ equalityProofInstructionOffset: 1,
86
+ rangeProofInstructionOffset: 2,
87
+ })
88
+ .verifyEqualityProof({ proofData: proofDataHex })
89
+ .verifyRangeProof({ proofData: '00'.repeat(1000) });
90
+ const tx = await toV1(b).build();
91
+ assertV1(tx);
92
+ });
93
+ it('should force ApplyPendingBalance to instruction #1 even when added last', async () => {
94
+ const b = ctBuilder();
95
+ // Deliberately add Deposit first, then ApplyPendingBalance out of order.
96
+ b.confidentialDeposit({
97
+ tokenAddress,
98
+ mintAddress,
99
+ authorityAddress,
100
+ amount: '1000000',
101
+ decimals: 6,
102
+ }).applyPendingBalance({
103
+ tokenAddress,
104
+ authorityAddress,
105
+ expectedPendingBalanceCreditCounter: '2',
106
+ newDecryptableAvailableBalance: zeroBytes36,
107
+ });
108
+ const tx = await toV1(b).build();
109
+ assertV1(tx);
110
+ const instructions = tx.toJson().instructionsData;
111
+ instructions.should.have.length(2);
112
+ instructions[0].type.should.equal('ApplyPendingBalance');
113
+ instructions[1].type.should.equal('ConfidentialDeposit');
114
+ });
115
+ it('should build a private Transfer with all proofs as a valid v1 transaction', async () => {
116
+ const b = ctBuilder();
117
+ b.applyPendingBalance({
118
+ tokenAddress,
119
+ authorityAddress,
120
+ expectedPendingBalanceCreditCounter: '2',
121
+ newDecryptableAvailableBalance: zeroBytes36,
122
+ })
123
+ .verifyEqualityProof({ proofData: proofDataHex })
124
+ .verifyValidityProof({ proofData: proofDataHex })
125
+ .verifyRangeProof({ proofData: '00'.repeat(1000) })
126
+ .confidentialTransfer({
127
+ sourceTokenAddress: tokenAddress,
128
+ mintAddress,
129
+ destinationTokenAddress,
130
+ authorityAddress,
131
+ newSourceDecryptableAvailableBalance: zeroBytes36,
132
+ transferAmountAuditorCiphertextLo: zeroBytes64,
133
+ transferAmountAuditorCiphertextHi: zeroBytes64,
134
+ equalityProofInstructionOffset: 1,
135
+ ciphertextValidityProofInstructionOffset: 2,
136
+ rangeProofInstructionOffset: 3,
137
+ });
138
+ const tx = await toV1(b).build();
139
+ assertV1(tx);
140
+ const instructions = tx.toJson().instructionsData;
141
+ instructions[0].type.should.equal('ApplyPendingBalance');
142
+ instructions[4].type.should.equal('ConfidentialTransfer');
143
+ });
144
+ it('should build ConfigureAccount + VerifyPubkeyValidity as a valid v1 transaction', async () => {
145
+ const b = ctBuilder();
146
+ b.configureAccount({
147
+ tokenAddress,
148
+ mintAddress,
149
+ authorityAddress,
150
+ decryptableZeroBalance: zeroBytes36,
151
+ maximumPendingBalanceCreditCounter: '65536',
152
+ proofInstructionOffset: 1,
153
+ }).verifyPubkeyValidity({ proofData: proofDataHex });
154
+ const tx = await toV1(b).build();
155
+ assertV1(tx);
156
+ });
157
+ it('should build each verify-proof instruction through v1', async () => {
158
+ const b = ctBuilder();
159
+ b.verifyEqualityProof({ proofData: proofDataHex })
160
+ .verifyValidityProof({ proofData: proofDataHex })
161
+ .verifyRangeProof({ proofData: '00'.repeat(1000) })
162
+ .verifyPubkeyValidity({ proofData: proofDataHex });
163
+ const tx = await toV1(b).build();
164
+ assertV1(tx);
165
+ });
166
+ });
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJWMU9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvY29uZmlkZW50aWFsVHJhbnNmZXJWMU9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQixzQ0FBb0Q7QUFDcEQsOERBQWdEO0FBQ2hELDREQUF5RDtBQUV6RCxRQUFRLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BGLE1BQU0sZUFBZSxHQUFHLDhDQUE4QyxDQUFDO0lBRXZFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQUM7SUFDdEUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDaEYsTUFBTSx1QkFBdUIsR0FBRyw4Q0FBOEMsQ0FBQztJQUMvRSxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFFckMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEMsTUFBTSxRQUFRLEdBQUc7UUFDZixnQkFBZ0Is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QUM7SUFDZixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRSxNQUFNLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUM7YUFDL0MsbUJBQW1CLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUM7YUFDaEQsZ0JBQWdCLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQ2xELG9CQUFvQixDQUFDLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9zb2wnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5cbmRlc2NyaWJlKCdTb2xhbmEgQ29uZmlkZW50aWFsIFRyYW5zZmVyIEJ1aWxkZXIgLSB2MSBwZXItb3AnLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgnc29sJyk7XG4gIGNvbnN0IGFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXSkuZ2V0S2V5cygpO1xuICBjb25zdCByZWNlbnRCbG9ja0hhc2ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuXG4gIGNvbnN0IG1pbnRBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLm1pbnRJZDtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MgPSAnRU5uOGEydEdNUzliUjVYVjdzbUdISnZOZ3preXhKbW5EMmVVdlF4WTVqU1AnO1xuICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gYWNjb3VudC5wdWI7XG5cbiAgY29uc3QgemVyb0J5dGVzMzYgPSAnMDAnLnJlcGVhdCgzNik7XG4gIGNvbnN0IHplcm9CeXRlczY0ID0gJzAwJy5yZXBlYXQoNjQpO1xuICBjb25zdCBwcm9vZkRhdGFIZXggPSAnMDAnLnJlcGVhdCgzMjApO1xuXG4gIGNvbnN0IHYxQ29uZmlnID0ge1xuICAgIGNvbXB1dGVVbml0TGltaXQ6IDIwMF8wMDAsXG4gICAgaGVhcFNpemU6IDMyXzc2OCxcbiAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IDY1XzUzNixcbiAgICBwcmlvcml0eUZlZTogNV8wMDAsXG4gIH07XG5cbiAgY29uc3QgY3RCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IGIgPSBmYWN0b3J5LmdldENvbmZpZGVudGlhbFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIGIubm9uY2UocmVjZW50QmxvY2tIYXNoKS5zZW5kZXIoYWNjb3VudC5wdWIpLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgIHJldHVybiBiO1xuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHRvVjEgPSAoYjogYW55KSA9PiBiLnZlcnNpb24oMSkudHJhbnNhY3Rpb25Db25maWcodjFDb25maWcpO1xuXG4gIGNvbnN0IGFzc2VydFYxID0gKHR4OiBUcmFuc2FjdGlvbikgPT4ge1xuICAgIGNvbnN0IHdpcmUgPSBCdWZmZXIuZnJvbSgodHggYXMgVHJhbnNhY3Rpb24pLnRvQnJvYWRjYXN0Rm9ybWF0KCksICdiYXNlNjQnKTtcbiAgICB3aXJlWzBdLnNob3VsZC5lcXVhbCgweDgxKTtcbiAgICB3aXJlLmxlbmd0aC5zaG91bGQuYmUubGVzc1RoYW5PckVxdWFsKDQwOTYpO1xuICAgICh0eCBhcyBUcmFuc2FjdGlvbikudjFNZXNzYWdlQnl0ZXMhLnNob3VsZC5iZS5hbi5pbnN0YW5jZU9mKFVpbnQ4QXJyYXkpO1xuICB9O1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBEZXBvc2l0IGFzIGEgdmFsaWQgdjEgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYiA9IGN0QnVpbGRlcigpO1xuICAgIGIuY29uZmlkZW50aWFsRGVwb3NpdCh7IHRva2VuQWRkcmVzcywgbWludEFkZHJlc3MsIGF1dGhvcml0eUFkZHJlc3MsIGFtb3VudDogJzEwMDAwMDAnLCBkZWNpbWFsczogNiB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRvVjEoYikuYnVpbGQoKTtcbiAgICBhc3NlcnRWMSh0eCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBXaXRoZHJhdyAod2l0aCBlcXVhbGl0eSArIHJhbmdlIHByb29mcykgYXMgYSB2YWxpZCB2MSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gY3RCdWlsZGVyKCk7XG4gICAgYi5jb25maWRlbnRpYWxXaXRoZHJhdyh7XG4gICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICBtaW50QWRkcmVzcyxcbiAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgIH0pXG4gICAgICAudmVyaWZ5RXF1YWxpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pXG4gICAgICAudmVyaWZ5UmFuZ2VQcm9vZih7IHByb29mRGF0YTogJzAwJy5yZXBlYXQoMTAwMCkgfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0b1YxKGIpLmJ1aWxkKCk7XG4gICAgYXNzZXJ0VjEodHgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZvcmNlIEFwcGx5UGVuZGluZ0JhbGFuY2UgdG8gaW5zdHJ1Y3Rpb24gIzEgZXZlbiB3aGVuIGFkZGVkIGxhc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYiA9IGN0QnVpbGRlcigpO1xuICAgIC8vIERlbGliZXJhdGVseSBhZGQgRGVwb3NpdCBmaXJzdCwgdGhlbiBBcHBseVBlbmRpbmdCYWxhbmNlIG91dCBvZiBvcmRlci5cbiAgICBiLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgbWludEFkZHJlc3MsXG4gICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICBkZWNpbWFsczogNixcbiAgICB9KS5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzInLFxuICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRvVjEoYikuYnVpbGQoKTtcbiAgICBhc3NlcnRWMSh0eCk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gdHgudG9Kc29uKCkuaW5zdHJ1Y3Rpb25zRGF0YTtcbiAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQXBwbHlQZW5kaW5nQmFsYW5jZScpO1xuICAgIGluc3RydWN0aW9uc1sxXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsRGVwb3NpdCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgcHJpdmF0ZSBUcmFuc2ZlciB3aXRoIGFsbCBwcm9vZnMgYXMgYSB2YWxpZCB2MSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gY3RCdWlsZGVyKCk7XG4gICAgYi5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzInLFxuICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICB9KVxuICAgICAgLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KVxuICAgICAgLnZlcmlmeVZhbGlkaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KVxuICAgICAgLnZlcmlmeVJhbmdlUHJvb2YoeyBwcm9vZkRhdGE6ICcwMCcucmVwZWF0KDEwMDApIH0pXG4gICAgICAuY29uZmlkZW50aWFsVHJhbnNmZXIoe1xuICAgICAgICBzb3VyY2VUb2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGRlc3RpbmF0aW9uVG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0SGk6IHplcm9CeXRlczY0LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICAgIHJhbmdlUHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMyxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdG9WMShiKS5idWlsZCgpO1xuICAgIGFzc2VydFYxKHR4KTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQXBwbHlQZW5kaW5nQmFsYW5jZScpO1xuICAgIGluc3RydWN0aW9uc1s0XS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBDb25maWd1cmVBY2NvdW50ICsgVmVyaWZ5UHVia2V5VmFsaWRpdHkgYXMgYSB2YWxpZCB2MSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gY3RCdWlsZGVyKCk7XG4gICAgYi5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgfSkudmVyaWZ5UHVia2V5VmFsaWRpdHkoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRvVjEoYikuYnVpbGQoKTtcbiAgICBhc3NlcnRWMSh0eCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgZWFjaCB2ZXJpZnktcHJvb2YgaW5zdHJ1Y3Rpb24gdGhyb3VnaCB2MScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gY3RCdWlsZGVyKCk7XG4gICAgYi52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlWYWxpZGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgLnZlcmlmeVB1YmtleVZhbGlkaXR5KHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0b1YxKGIpLmJ1aWxkKCk7XG4gICAgYXNzZXJ0VjEodHgpO1xuICB9KTtcbn0pO1xuIl19