@getomnichain/omnichain 0.6.3 → 0.7.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 (104) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/cjs/chain_ids.js +2 -2
  3. package/dist/cjs/chain_ids.js.map +1 -1
  4. package/dist/cjs/errors.js +6 -0
  5. package/dist/cjs/errors.js.map +1 -1
  6. package/dist/cjs/index.js +1 -1
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/ton/index.js +12 -0
  9. package/dist/cjs/ton/index.js.map +1 -1
  10. package/dist/cjs/ton/ton_address.js +72 -14
  11. package/dist/cjs/ton/ton_address.js.map +1 -1
  12. package/dist/cjs/ton/ton_asset.js +21 -0
  13. package/dist/cjs/ton/ton_asset.js.map +1 -0
  14. package/dist/cjs/ton/ton_assets.js +10 -0
  15. package/dist/cjs/ton/ton_assets.js.map +1 -0
  16. package/dist/cjs/ton/ton_chain.js +483 -0
  17. package/dist/cjs/ton/ton_chain.js.map +1 -0
  18. package/dist/cjs/ton/ton_chains.js +21 -0
  19. package/dist/cjs/ton/ton_chains.js.map +1 -0
  20. package/dist/cjs/ton/ton_jetton_metadata.js +107 -0
  21. package/dist/cjs/ton/ton_jetton_metadata.js.map +1 -0
  22. package/dist/cjs/ton/ton_messages.js +174 -0
  23. package/dist/cjs/ton/ton_messages.js.map +1 -0
  24. package/dist/cjs/ton/ton_provider.js +456 -0
  25. package/dist/cjs/ton/ton_provider.js.map +1 -0
  26. package/dist/cjs/ton/ton_tonapi.js +243 -0
  27. package/dist/cjs/ton/ton_tonapi.js.map +1 -0
  28. package/dist/cjs/ton/ton_toncenter.js +252 -0
  29. package/dist/cjs/ton/ton_toncenter.js.map +1 -0
  30. package/dist/cjs/ton/ton_transaction_status.js +231 -0
  31. package/dist/cjs/ton/ton_transaction_status.js.map +1 -0
  32. package/dist/cjs/ton/ton_transactions.js +107 -0
  33. package/dist/cjs/ton/ton_transactions.js.map +1 -0
  34. package/dist/cjs/ton/ton_wallet.js +285 -0
  35. package/dist/cjs/ton/ton_wallet.js.map +1 -0
  36. package/dist/esm/chain_ids.js +2 -2
  37. package/dist/esm/chain_ids.js.map +1 -1
  38. package/dist/esm/errors.d.ts +3 -0
  39. package/dist/esm/errors.d.ts.map +1 -1
  40. package/dist/esm/errors.js +5 -0
  41. package/dist/esm/errors.js.map +1 -1
  42. package/dist/esm/index.d.ts +1 -1
  43. package/dist/esm/index.d.ts.map +1 -1
  44. package/dist/esm/index.js +1 -1
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/ton/index.d.ts +12 -0
  47. package/dist/esm/ton/index.d.ts.map +1 -1
  48. package/dist/esm/ton/index.js +12 -0
  49. package/dist/esm/ton/index.js.map +1 -1
  50. package/dist/esm/ton/ton_address.d.ts +26 -2
  51. package/dist/esm/ton/ton_address.d.ts.map +1 -1
  52. package/dist/esm/ton/ton_address.js +70 -14
  53. package/dist/esm/ton/ton_address.js.map +1 -1
  54. package/dist/esm/ton/ton_asset.d.ts +12 -0
  55. package/dist/esm/ton/ton_asset.d.ts.map +1 -0
  56. package/dist/esm/ton/ton_asset.js +17 -0
  57. package/dist/esm/ton/ton_asset.js.map +1 -0
  58. package/dist/esm/ton/ton_assets.d.ts +6 -0
  59. package/dist/esm/ton/ton_assets.d.ts.map +1 -0
  60. package/dist/esm/ton/ton_assets.js +7 -0
  61. package/dist/esm/ton/ton_assets.js.map +1 -0
  62. package/dist/esm/ton/ton_chain.d.ts +205 -0
  63. package/dist/esm/ton/ton_chain.d.ts.map +1 -0
  64. package/dist/esm/ton/ton_chain.js +479 -0
  65. package/dist/esm/ton/ton_chain.js.map +1 -0
  66. package/dist/esm/ton/ton_chains.d.ts +11 -0
  67. package/dist/esm/ton/ton_chains.d.ts.map +1 -0
  68. package/dist/esm/ton/ton_chains.js +18 -0
  69. package/dist/esm/ton/ton_chains.js.map +1 -0
  70. package/dist/esm/ton/ton_jetton_metadata.d.ts +36 -0
  71. package/dist/esm/ton/ton_jetton_metadata.d.ts.map +1 -0
  72. package/dist/esm/ton/ton_jetton_metadata.js +103 -0
  73. package/dist/esm/ton/ton_jetton_metadata.js.map +1 -0
  74. package/dist/esm/ton/ton_messages.d.ts +133 -0
  75. package/dist/esm/ton/ton_messages.d.ts.map +1 -0
  76. package/dist/esm/ton/ton_messages.js +159 -0
  77. package/dist/esm/ton/ton_messages.js.map +1 -0
  78. package/dist/esm/ton/ton_provider.d.ts +261 -0
  79. package/dist/esm/ton/ton_provider.d.ts.map +1 -0
  80. package/dist/esm/ton/ton_provider.js +432 -0
  81. package/dist/esm/ton/ton_provider.js.map +1 -0
  82. package/dist/esm/ton/ton_tonapi.d.ts +39 -0
  83. package/dist/esm/ton/ton_tonapi.d.ts.map +1 -0
  84. package/dist/esm/ton/ton_tonapi.js +239 -0
  85. package/dist/esm/ton/ton_tonapi.js.map +1 -0
  86. package/dist/esm/ton/ton_toncenter.d.ts +25 -0
  87. package/dist/esm/ton/ton_toncenter.d.ts.map +1 -0
  88. package/dist/esm/ton/ton_toncenter.js +248 -0
  89. package/dist/esm/ton/ton_toncenter.js.map +1 -0
  90. package/dist/esm/ton/ton_transaction_status.d.ts +116 -0
  91. package/dist/esm/ton/ton_transaction_status.d.ts.map +1 -0
  92. package/dist/esm/ton/ton_transaction_status.js +226 -0
  93. package/dist/esm/ton/ton_transaction_status.js.map +1 -0
  94. package/dist/esm/ton/ton_transactions.d.ts +54 -0
  95. package/dist/esm/ton/ton_transactions.d.ts.map +1 -0
  96. package/dist/esm/ton/ton_transactions.js +100 -0
  97. package/dist/esm/ton/ton_transactions.js.map +1 -0
  98. package/dist/esm/ton/ton_wallet.d.ts +134 -0
  99. package/dist/esm/ton/ton_wallet.d.ts.map +1 -0
  100. package/dist/esm/ton/ton_wallet.js +278 -0
  101. package/dist/esm/ton/ton_wallet.js.map +1 -0
  102. package/docs/README.md +2 -1
  103. package/docs/ton.md +164 -0
  104. package/package.json +5 -1
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TonChain = exports.REQUEST_EXPIRY_MARGIN_SECONDS = exports.DEFAULT_JETTON_FORWARD_NANOTON = exports.DEFAULT_JETTON_TRANSFER_ATTACHED_NANOTON = void 0;
4
+ const core_1 = require("@ton/core");
5
+ const crypto_1 = require("@ton/crypto");
6
+ const chain_base_ts_1 = require("../chain.base.js");
7
+ const chain_type_ts_1 = require("../chain_type.js");
8
+ const errors_ts_1 = require("../errors.js");
9
+ const network_type_ts_1 = require("../network_type.js");
10
+ const transaction_status_ts_1 = require("../transaction_status.js");
11
+ const ton_address_ts_1 = require("./ton_address.js");
12
+ const ton_asset_ts_1 = require("./ton_asset.js");
13
+ const ton_jetton_metadata_ts_1 = require("./ton_jetton_metadata.js");
14
+ const ton_messages_ts_1 = require("./ton_messages.js");
15
+ const ton_provider_ts_1 = require("./ton_provider.js");
16
+ const ton_toncenter_ts_1 = require("./ton_toncenter.js");
17
+ const ton_tonapi_ts_1 = require("./ton_tonapi.js");
18
+ const ton_transaction_status_ts_1 = require("./ton_transaction_status.js");
19
+ const ton_transactions_ts_1 = require("./ton_transactions.js");
20
+ /** TON a jetton transfer carries to the sender's jetton wallet; the excess returns to `responseDestination`. */
21
+ exports.DEFAULT_JETTON_TRANSFER_ATTACHED_NANOTON = 50000000n;
22
+ /** TON forwarded to the jetton recipient with the transfer notification. */
23
+ exports.DEFAULT_JETTON_FORWARD_NANOTON = 1n;
24
+ /**
25
+ * How far past a request's `validUntil` the masterchain must be before the
26
+ * request counts as expired; shard blocks and the provider's state can trail
27
+ * the masterchain head by a few seconds.
28
+ */
29
+ exports.REQUEST_EXPIRY_MARGIN_SECONDS = 60;
30
+ function strictHex(value, bytes, what) {
31
+ if (!new RegExp(`^[0-9a-fA-F]{${bytes * 2}}$`).test(value)) {
32
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `A TON ${what} is ${bytes * 2} hex characters`);
33
+ }
34
+ return Buffer.from(value, 'hex');
35
+ }
36
+ /**
37
+ * A TON chain, read through TON Center v3 with TonAPI as the fallback.
38
+ *
39
+ * Transaction ids are normalized external-message hashes (lowercase hex), and
40
+ * a transaction's status covers its whole trace.
41
+ */
42
+ class TonChain extends chain_base_ts_1.Chain {
43
+ #init;
44
+ #jettons = new Map();
45
+ #provider;
46
+ _nativeAsset;
47
+ constructor(init) {
48
+ super(init.chainId, init.name, network_type_ts_1.NetworkType.TON, 5, 'TON', init.explorerUrl);
49
+ this.#init = init;
50
+ this.#provider = init.provider ?? null;
51
+ this._nativeAsset = new ton_asset_ts_1.TonAsset(init.chainId, 'TON', null, ton_asset_ts_1.TonAsset.NATIVE_DECIMALS);
52
+ }
53
+ /** The configured provider, built on first use so a chain without keys can still be constructed. */
54
+ get provider() {
55
+ if (this.#provider === null) {
56
+ const toncenter = endpointOf('TON Center', this.#init.toncenter, 'TONCENTER_API_KEY');
57
+ if (toncenter === null) {
58
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.RpcNotConfigured, `${this.name}: a TON Center API key is required`, {
59
+ chainId: this.chainId,
60
+ });
61
+ }
62
+ const tonapi = this.#init.tonapi === undefined || this.#init.tonapi === null
63
+ ? null
64
+ : endpointOf('TonAPI', this.#init.tonapi, 'TONAPI_API_KEY');
65
+ this.#provider = new ton_provider_ts_1.TonFallbackProvider(new ton_toncenter_ts_1.ToncenterProvider(toncenter), tonapi === null ? null : new ton_tonapi_ts_1.TonapiProvider(tonapi));
66
+ }
67
+ return this.#provider;
68
+ }
69
+ get chainType() {
70
+ return chain_type_ts_1.ChainType.TON;
71
+ }
72
+ get nativeToken() {
73
+ return this._nativeAsset;
74
+ }
75
+ get nativeAsset() {
76
+ return this._nativeAsset;
77
+ }
78
+ getWalletExplorerUrl(address) {
79
+ return `${this.explorerBaseUrl}/${new ton_address_ts_1.TonAddress(address).toUserFriendly({ bounceable: false })}`;
80
+ }
81
+ /** A jetton master is a contract, so its link uses the bounceable (`EQ…`) form. */
82
+ getTokenExplorerUrl(tokenIdentifier) {
83
+ if (tokenIdentifier === undefined)
84
+ return this.explorerBaseUrl;
85
+ return `${this.explorerBaseUrl}/${new ton_address_ts_1.TonAddress(tokenIdentifier).toUserFriendly({ bounceable: true })}`;
86
+ }
87
+ /** `null` for native TON. */
88
+ getAssetExplorerUrl(asset) {
89
+ if (!(asset instanceof ton_asset_ts_1.TonAsset)) {
90
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Invalid asset ${String(asset)}, expected TonAsset`, { chainId: this.chainId });
91
+ }
92
+ return asset.jettonMaster === null ? null : this.getTokenExplorerUrl(asset.jettonMaster);
93
+ }
94
+ getTransactionExplorerUrl(txHash) {
95
+ return `${this.explorerBaseUrl}/transaction/${txHash}`;
96
+ }
97
+ validateAddress(raw) {
98
+ try {
99
+ const { workchain } = new ton_address_ts_1.TonAddress(raw);
100
+ return workchain === 0 || workchain === -1;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ }
106
+ validateTokenIdentifier(raw) {
107
+ return raw === undefined || this.validateAddress(raw);
108
+ }
109
+ getAccountState(address) {
110
+ return this.provider.getAccountState((0, ton_address_ts_1.tonRawAddress)(address));
111
+ }
112
+ /**
113
+ * The wallet's seqno, read live from its get-method rather than from the
114
+ * indexed account state, which can trail a deploy; 0 while it has no code.
115
+ */
116
+ getSeqno(address) {
117
+ return this.provider.getSeqno((0, ton_address_ts_1.tonRawAddress)(address));
118
+ }
119
+ /**
120
+ * Native TON for no identifier; otherwise the jetton whose master
121
+ * `identifier` names, its symbol and decimals read from its TEP-64
122
+ * metadata ({@link getJettonMetadata}). Resolved jettons are kept for the
123
+ * chain's lifetime.
124
+ */
125
+ async resolveAsset(identifier) {
126
+ if (identifier === null || identifier === undefined)
127
+ return this._nativeAsset;
128
+ const master = (0, ton_address_ts_1.tonRawAddress)(identifier);
129
+ const known = this.#jettons.get(master);
130
+ if (known !== undefined)
131
+ return known;
132
+ const metadata = await this.getJettonMetadata(master);
133
+ // As Python does: a jetton whose metadata names no symbol is called by its address's first characters.
134
+ const symbol = metadata.symbol ?? new ton_address_ts_1.TonAddress(master).toUserFriendly({ bounceable: true }).slice(0, 4);
135
+ const asset = new ton_asset_ts_1.TonAsset(this.chainId, symbol, master, metadata.decimals);
136
+ this.#jettons.set(master, asset);
137
+ return asset;
138
+ }
139
+ /**
140
+ * A jetton's TEP-64 metadata: the master's `get_jetton_data` content, and the
141
+ * off-chain JSON its URI names (https) for what the content lacks. Throws
142
+ * `InvalidTokenIdentifier` for anything that is not a jetton master, and
143
+ * (retryably) when the decimals cannot be read.
144
+ */
145
+ async getJettonMetadata(jettonMaster) {
146
+ return (0, ton_jetton_metadata_ts_1.readTonJettonMetadata)(await this.provider.getJettonContent((0, ton_address_ts_1.tonRawAddress)(jettonMaster)), this.#init.fetchMetadata);
147
+ }
148
+ createAsset(symbol, identifier, decimals) {
149
+ if (identifier === null || identifier === undefined) {
150
+ if (symbol !== 'TON' || decimals !== ton_asset_ts_1.TonAsset.NATIVE_DECIMALS) {
151
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Native TON is TON with ${ton_asset_ts_1.TonAsset.NATIVE_DECIMALS} decimals`, { chainId: this.chainId });
152
+ }
153
+ return this._nativeAsset;
154
+ }
155
+ return this.getJettonAsset(symbol, identifier, decimals);
156
+ }
157
+ getJettonAsset(symbol, jettonMaster, decimals) {
158
+ return new ton_asset_ts_1.TonAsset(this.chainId, symbol, jettonMaster, decimals);
159
+ }
160
+ /** The jetton wallet `owner` has (or will have) for `jettonMaster`, raw. */
161
+ getJettonWalletAddress(jettonMaster, owner) {
162
+ return this.provider.getJettonWalletAddress((0, ton_address_ts_1.tonRawAddress)(jettonMaster), (0, ton_address_ts_1.tonRawAddress)(owner));
163
+ }
164
+ /** Nanotons, or the jetton's smallest unit when `tokenIdentifier` is a jetton master. */
165
+ async getBalance(owner, tokenIdentifier) {
166
+ if (tokenIdentifier === undefined)
167
+ return (await this.getAccountState(owner)).balance;
168
+ return this.provider.getJettonBalance(await this.getJettonWalletAddress(tokenIdentifier, owner));
169
+ }
170
+ /**
171
+ * A transfer from `from`: native TON (with `memo` as a text comment), or a
172
+ * jetton through the sender's jetton wallet, the excess returned to the
173
+ * sender. `amountHr` takes the jetton's decimals from its metadata.
174
+ *
175
+ * - `isFullBalance`: native TON sends everything the wallet holds (send mode
176
+ * 128 + 2, value 0); a jetton sends the jetton wallet's whole balance.
177
+ * - Native `bounce`, unless given: only to a bounceable (`EQ…`) address
178
+ * that is deployed — a contract that fails then returns the TON, and a
179
+ * wallet not deployed yet still receives it, as TON wallets send.
180
+ * - Jetton transfers are always bounceable unless `bounce` says otherwise,
181
+ * carry {@link DEFAULT_JETTON_TRANSFER_ATTACHED_NANOTON} and forward
182
+ * {@link DEFAULT_JETTON_FORWARD_NANOTON}; `jettonAttachedNanoton`,
183
+ * `forwardTonAmountNanoton` and `sendMode` override.
184
+ */
185
+ async createTransferUnsignedTransaction(req) {
186
+ if (req.from === undefined) {
187
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, 'TON transfers need `from`', { chainId: this.chainId });
188
+ }
189
+ if (req.gasPricing !== undefined) {
190
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, 'TON transfers take no gasPricing', { chainId: this.chainId });
191
+ }
192
+ const from = req.from;
193
+ const comment = req.memo === undefined ? undefined : (0, ton_messages_ts_1.tonCommentBody)(req.memo);
194
+ const jettonMaster = req.tokenIdentifier;
195
+ if (jettonMaster === undefined) {
196
+ const resolved = (0, chain_base_ts_1.resolveTransferAmount)(req, ton_asset_ts_1.TonAsset.NATIVE_DECIMALS);
197
+ const full = resolved.kind === 'full';
198
+ return new ton_transactions_ts_1.TonUnsignedTransaction({
199
+ chainId: this.chainId,
200
+ walletAddress: from,
201
+ messages: [
202
+ {
203
+ to: req.to,
204
+ value: full ? 0n : resolved.amountMr,
205
+ body: comment,
206
+ bounce: req.bounce ?? (await this.bouncesByDefault(req.to)),
207
+ mode: req.sendMode ?? (full ? core_1.SendMode.CARRY_ALL_REMAINING_BALANCE | core_1.SendMode.IGNORE_ERRORS : undefined),
208
+ },
209
+ ],
210
+ });
211
+ }
212
+ // Only a human-readable amount needs the jetton's decimals, and so its metadata.
213
+ const decimals = req.amountHr === undefined ? 0 : (await this.resolveAsset(jettonMaster)).decimals;
214
+ const resolved = (0, chain_base_ts_1.resolveTransferAmount)(req, decimals);
215
+ const amount = resolved.kind === 'full' ? await this.getBalance(from, jettonMaster) : resolved.amountMr;
216
+ if (amount === 0n) {
217
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InsufficientFunds, `${from} holds none of ${jettonMaster}`, { chainId: this.chainId });
218
+ }
219
+ return new ton_transactions_ts_1.TonUnsignedTransaction({
220
+ chainId: this.chainId,
221
+ walletAddress: from,
222
+ messages: [
223
+ {
224
+ to: await this.getJettonWalletAddress(jettonMaster, from),
225
+ value: req.jettonAttachedNanoton ?? exports.DEFAULT_JETTON_TRANSFER_ATTACHED_NANOTON,
226
+ bounce: req.bounce ?? true,
227
+ mode: req.sendMode,
228
+ body: (0, ton_messages_ts_1.tonJettonTransferBody)({
229
+ amount,
230
+ destination: req.to,
231
+ responseDestination: from,
232
+ forwardTonAmount: req.forwardTonAmountNanoton ?? exports.DEFAULT_JETTON_FORWARD_NANOTON,
233
+ forwardPayload: comment,
234
+ }),
235
+ },
236
+ ],
237
+ });
238
+ }
239
+ /**
240
+ * Emulates the whole trace of an external message (signature ignored): what
241
+ * it would cost, and whether every transaction would succeed with nothing
242
+ * bounced. Throws `SimulationFailed` when the message would be refused
243
+ * outright.
244
+ */
245
+ async emulate(boc) {
246
+ const trace = await this.provider.emulate(boc);
247
+ const summary = (0, ton_transaction_status_ts_1.summarizeTonTrace)(this.chainId, trace);
248
+ await this.addJettonBalanceChanges(trace, summary.jettonCredits, summary.balanceChanges);
249
+ return { trace, ...summary };
250
+ }
251
+ /**
252
+ * Sends an external message (base64 BOC or bytes) and returns its normalized
253
+ * hash. Throws `TonBroadcastUncertainError` when the message may have reached
254
+ * the network anyway; re-signing then can pay twice.
255
+ */
256
+ async broadcast(signed, opts) {
257
+ if (opts?.signal !== undefined) {
258
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.FeatureNotSupported, 'TON broadcast does not take a signal', { chainId: this.chainId });
259
+ }
260
+ const boc = typeof signed === 'string' ? signed : Buffer.from(signed).toString('base64');
261
+ const hash = (0, ton_transactions_ts_1.tonExternalBocHash)(boc);
262
+ try {
263
+ await this.provider.sendBoc(boc);
264
+ }
265
+ catch (err) {
266
+ if (err instanceof ton_provider_ts_1.TonBroadcastUncertainError) {
267
+ throw new ton_provider_ts_1.TonBroadcastUncertainError(err.message, { chainId: this.chainId, txHash: hash }, err);
268
+ }
269
+ if (err instanceof ton_provider_ts_1.TonProviderError) {
270
+ throw new errors_ts_1.ChainError(err.kind, err.message, { chainId: this.chainId, txHash: hash }, err);
271
+ }
272
+ throw err;
273
+ }
274
+ return hash;
275
+ }
276
+ broadcastSignedTransaction(signed) {
277
+ if (signed.chainId !== this.chainId) {
278
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `Signed for chain ${signed.chainId}, not ${this.chainId}`);
279
+ }
280
+ return this.broadcast(signed.boc);
281
+ }
282
+ async getTransactionStatus(hashOrHashes, opts = {}) {
283
+ if (Array.isArray(hashOrHashes)) {
284
+ const statuses = [];
285
+ for (const hash of hashOrHashes)
286
+ statuses.push(await this.statusOf(hash, opts));
287
+ return statuses;
288
+ }
289
+ return this.statusOf(hashOrHashes, opts);
290
+ }
291
+ /** The masterchain's latest block. */
292
+ async getChainTipHeight() {
293
+ return (await this.provider.getMasterchainHead()).seqno;
294
+ }
295
+ /**
296
+ * Where a signed request stands, so it is never replaced while it can still
297
+ * execute — the one check to make before signing a replacement, after a
298
+ * `Failed` relayed request or an uncertain broadcast:
299
+ * - `consumed`: the wallet's seqno has moved past the request's, or (given
300
+ * `hash`, for an external request) the request has a trace. It executed —
301
+ * or another request signed with the same seqno did. Do not re-sign it;
302
+ * read its status (`getTransactionStatus(hash)`, or the relay's).
303
+ * - `expired`: the chain's own time (not this machine's) is past
304
+ * `validUntil` by {@link REQUEST_EXPIRY_MARGIN_SECONDS}, with the seqno
305
+ * not moved past it and no trace. It can never execute; replacing it is
306
+ * safe.
307
+ * - `live`: neither yet. It can still execute — a relayed request that
308
+ * failed included: W5 keeps an internal request's seqno only when the
309
+ * transaction succeeds, so anyone can deliver it again from the trace
310
+ * until `validUntil`.
311
+ *
312
+ * `wallet` is the wallet that signed it: the sender of an external request,
313
+ * the target of a relayed one (pass no `hash` for a relayed request; a
314
+ * relay's own hash is the relayer's request). All reads come from one
315
+ * provider.
316
+ */
317
+ async getRequestState(args) {
318
+ if (args.hash !== undefined)
319
+ this.assertTxHash(args.hash);
320
+ const wallet = (0, ton_address_ts_1.tonRawAddress)(args.wallet);
321
+ return this.onOneProvider('getRequestState', async (provider) => {
322
+ if ((await provider.getSeqno(wallet)) > args.seqno)
323
+ return 'consumed';
324
+ const trace = args.hash === undefined ? null : await provider.getTrace(args.hash);
325
+ if (trace !== null) {
326
+ // A relay's hash names the relayer's request, not the relayed one: its
327
+ // trace says nothing about whether the target's request executed.
328
+ const root = trace.transactions[0];
329
+ if (root !== undefined && root.parent === null) {
330
+ if (root.account !== wallet) {
331
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `${args.hash} is a request of ${root.account}, not of ${wallet}; for a relayed request pass no hash`, { chainId: this.chainId, txHash: args.hash });
332
+ }
333
+ // The provider bound the trace to `hash`, so its root carries the signed request.
334
+ const signedSeqno = (0, ton_messages_ts_1.tonWalletRequestFields)(root.inMsg?.body).seqno;
335
+ if (signedSeqno !== args.seqno) {
336
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `${args.hash} was signed at seqno ${signedSeqno}, not ${args.seqno}`, { chainId: this.chainId, txHash: args.hash });
337
+ }
338
+ }
339
+ return 'consumed';
340
+ }
341
+ const head = await provider.getMasterchainHead();
342
+ return head.utime > args.validUntil + exports.REQUEST_EXPIRY_MARGIN_SECONDS ? 'expired' : 'live';
343
+ });
344
+ }
345
+ /** Native TON bounces only to a bounceable (`EQ…`) address that is deployed. */
346
+ async bouncesByDefault(to) {
347
+ if (new ton_address_ts_1.TonAddress(to).isBounceable !== true)
348
+ return false;
349
+ return (await this.getAccountState(to)).status === 'active';
350
+ }
351
+ assertTxHash(hash) {
352
+ try {
353
+ (0, ton_provider_ts_1.assertTonTxHash)(hash);
354
+ }
355
+ catch (err) {
356
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, err.message, { chainId: this.chainId });
357
+ }
358
+ }
359
+ onOneProvider(method, run) {
360
+ const provider = this.provider;
361
+ return provider instanceof ton_provider_ts_1.TonFallbackProvider ? provider.onOneProvider(method, run) : run(provider);
362
+ }
363
+ /**
364
+ * Whether `signedMessage` is `publicKey`'s signature of `message`
365
+ * (`TonWallet.signMessage`: ed25519 over {@link tonMessageHash}). Needs only
366
+ * the public key — 32 bytes, or 64 hex characters — as Tron's and
367
+ * Stellar's do. A signature must be exactly 128 hex characters.
368
+ */
369
+ static verifySignature(publicKey, message, signedMessage) {
370
+ if (!(signedMessage instanceof ton_messages_ts_1.TonSignedMessage)) {
371
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `TonChain expected a TonSignedMessage, got ${signedMessage?.constructor?.name ?? typeof signedMessage}`);
372
+ }
373
+ const key = typeof publicKey === 'string' ? strictHex(publicKey, 32, 'public key') : Buffer.from(publicKey);
374
+ if (key.length !== 32)
375
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `A TON public key is 32 bytes, got ${key.length}`);
376
+ if (!/^[0-9a-fA-F]{128}$/.test(signedMessage.signature))
377
+ return false;
378
+ try {
379
+ return (0, crypto_1.signVerify)((0, ton_messages_ts_1.tonMessageHash)(message), Buffer.from(signedMessage.signature, 'hex'), key);
380
+ }
381
+ catch {
382
+ return false;
383
+ }
384
+ }
385
+ /**
386
+ * TON addresses do not reveal their key, so a signature cannot be checked
387
+ * against an address alone: use `TonChain.verifySignature` with the
388
+ * signer's public key (its W5 address is `WalletContractV5R1.create({
389
+ * publicKey, workchain: 0 }).address`).
390
+ */
391
+ async verifyMessageSignature(_req) {
392
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.FeatureNotSupported, 'TON message signatures need the signer public key; use TonChain.verifySignature(publicKey, message, signature)', { chainId: this.chainId });
393
+ }
394
+ async statusOf(hash, opts) {
395
+ this.assertTxHash(hash);
396
+ const trace = await this.provider.getTrace(hash);
397
+ const masterchainTip = trace === null ? 0 : (await this.provider.getMasterchainHead()).seqno;
398
+ const status = ton_transaction_status_ts_1.TonTransactionStatus.fromTrace({
399
+ chainId: this.chainId,
400
+ trace,
401
+ masterchainTip,
402
+ minMasterchainDepth: opts.minMasterchainDepth,
403
+ });
404
+ if (trace !== null && status.balanceChanges !== null)
405
+ await this.addJettonBalanceChanges(trace, status.jettonCredits, status.balanceChanges);
406
+ return status;
407
+ }
408
+ /**
409
+ * Adds the jetton balance changes of the trace's wallet-to-wallet jetton
410
+ * transfers (TEP-74 \`transfer\` → \`internal_transfer\`) to
411
+ * \`balanceChanges\`: the sending owner loses the amount and the recipient
412
+ * gains it, in the jetton's asset ({@link resolveAsset}).
413
+ *
414
+ * A transfer counts only once its master vouches for both jetton wallets:
415
+ * the sender's must be the master's wallet for the owner it reports, and
416
+ * the receiving one the master's wallet for the recipient the transfer
417
+ * named. Anything else — a contract posing as a jetton wallet, a mint or a
418
+ * burn — moves no balance here.
419
+ */
420
+ async addJettonBalanceChanges(trace, credits, balanceChanges) {
421
+ const byHash = new Map(trace.transactions.map((tx) => [tx.hash, tx]));
422
+ const walletData = new Map();
423
+ const walletOf = new Map();
424
+ const dataOf = (wallet) => {
425
+ if (!walletData.has(wallet))
426
+ walletData.set(wallet, this.provider.getJettonWalletData(wallet));
427
+ return walletData.get(wallet);
428
+ };
429
+ const walletAddressOf = (master, owner) => {
430
+ const key = `${master}|${owner}`;
431
+ if (!walletOf.has(key))
432
+ walletOf.set(key, this.provider.getJettonWalletAddress(master, owner));
433
+ return walletOf.get(key);
434
+ };
435
+ for (const credit of credits) {
436
+ const received = byHash.get(credit.transaction);
437
+ const sender = received?.parent === null || received?.parent === undefined ? undefined : byHash.get(received.parent);
438
+ const recipient = sender?.inMsg === null || sender?.inMsg === undefined ? null : jettonTransferDestinationOf(sender.inMsg);
439
+ if (credit.senderJettonWallet === null || sender === undefined || recipient === null)
440
+ continue;
441
+ const data = await dataOf(credit.senderJettonWallet);
442
+ if (data === null)
443
+ continue;
444
+ const [senderWallet, recipientWallet] = await Promise.all([
445
+ walletAddressOf(data.jettonMaster, data.owner),
446
+ walletAddressOf(data.jettonMaster, recipient),
447
+ ]);
448
+ if (senderWallet !== credit.senderJettonWallet || recipientWallet !== credit.jettonWallet)
449
+ continue;
450
+ const asset = await this.resolveAsset(data.jettonMaster);
451
+ transaction_status_ts_1.AssetBalanceChange.upsert(balanceChanges, data.owner, asset, transaction_status_ts_1.AssetBalanceChange.fromMr(-credit.amount, asset.decimals));
452
+ transaction_status_ts_1.AssetBalanceChange.upsert(balanceChanges, recipient, asset, transaction_status_ts_1.AssetBalanceChange.fromMr(credit.amount, asset.decimals));
453
+ }
454
+ }
455
+ }
456
+ exports.TonChain = TonChain;
457
+ /** The recipient owner a jetton \`transfer\` names, raw; \`null\` for any other message. */
458
+ function jettonTransferDestinationOf(message) {
459
+ if (message.opcode !== ton_messages_ts_1.TON_JETTON_TRANSFER_OP || message.body === null)
460
+ return null;
461
+ try {
462
+ const slice = message.body.beginParse();
463
+ slice.skip(32 + 64);
464
+ slice.loadCoins();
465
+ return slice.loadAddress().toRawString();
466
+ }
467
+ catch {
468
+ return null;
469
+ }
470
+ }
471
+ function endpointOf(name, endpoint, apiKeyEnv) {
472
+ const apiKey = (endpoint.apiKey ?? readEnv()?.[apiKeyEnv] ?? '').trim();
473
+ if (apiKey.length === 0)
474
+ return null;
475
+ if (!/^https:\/\//.test(endpoint.url)) {
476
+ throw new errors_ts_1.ChainError(errors_ts_1.ChainErrorKinds.InvalidArgument, `${name} URL must be https, got ${endpoint.url}`);
477
+ }
478
+ return { url: endpoint.url, apiKey, timeoutMs: endpoint.timeoutMs };
479
+ }
480
+ function readEnv() {
481
+ return globalThis.process?.env;
482
+ }
483
+ //# sourceMappingURL=ton_chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_chain.js","sourceRoot":"","sources":["../../../ton/ton_chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ALL_TON_CHAINS = exports.TonMainnet = exports.TONAPI_MAINNET_URL = exports.TON_CENTER_MAINNET_URL = void 0;
4
+ const chain_ids_ts_1 = require("../chain_ids.js");
5
+ const ton_chain_ts_1 = require("./ton_chain.js");
6
+ exports.TON_CENTER_MAINNET_URL = 'https://toncenter.com';
7
+ exports.TONAPI_MAINNET_URL = 'https://tonapi.io';
8
+ /**
9
+ * TON mainnet. Its keys are read at first use from `TONCENTER_API_KEY` and
10
+ * `TONAPI_API_KEY`; a service that holds them elsewhere builds its own
11
+ * `TonChain` with the same URLs.
12
+ */
13
+ exports.TonMainnet = new ton_chain_ts_1.TonChain({
14
+ chainId: chain_ids_ts_1.CHAIN_ID_TON_MAINNET,
15
+ name: 'TON Mainnet',
16
+ explorerUrl: 'https://tonviewer.com',
17
+ toncenter: { url: exports.TON_CENTER_MAINNET_URL },
18
+ tonapi: { url: exports.TONAPI_MAINNET_URL },
19
+ });
20
+ exports.ALL_TON_CHAINS = [exports.TonMainnet];
21
+ //# sourceMappingURL=ton_chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_chains.js","sourceRoot":"","sources":["../../../ton/ton_chains.ts"],"names":[],"mappings":";;;AAAA,kDAAuD;AACvD,iDAA0C;AAE7B,QAAA,sBAAsB,GAAG,uBAAuB,CAAC;AACjD,QAAA,kBAAkB,GAAG,mBAAmB,CAAC;AAEtD;;;;GAIG;AACU,QAAA,UAAU,GAAG,IAAI,uBAAQ,CAAC;IACrC,OAAO,EAAE,mCAAoB;IAC7B,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uBAAuB;IACpC,SAAS,EAAE,EAAE,GAAG,EAAE,8BAAsB,EAAE;IAC1C,MAAM,EAAE,EAAE,GAAG,EAAE,0BAAkB,EAAE;CACpC,CAAC,CAAC;AAEU,QAAA,cAAc,GAA4B,CAAC,kBAAU,CAAC,CAAC"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseTonJettonContent = parseTonJettonContent;
4
+ exports.readTonJettonMetadata = readTonJettonMetadata;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const core_1 = require("@ton/core");
7
+ const errors_ts_1 = require("../errors.js");
8
+ const ton_provider_ts_1 = require("./ton_provider.js");
9
+ const TEP64_KEYS = ['uri', 'name', 'description', 'image', 'symbol', 'decimals'];
10
+ const OFFCHAIN_FETCH_TIMEOUT_MS = 10_000;
11
+ const OFFCHAIN_MAX_BYTES = 64 * 1024;
12
+ const TEP64_DEFAULT_DECIMALS = 9;
13
+ /**
14
+ * The fields of a jetton master's content cell (`get_jetton_data`, TEP-64):
15
+ * on-chain (prefix 0x00, a dictionary keyed by the SHA-256 of each field
16
+ * name, values snake or chunked), or off-chain (any other prefix, a snake
17
+ * URI — TEP-64's 0x01 and the older variants some jettons use).
18
+ */
19
+ function parseTonJettonContent(content) {
20
+ const slice = content.beginParse();
21
+ const prefix = slice.loadUint(8);
22
+ if (prefix !== 0x00)
23
+ return { fields: {}, uri: slice.loadStringTail() };
24
+ const dict = slice.loadDict(core_1.Dictionary.Keys.Buffer(32), core_1.Dictionary.Values.Cell());
25
+ const fields = {};
26
+ for (const key of TEP64_KEYS) {
27
+ const value = dict.get((0, node_crypto_1.createHash)('sha256').update(key).digest());
28
+ if (value !== undefined)
29
+ fields[key] = contentDataOf(value.beginParse());
30
+ }
31
+ return { fields, uri: fields.uri ?? null };
32
+ }
33
+ /**
34
+ * A jetton's metadata from its content cell, filling what the content lacks
35
+ * from the off-chain JSON its URI names (https only).
36
+ *
37
+ * The decimals decide every amount, so they are never guessed: when the
38
+ * content names none and the off-chain JSON could not be read, this throws
39
+ * (retryably). A symbol that cannot be read is `null`.
40
+ */
41
+ async function readTonJettonMetadata(content, fetchJson = fetchOffchainJson) {
42
+ const { fields, uri } = parseTonJettonContent(content);
43
+ const merged = { ...fields };
44
+ let offchainRead = uri === null;
45
+ if (uri !== null && (merged.symbol === undefined || merged.decimals === undefined)) {
46
+ try {
47
+ const json = await fetchJson(uri);
48
+ if (json !== null && typeof json === 'object' && !Array.isArray(json)) {
49
+ for (const key of TEP64_KEYS) {
50
+ const value = json[key];
51
+ if (merged[key] === undefined && (typeof value === 'string' || typeof value === 'number'))
52
+ merged[key] = String(value);
53
+ }
54
+ offchainRead = true;
55
+ }
56
+ }
57
+ catch {
58
+ offchainRead = false;
59
+ }
60
+ }
61
+ else {
62
+ offchainRead = true;
63
+ }
64
+ if (merged.decimals === undefined && !offchainRead) {
65
+ throw new ton_provider_ts_1.TonProviderError(errors_ts_1.ChainErrorKinds.RpcError, `Could not read the jetton's decimals: its metadata at ${uri} did not load`, true);
66
+ }
67
+ return {
68
+ symbol: merged.symbol ?? null,
69
+ name: merged.name ?? null,
70
+ decimals: merged.decimals === undefined ? TEP64_DEFAULT_DECIMALS : decimalsOf(merged.decimals),
71
+ description: merged.description ?? null,
72
+ image: merged.image ?? null,
73
+ uri,
74
+ };
75
+ }
76
+ function decimalsOf(value) {
77
+ if (!/^\d{1,3}$/.test(value.trim()) || Number(value) > 255) {
78
+ throw new ton_provider_ts_1.TonProviderError(errors_ts_1.ChainErrorKinds.InvalidTokenIdentifier, `A jetton's decimals must be 0 to 255, got ${JSON.stringify(value)}`, false);
79
+ }
80
+ return Number(value);
81
+ }
82
+ /** A TEP-64 content value: snake (0x00) or chunked (0x01, a dictionary of snake chunks). */
83
+ function contentDataOf(slice) {
84
+ const prefix = slice.loadUint(8);
85
+ if (prefix === 0x00)
86
+ return slice.loadStringTail();
87
+ if (prefix === 0x01) {
88
+ const chunks = slice.loadDict(core_1.Dictionary.Keys.Uint(32), core_1.Dictionary.Values.Cell());
89
+ return [...chunks.keys()]
90
+ .sort((a, b) => a - b)
91
+ .map((index) => chunks.get(index).beginParse().loadStringTail())
92
+ .join('');
93
+ }
94
+ throw new ton_provider_ts_1.TonProviderError(errors_ts_1.ChainErrorKinds.InvalidTokenIdentifier, `Unknown TEP-64 content data prefix 0x${prefix.toString(16)}`, false);
95
+ }
96
+ async function fetchOffchainJson(uri) {
97
+ if (!uri.startsWith('https://'))
98
+ throw new Error(`only https metadata is fetched, not ${uri}`);
99
+ const response = await fetch(uri, { signal: AbortSignal.timeout(OFFCHAIN_FETCH_TIMEOUT_MS), redirect: 'follow' });
100
+ if (!response.ok)
101
+ throw new Error(`HTTP ${response.status}`);
102
+ const text = await response.text();
103
+ if (text.length > OFFCHAIN_MAX_BYTES)
104
+ throw new Error('metadata too large');
105
+ return JSON.parse(text);
106
+ }
107
+ //# sourceMappingURL=ton_jetton_metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_jetton_metadata.js","sourceRoot":"","sources":["../../../ton/ton_jetton_metadata.ts"],"names":[],"mappings":";;AAiCA,sDAWC;AAUD,sDA+BC;AArFD,6CAAyC;AAEzC,oCAA8D;AAE9D,4CAA+C;AAC/C,uDAAqD;AAiBrD,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AAC1F,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,OAAa;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;IACxE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,iBAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,iBAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,MAAM,GAAyD,EAAE,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,qBAAqB,CAAC,OAAa,EAAE,YAAgC,iBAAiB;IAC1G,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAA2B,EAAE,GAAG,MAAM,EAAE,CAAC;IACrD,IAAI,YAAY,GAAG,GAAG,KAAK,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;oBACrD,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;wBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzH,CAAC;gBACD,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QACnD,MAAM,IAAI,kCAAgB,CAAC,2BAAe,CAAC,QAAQ,EAAE,yDAAyD,GAAG,eAAe,EAAE,IAAI,CAAC,CAAC;IAC1I,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9F,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;QAC3B,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;QAC3D,MAAM,IAAI,kCAAgB,CAAC,2BAAe,CAAC,sBAAsB,EAAE,6CAA6C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAClJ,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,4FAA4F;AAC5F,SAAS,aAAa,CAAC,KAAY;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;IACnD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,iBAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,iBAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;aACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAU,CAAC,UAAU,EAAE,CAAC,cAAc,EAAE,CAAC;aACzE,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IACD,MAAM,IAAI,kCAAgB,CAAC,2BAAe,CAAC,sBAAsB,EAAE,wCAAwC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC3I,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,GAAG,kBAAkB;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}