@bitgo-beta/sdk-coin-canton 1.0.1-beta.9 → 1.0.1-beta.91

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 (106) hide show
  1. package/dist/resources/hash/hash.d.ts +5 -0
  2. package/dist/resources/hash/hash.js +298 -0
  3. package/dist/resources/proto/damlTransaction.js +100 -0
  4. package/dist/resources/proto/damlTransactionNode.js +71 -0
  5. package/dist/resources/proto/damlTransactionNodeSeed.js +56 -0
  6. package/dist/resources/proto/metadata/metadataGlobalKeyMappingEntry.js +53 -0
  7. package/dist/resources/proto/metadata/metadataInputContract.js +80 -0
  8. package/dist/resources/proto/metadata/metadataSubmitterInfo.js +62 -0
  9. package/dist/resources/proto/metadata.js +189 -0
  10. package/dist/resources/proto/node/empty.js +36 -0
  11. package/dist/resources/proto/node/globalKey.js +81 -0
  12. package/dist/resources/proto/node/identifier.js +73 -0
  13. package/dist/resources/proto/node/node.js +664 -0
  14. package/dist/resources/proto/node/timestamp.js +145 -0
  15. package/dist/resources/proto/node/value.js +838 -0
  16. package/dist/resources/proto/preparedTransaction.d.ts +8 -0
  17. package/dist/resources/proto/preparedTransaction.js +66 -0
  18. package/dist/src/canton.d.ts +15 -2
  19. package/dist/src/canton.d.ts.map +1 -1
  20. package/dist/src/canton.js +67 -6
  21. package/dist/src/index.d.ts +1 -0
  22. package/dist/src/index.d.ts.map +1 -1
  23. package/dist/src/index.js +2 -1
  24. package/dist/src/lib/constant.d.ts +16 -0
  25. package/dist/src/lib/constant.d.ts.map +1 -0
  26. package/dist/src/lib/constant.js +19 -0
  27. package/dist/src/lib/iface.d.ts +107 -0
  28. package/dist/src/lib/iface.d.ts.map +1 -1
  29. package/dist/src/lib/iface.js +1 -1
  30. package/dist/src/lib/index.d.ts +7 -1
  31. package/dist/src/lib/index.d.ts.map +1 -1
  32. package/dist/src/lib/index.js +15 -3
  33. package/dist/src/lib/keyPair.d.ts +7 -1
  34. package/dist/src/lib/keyPair.d.ts.map +1 -1
  35. package/dist/src/lib/keyPair.js +24 -4
  36. package/dist/src/lib/oneStepPreApprovalBuilder.d.ts +51 -0
  37. package/dist/src/lib/oneStepPreApprovalBuilder.d.ts.map +1 -0
  38. package/dist/src/lib/oneStepPreApprovalBuilder.js +101 -0
  39. package/dist/src/lib/resourcesInterface.d.ts +214 -0
  40. package/dist/src/lib/resourcesInterface.d.ts.map +1 -0
  41. package/dist/src/lib/resourcesInterface.js +3 -0
  42. package/dist/src/lib/transaction/transaction.d.ts +24 -0
  43. package/dist/src/lib/transaction/transaction.d.ts.map +1 -0
  44. package/dist/src/lib/transaction/transaction.js +206 -0
  45. package/dist/src/lib/transactionBuilder.d.ts +10 -17
  46. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  47. package/dist/src/lib/transactionBuilder.js +31 -27
  48. package/dist/src/lib/transactionBuilderFactory.d.ts +15 -3
  49. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  50. package/dist/src/lib/transactionBuilderFactory.js +56 -6
  51. package/dist/src/lib/transferAcceptanceBuilder.d.ts +59 -0
  52. package/dist/src/lib/transferAcceptanceBuilder.d.ts.map +1 -0
  53. package/dist/src/lib/transferAcceptanceBuilder.js +116 -0
  54. package/dist/src/lib/transferAcknowledgeBuilder.d.ts +72 -0
  55. package/dist/src/lib/transferAcknowledgeBuilder.d.ts.map +1 -0
  56. package/dist/src/lib/transferAcknowledgeBuilder.js +133 -0
  57. package/dist/src/lib/transferBuilder.d.ts +5 -1
  58. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  59. package/dist/src/lib/transferBuilder.js +8 -1
  60. package/dist/src/lib/transferRejectionBuilder.d.ts +59 -0
  61. package/dist/src/lib/transferRejectionBuilder.d.ts.map +1 -0
  62. package/dist/src/lib/transferRejectionBuilder.js +116 -0
  63. package/dist/src/lib/utils.d.ts +101 -0
  64. package/dist/src/lib/utils.d.ts.map +1 -1
  65. package/dist/src/lib/utils.js +258 -3
  66. package/dist/src/lib/walletInitBuilder.d.ts +101 -0
  67. package/dist/src/lib/walletInitBuilder.d.ts.map +1 -0
  68. package/dist/src/lib/walletInitBuilder.js +232 -0
  69. package/dist/src/lib/walletInitialization/walletInitTransaction.d.ts +17 -0
  70. package/dist/src/lib/walletInitialization/walletInitTransaction.d.ts.map +1 -0
  71. package/dist/src/lib/walletInitialization/walletInitTransaction.js +100 -0
  72. package/dist/test/helper.d.ts +3 -0
  73. package/dist/test/helper.d.ts.map +1 -0
  74. package/dist/test/helper.js +9 -0
  75. package/dist/test/integration/canton.integration.d.ts +2 -0
  76. package/dist/test/integration/canton.integration.d.ts.map +1 -0
  77. package/dist/test/integration/canton.integration.js +40 -0
  78. package/dist/test/resources.d.ts +79 -0
  79. package/dist/test/resources.d.ts.map +1 -0
  80. package/dist/test/resources.js +94 -0
  81. package/dist/test/unit/builder/oneStepEnablement/oneStepEnablementBuilder.d.ts +2 -0
  82. package/dist/test/unit/builder/oneStepEnablement/oneStepEnablementBuilder.d.ts.map +1 -0
  83. package/dist/test/unit/builder/oneStepEnablement/oneStepEnablementBuilder.js +66 -0
  84. package/dist/test/unit/builder/transferAccept/transferAcceptBuilder.d.ts +2 -0
  85. package/dist/test/unit/builder/transferAccept/transferAcceptBuilder.d.ts.map +1 -0
  86. package/dist/test/unit/builder/transferAccept/transferAcceptBuilder.js +57 -0
  87. package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.d.ts +2 -0
  88. package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.d.ts.map +1 -0
  89. package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.js +32 -0
  90. package/dist/test/unit/builder/transferReject/transferRejectBuilder.d.ts +2 -0
  91. package/dist/test/unit/builder/transferReject/transferRejectBuilder.d.ts.map +1 -0
  92. package/dist/test/unit/builder/transferReject/transferRejectBuilder.js +57 -0
  93. package/dist/test/unit/builder/walletInit/walletInitBuilder.d.ts +2 -0
  94. package/dist/test/unit/builder/walletInit/walletInitBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/builder/walletInit/walletInitBuilder.js +65 -0
  96. package/dist/test/unit/keyPair.d.ts +2 -0
  97. package/dist/test/unit/keyPair.d.ts.map +1 -0
  98. package/dist/test/unit/keyPair.js +72 -0
  99. package/dist/test/unit/utils.d.ts +2 -0
  100. package/dist/test/unit/utils.d.ts.map +1 -0
  101. package/dist/test/unit/utils.js +76 -0
  102. package/dist/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +29 -10
  104. package/dist/src/lib/transaction.d.ts +0 -8
  105. package/dist/src/lib/transaction.d.ts.map +0 -1
  106. package/dist/src/lib/transaction.js +0 -17
@@ -1,4 +1,5 @@
1
1
  import { BaseUtils } from '@bitgo-beta/sdk-core';
2
+ import { PreparedTxnParsedInfo } from './iface';
2
3
  export declare class Utils implements BaseUtils {
3
4
  /** @inheritdoc */
4
5
  isValidAddress(address: string): boolean;
@@ -12,6 +13,106 @@ export declare class Utils implements BaseUtils {
12
13
  isValidSignature(signature: string): boolean;
13
14
  /** @inheritdoc */
14
15
  isValidTransactionId(txId: string): boolean;
16
+ /**
17
+ * Method to validate the input is a valid canton hex string
18
+ * @param {String} value the hex string value
19
+ * @returns {Boolean} true if valid
20
+ */
21
+ isValidCantonHex(value: string): boolean;
22
+ /**
23
+ * Helper method to convert hex value to base64
24
+ * @param {String} hexString - hex encoded string
25
+ * @returns {String} base64 encoded string
26
+ */
27
+ getBase64FromHex(hexString: string): string;
28
+ /**
29
+ * Method to create fingerprint (part of the canton partyId) from public key
30
+ * @param {String} publicKey the public key
31
+ * @returns {String}
32
+ */
33
+ getAddressFromPublicKey(publicKey: string): string;
34
+ /**
35
+ * Method to parse raw canton transaction & get required data
36
+ * @param {String} rawData base64 encoded string
37
+ * @returns {PreparedTxnParsedInfo}
38
+ */
39
+ parseRawCantonTransactionData(rawData: string): PreparedTxnParsedInfo;
40
+ /**
41
+ * Computes the topology hash from the API response of the 'create party' endpoint.
42
+ *
43
+ * @param topologyTransactions - List of base64-encoded topology transactions from the Canton API.
44
+ * @returns The final base64-encoded topology transaction hash.
45
+ */
46
+ computeHashFromCreatePartyResponse(topologyTransactions: string[]): string;
47
+ computeHashFromPrepareSubmissionResponse(preparedTransactionBase64: string): Promise<string>;
48
+ /**
49
+ * Computes the final topology transaction hash for a list of prepared Canton transactions.
50
+ *
51
+ * Each transaction is first hashed with purpose `11`, then all hashes are combined and
52
+ * hashed again with purpose `55`, following the Canton topology hash rules.
53
+ *
54
+ * The resulting hash is encoded as a base64 string.
55
+ *
56
+ * @param {Buffer[]} preparedTransactions - An array of Canton transaction buffers.
57
+ * @returns {string} The final topology hash, base64-encoded.
58
+ */
59
+ private computeHashFromTopologyTransaction;
60
+ /**
61
+ * Converts a base64-encoded Ed25519 public key string into a structured signing public key object.
62
+ * @param {String} publicKey The base64-encoded Ed25519 public key
63
+ * @returns {Object} The structured signing key object formatted for use with cryptographic operations
64
+ * @private
65
+ */
66
+ private signingPublicKeyFromEd25519;
67
+ /**
68
+ * Creates a buffer with a 4-byte big-endian integer prefix followed by the provided byte buffer
69
+ * @param {Number} value The integer to prefix, written as 4 bytes in big-endian order
70
+ * @param {Buffer} bytes The buffer to append after the integer prefix
71
+ * @returns {Buffer} The resulting buffer with the prefixed integer
72
+ * @private
73
+ */
74
+ private prefixedInt;
75
+ /**
76
+ * Computes an SHA-256 Canton-style hash by prefixing the input with a purpose identifier,
77
+ * then hashing the resulting buffer and prepending a multi-prefix
78
+ *
79
+ * @param {Number} purpose A numeric identifier to prefix the hash input with
80
+ * @param {Buffer} bytes The buffer to be hashed
81
+ * @returns {String} A hexadecimal string representation of the resulting hash with multi-prefix
82
+ * @private
83
+ */
84
+ private computeSha256CantonHash;
85
+ /**
86
+ * Decodes a Base64-encoded string into a Uint8Array
87
+ * @param {String} b64 The Base64-encoded string
88
+ * @returns {Uint8Array} The decoded byte array
89
+ * @private
90
+ */
91
+ private fromBase64;
92
+ /**
93
+ * Decodes a Base64-encoded prepared transaction into a structured object
94
+ * @param {String} base64 The Base64-encoded transaction data
95
+ * @returns {IPreparedTransaction} The decoded `IPreparedTransaction` object
96
+ * @private
97
+ */
98
+ private decodePreparedTransaction;
99
+ /**
100
+ * Computes a deterministic combined hash from an array of individual Canton-style SHA-256 hashes
101
+ *
102
+ * Each hash is decoded from hex, sorted lexicographically (by hex), and prefixed with its length
103
+ * The final buffer includes the number of hashes followed by each (length-prefixed) hash
104
+ *
105
+ * @param {string[]} hashes - An array of Canton-prefixed SHA-256 hashes in hexadecimal string format
106
+ * @returns {Buffer} A binary buffer representing the combined hash input
107
+ */
108
+ private computeMultiHashForTopology;
109
+ /**
110
+ * Encodes a 32-bit signed integer into a 4-byte big-endian Buffer
111
+ *
112
+ * @param {number} value - The integer to encode
113
+ * @returns {Buffer} A 4-byte buffer representing the integer in big-endian format
114
+ */
115
+ private encodeInt32;
15
116
  }
16
117
  declare const utils: Utils;
17
118
  export default utils;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,qBAAa,KAAM,YAAW,SAAS;IACrC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,kBAAkB;IAClB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,kBAAkB;IAClB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,kBAAkB;IAClB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,kBAAkB;IAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,kBAAkB;IAClB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG5C;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAA2B,MAAM,sBAAsB,CAAC;AAM1E,OAAO,EAA+C,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG7F,qBAAa,KAAM,YAAW,SAAS;IACrC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOxC,kBAAkB;IAClB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,kBAAkB;IAClB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,kBAAkB;IAClB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,kBAAkB;IAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,kBAAkB;IAClB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKxC;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI3C;;;;OAIG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAMlD;;;;OAIG;IACH,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB;IAwErE;;;;;OAKG;IACH,kCAAkC,CAAC,oBAAoB,EAAE,MAAM,EAAE,GAAG,MAAM;IAKpE,wCAAwC,CAAC,yBAAyB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlG;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kCAAkC;IAO1C;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAgBnC;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;;;OAQG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAIlB;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAKjC;;;;;;;;OAQG;IACH,OAAO,CAAC,2BAA2B;IAgBnC;;;;;OAKG;IACH,OAAO,CAAC,WAAW;CAKpB;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}
@@ -1,10 +1,23 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.Utils = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const hash_js_1 = require("../../resources/hash/hash.js");
10
+ const preparedTransaction_js_1 = require("../../resources/proto/preparedTransaction.js");
11
+ const constant_1 = require("./constant");
4
12
  class Utils {
5
13
  /** @inheritdoc */
6
14
  isValidAddress(address) {
7
- throw new Error('Method not implemented.');
15
+ if (!address || address.trim() === '')
16
+ return false;
17
+ const [partyHint, fingerprint] = address.trim().split('::');
18
+ if (!partyHint || !fingerprint)
19
+ return false;
20
+ return partyHint.length === 5 && this.isValidCantonHex(fingerprint);
8
21
  }
9
22
  /** @inheritdoc */
10
23
  isValidBlockId(hash) {
@@ -16,7 +29,7 @@ class Utils {
16
29
  }
17
30
  /** @inheritdoc */
18
31
  isValidPublicKey(key) {
19
- throw new Error('Method not implemented.');
32
+ return (0, sdk_core_1.isValidEd25519PublicKey)(key);
20
33
  }
21
34
  /** @inheritdoc */
22
35
  isValidSignature(signature) {
@@ -26,8 +39,250 @@ class Utils {
26
39
  isValidTransactionId(txId) {
27
40
  throw new Error('Method not implemented.');
28
41
  }
42
+ /**
43
+ * Method to validate the input is a valid canton hex string
44
+ * @param {String} value the hex string value
45
+ * @returns {Boolean} true if valid
46
+ */
47
+ isValidCantonHex(value) {
48
+ const regex = /^[a-fA-F0-9]{68}$/;
49
+ return regex.test(value);
50
+ }
51
+ /**
52
+ * Helper method to convert hex value to base64
53
+ * @param {String} hexString - hex encoded string
54
+ * @returns {String} base64 encoded string
55
+ */
56
+ getBase64FromHex(hexString) {
57
+ return Buffer.from(hexString, 'hex').toString('base64');
58
+ }
59
+ /**
60
+ * Method to create fingerprint (part of the canton partyId) from public key
61
+ * @param {String} publicKey the public key
62
+ * @returns {String}
63
+ */
64
+ getAddressFromPublicKey(publicKey) {
65
+ const key = this.signingPublicKeyFromEd25519(publicKey);
66
+ const hashPurpose = 12;
67
+ return this.computeSha256CantonHash(hashPurpose, key.publicKey);
68
+ }
69
+ /**
70
+ * Method to parse raw canton transaction & get required data
71
+ * @param {String} rawData base64 encoded string
72
+ * @returns {PreparedTxnParsedInfo}
73
+ */
74
+ parseRawCantonTransactionData(rawData) {
75
+ const decodedData = this.decodePreparedTransaction(rawData);
76
+ let sender = '';
77
+ let receiver = '';
78
+ let amount = '';
79
+ decodedData.transaction?.nodes?.forEach((node) => {
80
+ const versionedNode = node.versionedNode;
81
+ if (!versionedNode || versionedNode.oneofKind !== 'v1')
82
+ return;
83
+ const v1Node = versionedNode.v1;
84
+ const nodeType = v1Node.nodeType;
85
+ if (nodeType.oneofKind !== 'create')
86
+ return;
87
+ const createNode = nodeType.create;
88
+ const getField = (fields, label) => fields.find((f) => f.label === label)?.value?.sum;
89
+ // Check if it's the correct template
90
+ const template = createNode.templateId;
91
+ const argSum = createNode.argument?.sum;
92
+ if (!argSum || argSum.oneofKind !== 'record')
93
+ return;
94
+ const fields = argSum.record?.fields;
95
+ if (!fields)
96
+ return;
97
+ if (template?.entityName === 'AmuletTransferInstruction') {
98
+ const transferField = fields.find((f) => f.label === 'transfer');
99
+ const transferSum = transferField?.value?.sum;
100
+ if (!transferSum || transferSum.oneofKind !== 'record')
101
+ return;
102
+ const transferRecord = transferSum.record?.fields;
103
+ if (!transferRecord)
104
+ return;
105
+ const senderData = getField(transferRecord, 'sender');
106
+ if (senderData?.oneofKind === 'party')
107
+ sender = senderData.party ?? '';
108
+ const receiverData = getField(transferRecord, 'receiver');
109
+ if (receiverData?.oneofKind === 'party')
110
+ receiver = receiverData.party ?? '';
111
+ const amountData = getField(transferRecord, 'amount');
112
+ if (amountData?.oneofKind === 'numeric')
113
+ amount = amountData.numeric ?? '';
114
+ }
115
+ else if (template?.entityName === 'Amulet') {
116
+ const dsoData = getField(fields, 'dso');
117
+ if (dsoData?.oneofKind === 'party')
118
+ sender = dsoData.party ?? '';
119
+ const ownerData = getField(fields, 'owner');
120
+ if (ownerData?.oneofKind === 'party')
121
+ receiver = ownerData.party ?? '';
122
+ const amountField = getField(fields, 'amount');
123
+ if (!amountField || amountField.oneofKind !== 'record')
124
+ return;
125
+ const amountRecord = amountField.record?.fields;
126
+ if (!amountRecord)
127
+ return;
128
+ const initialAmountData = getField(amountRecord, 'initialAmount');
129
+ if (initialAmountData?.oneofKind === 'numeric')
130
+ amount = initialAmountData.numeric ?? '';
131
+ }
132
+ else if (template?.entityName === 'TransferPreapprovalProposal') {
133
+ const receiverData = getField(fields, 'receiver');
134
+ if (receiverData?.oneofKind === 'party')
135
+ receiver = receiverData.party ?? '';
136
+ const providerData = getField(fields, 'provider');
137
+ if (providerData?.oneofKind === 'party')
138
+ sender = providerData.party ?? '';
139
+ amount = '0';
140
+ }
141
+ });
142
+ if (!sender || !receiver || !amount) {
143
+ const missingFields = [];
144
+ if (!sender)
145
+ missingFields.push('sender');
146
+ if (!receiver)
147
+ missingFields.push('receiver');
148
+ if (!amount)
149
+ missingFields.push('amount');
150
+ throw new Error(`invalid transaction data: missing ${missingFields.join(', ')}`);
151
+ }
152
+ return {
153
+ sender,
154
+ receiver,
155
+ amount,
156
+ };
157
+ }
158
+ /**
159
+ * Computes the topology hash from the API response of the 'create party' endpoint.
160
+ *
161
+ * @param topologyTransactions - List of base64-encoded topology transactions from the Canton API.
162
+ * @returns The final base64-encoded topology transaction hash.
163
+ */
164
+ computeHashFromCreatePartyResponse(topologyTransactions) {
165
+ const txBuffers = topologyTransactions.map((tx) => Buffer.from(tx, 'base64'));
166
+ return this.computeHashFromTopologyTransaction(txBuffers);
167
+ }
168
+ async computeHashFromPrepareSubmissionResponse(preparedTransactionBase64) {
169
+ const preparedTransaction = this.decodePreparedTransaction(preparedTransactionBase64);
170
+ const hash = await (0, hash_js_1.computePreparedTransaction)(preparedTransaction);
171
+ return Buffer.from(hash).toString('base64');
172
+ }
173
+ /**
174
+ * Computes the final topology transaction hash for a list of prepared Canton transactions.
175
+ *
176
+ * Each transaction is first hashed with purpose `11`, then all hashes are combined and
177
+ * hashed again with purpose `55`, following the Canton topology hash rules.
178
+ *
179
+ * The resulting hash is encoded as a base64 string.
180
+ *
181
+ * @param {Buffer[]} preparedTransactions - An array of Canton transaction buffers.
182
+ * @returns {string} The final topology hash, base64-encoded.
183
+ */
184
+ computeHashFromTopologyTransaction(preparedTransactions) {
185
+ const rawHashes = preparedTransactions.map((tx) => this.computeSha256CantonHash(11, tx));
186
+ const combinedHashes = this.computeMultiHashForTopology(rawHashes);
187
+ const computedHash = this.computeSha256CantonHash(55, combinedHashes);
188
+ return Buffer.from(computedHash, 'hex').toString('base64');
189
+ }
190
+ /**
191
+ * Converts a base64-encoded Ed25519 public key string into a structured signing public key object.
192
+ * @param {String} publicKey The base64-encoded Ed25519 public key
193
+ * @returns {Object} The structured signing key object formatted for use with cryptographic operations
194
+ * @private
195
+ */
196
+ signingPublicKeyFromEd25519(publicKey) {
197
+ return {
198
+ format: constant_1.CryptoKeyFormat.RAW,
199
+ publicKey: Buffer.from(publicKey, 'base64'),
200
+ scheme: constant_1.SigningAlgorithmSpec.ED25519,
201
+ keySpec: constant_1.SigningKeySpec.EC_CURVE25519,
202
+ usage: [],
203
+ };
204
+ }
205
+ /**
206
+ * Creates a buffer with a 4-byte big-endian integer prefix followed by the provided byte buffer
207
+ * @param {Number} value The integer to prefix, written as 4 bytes in big-endian order
208
+ * @param {Buffer} bytes The buffer to append after the integer prefix
209
+ * @returns {Buffer} The resulting buffer with the prefixed integer
210
+ * @private
211
+ */
212
+ prefixedInt(value, bytes) {
213
+ const buffer = Buffer.alloc(4 + bytes.length);
214
+ buffer.writeUInt32BE(value, 0);
215
+ Buffer.from(bytes).copy(buffer, 4);
216
+ return buffer;
217
+ }
218
+ /**
219
+ * Computes an SHA-256 Canton-style hash by prefixing the input with a purpose identifier,
220
+ * then hashing the resulting buffer and prepending a multi-prefix
221
+ *
222
+ * @param {Number} purpose A numeric identifier to prefix the hash input with
223
+ * @param {Buffer} bytes The buffer to be hashed
224
+ * @returns {String} A hexadecimal string representation of the resulting hash with multi-prefix
225
+ * @private
226
+ */
227
+ computeSha256CantonHash(purpose, bytes) {
228
+ const hashInput = this.prefixedInt(purpose, bytes);
229
+ const hash = crypto_1.default.createHash('sha256').update(hashInput).digest();
230
+ const multiprefix = Buffer.from([0x12, 0x20]);
231
+ return Buffer.concat([multiprefix, hash]).toString('hex');
232
+ }
233
+ /**
234
+ * Decodes a Base64-encoded string into a Uint8Array
235
+ * @param {String} b64 The Base64-encoded string
236
+ * @returns {Uint8Array} The decoded byte array
237
+ * @private
238
+ */
239
+ fromBase64(b64) {
240
+ return new Uint8Array(Buffer.from(b64, 'base64'));
241
+ }
242
+ /**
243
+ * Decodes a Base64-encoded prepared transaction into a structured object
244
+ * @param {String} base64 The Base64-encoded transaction data
245
+ * @returns {IPreparedTransaction} The decoded `IPreparedTransaction` object
246
+ * @private
247
+ */
248
+ decodePreparedTransaction(base64) {
249
+ const bytes = this.fromBase64(base64);
250
+ return preparedTransaction_js_1.PreparedTransaction.fromBinary(bytes);
251
+ }
252
+ /**
253
+ * Computes a deterministic combined hash from an array of individual Canton-style SHA-256 hashes
254
+ *
255
+ * Each hash is decoded from hex, sorted lexicographically (by hex), and prefixed with its length
256
+ * The final buffer includes the number of hashes followed by each (length-prefixed) hash
257
+ *
258
+ * @param {string[]} hashes - An array of Canton-prefixed SHA-256 hashes in hexadecimal string format
259
+ * @returns {Buffer} A binary buffer representing the combined hash input
260
+ */
261
+ computeMultiHashForTopology(hashes) {
262
+ const sortedHashes = hashes
263
+ .map((hex) => Buffer.from(hex, 'hex'))
264
+ .sort((a, b) => a.toString('hex').localeCompare(b.toString('hex')));
265
+ const numHashesBytes = this.encodeInt32(sortedHashes.length);
266
+ const parts = [numHashesBytes];
267
+ for (const h of sortedHashes) {
268
+ const lengthBytes = this.encodeInt32(h.length);
269
+ parts.push(lengthBytes, h);
270
+ }
271
+ return Buffer.concat(parts);
272
+ }
273
+ /**
274
+ * Encodes a 32-bit signed integer into a 4-byte big-endian Buffer
275
+ *
276
+ * @param {number} value - The integer to encode
277
+ * @returns {Buffer} A 4-byte buffer representing the integer in big-endian format
278
+ */
279
+ encodeInt32(value) {
280
+ const buf = Buffer.alloc(4);
281
+ buf.writeInt32BE(value, 0);
282
+ return buf;
283
+ }
29
284
  }
30
285
  exports.Utils = Utils;
31
286
  const utils = new Utils();
32
287
  exports.default = utils;
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsS0FBSztJQUNoQixrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLElBQVk7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsR0FBVztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixnQkFBZ0IsQ0FBQyxHQUFXO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLFNBQWlCO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLG9CQUFvQixDQUFDLElBQVk7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQTlCRCxzQkE4QkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VVdGlscyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUU1QixtREFBMEU7QUFFMUUsMERBQTBFO0FBQzFFLHlGQUFtRjtBQUVuRix5Q0FBbUY7QUFJbkYsTUFBYSxLQUFLO0lBQ2hCLGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZTtRQUM1QixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEQsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0MsT0FBTyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsSUFBWTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsT0FBTyxJQUFBLGtDQUF1QixFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFF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Q0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxXQUFXLENBQUMsS0FBYTtRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBN1JELHNCQTZSQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBjb21wdXRlUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9oYXNoL2hhc2guanMnO1xuaW1wb3J0IHsgUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9wcm90by9wcmVwYXJlZFRyYW5zYWN0aW9uLmpzJztcblxuaW1wb3J0IHsgQ3J5cHRvS2V5Rm9ybWF0LCBTaWduaW5nQWxnb3JpdGhtU3BlYywgU2lnbmluZ0tleVNwZWMgfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7IFByZXBhcmVkVHJhbnNhY3Rpb24gYXMgSVByZXBhcmVkVHJhbnNhY3Rpb24sIFByZXBhcmVkVHhuUGFyc2VkSW5mbyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgUmVjb3JkRmllbGQgfSBmcm9tICcuL3Jlc291cmNlc0ludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgYWRkcmVzcy50cmltKCkgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgW3BhcnR5SGludCwgZmluZ2VycHJpbnRdID0gYWRkcmVzcy50cmltKCkuc3BsaXQoJzo6Jyk7XG4gICAgaWYgKCFwYXJ0eUhpbnQgfHwgIWZpbmdlcnByaW50KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHBhcnR5SGludC5sZW5ndGggPT09IDUgJiYgdGhpcy5pc1ZhbGlkQ2FudG9uSGV4KGZpbmdlcnByaW50KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgaXMgYSB2YWxpZCBjYW50b24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgdGhlIGhleCBzdHJpbmcgdmFsdWVcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRDYW50b25IZXgodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS1mQS1GMC05XXs2OH0kLztcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGhleCB2YWx1ZSB0byBiYXNlNjRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGhleFN0cmluZyAtIGhleCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIGdldEJhc2U2NEZyb21IZXgoaGV4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShoZXhTdHJpbmcsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNyZWF0ZSBmaW5nZXJwcmludCAocGFydCBvZiB0aGUgY2FudG9uIHBhcnR5SWQpIGZyb20gcHVibGljIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHVibGljS2V5IHRoZSBwdWJsaWMga2V5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zaWduaW5nUHVibGljS2V5RnJvbUVkMjU1MTkocHVibGljS2V5KTtcbiAgICBjb25zdCBoYXNoUHVycG9zZSA9IDEyO1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGVTaGEyNTZDYW50b25IYXNoKGhhc2hQdXJwb3NlLCBrZXkucHVibGljS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcGFyc2UgcmF3IGNhbnRvbiB0cmFuc2FjdGlvbiAmIGdldCByZXF1aXJlZCBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByYXdEYXRhIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7UHJlcGFyZWRUeG5QYXJzZWRJbmZvfVxuICAgKi9cbiAgcGFyc2VSYXdDYW50b25UcmFuc2FjdGlvbkRhdGEocmF3RGF0YTogc3RyaW5nKTogUHJlcGFyZWRUeG5QYXJzZWRJbmZvIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihyYXdEYXRhKTtcbiAgICBsZXQgc2VuZGVyID0gJyc7XG4gICAgbGV0IHJlY2VpdmVyID0gJyc7XG4gICAgbGV0IGFtb3VudCA9ICcnO1xuICAgIGRlY29kZWREYXRhLnRyYW5zYWN0aW9uPy5ub2Rlcz8uZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbmVkTm9kZSA9IG5vZGUudmVyc2lvbmVkTm9kZTtcbiAgICAgIGlmICghdmVyc2lvbmVkTm9kZSB8fCB2ZXJzaW9uZWROb2RlLm9uZW9mS2luZCAhPT0gJ3YxJykgcmV0dXJuO1xuXG4gICAgICBjb25zdCB2MU5vZGUgPSB2ZXJzaW9uZWROb2RlLnYxO1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPSB2MU5vZGUubm9kZVR5cGU7XG5cbiAgICAgIGlmIChub2RlVHlwZS5vbmVvZktpbmQgIT09ICdjcmVhdGUnKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZU5vZGUgPSBub2RlVHlwZS5jcmVhdGU7XG5cbiAgICAgIGNvbnN0IGdldEZpZWxkID0gKGZpZWxkczogUmVjb3JkRmllbGRbXSwgbGFiZWw6IHN0cmluZykgPT4gZmllbGRzLmZpbmQoKGYpID0+IGYubGFiZWwgPT09IGxhYmVsKT8udmFsdWU/LnN1bTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyB0aGUgY29ycmVjdCB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBjcmVhdGVOb2RlLnRlbXBsYXRlSWQ7XG4gICAgICBjb25zdCBhcmdTdW0gPSBjcmVhdGVOb2RlLmFyZ3VtZW50Py5zdW07XG4gICAgICBpZiAoIWFyZ1N1bSB8fCBhcmdTdW0ub25lb2ZLaW5kICE9PSAncmVjb3JkJykgcmV0dXJuO1xuICAgICAgY29uc3QgZmllbGRzID0gYXJnU3VtLnJlY29yZD8uZmllbGRzO1xuICAgICAgaWYgKCFmaWVsZHMpIHJldHVybjtcbiAgICAgIGlmICh0ZW1wbGF0ZT8uZW50aXR5TmFtZSA9PT0gJ0FtdWxldFRyYW5zZmVySW5zdHJ1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyRmllbGQgPSBmaWVsZHMuZmluZCgoZikgPT4gZi5sYWJlbCA9PT0gJ3RyYW5zZmVyJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyU3VtID0gdHJhbnNmZXJGaWVsZD8udmFsdWU/LnN1bTtcbiAgICAgICAgaWYgKCF0cmFuc2ZlclN1bSB8fCB0cmFuc2ZlclN1bS5vbmVvZktpbmQgIT09ICdyZWNvcmQnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyUmVjb3JkID0gdHJhbnNmZXJTdW0ucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmICghdHJhbnNmZXJSZWNvcmQpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2VuZGVyRGF0YSA9IGdldEZpZWxkKHRyYW5zZmVyUmVjb3JkLCAnc2VuZGVyJyk7XG4gICAgICAgIGlmIChzZW5kZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IHNlbmRlckRhdGEucGFydHkgPz8gJyc7XG5cbiAgICAgICAgY29uc3QgcmVjZWl2ZXJEYXRhID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdyZWNlaXZlcicpO1xuICAgICAgICBpZiAocmVjZWl2ZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gcmVjZWl2ZXJEYXRhLnBhcnR5ID8/ICcnO1xuXG4gICAgICAgIGNvbnN0IGFtb3VudERhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ2Ftb3VudCcpO1xuICAgICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgIH0gZWxzZSBpZiAodGVtcGxhdGU/LmVudGl0eU5hbWUgPT09ICdBbXVsZXQnKSB7XG4gICAgICAgIGNvbnN0IGRzb0RhdGEgPSBnZXRGaWVsZChmaWVsZHMsICdkc28nKTtcbiAgICAgICAgaWYgKGRzb0RhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gZHNvRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQoZmllbGRzLCAnb3duZXInKTtcbiAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgY29uc3QgYW1vdW50RmllbGQgPSBnZXRGaWVsZChmaWVsZHMsICdhbW91bnQnKTtcbiAgICAgICAgaWYgKCFhbW91bnRGaWVsZCB8fCBhbW91bnRGaWVsZC5vbmVvZktpbmQgIT09ICdyZWNvcmQnKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYW1vdW50UmVjb3JkID0gYW1vdW50RmllbGQucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmICghYW1vdW50UmVjb3JkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGluaXRpYWxBbW91bnREYXRhID0gZ2V0RmllbGQoYW1vdW50UmVjb3JkLCAnaW5pdGlhbEFtb3VudCcpO1xuICAgICAgICBpZiAoaW5pdGlhbEFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSBhbW91bnQgPSBpbml0aWFsQW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZT8uZW50aXR5TmFtZSA9PT0gJ1RyYW5zZmVyUHJlYXBwcm92YWxQcm9wb3NhbCcpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXJEYXRhID0gZ2V0RmllbGQoZmllbGRzLCAncmVjZWl2ZXInKTtcbiAgICAgICAgaWYgKHJlY2VpdmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IHJlY2VpdmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgY29uc3QgcHJvdmlkZXJEYXRhID0gZ2V0RmllbGQoZmllbGRzLCAncHJvdmlkZXInKTtcbiAgICAgICAgaWYgKHByb3ZpZGVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBwcm92aWRlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgIGFtb3VudCA9ICcwJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIXNlbmRlciB8fCAhcmVjZWl2ZXIgfHwgIWFtb3VudCkge1xuICAgICAgY29uc3QgbWlzc2luZ0ZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghc2VuZGVyKSBtaXNzaW5nRmllbGRzLnB1c2goJ3NlbmRlcicpO1xuICAgICAgaWYgKCFyZWNlaXZlcikgbWlzc2luZ0ZpZWxkcy5wdXNoKCdyZWNlaXZlcicpO1xuICAgICAgaWYgKCFhbW91bnQpIG1pc3NpbmdGaWVsZHMucHVzaCgnYW1vdW50Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHJhbnNhY3Rpb24gZGF0YTogbWlzc2luZyAke21pc3NpbmdGaWVsZHMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRlcixcbiAgICAgIHJlY2VpdmVyLFxuICAgICAgYW1vdW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIHRvcG9sb2d5IGhhc2ggZnJvbSB0aGUgQVBJIHJlc3BvbnNlIG9mIHRoZSAnY3JlYXRlIHBhcnR5JyBlbmRwb2ludC5cbiAgICpcbiAgICogQHBhcmFtIHRvcG9sb2d5VHJhbnNhY3Rpb25zIC0gTGlzdCBvZiBiYXNlNjQtZW5jb2RlZCB0b3BvbG9neSB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgQ2FudG9uIEFQSS5cbiAgICogQHJldHVybnMgVGhlIGZpbmFsIGJhc2U2NC1lbmNvZGVkIHRvcG9sb2d5IHRyYW5zYWN0aW9uIGhhc2guXG4gICAqL1xuICBjb21wdXRlSGFzaEZyb21DcmVhdGVQYXJ0eVJlc3BvbnNlKHRvcG9sb2d5VHJhbnNhY3Rpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgdHhCdWZmZXJzID0gdG9wb2xvZ3lUcmFuc2FjdGlvbnMubWFwKCh0eCkgPT4gQnVmZmVyLmZyb20odHgsICdiYXNlNjQnKSk7XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUhhc2hGcm9tVG9wb2xvZ3lUcmFuc2FjdGlvbih0eEJ1ZmZlcnMpO1xuICB9XG5cbiAgYXN5bmMgY29tcHV0ZUhhc2hGcm9tUHJlcGFyZVN1Ym1pc3Npb25SZXNwb25zZShwcmVwYXJlZFRyYW5zYWN0aW9uQmFzZTY0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHByZXBhcmVkVHJhbnNhY3Rpb24gPSB0aGlzLmRlY29kZVByZXBhcmVkVHJhbnNhY3Rpb24ocHJlcGFyZWRUcmFuc2FjdGlvbkJhc2U2NCk7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IGNvbXB1dGVQcmVwYXJlZFRyYW5zYWN0aW9uKHByZXBhcmVkVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShoYXNoKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGZpbmFsIHRvcG9sb2d5IHRyYW5zYWN0aW9uIGhhc2ggZm9yIGEgbGlzdCBvZiBwcmVwYXJlZCBDYW50b24gdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBFYWNoIHRyYW5zYWN0aW9uIGlzIGZpcnN0IGhhc2hlZCB3aXRoIHB1cnBvc2UgYDExYCwgdGhlbiBhbGwgaGFzaGVzIGFyZSBjb21iaW5lZCBhbmRcbiAgICogaGFzaGVkIGFnYWluIHdpdGggcHVycG9zZSBgNTVgLCBmb2xsb3dpbmcgdGhlIENhbnRvbiB0b3BvbG9neSBoYXNoIHJ1bGVzLlxuICAgKlxuICAgKiBUaGUgcmVzdWx0aW5nIGhhc2ggaXMgZW5jb2RlZCBhcyBhIGJhc2U2NCBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyW119IHByZXBhcmVkVHJhbnNhY3Rpb25zIC0gQW4gYXJyYXkgb2YgQ2FudG9uIHRyYW5zYWN0aW9uIGJ1ZmZlcnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmaW5hbCB0b3BvbG9neSBoYXNoLCBiYXNlNjQtZW5jb2RlZC5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUhhc2hGcm9tVG9wb2xvZ3lUcmFuc2FjdGlvbihwcmVwYXJlZFRyYW5zYWN0aW9uczogQnVmZmVyW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHJhd0hhc2hlcyA9IHByZXBhcmVkVHJhbnNhY3Rpb25zLm1hcCgodHgpID0+IHRoaXMuY29tcHV0ZVNoYTI1NkNhbnRvbkhhc2goMTEsIHR4KSk7XG4gICAgY29uc3QgY29tYmluZWRIYXNoZXMgPSB0aGlzLmNvbXB1dGVNdWx0aUhhc2hGb3JUb3BvbG9neShyYXdIYXNoZXMpO1xuICAgIGNvbnN0IGNvbXB1dGVkSGFzaCA9IHRoaXMuY29tcHV0ZVNoYTI1NkNhbnRvbkhhc2goNTUsIGNvbWJpbmVkSGFzaGVzKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY29tcHV0ZWRIYXNoLCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYmFzZTY0LWVuY29kZWQgRWQyNTUxOSBwdWJsaWMga2V5IHN0cmluZyBpbnRvIGEgc3RydWN0dXJlZCBzaWduaW5nIHB1YmxpYyBrZXkgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHVibGljS2V5IFRoZSBiYXNlNjQtZW5jb2RlZCBFZDI1NTE5IHB1YmxpYyBrZXlcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIHN0cnVjdHVyZWQgc2lnbmluZyBrZXkgb2JqZWN0IGZvcm1hdHRlZCBmb3IgdXNlIHdpdGggY3J5cHRvZ3JhcGhpYyBvcGVyYXRpb25zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHNpZ25pbmdQdWJsaWNLZXlGcm9tRWQyNTUxOShwdWJsaWNLZXk6IHN0cmluZyk6IHtcbiAgICBmb3JtYXQ6IG51bWJlcjtcbiAgICBwdWJsaWNLZXk6IEJ1ZmZlcjtcbiAgICBzY2hlbWU6IG51bWJlcjtcbiAgICBrZXlTcGVjOiBudW1iZXI7XG4gICAgdXNhZ2U6IFtdO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiBDcnlwdG9LZXlGb3JtYXQuUkFXLFxuICAgICAgcHVibGljS2V5OiBCdWZmZXIuZnJvbShwdWJsaWNLZXksICdiYXNlNjQnKSxcbiAgICAgIHNjaGVtZTogU2lnbmluZ0FsZ29yaXRobVNwZWMuRUQyNTUxOSxcbiAgICAgIGtleVNwZWM6IFNpZ25pbmdLZXlTcGVjLkVDX0NVUlZFMjU1MTksXG4gICAgICB1c2FnZTogW10sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnVmZmVyIHdpdGggYSA0LWJ5dGUgYmlnLWVuZGlhbiBpbnRlZ2VyIHByZWZpeCBmb2xsb3dlZCBieSB0aGUgcHJvdmlkZWQgYnl0ZSBidWZmZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIFRoZSBpbnRlZ2VyIHRvIHByZWZpeCwgd3JpdHRlbiBhcyA0IGJ5dGVzIGluIGJpZy1lbmRpYW4gb3JkZXJcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGJ5dGVzIFRoZSBidWZmZXIgdG8gYXBwZW5kIGFmdGVyIHRoZSBpbnRlZ2VyIHByZWZpeFxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBUaGUgcmVzdWx0aW5nIGJ1ZmZlciB3aXRoIHRoZSBwcmVmaXhlZCBpbnRlZ2VyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHByZWZpeGVkSW50KHZhbHVlOiBudW1iZXIsIGJ5dGVzOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0ICsgYnl0ZXMubGVuZ3RoKTtcbiAgICBidWZmZXIud3JpdGVVSW50MzJCRSh2YWx1ZSwgMCk7XG4gICAgQnVmZmVyLmZyb20oYnl0ZXMpLmNvcHkoYnVmZmVyLCA0KTtcbiAgICByZXR1cm4gYnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIGFuIFNIQS0yNTYgQ2FudG9uLXN0eWxlIGhhc2ggYnkgcHJlZml4aW5nIHRoZSBpbnB1dCB3aXRoIGEgcHVycG9zZSBpZGVudGlmaWVyLFxuICAgKiB0aGVuIGhhc2hpbmcgdGhlIHJlc3VsdGluZyBidWZmZXIgYW5kIHByZXBlbmRpbmcgYSBtdWx0aS1wcmVmaXhcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHB1cnBvc2UgQSBudW1lcmljIGlkZW50aWZpZXIgdG8gcHJlZml4IHRoZSBoYXNoIGlucHV0IHdpdGhcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGJ5dGVzIFRoZSBidWZmZXIgdG8gYmUgaGFzaGVkXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IEEgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgaGFzaCB3aXRoIG11bHRpLXByZWZpeFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlU2hhMjU2Q2FudG9uSGFzaChwdXJwb3NlOiBudW1iZXIsIGJ5dGVzOiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc2hJbnB1dCA9IHRoaXMucHJlZml4ZWRJbnQocHVycG9zZSwgYnl0ZXMpO1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGhhc2hJbnB1dCkuZGlnZXN0KCk7XG4gICAgY29uc3QgbXVsdGlwcmVmaXggPSBCdWZmZXIuZnJvbShbMHgxMiwgMHgyMF0pO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFttdWx0aXByZWZpeCwgaGFzaF0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgQmFzZTY0LWVuY29kZWQgc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiNjQgVGhlIEJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gVGhlIGRlY29kZWQgYnl0ZSBhcnJheVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBmcm9tQmFzZTY0KGI2NDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKGI2NCwgJ2Jhc2U2NCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgQmFzZTY0LWVuY29kZWQgcHJlcGFyZWQgdHJhbnNhY3Rpb24gaW50byBhIHN0cnVjdHVyZWQgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiYXNlNjQgVGhlIEJhc2U2NC1lbmNvZGVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICogQHJldHVybnMge0lQcmVwYXJlZFRyYW5zYWN0aW9ufSBUaGUgZGVjb2RlZCBgSVByZXBhcmVkVHJhbnNhY3Rpb25gIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVQcmVwYXJlZFRyYW5zYWN0aW9uKGJhc2U2NDogc3RyaW5nKTogSVByZXBhcmVkVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5mcm9tQmFzZTY0KGJhc2U2NCk7XG4gICAgcmV0dXJuIFByZXBhcmVkVHJhbnNhY3Rpb24uZnJvbUJpbmFyeShieXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYSBkZXRlcm1pbmlzdGljIGNvbWJpbmVkIGhhc2ggZnJvbSBhbiBhcnJheSBvZiBpbmRpdmlkdWFsIENhbnRvbi1zdHlsZSBTSEEtMjU2IGhhc2hlc1xuICAgKlxuICAgKiBFYWNoIGhhc2ggaXMgZGVjb2RlZCBmcm9tIGhleCwgc29ydGVkIGxleGljb2dyYXBoaWNhbGx5IChieSBoZXgpLCBhbmQgcHJlZml4ZWQgd2l0aCBpdHMgbGVuZ3RoXG4gICAqIFRoZSBmaW5hbCBidWZmZXIgaW5jbHVkZXMgdGhlIG51bWJlciBvZiBoYXNoZXMgZm9sbG93ZWQgYnkgZWFjaCAobGVuZ3RoLXByZWZpeGVkKSBoYXNoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGhhc2hlcyAtIEFuIGFycmF5IG9mIENhbnRvbi1wcmVmaXhlZCBTSEEtMjU2IGhhc2hlcyBpbiBoZXhhZGVjaW1hbCBzdHJpbmcgZm9ybWF0XG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IEEgYmluYXJ5IGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGNvbWJpbmVkIGhhc2ggaW5wdXRcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZU11bHRpSGFzaEZvclRvcG9sb2d5KGhhc2hlczogc3RyaW5nW10pOiBCdWZmZXIge1xuICAgIGNvbnN0IHNvcnRlZEhhc2hlcyA9IGhhc2hlc1xuICAgICAgLm1hcCgoaGV4KSA9PiBCdWZmZXIuZnJvbShoZXgsICdoZXgnKSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnRvU3RyaW5nKCdoZXgnKS5sb2NhbGVDb21wYXJlKGIudG9TdHJpbmcoJ2hleCcpKSk7XG5cbiAgICBjb25zdCBudW1IYXNoZXNCeXRlcyA9IHRoaXMuZW5jb2RlSW50MzIoc29ydGVkSGFzaGVzLmxlbmd0aCk7XG4gICAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW251bUhhc2hlc0J5dGVzXTtcblxuICAgIGZvciAoY29uc3QgaCBvZiBzb3J0ZWRIYXNoZXMpIHtcbiAgICAgIGNvbnN0IGxlbmd0aEJ5dGVzID0gdGhpcy5lbmNvZGVJbnQzMihoLmxlbmd0aCk7XG4gICAgICBwYXJ0cy5wdXNoKGxlbmd0aEJ5dGVzLCBoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChwYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyBhIDMyLWJpdCBzaWduZWQgaW50ZWdlciBpbnRvIGEgNC1ieXRlIGJpZy1lbmRpYW4gQnVmZmVyXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBpbnRlZ2VyIHRvIGVuY29kZVxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBBIDQtYnl0ZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBpbnRlZ2VyIGluIGJpZy1lbmRpYW4gZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGVuY29kZUludDMyKHZhbHVlOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBidWYud3JpdGVJbnQzMkJFKHZhbHVlLCAwKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIl19
@@ -0,0 +1,101 @@
1
+ import BigNumber from 'bignumber.js';
2
+ import { BaseAddress, BaseKey, BaseTransactionBuilder, PublicKey } from '@bitgo-beta/sdk-core';
3
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
4
+ import { PreparedParty, WalletInitRequest } from './iface';
5
+ import { WalletInitTransaction } from './walletInitialization/walletInitTransaction';
6
+ export declare class WalletInitBuilder extends BaseTransactionBuilder {
7
+ private _transaction;
8
+ private _signatures;
9
+ private _publicKey;
10
+ private _partyHint;
11
+ private _localParticipantObservationOnly;
12
+ private _otherConfirmingParticipantUids;
13
+ private _confirmationThreshold;
14
+ private _observingParticipantUids;
15
+ constructor(_coinConfig: Readonly<CoinConfig>);
16
+ initBuilder(tx: WalletInitTransaction): void;
17
+ protected buildImplementation(): Promise<WalletInitTransaction>;
18
+ protected fromImplementation(rawTransaction: any, isFirstSigner?: boolean): WalletInitTransaction;
19
+ protected signImplementation(key: BaseKey): WalletInitTransaction;
20
+ get transaction(): WalletInitTransaction;
21
+ set transaction(transaction: PreparedParty);
22
+ validateAddress(address: BaseAddress, addressFormat?: string): void;
23
+ validateKey(key: BaseKey): void;
24
+ validateRawTransaction(rawTransaction: string[]): void;
25
+ validateTransaction(transaction?: WalletInitTransaction): void;
26
+ validateValue(value: BigNumber): void;
27
+ /** @inheritDoc */
28
+ addSignature(publicKey: PublicKey, signature: Buffer): void;
29
+ /**
30
+ * Sets the public key used for signing.
31
+ *
32
+ * @param key - The public key of the wallet.
33
+ * @returns The current builder instance for chaining.
34
+ * @throws Error if key is not a valid public key
35
+ */
36
+ publicKey(key: string): this;
37
+ /**
38
+ * Sets the party hint (alias or name) used during wallet initialization.
39
+ *
40
+ * @param hint - A 5-character non-empty string representing the party hint.
41
+ * @returns The current builder instance for chaining.
42
+ * @throws Error if the hint is empty or more than 5 characters long.
43
+ */
44
+ partyHint(hint: string): this;
45
+ /**
46
+ * Sets whether the local participant should be added in observation-only mode.
47
+ *
48
+ * @param flag - Boolean flag indicating observation-only status.
49
+ * @returns The current builder instance for chaining.
50
+ */
51
+ localParticipantObservationOnly(flag: boolean): this;
52
+ /**
53
+ * Adds a confirming participant UID to the list of other confirming participants.
54
+ *
55
+ * @param uid - A non-empty string UID of another confirming participant.
56
+ * @returns The current builder instance for chaining.
57
+ * @throws Error if the UID is empty.
58
+ */
59
+ otherConfirmingParticipantUid(uid: string): this;
60
+ /**
61
+ * Sets the confirmation threshold for the wallet initialization.
62
+ *
63
+ * @param threshold - A positive integer indicating how many confirmations are required.
64
+ * @returns The current builder instance for chaining.
65
+ * @throws Error if the threshold is not a positive integer.
66
+ */
67
+ confirmationThreshold(threshold: number): this;
68
+ /**
69
+ * Adds an observing participant UID to the list of observers.
70
+ *
71
+ * @param uid - A non-empty string UID of the observing participant.
72
+ * @returns The current builder instance for chaining.
73
+ * @throws Error if the UID is empty.
74
+ */
75
+ observingParticipantUid(uid: string): this;
76
+ /**
77
+ * Builds and returns the WalletInitRequest object from the builder's internal state.
78
+ *
79
+ * This method performs validation before constructing the object. If required fields are
80
+ * missing or invalid, it throws an error.
81
+ *
82
+ * @returns {WalletInitRequest} - A fully constructed and validated request object for wallet initialization.
83
+ * @throws {Error} If any required field is missing or fails validation.
84
+ */
85
+ toRequestObject(): WalletInitRequest;
86
+ /**
87
+ * Validates the internal state of the builder before building the request object.
88
+ *
89
+ * Checks for:
90
+ * - Presence of a synchronizer ID.
91
+ * - `partyHint` must not be empty and must be at most 5 characters long.
92
+ * - Public key must include `keyData`, `format`, and `keySpec`.
93
+ * - Confirmation threshold must be a positive integer.
94
+ * - Confirming and observing participant UID lists must be arrays.
95
+ *
96
+ * @private
97
+ * @throws {Error} If any required field is missing or invalid.
98
+ */
99
+ private validate;
100
+ }
101
+ //# sourceMappingURL=walletInitBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletInitBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/walletInitBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAGtB,SAAS,EAEV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAc,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAGrF,qBAAa,iBAAkB,SAAQ,sBAAsB;IAC3D,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,WAAW,CAAmB;IAEtC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gCAAgC,CAAS;IACjD,OAAO,CAAC,+BAA+B,CAAgB;IACvD,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,yBAAyB,CAAgB;gBAErC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,WAAW,CAAC,EAAE,EAAE,qBAAqB,GAAG,IAAI;IAI5C,SAAS,CAAC,mBAAmB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAI/D,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,qBAAqB;IAIjG,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB;IAIjE,IAAI,WAAW,IAAI,qBAAqB,CAEvC;IAED,IAAI,WAAW,CAAC,WAAW,EAAE,aAAa,EAEzC;IAED,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAY/B,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI;IAUtD,mBAAmB,CAAC,WAAW,CAAC,EAAE,qBAAqB,GAAG,IAAI;IAW9D,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIrC,kBAAkB;IAClB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ3D;;;;;;OAMG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAU5B;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY7B;;;;;OAKG;IACH,+BAA+B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKpD;;;;;;OAMG;IACH,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAYhD;;;;;;OAMG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ9C;;;;;;OAMG;IACH,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAY1C;;;;;;;;OAQG;IACH,eAAe,IAAI,iBAAiB;IAYpC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,QAAQ;CAejB"}