@bitgo/sdk-coin-canton 1.25.0 → 1.26.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.
Files changed (30) hide show
  1. package/dist/src/canton.d.ts.map +1 -1
  2. package/dist/src/canton.js +37 -3
  3. package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts +67 -0
  4. package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
  5. package/dist/src/lib/allocationAllocateWithdrawnBuilder.js +130 -0
  6. package/dist/src/lib/allocationRejectBuilder.d.ts +51 -0
  7. package/dist/src/lib/allocationRejectBuilder.d.ts.map +1 -0
  8. package/dist/src/lib/allocationRejectBuilder.js +107 -0
  9. package/dist/src/lib/iface.d.ts +3 -0
  10. package/dist/src/lib/iface.d.ts.map +1 -1
  11. package/dist/src/lib/iface.js +1 -1
  12. package/dist/src/lib/index.d.ts +2 -0
  13. package/dist/src/lib/index.d.ts.map +1 -1
  14. package/dist/src/lib/index.js +6 -2
  15. package/dist/src/lib/transactionBuilderFactory.d.ts +4 -0
  16. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  17. package/dist/src/lib/transactionBuilderFactory.js +15 -1
  18. package/dist/src/lib/utils.d.ts.map +1 -1
  19. package/dist/src/lib/utils.js +68 -1
  20. package/dist/test/resources.d.ts +17 -0
  21. package/dist/test/resources.d.ts.map +1 -1
  22. package/dist/test/resources.js +19 -2
  23. package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts +2 -0
  24. package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
  25. package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.js +133 -0
  26. package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.d.ts +2 -0
  27. package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.d.ts.map +1 -0
  28. package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.js +121 -0
  29. package/dist/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +6 -6
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=allocationAllocateWithdrawnBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocationAllocateWithdrawnBuilder.d.ts","sourceRoot":"","sources":["../../../../../test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
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 assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const statics_1 = require("@bitgo/statics");
9
+ const src_1 = require("../../../../src");
10
+ const resources_1 = require("../../../resources");
11
+ describe('AllocationAllocateWithdrawn Builder', () => {
12
+ it('should get the allocation allocate withdrawn request object', function () {
13
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
14
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
15
+ txBuilder.initBuilder(tx);
16
+ txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
17
+ const { commandId, contractId, partyId } = resources_1.TransferAcceptance;
18
+ txBuilder.commandId(commandId).contractId(contractId).actAs(partyId);
19
+ const requestObj = txBuilder.toRequestObject();
20
+ should_1.default.exist(requestObj);
21
+ assert_1.default.equal(requestObj.commandId, commandId);
22
+ assert_1.default.equal(requestObj.contractId, contractId);
23
+ assert_1.default.equal(requestObj.actAs.length, 1);
24
+ assert_1.default.equal(requestObj.actAs[0], partyId);
25
+ assert_1.default.equal(requestObj.verboseHashing, false);
26
+ assert_1.default.deepEqual(requestObj.readAs, []);
27
+ });
28
+ it('should include tokenName when set', function () {
29
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
30
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
31
+ txBuilder.initBuilder(tx);
32
+ txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
33
+ const { commandId, contractId, partyId } = resources_1.TransferAcceptance;
34
+ txBuilder.commandId(commandId).contractId(contractId).actAs(partyId).tokenName('tcanton:test-token');
35
+ const requestObj = txBuilder.toRequestObject();
36
+ assert_1.default.equal(requestObj.tokenName, 'tcanton:test-token');
37
+ });
38
+ it('should set the transaction id to the commandId', function () {
39
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
40
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
41
+ txBuilder.initBuilder(tx);
42
+ const { commandId } = resources_1.TransferAcceptance;
43
+ txBuilder.commandId(commandId);
44
+ assert_1.default.equal(tx.id, commandId);
45
+ });
46
+ it('should validate raw canton allocation allocate withdrawn transaction', function () {
47
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
48
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
49
+ txBuilder.initBuilder(tx);
50
+ txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
51
+ txBuilder.validateRawTransaction(resources_1.CantonAllocationWithdrawPrepareResponse.preparedTransaction);
52
+ });
53
+ it('should validate the transaction', function () {
54
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
55
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
56
+ tx.prepareCommand = resources_1.CantonAllocationWithdrawPrepareResponse;
57
+ txBuilder.initBuilder(tx);
58
+ txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
59
+ txBuilder.validateTransaction(tx);
60
+ });
61
+ it('should throw error on invalid raw transaction hash mismatch', function () {
62
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
63
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
64
+ txBuilder.initBuilder(tx);
65
+ const invalidPrepareResponse = {
66
+ ...resources_1.CantonAllocationWithdrawPrepareResponse,
67
+ preparedTransactionHash: '+vlIXv6Vgd2ypPXD0mrdn7RlcSH4c2hCRj2/tXqqUVs=',
68
+ };
69
+ txBuilder.setTransaction(invalidPrepareResponse);
70
+ try {
71
+ txBuilder.validateRawTransaction(invalidPrepareResponse.preparedTransaction);
72
+ }
73
+ catch (e) {
74
+ assert_1.default.equal(e.message, 'invalid raw transaction, hash not matching');
75
+ }
76
+ });
77
+ it('should throw if commandId is missing', function () {
78
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
79
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
80
+ txBuilder.initBuilder(tx);
81
+ const { contractId, partyId } = resources_1.TransferAcceptance;
82
+ txBuilder.contractId(contractId).actAs(partyId);
83
+ assert_1.default.throws(() => txBuilder.toRequestObject(), /commandId is missing/);
84
+ });
85
+ it('should throw if contractId is missing', function () {
86
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
87
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
88
+ txBuilder.initBuilder(tx);
89
+ const { commandId, partyId } = resources_1.TransferAcceptance;
90
+ txBuilder.commandId(commandId).actAs(partyId);
91
+ assert_1.default.throws(() => txBuilder.toRequestObject(), /contractId is missing/);
92
+ });
93
+ it('should throw if actAs is missing', function () {
94
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
95
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
96
+ txBuilder.initBuilder(tx);
97
+ const { commandId, contractId } = resources_1.TransferAcceptance;
98
+ txBuilder.commandId(commandId).contractId(contractId);
99
+ assert_1.default.throws(() => txBuilder.toRequestObject(), /actAs partyId is missing/);
100
+ });
101
+ it('should throw if commandId is an empty string', function () {
102
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
103
+ assert_1.default.throws(() => txBuilder.commandId(''), /commandId must be a non-empty string/);
104
+ });
105
+ it('should throw if contractId is an empty string', function () {
106
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
107
+ assert_1.default.throws(() => txBuilder.contractId(''), /contractId must be a non-empty string/);
108
+ });
109
+ it('should throw if actAs is an empty string', function () {
110
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
111
+ assert_1.default.throws(() => txBuilder.actAs(''), /actAsPartyId must be a non-empty string/);
112
+ });
113
+ it('should throw if tokenName is an empty string', function () {
114
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
115
+ assert_1.default.throws(() => txBuilder.tokenName(''), /tokenName must be a non-empty string/);
116
+ });
117
+ describe('Prepared transaction parsing', () => {
118
+ it('should parse the allocation allocate withdrawn prepared transaction', function () {
119
+ const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
120
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
121
+ txBuilder.initBuilder(tx);
122
+ txBuilder.commandId(resources_1.TransferAcceptance.commandId);
123
+ txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
124
+ const txData = txBuilder.transaction.toJson();
125
+ should_1.default.exist(txData);
126
+ // owner of the returned Holding = sender = receiver
127
+ assert_1.default.equal(txData.sender, 'ravi-2-step-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
128
+ assert_1.default.equal(txData.sender, txData.receiver);
129
+ assert_1.default.equal(txData.amount, '50000000000');
130
+ });
131
+ });
132
+ });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9idWlsZGVyL2FsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bi9hbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw0Q0FBdUM7QUFFdkMseUNBQWtGO0FBR2xGLGtEQUFpRztBQUVqRyxRQUFRLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFO0lBQ25ELEVBQUUsQ0FBQyw2REFBNkQsRUFBRTtRQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLHdDQUFrQyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvRSxNQUFNLEVBQUUsR0FBRyxJQUFJLGlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pELFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxtREFBdUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLDhCQUFrQixDQUFDO1FBQzlELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRSxNQUFNLFVBQVUsR0FBNkMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pGLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsZ0JB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N0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25SZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmltcG9ydCB7IENhbnRvbkFsbG9jYXRpb25XaXRoZHJhd1ByZXBhcmVSZXNwb25zZSwgVHJhbnNmZXJBY2NlcHRhbmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ0FsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3biBCdWlsZGVyJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGdldCB0aGUgYWxsb2NhdGlvbiBhbGxvY2F0ZSB3aXRoZHJhd24gcmVxdWVzdCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uV2l0aGRyYXdQcmVwYXJlUmVzcG9uc2UpO1xuICAgIGNvbnN0IHsgY29tbWFuZElkLCBjb250cmFjdElkLCBwYXJ0eUlkIH0gPSBUcmFuc2ZlckFjY2VwdGFuY2U7XG4gICAgdHhCdWlsZGVyLmNvbW1hbmRJZChjb21tYW5kSWQpLmNvbnRyYWN0SWQoY29udHJhY3RJZCkuYWN0QXMocGFydHlJZCk7XG4gICAgY29uc3QgcmVxdWVzdE9iajogQ2FudG9uQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduUmVxdWVzdCA9IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKTtcbiAgICBzaG91bGQuZXhpc3QocmVxdWVzdE9iaik7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouY29tbWFuZElkLCBjb21tYW5kSWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmNvbnRyYWN0SWQsIGNvbnRyYWN0SWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmFjdEFzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouYWN0QXNbMF0sIHBhcnR5SWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLnZlcmJvc2VIYXNoaW5nLCBmYWxzZSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChyZXF1ZXN0T2JqLnJlYWRBcywgW10pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGluY2x1ZGUgdG9rZW5OYW1lIHdoZW4gc2V0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXIuc2V0VHJhbnNhY3Rpb24oQ2FudG9uQWxsb2NhdGlvbldpdGhkcmF3UHJlcGFyZVJlc3BvbnNlKTtcbiAgICBjb25zdCB7IGNvbW1hbmRJZCwgY29udHJhY3RJZCwgcGFydHlJZCB9ID0gVHJhbnNmZXJBY2NlcHRhbmNlO1xuICAgIHR4QnVpbGRlci5jb21tYW5kSWQoY29tbWFuZElkKS5jb250cmFjdElkKGNvbnRyYWN0SWQpLmFjdEFzKHBhcnR5SWQpLnRva2VuTmFtZSgndGNhbnRvbjp0ZXN0LXRva2VuJyk7XG4gICAgY29uc3QgcmVxdWVzdE9iajogQ2FudG9uQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduUmVxdWVzdCA9IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai50b2tlbk5hbWUsICd0Y2FudG9uOnRlc3QtdG9rZW4nKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzZXQgdGhlIHRyYW5zYWN0aW9uIGlkIHRvIHRoZSBjb21tYW5kSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIGNvbnN0IHsgY29tbWFuZElkIH0gPSBUcmFuc2ZlckFjY2VwdGFuY2U7XG4gICAgdHhCdWlsZGVyLmNvbW1hbmRJZChjb21tYW5kSWQpO1xuICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgY29tbWFuZElkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSByYXcgY2FudG9uIGFsbG9jYXRpb24gYWxsb2NhdGUgd2l0aGRyYXduIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXIuc2V0VHJhbnNhY3Rpb24oQ2FudG9uQWxsb2NhdGlvbldpdGhkcmF3UHJlcGFyZVJlc3BvbnNlKTtcbiAgICB0eEJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uV2l0aGRyYXdQcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHgucHJlcGFyZUNvbW1hbmQgPSBDYW50b25BbGxvY2F0aW9uV2l0aGRyYXdQcmVwYXJlUmVzcG9uc2U7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXIuc2V0VHJhbnNhY3Rpb24oQ2FudG9uQWxsb2NhdGlvbldpdGhkcmF3UHJlcGFyZVJlc3BvbnNlKTtcbiAgICB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih0eCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igb24gaW52YWxpZCByYXcgdHJhbnNhY3Rpb24gaGFzaCBtaXNtYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgaW52YWxpZFByZXBhcmVSZXNwb25zZSA9IHtcbiAgICAgIC4uLkNhbnRvbkFsbG9jYXRpb25XaXRoZHJhd1ByZXBhcmVSZXNwb25zZSxcbiAgICAgIHByZXBhcmVkVHJhbnNhY3Rpb25IYXNoOiAnK3ZsSVh2NlZnZDJ5cFBYRDBtcmRuN1JsY1NINGMyaENSajIvdFhxcVVWcz0nLFxuICAgIH07XG4gICAgdHhCdWlsZGVyLnNldFRyYW5zYWN0aW9uKGludmFsaWRQcmVwYXJlUmVzcG9uc2UpO1xuICAgIHRyeSB7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihpbnZhbGlkUHJlcGFyZVJlc3BvbnNlLnByZXBhcmVkVHJhbnNhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbiwgaGFzaCBub3QgbWF0Y2hpbmcnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgY29tbWFuZElkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIGNvbnN0IHsgY29udHJhY3RJZCwgcGFydHlJZCB9ID0gVHJhbnNmZXJBY2NlcHRhbmNlO1xuICAgIHR4QnVpbGRlci5jb250cmFjdElkKGNvbnRyYWN0SWQpLmFjdEFzKHBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvY29tbWFuZElkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb250cmFjdElkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIGNvbnN0IHsgY29tbWFuZElkLCBwYXJ0eUlkIH0gPSBUcmFuc2ZlckFjY2VwdGFuY2U7XG4gICAgdHhCdWlsZGVyLmNvbW1hbmRJZChjb21tYW5kSWQpLmFjdEFzKHBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvY29udHJhY3RJZCBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgYWN0QXMgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgeyBjb21tYW5kSWQsIGNvbnRyYWN0SWQgfSA9IFRyYW5zZmVyQWNjZXB0YW5jZTtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCkuY29udHJhY3RJZChjb250cmFjdElkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL2FjdEFzIHBhcnR5SWQgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbW1hbmRJZCBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmNvbW1hbmRJZCgnJyksIC9jb21tYW5kSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb250cmFjdElkIGlzIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuY29udHJhY3RJZCgnJyksIC9jb250cmFjdElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgYWN0QXMgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5hY3RBcygnJyksIC9hY3RBc1BhcnR5SWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0b2tlbk5hbWUgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b2tlbk5hbWUoJycpLCAvdG9rZW5OYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQcmVwYXJlZCB0cmFuc2FjdGlvbiBwYXJzaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIGFsbG9jYXRpb24gYWxsb2NhdGUgd2l0aGRyYXduIHByZXBhcmVkIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIHR4QnVpbGRlci5jb21tYW5kSWQoVHJhbnNmZXJBY2NlcHRhbmNlLmNvbW1hbmRJZCk7XG4gICAgICB0eEJ1aWxkZXIuc2V0VHJhbnNhY3Rpb24oQ2FudG9uQWxsb2NhdGlvbldpdGhkcmF3UHJlcGFyZVJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IHR4QnVpbGRlci50cmFuc2FjdGlvbi50b0pzb24oKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eERhdGEpO1xuICAgICAgLy8gb3duZXIgb2YgdGhlIHJldHVybmVkIEhvbGRpbmcgPSBzZW5kZXIgPSByZWNlaXZlclxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eERhdGEuc2VuZGVyLFxuICAgICAgICAncmF2aS0yLXN0ZXAtcGFydHk6OjEyMjA5MmU3ZDMzYWMxMGMwZjNkNTU5NzYzNDJmMzc1NTVkZjA1ZGE1Yjc0Mjk1NmQ1NmE2MmFlMjM2Nzc2OTA3OWQyJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eERhdGEuc2VuZGVyLCB0eERhdGEucmVjZWl2ZXIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4RGF0YS5hbW91bnQsICc1MDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=allocationRejectBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocationRejectBuilder.d.ts","sourceRoot":"","sources":["../../../../../test/unit/builder/allocationReject/allocationRejectBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
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 assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const statics_1 = require("@bitgo/statics");
9
+ const src_1 = require("../../../../src");
10
+ const resources_1 = require("../../../resources");
11
+ describe('AllocationReject Builder', () => {
12
+ it('should get the allocation reject request object', function () {
13
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
14
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
15
+ txBuilder.initBuilder(tx);
16
+ txBuilder.setTransaction(resources_1.CantonAllocationRejectPrepareResponse);
17
+ const { commandId, contractId, partyId } = resources_1.AllocationRejection;
18
+ txBuilder.commandId(commandId).contractId(contractId).actAs(partyId);
19
+ const requestObj = txBuilder.toRequestObject();
20
+ should_1.default.exist(requestObj);
21
+ assert_1.default.equal(requestObj.commandId, commandId);
22
+ assert_1.default.equal(requestObj.contractId, contractId);
23
+ assert_1.default.equal(requestObj.actAs.length, 1);
24
+ assert_1.default.equal(requestObj.actAs[0], partyId);
25
+ assert_1.default.equal(requestObj.verboseHashing, false);
26
+ assert_1.default.deepEqual(requestObj.readAs, []);
27
+ });
28
+ it('should set the transaction id to the commandId', function () {
29
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
30
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
31
+ txBuilder.initBuilder(tx);
32
+ const { commandId } = resources_1.AllocationRejection;
33
+ txBuilder.commandId(commandId);
34
+ assert_1.default.equal(tx.id, commandId);
35
+ });
36
+ it('should validate raw canton allocation reject transaction', function () {
37
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
38
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
39
+ txBuilder.initBuilder(tx);
40
+ txBuilder.setTransaction(resources_1.CantonAllocationRejectPrepareResponse);
41
+ txBuilder.validateRawTransaction(resources_1.CantonAllocationRejectPrepareResponse.preparedTransaction);
42
+ });
43
+ it('should validate the transaction', function () {
44
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
45
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
46
+ tx.prepareCommand = resources_1.CantonAllocationRejectPrepareResponse;
47
+ txBuilder.initBuilder(tx);
48
+ txBuilder.setTransaction(resources_1.CantonAllocationRejectPrepareResponse);
49
+ txBuilder.validateTransaction(tx);
50
+ });
51
+ it('should throw error on invalid raw transaction hash mismatch', function () {
52
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
53
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
54
+ txBuilder.initBuilder(tx);
55
+ const invalidPrepareResponse = {
56
+ ...resources_1.CantonAllocationRejectPrepareResponse,
57
+ preparedTransactionHash: 'L1KfrA5exnpsOqtXODGj2gNF+y/dv/onPtVvGJ5km7d=',
58
+ };
59
+ txBuilder.setTransaction(invalidPrepareResponse);
60
+ try {
61
+ txBuilder.validateRawTransaction(invalidPrepareResponse.preparedTransaction);
62
+ }
63
+ catch (e) {
64
+ assert_1.default.equal(e.message, 'invalid raw transaction, hash not matching');
65
+ }
66
+ });
67
+ it('should throw if commandId is missing', function () {
68
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
69
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
70
+ txBuilder.initBuilder(tx);
71
+ const { contractId, partyId } = resources_1.AllocationRejection;
72
+ txBuilder.contractId(contractId).actAs(partyId);
73
+ assert_1.default.throws(() => txBuilder.toRequestObject(), /commandId is missing/);
74
+ });
75
+ it('should throw if contractId is missing', function () {
76
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
77
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
78
+ txBuilder.initBuilder(tx);
79
+ const { commandId, partyId } = resources_1.AllocationRejection;
80
+ txBuilder.commandId(commandId).actAs(partyId);
81
+ assert_1.default.throws(() => txBuilder.toRequestObject(), /contractId is missing/);
82
+ });
83
+ it('should throw if actAs is missing', function () {
84
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
85
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
86
+ txBuilder.initBuilder(tx);
87
+ const { commandId, contractId } = resources_1.AllocationRejection;
88
+ txBuilder.commandId(commandId).contractId(contractId);
89
+ assert_1.default.throws(() => txBuilder.toRequestObject(), /actAs partyId is missing/);
90
+ });
91
+ it('should throw if commandId is an empty string', function () {
92
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
93
+ assert_1.default.throws(() => txBuilder.commandId(''), /commandId must be a non-empty string/);
94
+ });
95
+ it('should throw if contractId is an empty string', function () {
96
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
97
+ assert_1.default.throws(() => txBuilder.contractId(''), /contractId must be a non-empty string/);
98
+ });
99
+ it('should throw if actAs is an empty string', function () {
100
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
101
+ assert_1.default.throws(() => txBuilder.actAs(''), /actAsPartyId must be a non-empty string/);
102
+ });
103
+ describe('Prepared transaction parsing', () => {
104
+ it('should parse the allocation reject prepared transaction', function () {
105
+ const txBuilder = new src_1.AllocationRejectBuilder(statics_1.coins.get('tcanton'));
106
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
107
+ txBuilder.initBuilder(tx);
108
+ txBuilder.commandId(resources_1.AllocationRejection.commandId);
109
+ txBuilder.setTransaction(resources_1.CantonAllocationRejectPrepareResponse);
110
+ const txData = txBuilder.transaction.toJson();
111
+ should_1.default.exist(txData);
112
+ // seller = rejecting party (sender)
113
+ assert_1.default.equal(txData.sender, 'ravi-2-step-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
114
+ // buyer = counterparty (receiver)
115
+ assert_1.default.equal(txData.receiver, '12208::122083082e9af156feaeb7afd363a0ee5ffa1fd160947b647a139a7e0c2ed78f5dc7');
116
+ // amount from dvp.terms.deliveries[0] (converted to lowest unit: 2.0 * 10^10 = 20000000000)
117
+ assert_1.default.equal(txData.amount, '20000000000');
118
+ });
119
+ });
120
+ });
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb2NhdGlvblJlamVjdEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYnVpbGRlci9hbGxvY2F0aW9uUmVqZWN0L2FsbG9jYXRpb25SZWplY3RCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw0Q0FBdUM7QUFFdkMseUNBQXVFO0FBR3ZFLGtEQUFnRztBQUVoRyxRQUFRLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLEVBQUUsQ0FBQyxpREFBaUQsRUFBRTtRQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFJLDZCQUF1QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLGlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pELFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxpREFBcUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLCtCQUFtQixDQUFDO1FBQy9ELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRSxNQUFNLFVBQVUsR0FBc0MsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2xGLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUs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Q0FBa0M7WUFDbEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSw2RUFBNkUsQ0FBQyxDQUFDO1lBQzdHLDRGQUE0RjtZQUM1RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5cbmltcG9ydCB7IEFsbG9jYXRpb25SZWplY3RCdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBDYW50b25UcmFuc2ZlckFjY2VwdFJlamVjdFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcblxuaW1wb3J0IHsgQWxsb2NhdGlvblJlamVjdGlvbiwgQ2FudG9uQWxsb2NhdGlvblJlamVjdFByZXBhcmVSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcyc7XG5cbmRlc2NyaWJlKCdBbGxvY2F0aW9uUmVqZWN0IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgZ2V0IHRoZSBhbGxvY2F0aW9uIHJlamVjdCByZXF1ZXN0IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvblJlamVjdEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uUmVqZWN0UHJlcGFyZVJlc3BvbnNlKTtcbiAgICBjb25zdCB7IGNvbW1hbmRJZCwgY29udHJhY3RJZCwgcGFydHlJZCB9ID0gQWxsb2NhdGlvblJlamVjdGlvbjtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCkuY29udHJhY3RJZChjb250cmFjdElkKS5hY3RBcyhwYXJ0eUlkKTtcbiAgICBjb25zdCByZXF1ZXN0T2JqOiBDYW50b25UcmFuc2ZlckFjY2VwdFJlamVjdFJlcXVlc3QgPSB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCk7XG4gICAgc2hvdWxkLmV4aXN0KHJlcXVlc3RPYmopO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmNvbW1hbmRJZCwgY29tbWFuZElkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5jb250cmFjdElkLCBjb250cmFjdElkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5hY3RBcy5sZW5ndGgsIDEpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmFjdEFzWzBdLCBwYXJ0eUlkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai52ZXJib3NlSGFzaGluZywgZmFsc2UpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwocmVxdWVzdE9iai5yZWFkQXMsIFtdKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzZXQgdGhlIHRyYW5zYWN0aW9uIGlkIHRvIHRoZSBjb21tYW5kSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25SZWplY3RCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBjb25zdCB7IGNvbW1hbmRJZCB9ID0gQWxsb2NhdGlvblJlamVjdGlvbjtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCBjb21tYW5kSWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIHJhdyBjYW50b24gYWxsb2NhdGlvbiByZWplY3QgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25SZWplY3RCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXIuc2V0VHJhbnNhY3Rpb24oQ2FudG9uQWxsb2NhdGlvblJlamVjdFByZXBhcmVSZXNwb25zZSk7XG4gICAgdHhCdWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oQ2FudG9uQWxsb2NhdGlvblJlamVjdFByZXBhcmVSZXNwb25zZS5wcmVwYXJlZFRyYW5zYWN0aW9uKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25SZWplY3RCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHgucHJlcGFyZUNvbW1hbmQgPSBDYW50b25BbGxvY2F0aW9uUmVqZWN0UHJlcGFyZVJlc3BvbnNlO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyLnNldFRyYW5zYWN0aW9uKENhbnRvbkFsbG9jYXRpb25SZWplY3RQcmVwYXJlUmVzcG9uc2UpO1xuICAgIHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHR4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBvbiBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbiBoYXNoIG1pc21hdGNoJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uUmVqZWN0QnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgaW52YWxpZFByZXBhcmVSZXNwb25zZSA9IHtcbiAgICAgIC4uLkNhbnRvbkFsbG9jYXRpb25SZWplY3RQcmVwYXJlUmVzcG9uc2UsXG4gICAgICBwcmVwYXJlZFRyYW5zYWN0aW9uSGFzaDogJ0wxS2ZyQTVleG5wc09xdFhPREdqMmdORit5L2R2L29uUHRWdkdKNWttN2Q9JyxcbiAgICB9O1xuICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihpbnZhbGlkUHJlcGFyZVJlc3BvbnNlKTtcbiAgICB0cnkge1xuICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oaW52YWxpZFByZXBhcmVSZXNwb25zZS5wcmVwYXJlZFRyYW5zYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnaW52YWxpZCByYXcgdHJhbnNhY3Rpb24sIGhhc2ggbm90IG1hdGNoaW5nJyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbW1hbmRJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uUmVqZWN0QnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgeyBjb250cmFjdElkLCBwYXJ0eUlkIH0gPSBBbGxvY2F0aW9uUmVqZWN0aW9uO1xuICAgIHR4QnVpbGRlci5jb250cmFjdElkKGNvbnRyYWN0SWQpLmFjdEFzKHBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvY29tbWFuZElkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb250cmFjdElkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25SZWplY3RCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBjb25zdCB7IGNvbW1hbmRJZCwgcGFydHlJZCB9ID0gQWxsb2NhdGlvblJlamVjdGlvbjtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCkuYWN0QXMocGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb250cmFjdElkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhY3RBcyBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uUmVqZWN0QnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgeyBjb21tYW5kSWQsIGNvbnRyYWN0SWQgfSA9IEFsbG9jYXRpb25SZWplY3Rpb247XG4gICAgdHhCdWlsZGVyLmNvbW1hbmRJZChjb21tYW5kSWQpLmNvbnRyYWN0SWQoY29udHJhY3RJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9hY3RBcyBwYXJ0eUlkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb21tYW5kSWQgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uUmVqZWN0QnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuY29tbWFuZElkKCcnKSwgL2NvbW1hbmRJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbnRyYWN0SWQgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uUmVqZWN0QnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuY29udHJhY3RJZCgnJyksIC9jb250cmFjdElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgYWN0QXMgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uUmVqZWN0QnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuYWN0QXMoJycpLCAvYWN0QXNQYXJ0eUlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQcmVwYXJlZCB0cmFuc2FjdGlvbiBwYXJzaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIGFsbG9jYXRpb24gcmVqZWN0IHByZXBhcmVkIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25SZWplY3RCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICB0eEJ1aWxkZXIuY29tbWFuZElkKEFsbG9jYXRpb25SZWplY3Rpb24uY29tbWFuZElkKTtcbiAgICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uUmVqZWN0UHJlcGFyZVJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IHR4QnVpbGRlci50cmFuc2FjdGlvbi50b0pzb24oKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eERhdGEpO1xuICAgICAgLy8gc2VsbGVyID0gcmVqZWN0aW5nIHBhcnR5IChzZW5kZXIpXG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHR4RGF0YS5zZW5kZXIsXG4gICAgICAgICdyYXZpLTItc3RlcC1wYXJ0eTo6MTIyMDkyZTdkMzNhYzEwYzBmM2Q1NTk3NjM0MmYzNzU1NWRmMDVkYTViNzQyOTU2ZDU2YTYyYWUyMzY3NzY5MDc5ZDInXG4gICAgICApO1xuICAgICAgLy8gYnV5ZXIgPSBjb3VudGVycGFydHkgKHJlY2VpdmVyKVxuICAgICAgYXNzZXJ0LmVxdWFsKHR4RGF0YS5yZWNlaXZlciwgJzEyMjA4OjoxMjIwODMwODJlOWFmMTU2ZmVhZWI3YWZkMzYzYTBlZTVmZmExZmQxNjA5NDdiNjQ3YTEzOWE3ZTBjMmVkNzhmNWRjNycpO1xuICAgICAgLy8gYW1vdW50IGZyb20gZHZwLnRlcm1zLmRlbGl2ZXJpZXNbMF0gKGNvbnZlcnRlZCB0byBsb3dlc3QgdW5pdDogMi4wICogMTBeMTAgPSAyMDAwMDAwMDAwMClcbiAgICAgIGFzc2VydC5lcXVhbCh0eERhdGEuYW1vdW50LCAnMjAwMDAwMDAwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==