@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.
- package/README.md +1 -1
- package/dist/chains/algorand.d.ts +44 -0
- package/dist/chains/algorand.d.ts.map +1 -0
- package/dist/chains/algorand.js +148 -0
- package/dist/chains/algorand.js.map +1 -0
- package/dist/chains/aptos.d.ts +39 -0
- package/dist/chains/aptos.d.ts.map +1 -0
- package/dist/chains/aptos.js +168 -0
- package/dist/chains/aptos.js.map +1 -0
- package/dist/chains/bitcoin-taproot.d.ts +77 -14
- package/dist/chains/bitcoin-taproot.d.ts.map +1 -1
- package/dist/chains/bitcoin-taproot.js +324 -65
- package/dist/chains/bitcoin-taproot.js.map +1 -1
- package/dist/chains/bitcoin.d.ts +12 -7
- package/dist/chains/bitcoin.d.ts.map +1 -1
- package/dist/chains/bitcoin.js +14 -9
- package/dist/chains/bitcoin.js.map +1 -1
- package/dist/chains/cardano.d.ts +42 -0
- package/dist/chains/cardano.d.ts.map +1 -0
- package/dist/chains/cardano.js +188 -0
- package/dist/chains/cardano.js.map +1 -0
- package/dist/chains/cosmos.d.ts +42 -0
- package/dist/chains/cosmos.d.ts.map +1 -0
- package/dist/chains/cosmos.js +216 -0
- package/dist/chains/cosmos.js.map +1 -0
- package/dist/chains/dogecoin-litecoin.d.ts +57 -0
- package/dist/chains/dogecoin-litecoin.d.ts.map +1 -0
- package/dist/chains/dogecoin-litecoin.js +521 -0
- package/dist/chains/dogecoin-litecoin.js.map +1 -0
- package/dist/chains/ethereum.d.ts.map +1 -1
- package/dist/chains/ethereum.js +16 -0
- package/dist/chains/ethereum.js.map +1 -1
- package/dist/chains/hedera.d.ts +113 -0
- package/dist/chains/hedera.d.ts.map +1 -0
- package/dist/chains/hedera.js +302 -0
- package/dist/chains/hedera.js.map +1 -0
- package/dist/chains/icp.d.ts +95 -0
- package/dist/chains/icp.d.ts.map +1 -0
- package/dist/chains/icp.js +520 -0
- package/dist/chains/icp.js.map +1 -0
- package/dist/chains/kaspa.d.ts +152 -0
- package/dist/chains/kaspa.d.ts.map +1 -0
- package/dist/chains/kaspa.js +790 -0
- package/dist/chains/kaspa.js.map +1 -0
- package/dist/chains/multiversx.d.ts +143 -0
- package/dist/chains/multiversx.d.ts.map +1 -0
- package/dist/chains/multiversx.js +524 -0
- package/dist/chains/multiversx.js.map +1 -0
- package/dist/chains/near.d.ts +40 -0
- package/dist/chains/near.d.ts.map +1 -0
- package/dist/chains/near.js +170 -0
- package/dist/chains/near.js.map +1 -0
- package/dist/chains/polkadot.d.ts +43 -0
- package/dist/chains/polkadot.d.ts.map +1 -0
- package/dist/chains/polkadot.js +179 -0
- package/dist/chains/polkadot.js.map +1 -0
- package/dist/chains/ripple.d.ts +41 -0
- package/dist/chains/ripple.d.ts.map +1 -0
- package/dist/chains/ripple.js +190 -0
- package/dist/chains/ripple.js.map +1 -0
- package/dist/chains/stellar.d.ts +40 -0
- package/dist/chains/stellar.d.ts.map +1 -0
- package/dist/chains/stellar.js +156 -0
- package/dist/chains/stellar.js.map +1 -0
- package/dist/chains/sui.d.ts +44 -0
- package/dist/chains/sui.d.ts.map +1 -0
- package/dist/chains/sui.js +157 -0
- package/dist/chains/sui.js.map +1 -0
- package/dist/chains/tezos.d.ts +43 -0
- package/dist/chains/tezos.d.ts.map +1 -0
- package/dist/chains/tezos.js +162 -0
- package/dist/chains/tezos.js.map +1 -0
- package/dist/chains/ton.d.ts +40 -0
- package/dist/chains/ton.d.ts.map +1 -0
- package/dist/chains/ton.js +168 -0
- package/dist/chains/ton.js.map +1 -0
- package/dist/chains/tron.d.ts +41 -0
- package/dist/chains/tron.d.ts.map +1 -0
- package/dist/chains/tron.js +124 -0
- package/dist/chains/tron.js.map +1 -0
- package/dist/core/client.d.ts +4 -5
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +54 -29
- package/dist/core/client.js.map +1 -1
- package/dist/core/types.d.ts +161 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/erc4337/types.js +2 -2
- package/dist/index.d.ts +21 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/discovery.d.ts.map +1 -1
- package/dist/utils/discovery.js +56 -1
- package/dist/utils/discovery.js.map +1 -1
- package/dist/utils/eip712.d.ts +36 -0
- package/dist/utils/eip712.d.ts.map +1 -0
- package/dist/utils/eip712.js +80 -0
- package/dist/utils/eip712.js.map +1 -0
- package/dist/utils/fee.d.ts +2 -2
- package/dist/utils/fee.js +2 -2
- package/dist/utils/optional-deps.d.ts +9 -0
- package/dist/utils/optional-deps.d.ts.map +1 -0
- package/dist/utils/optional-deps.js +21 -0
- package/dist/utils/optional-deps.js.map +1 -0
- package/dist/utils/validation.d.ts +8 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +24 -1
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/websocket.js +1 -1
- package/dist/utils/websocket.js.map +1 -1
- package/dist/wallet/wallet.d.ts +16 -2
- package/dist/wallet/wallet.d.ts.map +1 -1
- package/dist/wallet/wallet.js +131 -58
- package/dist/wallet/wallet.js.map +1 -1
- 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"}
|