@bitgo/sdk-coin-starknet 1.3.3 → 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.
- package/dist/src/lib/constants.d.ts +1 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +4 -2
- package/dist/src/lib/iface.d.ts +19 -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 +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/transaction.d.ts +3 -1
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +33 -4
- package/dist/src/lib/transactionBuilderFactory.d.ts +2 -1
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +6 -3
- package/dist/src/lib/utils.d.ts +6 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +43 -1
- package/dist/src/lib/walletInitializationBuilder.d.ts +26 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/walletInitializationBuilder.js +116 -0
- package/dist/test/unit/utils.d.ts.map +1 -1
- package/dist/test/unit/utils.js +41 -1
- package/dist/test/unit/walletInitializationBuilder.d.ts +2 -0
- package/dist/test/unit/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/test/unit/walletInitializationBuilder.js +123 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -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=
|