@sequence0/sdk 1.1.0 → 1.2.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 (115) hide show
  1. package/README.md +1 -1
  2. package/dist/chains/algorand.d.ts +44 -0
  3. package/dist/chains/algorand.d.ts.map +1 -0
  4. package/dist/chains/algorand.js +148 -0
  5. package/dist/chains/algorand.js.map +1 -0
  6. package/dist/chains/aptos.d.ts +39 -0
  7. package/dist/chains/aptos.d.ts.map +1 -0
  8. package/dist/chains/aptos.js +168 -0
  9. package/dist/chains/aptos.js.map +1 -0
  10. package/dist/chains/bitcoin-taproot.d.ts +77 -14
  11. package/dist/chains/bitcoin-taproot.d.ts.map +1 -1
  12. package/dist/chains/bitcoin-taproot.js +324 -65
  13. package/dist/chains/bitcoin-taproot.js.map +1 -1
  14. package/dist/chains/bitcoin.d.ts +12 -7
  15. package/dist/chains/bitcoin.d.ts.map +1 -1
  16. package/dist/chains/bitcoin.js +14 -9
  17. package/dist/chains/bitcoin.js.map +1 -1
  18. package/dist/chains/cardano.d.ts +42 -0
  19. package/dist/chains/cardano.d.ts.map +1 -0
  20. package/dist/chains/cardano.js +188 -0
  21. package/dist/chains/cardano.js.map +1 -0
  22. package/dist/chains/cosmos.d.ts +42 -0
  23. package/dist/chains/cosmos.d.ts.map +1 -0
  24. package/dist/chains/cosmos.js +216 -0
  25. package/dist/chains/cosmos.js.map +1 -0
  26. package/dist/chains/dogecoin-litecoin.d.ts +57 -0
  27. package/dist/chains/dogecoin-litecoin.d.ts.map +1 -0
  28. package/dist/chains/dogecoin-litecoin.js +521 -0
  29. package/dist/chains/dogecoin-litecoin.js.map +1 -0
  30. package/dist/chains/ethereum.d.ts.map +1 -1
  31. package/dist/chains/ethereum.js +16 -0
  32. package/dist/chains/ethereum.js.map +1 -1
  33. package/dist/chains/hedera.d.ts +113 -0
  34. package/dist/chains/hedera.d.ts.map +1 -0
  35. package/dist/chains/hedera.js +302 -0
  36. package/dist/chains/hedera.js.map +1 -0
  37. package/dist/chains/icp.d.ts +95 -0
  38. package/dist/chains/icp.d.ts.map +1 -0
  39. package/dist/chains/icp.js +520 -0
  40. package/dist/chains/icp.js.map +1 -0
  41. package/dist/chains/kaspa.d.ts +152 -0
  42. package/dist/chains/kaspa.d.ts.map +1 -0
  43. package/dist/chains/kaspa.js +790 -0
  44. package/dist/chains/kaspa.js.map +1 -0
  45. package/dist/chains/multiversx.d.ts +143 -0
  46. package/dist/chains/multiversx.d.ts.map +1 -0
  47. package/dist/chains/multiversx.js +524 -0
  48. package/dist/chains/multiversx.js.map +1 -0
  49. package/dist/chains/near.d.ts +40 -0
  50. package/dist/chains/near.d.ts.map +1 -0
  51. package/dist/chains/near.js +170 -0
  52. package/dist/chains/near.js.map +1 -0
  53. package/dist/chains/polkadot.d.ts +43 -0
  54. package/dist/chains/polkadot.d.ts.map +1 -0
  55. package/dist/chains/polkadot.js +179 -0
  56. package/dist/chains/polkadot.js.map +1 -0
  57. package/dist/chains/ripple.d.ts +41 -0
  58. package/dist/chains/ripple.d.ts.map +1 -0
  59. package/dist/chains/ripple.js +190 -0
  60. package/dist/chains/ripple.js.map +1 -0
  61. package/dist/chains/stellar.d.ts +40 -0
  62. package/dist/chains/stellar.d.ts.map +1 -0
  63. package/dist/chains/stellar.js +156 -0
  64. package/dist/chains/stellar.js.map +1 -0
  65. package/dist/chains/sui.d.ts +44 -0
  66. package/dist/chains/sui.d.ts.map +1 -0
  67. package/dist/chains/sui.js +157 -0
  68. package/dist/chains/sui.js.map +1 -0
  69. package/dist/chains/tezos.d.ts +43 -0
  70. package/dist/chains/tezos.d.ts.map +1 -0
  71. package/dist/chains/tezos.js +162 -0
  72. package/dist/chains/tezos.js.map +1 -0
  73. package/dist/chains/ton.d.ts +40 -0
  74. package/dist/chains/ton.d.ts.map +1 -0
  75. package/dist/chains/ton.js +168 -0
  76. package/dist/chains/ton.js.map +1 -0
  77. package/dist/chains/tron.d.ts +41 -0
  78. package/dist/chains/tron.d.ts.map +1 -0
  79. package/dist/chains/tron.js +124 -0
  80. package/dist/chains/tron.js.map +1 -0
  81. package/dist/core/client.d.ts +4 -5
  82. package/dist/core/client.d.ts.map +1 -1
  83. package/dist/core/client.js +54 -29
  84. package/dist/core/client.js.map +1 -1
  85. package/dist/core/types.d.ts +161 -1
  86. package/dist/core/types.d.ts.map +1 -1
  87. package/dist/erc4337/types.js +2 -2
  88. package/dist/index.d.ts +21 -3
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +85 -4
  91. package/dist/index.js.map +1 -1
  92. package/dist/utils/discovery.d.ts.map +1 -1
  93. package/dist/utils/discovery.js +56 -1
  94. package/dist/utils/discovery.js.map +1 -1
  95. package/dist/utils/eip712.d.ts +36 -0
  96. package/dist/utils/eip712.d.ts.map +1 -0
  97. package/dist/utils/eip712.js +80 -0
  98. package/dist/utils/eip712.js.map +1 -0
  99. package/dist/utils/fee.d.ts +2 -2
  100. package/dist/utils/fee.js +2 -2
  101. package/dist/utils/optional-deps.d.ts +9 -0
  102. package/dist/utils/optional-deps.d.ts.map +1 -0
  103. package/dist/utils/optional-deps.js +21 -0
  104. package/dist/utils/optional-deps.js.map +1 -0
  105. package/dist/utils/validation.d.ts +8 -0
  106. package/dist/utils/validation.d.ts.map +1 -1
  107. package/dist/utils/validation.js +24 -1
  108. package/dist/utils/validation.js.map +1 -1
  109. package/dist/utils/websocket.js +1 -1
  110. package/dist/utils/websocket.js.map +1 -1
  111. package/dist/wallet/wallet.d.ts +16 -2
  112. package/dist/wallet/wallet.d.ts.map +1 -1
  113. package/dist/wallet/wallet.js +131 -58
  114. package/dist/wallet/wallet.js.map +1 -1
  115. package/package.json +35 -1
@@ -0,0 +1,520 @@
1
+ "use strict";
2
+ /**
3
+ * Internet Computer (ICP) Chain Adapter
4
+ *
5
+ * Builds ICP ledger transfer requests, computes the signing payload
6
+ * as SHA-256 of the request envelope, attaches secp256k1 ECDSA
7
+ * signatures from the FROST threshold signing network, and
8
+ * broadcasts via the IC HTTP API.
9
+ *
10
+ * Curve: secp256k1 (ECDSA)
11
+ * Native token: ICP (1 ICP = 1e8 e8s)
12
+ * API: IC HTTP API at https://ic0.app
13
+ *
14
+ * No external dependencies — uses raw HTTP calls and built-in crypto.
15
+ *
16
+ * The ICP transaction model is canister-call based. A transfer is a
17
+ * call to the ICP ledger canister (ryjl3-tyaaa-aaaaa-aaaba-cai) with
18
+ * the "transfer" method. The signing payload is the SHA-256 hash of
19
+ * the CBOR-encoded request ID derived from the request content map.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.IcpAdapter = void 0;
23
+ exports.createIcpAdapter = createIcpAdapter;
24
+ const crypto_1 = require("crypto");
25
+ const errors_1 = require("../utils/errors");
26
+ /** ICP Ledger canister ID */
27
+ const LEDGER_CANISTER_ID = 'ryjl3-tyaaa-aaaaa-aaaba-cai';
28
+ /** Default API endpoints */
29
+ const DEFAULT_APIS = {
30
+ mainnet: 'https://ic0.app',
31
+ local: 'http://127.0.0.1:4943',
32
+ };
33
+ /** Default transfer fee in e8s (10000 e8s = 0.0001 ICP) */
34
+ const DEFAULT_FEE = '10000';
35
+ /** Domain separator for IC request signing */
36
+ const IC_REQUEST_DOMAIN_SEPARATOR = '\x0Aic-request';
37
+ /**
38
+ * LEB128 variable-length unsigned integer encoding.
39
+ * Used by the IC protocol for encoding integer values in request bodies.
40
+ */
41
+ function encodeLeb128(value) {
42
+ const bytes = [];
43
+ while (value > 127n) {
44
+ bytes.push(Number(value & 0x7fn) | 0x80);
45
+ value >>= 7n;
46
+ }
47
+ bytes.push(Number(value));
48
+ return Buffer.from(bytes);
49
+ }
50
+ /**
51
+ * Encode a value for the IC request hash tree.
52
+ *
53
+ * The IC uses a specific encoding for hashing request fields:
54
+ * - strings: UTF-8 bytes
55
+ * - blobs: raw bytes
56
+ * - integers: LEB128 encoded
57
+ */
58
+ function encodeValue(value) {
59
+ if (typeof value === 'bigint') {
60
+ return encodeLeb128(value);
61
+ }
62
+ if (Buffer.isBuffer(value)) {
63
+ return value;
64
+ }
65
+ return Buffer.from(value, 'utf-8');
66
+ }
67
+ /**
68
+ * Compute the SHA-256 hash of a buffer.
69
+ */
70
+ function sha256(data) {
71
+ return (0, crypto_1.createHash)('sha256').update(data).digest();
72
+ }
73
+ /**
74
+ * Compute the IC request ID from a content map.
75
+ *
76
+ * The request ID is the SHA-256 of the concatenated hashes of each
77
+ * field, where fields are sorted by their hashed keys. Each field
78
+ * contributes: SHA-256(key) || SHA-256(value).
79
+ *
80
+ * See: https://internetcomputer.org/docs/references/ic-interface-spec#request-id
81
+ */
82
+ function computeRequestId(fields) {
83
+ const hashedPairs = [];
84
+ for (const [key, value] of fields) {
85
+ const keyHash = sha256(Buffer.from(key, 'utf-8'));
86
+ const valueHash = sha256(encodeValue(value));
87
+ hashedPairs.push({ keyHash, valueHash });
88
+ }
89
+ // Sort by key hash (lexicographic byte comparison)
90
+ hashedPairs.sort((a, b) => Buffer.compare(a.keyHash, b.keyHash));
91
+ // Concatenate all keyHash || valueHash pairs
92
+ const concatenated = Buffer.concat(hashedPairs.flatMap(p => [p.keyHash, p.valueHash]));
93
+ return sha256(concatenated);
94
+ }
95
+ /**
96
+ * Encode account identifier from a hex string to bytes.
97
+ * ICP account identifiers are 32-byte values.
98
+ */
99
+ function decodeAccountId(accountId) {
100
+ const hex = accountId.startsWith('0x') ? accountId.slice(2) : accountId;
101
+ return Buffer.from(hex, 'hex');
102
+ }
103
+ /**
104
+ * Encode a Candid-style transfer argument as a simplified binary format.
105
+ *
106
+ * This builds the argument blob for the ledger "transfer" method:
107
+ * record {
108
+ * to: AccountIdentifier (blob, 32 bytes)
109
+ * fee: Tokens (record { e8s: nat64 })
110
+ * memo: nat64
111
+ * amount: Tokens (record { e8s: nat64 })
112
+ * }
113
+ *
114
+ * For simplicity, we encode the essential fields as a deterministic
115
+ * binary blob that the adapter can reconstruct for broadcast.
116
+ */
117
+ function encodeTransferArgs(to, amount, fee, memo) {
118
+ // Layout: [to (32 bytes)] [amount (8 bytes BE)] [fee (8 bytes BE)] [memo (8 bytes BE)]
119
+ const buf = Buffer.alloc(56);
120
+ to.copy(buf, 0, 0, 32);
121
+ // Write amount as big-endian uint64
122
+ buf.writeBigUInt64BE(amount, 32);
123
+ buf.writeBigUInt64BE(fee, 40);
124
+ buf.writeBigUInt64BE(memo, 48);
125
+ return buf;
126
+ }
127
+ /**
128
+ * Decode transfer args from the binary format back to components.
129
+ */
130
+ function decodeTransferArgs(buf) {
131
+ return {
132
+ to: buf.subarray(0, 32),
133
+ amount: buf.readBigUInt64BE(32),
134
+ fee: buf.readBigUInt64BE(40),
135
+ memo: buf.readBigUInt64BE(48),
136
+ };
137
+ }
138
+ class IcpAdapter {
139
+ constructor(network = 'mainnet', apiUrl) {
140
+ this.network = network;
141
+ this.apiUrl = apiUrl || DEFAULT_APIS[network];
142
+ }
143
+ getRpcUrl() {
144
+ return this.apiUrl;
145
+ }
146
+ /**
147
+ * Build an unsigned ICP ledger transfer request.
148
+ *
149
+ * Constructs the transfer call content map, computes the request ID
150
+ * (signing payload), and returns the hex-encoded payload containing
151
+ * all information needed for signing and broadcast.
152
+ *
153
+ * The signing payload is: SHA-256(domain_separator || request_id)
154
+ * where domain_separator = "\x0Aic-request"
155
+ *
156
+ * @param tx - ICP transfer details (to, amount in e8s, optional memo/fee)
157
+ * @param fromAddress - Sender's principal or account ID (hex)
158
+ * @returns hex-encoded JSON payload with signingHash and request data
159
+ */
160
+ async buildTransaction(tx, fromAddress) {
161
+ try {
162
+ const fee = BigInt(tx.fee || DEFAULT_FEE);
163
+ const amount = BigInt(tx.amount);
164
+ const memo = tx.memo !== undefined ? BigInt(tx.memo) : 0n;
165
+ // Validate amount covers fee
166
+ if (amount <= 0n) {
167
+ throw new Error('Transfer amount must be positive');
168
+ }
169
+ // Decode recipient account ID
170
+ const toAccountId = decodeAccountId(tx.to);
171
+ if (toAccountId.length !== 32) {
172
+ throw new Error(`Invalid ICP account ID length: expected 32 bytes, got ${toAccountId.length}`);
173
+ }
174
+ // Encode the transfer arguments
175
+ const argBytes = encodeTransferArgs(toAccountId, amount, fee, memo);
176
+ // Current time in nanoseconds (IC uses nanosecond timestamps)
177
+ const ingressExpiryNs = BigInt(Date.now() * 1000000) + 300000000000n; // +5 min
178
+ // Build the content map for the request
179
+ const contentMap = new Map([
180
+ ['request_type', 'call'],
181
+ ['canister_id', Buffer.from(principalToBytes(LEDGER_CANISTER_ID))],
182
+ ['method_name', 'transfer'],
183
+ ['arg', argBytes],
184
+ ['sender', Buffer.from(principalToBytes(fromAddress))],
185
+ ['ingress_expiry', ingressExpiryNs],
186
+ ]);
187
+ // Compute the request ID
188
+ const requestId = computeRequestId(contentMap);
189
+ // The signing payload: SHA-256(domain_separator || request_id)
190
+ const signingPayload = sha256(Buffer.concat([
191
+ Buffer.from(IC_REQUEST_DOMAIN_SEPARATOR, 'ascii'),
192
+ requestId,
193
+ ]));
194
+ const payload = {
195
+ signingHash: signingPayload.toString('hex'),
196
+ requestId: requestId.toString('hex'),
197
+ sender: fromAddress,
198
+ canisterId: LEDGER_CANISTER_ID,
199
+ methodName: 'transfer',
200
+ arg: argBytes.toString('hex'),
201
+ ingressExpiry: ingressExpiryNs.toString(),
202
+ to: tx.to,
203
+ amount: tx.amount,
204
+ fee: fee.toString(),
205
+ memo: memo.toString(),
206
+ };
207
+ return Buffer.from(JSON.stringify(payload)).toString('hex');
208
+ }
209
+ catch (e) {
210
+ if (e instanceof errors_1.ChainError)
211
+ throw e;
212
+ throw new errors_1.ChainError(`Failed to build ICP transaction: ${e.message}`, 'icp');
213
+ }
214
+ }
215
+ /**
216
+ * Extract the signing payload (SHA-256 hash) from the build output.
217
+ *
218
+ * The signing payload is the SHA-256 of (domain_separator || request_id).
219
+ * This is the 32-byte hash that the FROST network signs with secp256k1.
220
+ */
221
+ getSigningPayload(unsignedTx) {
222
+ try {
223
+ const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
224
+ return payload.signingHash;
225
+ }
226
+ catch {
227
+ return unsignedTx;
228
+ }
229
+ }
230
+ /**
231
+ * Attach a secp256k1 ECDSA signature to the ICP request envelope.
232
+ *
233
+ * The IC expects the signature in DER-encoded format within a
234
+ * CBOR envelope. We store the 65-byte raw signature (r||s||v)
235
+ * and convert during broadcast.
236
+ */
237
+ async attachSignature(unsignedTx, signature) {
238
+ try {
239
+ const payload = JSON.parse(Buffer.from(unsignedTx, 'hex').toString());
240
+ const sig = signature.startsWith('0x') ? signature.slice(2) : signature;
241
+ const signedPayload = {
242
+ ...payload,
243
+ signature: sig, // 65-byte r||s||v
244
+ };
245
+ return Buffer.from(JSON.stringify(signedPayload)).toString('hex');
246
+ }
247
+ catch (e) {
248
+ throw new errors_1.ChainError(`Failed to attach ICP signature: ${e.message}`, 'icp');
249
+ }
250
+ }
251
+ /**
252
+ * Broadcast a signed ICP transaction via the IC HTTP API.
253
+ *
254
+ * Submits the signed request envelope to:
255
+ * POST /api/v2/canister/{canister_id}/call
256
+ *
257
+ * The IC returns a 202 Accepted on success with the request ID
258
+ * that can be polled for status.
259
+ *
260
+ * @returns request ID (hex) which serves as the transaction identifier
261
+ */
262
+ async broadcast(signedTx) {
263
+ try {
264
+ const payload = JSON.parse(Buffer.from(signedTx, 'hex').toString());
265
+ if (!payload.signature) {
266
+ throw new Error('Transaction is not signed');
267
+ }
268
+ // Build the CBOR-like envelope for the IC HTTP API
269
+ // The IC expects a specific CBOR structure, but we use
270
+ // the JSON-compatible /api/v2 endpoint format
271
+ const sigBytes = Buffer.from(payload.signature, 'hex');
272
+ // Extract r and s from the 65-byte signature (drop v byte)
273
+ const r = sigBytes.subarray(0, 32);
274
+ const s = sigBytes.subarray(32, 64);
275
+ // DER-encode the signature for IC consumption
276
+ const derSig = derEncodeSignature(r, s);
277
+ // Build the envelope
278
+ const envelope = {
279
+ content: {
280
+ request_type: 'call',
281
+ canister_id: principalToBytes(payload.canisterId),
282
+ method_name: payload.methodName,
283
+ arg: Array.from(Buffer.from(payload.arg, 'hex')),
284
+ sender: principalToBytes(payload.sender),
285
+ ingress_expiry: payload.ingressExpiry,
286
+ },
287
+ sender_pubkey: [], // Filled by the agent in practice
288
+ sender_sig: Array.from(derSig),
289
+ };
290
+ // Submit to the IC
291
+ const url = `${this.apiUrl}/api/v2/canister/${payload.canisterId}/call`;
292
+ const body = Buffer.from(JSON.stringify(envelope));
293
+ const response = await fetch(url, {
294
+ method: 'POST',
295
+ headers: {
296
+ 'Content-Type': 'application/cbor',
297
+ },
298
+ body,
299
+ });
300
+ // IC returns 202 Accepted for successful call submissions
301
+ if (response.status === 200 || response.status === 202) {
302
+ return payload.requestId;
303
+ }
304
+ // Try to get error details
305
+ const errorText = await response.text().catch(() => 'Unknown error');
306
+ throw new Error(`IC API returned ${response.status}: ${errorText}`);
307
+ }
308
+ catch (e) {
309
+ if (e instanceof errors_1.ChainError)
310
+ throw e;
311
+ throw new errors_1.ChainError(`Failed to broadcast ICP tx: ${e.message}`, 'icp');
312
+ }
313
+ }
314
+ /**
315
+ * Get ICP balance in e8s (1 ICP = 1e8 e8s).
316
+ *
317
+ * Queries the ledger canister using the read_state/query endpoint
318
+ * with the "icrc1_balance_of" method.
319
+ *
320
+ * @param address - Principal ID or account ID (hex)
321
+ * @returns balance in e8s as string
322
+ */
323
+ async getBalance(address) {
324
+ try {
325
+ // Use the ledger canister query endpoint
326
+ const url = `${this.apiUrl}/api/v2/canister/${LEDGER_CANISTER_ID}/query`;
327
+ // Build query for account_balance
328
+ // The argument encodes the account identifier
329
+ const accountId = decodeAccountId(address);
330
+ const argBytes = Buffer.alloc(36);
331
+ // DIDL header (empty type table) + account blob
332
+ argBytes.writeUInt8(0x44, 0); // 'D'
333
+ argBytes.writeUInt8(0x49, 1); // 'I'
334
+ argBytes.writeUInt8(0x44, 2); // 'D'
335
+ argBytes.writeUInt8(0x4c, 3); // 'L'
336
+ accountId.copy(argBytes, 4);
337
+ const queryPayload = {
338
+ content: {
339
+ request_type: 'query',
340
+ canister_id: principalToBytes(LEDGER_CANISTER_ID),
341
+ method_name: 'account_balance',
342
+ arg: Array.from(argBytes),
343
+ sender: principalToBytes('2vxsx-fae'), // Anonymous principal
344
+ ingress_expiry: (BigInt(Date.now() * 1000000) + 300000000000n).toString(),
345
+ },
346
+ };
347
+ const response = await fetch(url, {
348
+ method: 'POST',
349
+ headers: {
350
+ 'Content-Type': 'application/cbor',
351
+ },
352
+ body: Buffer.from(JSON.stringify(queryPayload)),
353
+ });
354
+ if (!response.ok) {
355
+ return '0';
356
+ }
357
+ // Parse the response to extract the balance
358
+ const data = await response.arrayBuffer();
359
+ const resultBytes = Buffer.from(data);
360
+ // The balance is returned as a Candid-encoded nat64
361
+ // For simplicity, try to extract the e8s value from the response
362
+ if (resultBytes.length >= 8) {
363
+ // Look for the balance value in the reply
364
+ // The Candid reply contains the Tokens record with e8s field
365
+ const lastEight = resultBytes.subarray(resultBytes.length - 8);
366
+ const balance = lastEight.readBigUInt64LE(0);
367
+ return balance.toString();
368
+ }
369
+ return '0';
370
+ }
371
+ catch {
372
+ return '0';
373
+ }
374
+ }
375
+ /**
376
+ * Check the status of a submitted request.
377
+ *
378
+ * After broadcast, callers can poll this method with the request ID
379
+ * to check whether the transfer was accepted by the ledger canister.
380
+ *
381
+ * @param requestId - hex-encoded request ID from broadcast()
382
+ * @returns status string: 'received', 'processing', 'replied', 'rejected', 'done', or 'unknown'
383
+ */
384
+ async getRequestStatus(requestId) {
385
+ try {
386
+ const requestIdBytes = Buffer.from(requestId, 'hex');
387
+ // Build read_state request for the given request ID
388
+ const paths = [[
389
+ Buffer.from('request_status'),
390
+ requestIdBytes,
391
+ Buffer.from('status'),
392
+ ]];
393
+ const url = `${this.apiUrl}/api/v2/canister/${LEDGER_CANISTER_ID}/read_state`;
394
+ const readStatePayload = {
395
+ content: {
396
+ request_type: 'read_state',
397
+ paths: paths.map(p => p.map(seg => Array.from(seg))),
398
+ sender: principalToBytes('2vxsx-fae'), // Anonymous
399
+ ingress_expiry: (BigInt(Date.now() * 1000000) + 300000000000n).toString(),
400
+ },
401
+ };
402
+ const response = await fetch(url, {
403
+ method: 'POST',
404
+ headers: {
405
+ 'Content-Type': 'application/cbor',
406
+ },
407
+ body: Buffer.from(JSON.stringify(readStatePayload)),
408
+ });
409
+ if (!response.ok) {
410
+ return 'unknown';
411
+ }
412
+ // Parse the certificate to extract the status
413
+ const data = await response.arrayBuffer();
414
+ const resultBuf = Buffer.from(data);
415
+ const statusStr = resultBuf.toString('utf-8');
416
+ if (statusStr.includes('replied'))
417
+ return 'replied';
418
+ if (statusStr.includes('rejected'))
419
+ return 'rejected';
420
+ if (statusStr.includes('done'))
421
+ return 'done';
422
+ if (statusStr.includes('processing'))
423
+ return 'processing';
424
+ if (statusStr.includes('received'))
425
+ return 'received';
426
+ return 'unknown';
427
+ }
428
+ catch {
429
+ return 'unknown';
430
+ }
431
+ }
432
+ /**
433
+ * Get the ICP ledger canister ID.
434
+ */
435
+ getLedgerCanisterId() {
436
+ return LEDGER_CANISTER_ID;
437
+ }
438
+ }
439
+ exports.IcpAdapter = IcpAdapter;
440
+ /**
441
+ * Convert a textual principal to raw bytes.
442
+ *
443
+ * Principal IDs use a base32-like encoding (no padding) with a 4-byte
444
+ * CRC32 checksum prepended. This function handles the well-known
445
+ * anonymous principal ('2vxsx-fae') and canister/user principals.
446
+ *
447
+ * For simplicity, we return the UTF-8 bytes of the principal string
448
+ * when full decoding is not needed (the IC API accepts both formats).
449
+ */
450
+ function principalToBytes(principal) {
451
+ // Anonymous principal
452
+ if (principal === '2vxsx-fae') {
453
+ return [0x04];
454
+ }
455
+ // For canister/user principals, decode the base32 representation
456
+ // Remove hyphens and convert from base32
457
+ const clean = principal.replace(/-/g, '').toUpperCase();
458
+ const base32Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
459
+ let bits = '';
460
+ for (const c of clean) {
461
+ const idx = base32Chars.indexOf(c);
462
+ if (idx === -1) {
463
+ // If not valid base32, return UTF-8 bytes as fallback
464
+ return Array.from(Buffer.from(principal, 'utf-8'));
465
+ }
466
+ bits += idx.toString(2).padStart(5, '0');
467
+ }
468
+ // Convert bits to bytes
469
+ const bytes = [];
470
+ for (let i = 0; i + 8 <= bits.length; i += 8) {
471
+ bytes.push(parseInt(bits.substring(i, i + 8), 2));
472
+ }
473
+ // First 4 bytes are CRC32 checksum, rest is the principal
474
+ if (bytes.length > 4) {
475
+ return bytes.slice(4);
476
+ }
477
+ return bytes;
478
+ }
479
+ /**
480
+ * DER-encode an ECDSA signature (r, s) for IC consumption.
481
+ *
482
+ * The IC expects signatures in DER format:
483
+ * SEQUENCE { INTEGER(r), INTEGER(s) }
484
+ */
485
+ function derEncodeSignature(r, s) {
486
+ // Remove leading zeros, then add 0x00 prefix if high bit is set
487
+ const rTrimmed = trimLeadingZeros(r);
488
+ const sTrimmed = trimLeadingZeros(s);
489
+ const rPadded = rTrimmed[0] & 0x80 ? Buffer.concat([Buffer.from([0x00]), rTrimmed]) : rTrimmed;
490
+ const sPadded = sTrimmed[0] & 0x80 ? Buffer.concat([Buffer.from([0x00]), sTrimmed]) : sTrimmed;
491
+ // DER: 0x30 <total_len> 0x02 <r_len> <r> 0x02 <s_len> <s>
492
+ const totalLen = 2 + rPadded.length + 2 + sPadded.length;
493
+ const der = Buffer.alloc(2 + totalLen);
494
+ let offset = 0;
495
+ der[offset++] = 0x30; // SEQUENCE
496
+ der[offset++] = totalLen;
497
+ der[offset++] = 0x02; // INTEGER
498
+ der[offset++] = rPadded.length;
499
+ rPadded.copy(der, offset);
500
+ offset += rPadded.length;
501
+ der[offset++] = 0x02; // INTEGER
502
+ der[offset++] = sPadded.length;
503
+ sPadded.copy(der, offset);
504
+ return der;
505
+ }
506
+ /**
507
+ * Remove leading zero bytes from a buffer.
508
+ */
509
+ function trimLeadingZeros(buf) {
510
+ let i = 0;
511
+ while (i < buf.length - 1 && buf[i] === 0) {
512
+ i++;
513
+ }
514
+ return buf.subarray(i);
515
+ }
516
+ /** Create a mainnet ICP adapter */
517
+ function createIcpAdapter(apiUrl) {
518
+ return new IcpAdapter('mainnet', apiUrl);
519
+ }
520
+ //# sourceMappingURL=icp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icp.js","sourceRoot":"","sources":["../../src/chains/icp.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAskBH,4CAEC;AAtkBD,mCAAoC;AAEpC,4CAA6C;AAE7C,6BAA6B;AAC7B,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;AAEzD,4BAA4B;AAC5B,MAAM,YAAY,GAA2B;IACzC,OAAO,EAAE,iBAAiB;IAC1B,KAAK,EAAE,uBAAuB;CACjC,CAAC;AAEF,2DAA2D;AAC3D,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B,8CAA8C;AAC9C,MAAM,2BAA2B,GAAG,gBAAgB,CAAC;AAErD;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO,KAAK,GAAG,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACzC,KAAK,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,KAA+B;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,IAAY;IACxB,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,MAA6C;IACnE,MAAM,WAAW,GAAkD,EAAE,CAAC;IAEtE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,mDAAmD;IACnD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAEjE,6CAA6C;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAC9B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CACrD,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,SAAiB;IACtC,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,kBAAkB,CACvB,EAAU,EACV,MAAc,EACd,GAAW,EACX,IAAY;IAEZ,uFAAuF;IACvF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvB,oCAAoC;IACpC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjC,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9B,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE/B,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAW;IAMnC,OAAO;QACH,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QAC/B,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5B,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;KAChC,CAAC;AACN,CAAC;AAED,MAAa,UAAU;IAInB,YAAY,UAA+B,SAAS,EAAE,MAAe;QACjE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,gBAAgB,CAAC,EAAkB,EAAE,WAAmB;QAC1D,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE1D,6BAA6B;YAC7B,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACxD,CAAC;YAED,8BAA8B;YAC9B,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3C,IAAI,WAAW,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,yDAAyD,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YACnG,CAAC;YAED,gCAAgC;YAChC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAEpE,8DAA8D;YAC9D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAS,CAAC,GAAG,aAAgB,CAAC,CAAC,SAAS;YAEpF,wCAAwC;YACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAmC;gBACzD,CAAC,cAAc,EAAE,MAAM,CAAC;gBACxB,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAClE,CAAC,aAAa,EAAE,UAAU,CAAC;gBAC3B,CAAC,KAAK,EAAE,QAAQ,CAAC;gBACjB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;gBACtD,CAAC,gBAAgB,EAAE,eAAe,CAAC;aACtC,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAE/C,+DAA+D;YAC/D,MAAM,cAAc,GAAG,MAAM,CACzB,MAAM,CAAC,MAAM,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,OAAO,CAAC;gBACjD,SAAS;aACZ,CAAC,CACL,CAAC;YAEF,MAAM,OAAO,GAAG;gBACZ,WAAW,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC3C,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACpC,MAAM,EAAE,WAAW;gBACnB,UAAU,EAAE,kBAAkB;gBAC9B,UAAU,EAAE,UAAU;gBACtB,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC7B,aAAa,EAAE,eAAe,CAAC,QAAQ,EAAE;gBACzC,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;gBACnB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;aACxB,CAAC;YAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,mBAAU;gBAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,mBAAU,CAChB,oCAAqC,CAAW,CAAC,OAAO,EAAE,EAC1D,KAAK,CACR,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,UAAkB;QAChC,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,OAAO,OAAO,CAAC,WAAW,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,UAAU,CAAC;QACtB,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,SAAiB;QACvD,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAExE,MAAM,aAAa,GAAG;gBAClB,GAAG,OAAO;gBACV,SAAS,EAAE,GAAG,EAAE,kBAAkB;aACrC,CAAC;YAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,IAAI,mBAAU,CAChB,mCAAoC,CAAW,CAAC,OAAO,EAAE,EACzD,KAAK,CACR,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC5B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEpE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACjD,CAAC;YAED,mDAAmD;YACnD,uDAAuD;YACvD,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEvD,2DAA2D;YAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEpC,8CAA8C;YAC9C,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAExC,qBAAqB;YACrB,MAAM,QAAQ,GAAG;gBACb,OAAO,EAAE;oBACL,YAAY,EAAE,MAAM;oBACpB,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;oBACjD,WAAW,EAAE,OAAO,CAAC,UAAU;oBAC/B,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAChD,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;oBACxC,cAAc,EAAE,OAAO,CAAC,aAAa;iBACxC;gBACD,aAAa,EAAE,EAAE,EAAE,kCAAkC;gBACrD,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;aACjC,CAAC;YAEF,mBAAmB;YACnB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,oBAAoB,OAAO,CAAC,UAAU,OAAO,CAAC;YACxE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC9B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;iBACrC;gBACD,IAAI;aACP,CAAC,CAAC;YAEH,0DAA0D;YAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACrD,OAAO,OAAO,CAAC,SAAS,CAAC;YAC7B,CAAC;YAED,2BAA2B;YAC3B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,mBAAU;gBAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,mBAAU,CAChB,+BAAgC,CAAW,CAAC,OAAO,EAAE,EACrD,KAAK,CACR,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CAAC,OAAe;QAC5B,IAAI,CAAC;YACD,yCAAyC;YACzC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,oBAAoB,kBAAkB,QAAQ,CAAC;YAEzE,kCAAkC;YAClC,8CAA8C;YAC9C,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClC,gDAAgD;YAChD,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YACpC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YACpC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YACpC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YACpC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAE5B,MAAM,YAAY,GAAG;gBACjB,OAAO,EAAE;oBACL,YAAY,EAAE,OAAO;oBACrB,WAAW,EAAE,gBAAgB,CAAC,kBAAkB,CAAC;oBACjD,WAAW,EAAE,iBAAiB;oBAC9B,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;oBACzB,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE,sBAAsB;oBAC7D,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAS,CAAC,GAAG,aAAgB,CAAC,CAAC,QAAQ,EAAE;iBACjF;aACJ,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC9B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;iBACrC;gBACD,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;aAClD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,GAAG,CAAC;YACf,CAAC;YAED,4CAA4C;YAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEtC,oDAAoD;YACpD,iEAAiE;YACjE,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC1B,0CAA0C;gBAC1C,6DAA6D;gBAC7D,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC9B,CAAC;YAED,OAAO,GAAG,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,GAAG,CAAC;QACf,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QACpC,IAAI,CAAC;YACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAErD,oDAAoD;YACpD,MAAM,KAAK,GAAG,CAAC;oBACX,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;oBAC7B,cAAc;oBACd,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACxB,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,oBAAoB,kBAAkB,aAAa,CAAC;YAE9E,MAAM,gBAAgB,GAAG;gBACrB,OAAO,EAAE;oBACL,YAAY,EAAE,YAAY;oBAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpD,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE,YAAY;oBACnD,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAS,CAAC,GAAG,aAAgB,CAAC,CAAC,QAAQ,EAAE;iBACjF;aACJ,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC9B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;iBACrC;gBACD,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;aACtD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,8CAA8C;YAC9C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAE9C,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YACpD,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,UAAU,CAAC;YACtD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,OAAO,YAAY,CAAC;YAC1D,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,UAAU,CAAC;YAEtD,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,mBAAmB;QACf,OAAO,kBAAkB,CAAC;IAC9B,CAAC;CACJ;AAxVD,gCAwVC;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACvC,sBAAsB;IACtB,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,iEAAiE;IACjE,yCAAyC;IACzC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,kCAAkC,CAAC;IAEvD,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACb,sDAAsD;YACtD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,0DAA0D;IAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,CAAS,EAAE,CAAS;IAC5C,gEAAgE;IAChE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/F,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE/F,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACvC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW;IACjC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC;IACzB,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU;IAChC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IACzB,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU;IAChC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE1B,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,CAAC,EAAE,CAAC;IACR,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,mCAAmC;AACnC,SAAgB,gBAAgB,CAAC,MAAe;IAC5C,OAAO,IAAI,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}