@bitgo/sdk-coin-starknet 1.3.4 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const should_1 = __importDefault(require("should"));
7
+ const statics_1 = require("@bitgo/statics");
8
+ const transactionBuilderFactory_1 = require("../../src/lib/transactionBuilderFactory");
9
+ const iface_1 = require("../../src/lib/iface");
10
+ const starknet_1 = require("../resources/starknet");
11
+ const constants_1 = require("../../src/lib/constants");
12
+ describe('Starknet WalletInitializationBuilder', () => {
13
+ const coinConfig = statics_1.coins.get('starknet');
14
+ const chainId = starknet_1.SandboxTransferData.chainId;
15
+ describe('Build deploy account transaction', () => {
16
+ it('should build DEPLOY_ACCOUNT and produce a transactionHash', async () => {
17
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
18
+ const builder = factory.getWalletInitializationBuilder();
19
+ builder.fromPublicKey(starknet_1.Accounts.account1.publicKey).nonce('0x0').chainId(chainId);
20
+ const tx = (await builder.build());
21
+ const data = tx.starknetTransactionData;
22
+ data.transactionType.should.equal(iface_1.StarknetTransactionType.DEPLOY_ACCOUNT);
23
+ should_1.default.exist(data.transactionHash);
24
+ data.transactionHash.should.startWith('0x');
25
+ data.senderAddress.should.equal(starknet_1.Accounts.account1.address);
26
+ data.classHash.should.equal(constants_1.OZ_ETH_ACCOUNT_CLASS_HASH);
27
+ should_1.default.exist(data.constructorCalldata);
28
+ should_1.default.exist(data.contractAddressSalt);
29
+ data.calls.should.have.length(0);
30
+ });
31
+ it('should set signableHex from the Poseidon deploy hash', async () => {
32
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
33
+ const builder = factory.getWalletInitializationBuilder();
34
+ builder.fromPublicKey(starknet_1.Accounts.account1.publicKey).nonce('0x0').chainId(chainId);
35
+ const tx = (await builder.build());
36
+ tx.signableHex.should.equal(tx.starknetTransactionData.transactionHash);
37
+ tx.id.should.equal(tx.starknetTransactionData.transactionHash);
38
+ });
39
+ it('should produce different hashes for different accounts', async () => {
40
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
41
+ const builder1 = factory.getWalletInitializationBuilder();
42
+ builder1.fromPublicKey(starknet_1.Accounts.account1.publicKey).nonce('0x0').chainId(chainId);
43
+ const tx1 = (await builder1.build());
44
+ const builder2 = factory.getWalletInitializationBuilder();
45
+ builder2.fromPublicKey(starknet_1.Accounts.account2.publicKey).nonce('0x0').chainId(chainId);
46
+ const tx2 = (await builder2.build());
47
+ tx1.signableHex.should.not.equal(tx2.signableHex);
48
+ });
49
+ it('should round-trip through toInternalHex and factory.from', async () => {
50
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
51
+ const builder = factory.getWalletInitializationBuilder();
52
+ builder.fromPublicKey(starknet_1.Accounts.account1.publicKey).nonce('0x0').chainId(chainId);
53
+ const tx = (await builder.build());
54
+ const internalHex = tx.toInternalHex();
55
+ const factory2 = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
56
+ const builder2 = await factory2.from(internalHex);
57
+ const tx2 = (await builder2.build());
58
+ tx2.signableHex.should.equal(tx.signableHex);
59
+ tx2.starknetTransactionData.transactionType.should.equal(iface_1.StarknetTransactionType.DEPLOY_ACCOUNT);
60
+ });
61
+ it('toBroadcastFormat should return DEPLOY_ACCOUNT RPC JSON', async () => {
62
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
63
+ const builder = factory.getWalletInitializationBuilder();
64
+ builder.fromPublicKey(starknet_1.Accounts.account1.publicKey).nonce('0x0').chainId(chainId);
65
+ const tx = (await builder.build());
66
+ const broadcast = tx.toBroadcastFormat();
67
+ const parsed = JSON.parse(broadcast);
68
+ parsed.type.should.equal('DEPLOY_ACCOUNT');
69
+ parsed.version.should.equal('0x3');
70
+ parsed.sender_address.should.equal(starknet_1.Accounts.account1.address);
71
+ parsed.class_hash.should.equal(constants_1.OZ_ETH_ACCOUNT_CLASS_HASH);
72
+ parsed.constructor_calldata.should.be.Array().and.not.empty();
73
+ parsed.contract_address_salt.should.startWith('0x');
74
+ parsed.nonce.should.equal('0x0');
75
+ parsed.resource_bounds.should.have.property('l2_gas');
76
+ parsed.nonce_data_availability_mode.should.equal('L1');
77
+ parsed.fee_data_availability_mode.should.equal('L1');
78
+ parsed.should.not.have.property('calldata');
79
+ parsed.should.not.have.property('account_deployment_data');
80
+ });
81
+ });
82
+ describe('Validation', () => {
83
+ it('should reject build without public key or deploy fields', async () => {
84
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
85
+ const builder = factory.getWalletInitializationBuilder();
86
+ builder.sender(starknet_1.Accounts.account1.address).nonce('0x0').chainId(chainId);
87
+ await builder.build().should.be.rejectedWith(/public key|constructor calldata/i);
88
+ });
89
+ it('should reject mismatched address and public key', () => {
90
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
91
+ const builder = factory.getWalletInitializationBuilder();
92
+ (() => builder
93
+ .fromPublicKey(starknet_1.Accounts.account1.publicKey)
94
+ .sender(starknet_1.Accounts.account2.address, starknet_1.Accounts.account1.publicKey)).should.throw(/[Aa]ddress/);
95
+ });
96
+ });
97
+ });
98
+ describe('Starknet deploy account RPC wire format (live Sepolia)', () => {
99
+ it('should reach node validation (not param parse error) for unsigned deploy', async function () {
100
+ this.timeout(15000);
101
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('starknet'));
102
+ const builder = factory.getWalletInitializationBuilder();
103
+ builder.fromPublicKey(starknet_1.Accounts.account1.publicKey).nonce('0x0').chainId(starknet_1.SandboxTransferData.chainId);
104
+ const tx = (await builder.build());
105
+ const body = {
106
+ jsonrpc: '2.0',
107
+ method: 'starknet_addDeployAccountTransaction',
108
+ params: [JSON.parse(tx.toBroadcastFormat())],
109
+ id: 1,
110
+ };
111
+ const response = await fetch('https://api.cartridge.gg/x/starknet/sepolia', {
112
+ method: 'POST',
113
+ headers: { 'Content-Type': 'application/json' },
114
+ body: JSON.stringify(body),
115
+ });
116
+ const json = (await response.json());
117
+ should_1.default.exist(json.error);
118
+ const msg = json.error?.message || '';
119
+ msg.should.not.match(/parsing params|EOF/i);
120
+ msg.should.match(/signature|Validate|nonce|fee|resource|Invalid params/i);
121
+ });
122
+ });
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3dhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1Qiw0Q0FBdUM7QUFDdkMsdUZBQW9GO0FBRXBGLCtDQUE4RDtBQUM5RCxvREFBc0U7QUFDdEUsdURBQW9FO0FBRXBFLFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7SUFDcEQsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FBRyw4QkFBbUIsQ0FBQyxPQUFPLENBQUM7SUFFNUMsUUFBUSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxxREFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUV6RCxPQUFPLENBQUMsYUFBYSxDQUFDLG1CQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFakYsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztZQUNsRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7WUFFeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFFLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZ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Q0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFN0YXJrbmV0VHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBBY2NvdW50cywgU2FuZGJveFRyYW5zZmVyRGF0YSB9IGZyb20gJy4uL3Jlc291cmNlcy9zdGFya25ldCc7XG5pbXBvcnQgeyBPWl9FVEhfQUNDT1VOVF9DTEFTU19IQVNIIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuXG5kZXNjcmliZSgnU3RhcmtuZXQgV2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCdzdGFya25ldCcpO1xuICBjb25zdCBjaGFpbklkID0gU2FuZGJveFRyYW5zZmVyRGF0YS5jaGFpbklkO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCBkZXBsb3kgYWNjb3VudCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIERFUExPWV9BQ0NPVU5UIGFuZCBwcm9kdWNlIGEgdHJhbnNhY3Rpb25IYXNoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG5cbiAgICAgIGJ1aWxkZXIuZnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpLm5vbmNlKCcweDAnKS5jaGFpbklkKGNoYWluSWQpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgZGF0YSA9IHR4LnN0YXJrbmV0VHJhbnNhY3Rpb25EYXRhO1xuXG4gICAgICBkYXRhLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoU3RhcmtuZXRUcmFuc2FjdGlvblR5cGUuREVQTE9ZX0FDQ09VTlQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGRhdGEudHJhbnNhY3Rpb25IYXNoKTtcbiAgICAgIChkYXRhLnRyYW5zYWN0aW9uSGFzaCBhcyBzdHJpbmcpLnNob3VsZC5zdGFydFdpdGgoJzB4Jyk7XG4gICAgICBkYXRhLnNlbmRlckFkZHJlc3Muc2hvdWxkLmVxdWFsKEFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgKGRhdGEuY2xhc3NIYXNoIGFzIHN0cmluZykuc2hvdWxkLmVxdWFsKE9aX0VUSF9BQ0NPVU5UX0NMQVNTX0hBU0gpO1xuICAgICAgc2hvdWxkLmV4aXN0KGRhdGEuY29uc3RydWN0b3JDYWxsZGF0YSk7XG4gICAgICBzaG91bGQuZXhpc3QoZGF0YS5jb250cmFjdEFkZHJlc3NTYWx0KTtcbiAgICAgIGRhdGEuY2FsbHMuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgc2lnbmFibGVIZXggZnJvbSB0aGUgUG9zZWlkb24gZGVwbG95IGhhc2gnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgYnVpbGRlci5mcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSkubm9uY2UoJzB4MCcpLmNoYWluSWQoY2hhaW5JZCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICB0eC5zaWduYWJsZUhleC5zaG91bGQuZXF1YWwodHguc3RhcmtuZXRUcmFuc2FjdGlvbkRhdGEudHJhbnNhY3Rpb25IYXNoKTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0eC5zdGFya25ldFRyYW5zYWN0aW9uRGF0YS50cmFuc2FjdGlvbkhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGRpZmZlcmVudCBoYXNoZXMgZm9yIGRpZmZlcmVudCBhY2NvdW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcblxuICAgICAgY29uc3QgYnVpbGRlcjEgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgYnVpbGRlcjEuZnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpLm5vbmNlKCcweDAnKS5jaGFpbklkKGNoYWluSWQpO1xuICAgICAgY29uc3QgdHgxID0gKGF3YWl0IGJ1aWxkZXIxLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICBidWlsZGVyMi5mcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQyLnB1YmxpY0tleSkubm9uY2UoJzB4MCcpLmNoYWluSWQoY2hhaW5JZCk7XG4gICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIHR4MS5zaWduYWJsZUhleC5zaG91bGQubm90LmVxdWFsKHR4Mi5zaWduYWJsZUhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJvdW5kLXRyaXAgdGhyb3VnaCB0b0ludGVybmFsSGV4IGFuZCBmYWN0b3J5LmZyb20nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgYnVpbGRlci5mcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSkubm9uY2UoJzB4MCcpLmNoYWluSWQoY2hhaW5JZCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBpbnRlcm5hbEhleCA9IHR4LnRvSW50ZXJuYWxIZXgoKTtcblxuICAgICAgY29uc3QgZmFjdG9yeTIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gYXdhaXQgZmFjdG9yeTIuZnJvbShpbnRlcm5hbEhleCk7XG4gICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIHR4Mi5zaWduYWJsZUhleC5zaG91bGQuZXF1YWwodHguc2lnbmFibGVIZXgpO1xuICAgICAgdHgyLnN0YXJrbmV0VHJhbnNhY3Rpb25EYXRhLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoU3RhcmtuZXRUcmFuc2FjdGlvblR5cGUuREVQTE9ZX0FDQ09VTlQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvQnJvYWRjYXN0Rm9ybWF0IHNob3VsZCByZXR1cm4gREVQTE9ZX0FDQ09VTlQgUlBDIEpTT04nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgYnVpbGRlci5mcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSkubm9uY2UoJzB4MCcpLmNoYWluSWQoY2hhaW5JZCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBicm9hZGNhc3QgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShicm9hZGNhc3QpO1xuXG4gICAgICBwYXJzZWQudHlwZS5zaG91bGQuZXF1YWwoJ0RFUExPWV9BQ0NPVU5UJyk7XG4gICAgICBwYXJzZWQudmVyc2lvbi5zaG91bGQuZXF1YWwoJzB4MycpO1xuICAgICAgcGFyc2VkLnNlbmRlcl9hZGRyZXNzLnNob3VsZC5lcXVhbChBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICAgIHBhcnNlZC5jbGFzc19oYXNoLnNob3VsZC5lcXVhbChPWl9FVEhfQUNDT1VOVF9DTEFTU19IQVNIKTtcbiAgICAgIHBhcnNlZC5jb25zdHJ1Y3Rvcl9jYWxsZGF0YS5zaG91bGQuYmUuQXJyYXkoKS5hbmQubm90LmVtcHR5KCk7XG4gICAgICBwYXJzZWQuY29udHJhY3RfYWRkcmVzc19zYWx0LnNob3VsZC5zdGFydFdpdGgoJzB4Jyk7XG4gICAgICBwYXJzZWQubm9uY2Uuc2hvdWxkLmVxdWFsKCcweDAnKTtcbiAgICAgIHBhcnNlZC5yZXNvdXJjZV9ib3VuZHMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2wyX2dhcycpO1xuICAgICAgcGFyc2VkLm5vbmNlX2RhdGFfYXZhaWxhYmlsaXR5X21vZGUuc2hvdWxkLmVxdWFsKCdMMScpO1xuICAgICAgcGFyc2VkLmZlZV9kYXRhX2F2YWlsYWJpbGl0eV9tb2RlLnNob3VsZC5lcXVhbCgnTDEnKTtcbiAgICAgIHBhcnNlZC5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2NhbGxkYXRhJyk7XG4gICAgICBwYXJzZWQuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdhY2NvdW50X2RlcGxveW1lbnRfZGF0YScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBidWlsZCB3aXRob3V0IHB1YmxpYyBrZXkgb3IgZGVwbG95IGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zZW5kZXIoQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcykubm9uY2UoJzB4MCcpLmNoYWluSWQoY2hhaW5JZCk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9wdWJsaWMga2V5fGNvbnN0cnVjdG9yIGNhbGxkYXRhL2kpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgbWlzbWF0Y2hlZCBhZGRyZXNzIGFuZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAoKCkgPT5cbiAgICAgICAgYnVpbGRlclxuICAgICAgICAgIC5mcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSlcbiAgICAgICAgICAuc2VuZGVyKEFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsIEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSkpLnNob3VsZC50aHJvdygvW0FhXWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnU3RhcmtuZXQgZGVwbG95IGFjY291bnQgUlBDIHdpcmUgZm9ybWF0IChsaXZlIFNlcG9saWEpJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHJlYWNoIG5vZGUgdmFsaWRhdGlvbiAobm90IHBhcmFtIHBhcnNlIGVycm9yKSBmb3IgdW5zaWduZWQgZGVwbG95JywgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1vY2hhLkNvbnRleHQpIHtcbiAgICB0aGlzLnRpbWVvdXQoMTUwMDApO1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3N0YXJrbmV0JykpO1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgIGJ1aWxkZXIuZnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpLm5vbmNlKCcweDAnKS5jaGFpbklkKFNhbmRib3hUcmFuc2ZlckRhdGEuY2hhaW5JZCk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICBtZXRob2Q6ICdzdGFya25ldF9hZGREZXBsb3lBY2NvdW50VHJhbnNhY3Rpb24nLFxuICAgICAgcGFyYW1zOiBbSlNPTi5wYXJzZSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKV0sXG4gICAgICBpZDogMSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuY2FydHJpZGdlLmdnL3gvc3RhcmtuZXQvc2Vwb2xpYScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBlcnJvcj86IHsgbWVzc2FnZT86IHN0cmluZyB9IH07XG5cbiAgICBzaG91bGQuZXhpc3QoanNvbi5lcnJvcik7XG4gICAgY29uc3QgbXNnID0ganNvbi5lcnJvcj8ubWVzc2FnZSB8fCAnJztcbiAgICBtc2cuc2hvdWxkLm5vdC5tYXRjaCgvcGFyc2luZyBwYXJhbXN8RU9GL2kpO1xuICAgIG1zZy5zaG91bGQubWF0Y2goL3NpZ25hdHVyZXxWYWxpZGF0ZXxub25jZXxmZWV8cmVzb3VyY2V8SW52YWxpZCBwYXJhbXMvaSk7XG4gIH0pO1xufSk7XG4iXX0=