@tonappchain/sdk 0.7.2-scaled-ui-support-2 → 0.7.2

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 (171) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +198 -198
  3. package/dist/artifacts/dev/index.d.ts +2 -2
  4. package/dist/artifacts/dev/index.js +2 -1
  5. package/dist/artifacts/dev/tac/endpoints.d.ts +1 -0
  6. package/dist/artifacts/dev/tac/endpoints.js +2 -1
  7. package/dist/artifacts/dev/ton/internal/build/CrossChainLayer.compiled.json +1 -1
  8. package/dist/artifacts/dev/ton/internal/build/Executor.compiled.json +1 -1
  9. package/dist/artifacts/dev/ton/internal/build/JettonProxy.compiled.json +1 -1
  10. package/dist/artifacts/dev/ton/internal/build/JettonWallet.compiled.json +1 -1
  11. package/dist/artifacts/dev/ton/internal/build/NFTItem.compiled.json +1 -1
  12. package/dist/artifacts/dev/ton/internal/build/NFTProxy.compiled.json +1 -1
  13. package/dist/artifacts/dev/ton/internal/build/Settings.compiled.json +1 -1
  14. package/dist/artifacts/dev/ton/internal/wrappers/CrossChainLayer.d.ts +53 -6
  15. package/dist/artifacts/dev/ton/internal/wrappers/CrossChainLayer.js +130 -17
  16. package/dist/artifacts/dev/ton/internal/wrappers/JettonMinter.d.ts +2 -0
  17. package/dist/artifacts/dev/ton/internal/wrappers/JettonMinter.js +3 -1
  18. package/dist/artifacts/dev/ton/internal/wrappers/JettonProxy.d.ts +9 -0
  19. package/dist/artifacts/dev/ton/internal/wrappers/JettonProxy.js +10 -1
  20. package/dist/artifacts/dev/ton/internal/wrappers/JettonWallet.d.ts +7 -0
  21. package/dist/artifacts/dev/ton/internal/wrappers/JettonWallet.js +9 -2
  22. package/dist/artifacts/dev/ton/internal/wrappers/NFTCollection.d.ts +9 -0
  23. package/dist/artifacts/dev/ton/internal/wrappers/NFTCollection.js +9 -0
  24. package/dist/artifacts/dev/ton/internal/wrappers/NFTItem.d.ts +7 -0
  25. package/dist/artifacts/dev/ton/internal/wrappers/NFTItem.js +7 -0
  26. package/dist/artifacts/dev/ton/internal/wrappers/NFTProxy.d.ts +7 -0
  27. package/dist/artifacts/dev/ton/internal/wrappers/NFTProxy.js +8 -1
  28. package/dist/artifacts/dev/ton/internal/wrappers/Settings.d.ts +1 -0
  29. package/dist/artifacts/dev/ton/internal/wrappers/Settings.js +1 -0
  30. package/dist/artifacts/dev/ton/internal/wrappers/utils/CrossChainLayerPayload.d.ts +10 -0
  31. package/dist/artifacts/dev/ton/internal/wrappers/utils/CrossChainLayerPayload.js +24 -0
  32. package/dist/artifacts/dev/ton/internal/wrappers/utils/MerkleRoots.d.ts +2 -1
  33. package/dist/artifacts/dev/ton/internal/wrappers/utils/MerkleRoots.js +9 -1
  34. package/dist/artifacts/mainnet/index.d.ts +2 -2
  35. package/dist/artifacts/mainnet/index.js +2 -1
  36. package/dist/artifacts/mainnet/tac/endpoints.d.ts +1 -0
  37. package/dist/artifacts/mainnet/tac/endpoints.js +2 -1
  38. package/dist/artifacts/mainnet/ton/endpoints.d.ts +1 -1
  39. package/dist/artifacts/mainnet/ton/endpoints.js +1 -1
  40. package/dist/artifacts/mainnet/ton/internal/build/CrossChainLayer.compiled.json +1 -1
  41. package/dist/artifacts/mainnet/ton/internal/build/Executor.compiled.json +1 -1
  42. package/dist/artifacts/mainnet/ton/internal/build/JettonMinter.compiled.json +1 -1
  43. package/dist/artifacts/mainnet/ton/internal/build/JettonProxy.compiled.json +1 -1
  44. package/dist/artifacts/mainnet/ton/internal/build/JettonWallet.compiled.json +1 -1
  45. package/dist/artifacts/mainnet/ton/internal/build/NFTItem.compiled.json +1 -1
  46. package/dist/artifacts/mainnet/ton/internal/build/NFTProxy.compiled.json +1 -1
  47. package/dist/artifacts/mainnet/ton/internal/wrappers/CrossChainLayer.d.ts +1 -13
  48. package/dist/artifacts/mainnet/ton/internal/wrappers/CrossChainLayer.js +7 -45
  49. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonMinter.d.ts +2 -2
  50. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonMinter.js +2 -2
  51. package/dist/artifacts/testnet/index.d.ts +2 -2
  52. package/dist/artifacts/testnet/index.js +2 -1
  53. package/dist/artifacts/testnet/tac/endpoints.d.ts +1 -0
  54. package/dist/artifacts/testnet/tac/endpoints.js +2 -1
  55. package/dist/artifacts/testnet/ton/endpoints.d.ts +1 -1
  56. package/dist/artifacts/testnet/ton/endpoints.js +1 -1
  57. package/dist/artifacts/testnet/ton/internal/build/CrossChainLayer.compiled.json +1 -1
  58. package/dist/artifacts/testnet/ton/internal/build/Executor.compiled.json +1 -1
  59. package/dist/artifacts/testnet/ton/internal/build/JettonProxy.compiled.json +1 -1
  60. package/dist/artifacts/testnet/ton/internal/build/JettonWallet.compiled.json +1 -1
  61. package/dist/artifacts/testnet/ton/internal/build/NFTItem.compiled.json +1 -1
  62. package/dist/artifacts/testnet/ton/internal/build/NFTProxy.compiled.json +1 -1
  63. package/dist/artifacts/testnet/ton/internal/build/Settings.compiled.json +1 -1
  64. package/dist/artifacts/testnet/ton/internal/wrappers/CrossChainLayer.d.ts +53 -6
  65. package/dist/artifacts/testnet/ton/internal/wrappers/CrossChainLayer.js +130 -17
  66. package/dist/artifacts/testnet/ton/internal/wrappers/JettonMinter.d.ts +2 -0
  67. package/dist/artifacts/testnet/ton/internal/wrappers/JettonMinter.js +3 -1
  68. package/dist/artifacts/testnet/ton/internal/wrappers/JettonProxy.d.ts +9 -0
  69. package/dist/artifacts/testnet/ton/internal/wrappers/JettonProxy.js +10 -1
  70. package/dist/artifacts/testnet/ton/internal/wrappers/JettonWallet.d.ts +7 -0
  71. package/dist/artifacts/testnet/ton/internal/wrappers/JettonWallet.js +9 -2
  72. package/dist/artifacts/testnet/ton/internal/wrappers/NFTCollection.d.ts +9 -0
  73. package/dist/artifacts/testnet/ton/internal/wrappers/NFTCollection.js +9 -0
  74. package/dist/artifacts/testnet/ton/internal/wrappers/NFTItem.d.ts +7 -0
  75. package/dist/artifacts/testnet/ton/internal/wrappers/NFTItem.js +7 -0
  76. package/dist/artifacts/testnet/ton/internal/wrappers/NFTProxy.d.ts +7 -0
  77. package/dist/artifacts/testnet/ton/internal/wrappers/NFTProxy.js +8 -1
  78. package/dist/artifacts/testnet/ton/internal/wrappers/Settings.d.ts +1 -0
  79. package/dist/artifacts/testnet/ton/internal/wrappers/Settings.js +1 -0
  80. package/dist/artifacts/testnet/ton/internal/wrappers/utils/CrossChainLayerPayload.d.ts +10 -0
  81. package/dist/artifacts/testnet/ton/internal/wrappers/utils/CrossChainLayerPayload.js +24 -0
  82. package/dist/artifacts/testnet/ton/internal/wrappers/utils/MerkleRoots.d.ts +2 -1
  83. package/dist/artifacts/testnet/ton/internal/wrappers/utils/MerkleRoots.js +9 -1
  84. package/dist/src/adapters/BaseContractOpener.d.ts +76 -0
  85. package/dist/src/adapters/BaseContractOpener.js +440 -0
  86. package/dist/src/adapters/LiteClientOpener.d.ts +38 -0
  87. package/dist/src/adapters/LiteClientOpener.js +141 -0
  88. package/dist/src/adapters/OpenerUtils.d.ts +3 -0
  89. package/dist/src/adapters/OpenerUtils.js +40 -0
  90. package/dist/src/adapters/RetryableContractOpener.d.ts +40 -0
  91. package/dist/src/adapters/RetryableContractOpener.js +290 -0
  92. package/dist/src/adapters/SandboxOpener.d.ts +15 -0
  93. package/dist/src/adapters/SandboxOpener.js +35 -0
  94. package/dist/src/adapters/TonClient4Opener.d.ts +24 -0
  95. package/dist/src/adapters/TonClient4Opener.js +95 -0
  96. package/dist/src/adapters/TonClientOpener.d.ts +19 -0
  97. package/dist/src/adapters/TonClientOpener.js +82 -0
  98. package/dist/src/adapters/index.d.ts +7 -2
  99. package/dist/src/adapters/index.js +7 -2
  100. package/dist/src/assets/AssetCache.d.ts +8 -8
  101. package/dist/src/assets/AssetCache.js +3 -0
  102. package/dist/src/assets/AssetFactory.js +8 -2
  103. package/dist/src/assets/FT.d.ts +2 -3
  104. package/dist/src/assets/FT.js +4 -7
  105. package/dist/src/assets/NFT.d.ts +1 -1
  106. package/dist/src/assets/NFT.js +1 -1
  107. package/dist/src/assets/TON.d.ts +3 -2
  108. package/dist/src/assets/TON.js +2 -1
  109. package/dist/src/errors/errors.d.ts +12 -1
  110. package/dist/src/errors/errors.js +66 -2
  111. package/dist/src/errors/index.d.ts +2 -2
  112. package/dist/src/errors/index.js +4 -1
  113. package/dist/src/errors/instances.d.ts +7 -2
  114. package/dist/src/errors/instances.js +67 -2
  115. package/dist/src/index.d.ts +3 -1
  116. package/dist/src/index.js +6 -4
  117. package/dist/src/interfaces/Asset.d.ts +4 -9
  118. package/dist/src/interfaces/ContractOpener.d.ts +76 -2
  119. package/dist/src/interfaces/IOperationTracker.d.ts +22 -22
  120. package/dist/src/interfaces/ISimulator.d.ts +9 -1
  121. package/dist/src/interfaces/ITONTransactionManager.d.ts +20 -1
  122. package/dist/src/interfaces/ITacExplorerClient.d.ts +8 -0
  123. package/dist/src/interfaces/ITacExplorerClient.js +2 -0
  124. package/dist/src/interfaces/ITacSDK.d.ts +25 -1
  125. package/dist/src/interfaces/ITxFinalizer.d.ts +4 -0
  126. package/dist/src/interfaces/ITxFinalizer.js +2 -0
  127. package/dist/src/interfaces/WalletInstanse.d.ts +4 -8
  128. package/dist/src/interfaces/index.d.ts +1 -0
  129. package/dist/src/interfaces/index.js +1 -0
  130. package/dist/src/sdk/Configuration.d.ts +5 -3
  131. package/dist/src/sdk/Configuration.js +54 -7
  132. package/dist/src/sdk/Consts.d.ts +18 -1
  133. package/dist/src/sdk/Consts.js +21 -2
  134. package/dist/src/sdk/Fees.d.ts +21 -0
  135. package/dist/src/sdk/Fees.js +201 -0
  136. package/dist/src/sdk/LiteSequencerClient.d.ts +1 -0
  137. package/dist/src/sdk/LiteSequencerClient.js +39 -17
  138. package/dist/src/sdk/OperationTracker.d.ts +11 -11
  139. package/dist/src/sdk/OperationTracker.js +46 -94
  140. package/dist/src/sdk/Simulator.d.ts +10 -2
  141. package/dist/src/sdk/Simulator.js +102 -0
  142. package/dist/src/sdk/StartTracking.d.ts +12 -7
  143. package/dist/src/sdk/StartTracking.js +75 -49
  144. package/dist/src/sdk/TONTransactionManager.d.ts +5 -4
  145. package/dist/src/sdk/TONTransactionManager.js +63 -8
  146. package/dist/src/sdk/TacExplorerClient.d.ts +8 -0
  147. package/dist/src/sdk/TacExplorerClient.js +22 -0
  148. package/dist/src/sdk/TacSdk.d.ts +8 -2
  149. package/dist/src/sdk/TacSdk.js +27 -4
  150. package/dist/src/sdk/TxFinalizer.d.ts +4 -3
  151. package/dist/src/sdk/TxFinalizer.js +41 -41
  152. package/dist/src/sdk/Utils.d.ts +20 -1
  153. package/dist/src/sdk/Utils.js +158 -10
  154. package/dist/src/sender/BatchSender.js +19 -0
  155. package/dist/src/sender/MockSender.d.ts +2 -0
  156. package/dist/src/sender/MockSender.js +13 -0
  157. package/dist/src/sender/RawSender.js +34 -1
  158. package/dist/src/sender/SenderFactory.js +1 -1
  159. package/dist/src/sender/TonConnectSender.js +2 -0
  160. package/dist/src/sender/index.d.ts +1 -0
  161. package/dist/src/sender/index.js +1 -0
  162. package/dist/src/structs/InternalStruct.d.ts +98 -4
  163. package/dist/src/structs/Struct.d.ts +183 -7
  164. package/dist/src/structs/Struct.js +4 -3
  165. package/dist/src/wrappers/HighloadWalletV3.d.ts +5 -3
  166. package/dist/src/wrappers/HighloadWalletV3.js +14 -3
  167. package/package.json +121 -117
  168. package/dist/src/adapters/contractOpener.d.ts +0 -20
  169. package/dist/src/adapters/contractOpener.js +0 -126
  170. package/dist/src/adapters/retryableContractOpener.d.ts +0 -24
  171. package/dist/src/adapters/retryableContractOpener.js +0 -111
@@ -1,4 +1,4 @@
1
- import { Address, Cell } from '@ton/ton';
1
+ import { Address, Cell, Message } from '@ton/ton';
2
2
  import { AbiCoder } from 'ethers';
3
3
  import type { FT, NFT, TON } from '../assets';
4
4
  import { Asset, IConfiguration } from '../interfaces';
@@ -37,3 +37,22 @@ export declare function getString(cell?: Cell): string;
37
37
  * Calculates (a * b + c / 2) / c with proper rounding
38
38
  */
39
39
  export declare function muldivr(a: bigint, b: bigint, c: bigint): bigint;
40
+ /**
41
+ * Normalize hash string to base64 format
42
+ * Accepts: base64, hex, or raw string
43
+ */
44
+ export declare function normalizeHashToBase64(hash: string): string;
45
+ /**
46
+ * Normalize hash string to hex format
47
+ * Accepts: base64, hex
48
+ */
49
+ export declare function normalizeHashToHex(hash: string): string;
50
+ export declare function getNormalizedExtMessageHash(message: Message): string;
51
+ export declare function retry<T>(fn: () => Promise<T>, options: {
52
+ retries: number;
53
+ delay: number;
54
+ }): Promise<T>;
55
+ export declare function recurisivelyCollectCellStats(cell: Cell): {
56
+ bits: number;
57
+ cells: number;
58
+ };
@@ -20,6 +20,11 @@ exports.getAddressString = getAddressString;
20
20
  exports.getNumber = getNumber;
21
21
  exports.getString = getString;
22
22
  exports.muldivr = muldivr;
23
+ exports.normalizeHashToBase64 = normalizeHashToBase64;
24
+ exports.normalizeHashToHex = normalizeHashToHex;
25
+ exports.getNormalizedExtMessageHash = getNormalizedExtMessageHash;
26
+ exports.retry = retry;
27
+ exports.recurisivelyCollectCellStats = recurisivelyCollectCellStats;
23
28
  const ton_1 = require("@ton/ton");
24
29
  const ethers_1 = require("ethers");
25
30
  const ton_crypto_1 = require("ton-crypto");
@@ -47,6 +52,9 @@ function buildEvmDataCell(transactionLinker, evmProxyMsg, validExecutors) {
47
52
  const evmArguments = evmProxyMsg.encodedParameters
48
53
  ? Buffer.from(evmProxyMsg.encodedParameters.split('0x')[1], 'hex').toString('base64')
49
54
  : null;
55
+ if (!evmProxyMsg.methodName && evmArguments) {
56
+ throw (0, errors_1.invalidMethodNameError)(evmProxyMsg.methodName ?? '');
57
+ }
50
58
  const json = JSON.stringify({
51
59
  evmCall: {
52
60
  target: evmProxyMsg.evmTargetAddress,
@@ -143,13 +151,12 @@ const generateFeeData = (feeParams) => {
143
151
  };
144
152
  exports.generateFeeData = generateFeeData;
145
153
  async function waitUntilSuccess(options = {}, operation, operationDescription, ...args) {
146
- const timeout = options.timeout ?? 300000;
147
- const maxAttempts = options.maxAttempts ?? 30;
148
- const delay = options.delay ?? 10000;
154
+ const timeout = options.timeout ?? Struct_1.defaultWaitOptions.timeout;
155
+ const maxAttempts = options.maxAttempts ?? Struct_1.defaultWaitOptions.maxAttempts;
156
+ const delay = options.delay ?? Struct_1.defaultWaitOptions.delay;
149
157
  const successCheck = options.successCheck;
150
158
  const context = options.context;
151
159
  const contextPrefix = operationDescription ? `[${operationDescription}] ` : '';
152
- options.logger?.debug(`${contextPrefix}Starting wait for success with timeout=${timeout}ms, maxAttempts=${maxAttempts}, delay=${delay}ms`);
153
160
  const startTime = Date.now();
154
161
  let attempt = 1;
155
162
  while (true) {
@@ -160,12 +167,10 @@ async function waitUntilSuccess(options = {}, operation, operationDescription, .
160
167
  if (result === undefined || result === null) {
161
168
  throw new Error(`Empty result`);
162
169
  }
163
- options.logger?.debug(`${contextPrefix}Result: ${formatObjectForLogging(result)}`);
164
170
  if (successCheck && !successCheck(result, context)) {
165
- throw new Error(`Result is not successful`);
171
+ throw new Error(`Result is not successful: ${formatObjectForLogging(result)}`);
166
172
  }
167
- options.logger?.debug(`${contextPrefix}Attempt ${attempt} successful`);
168
- // Execute custom onSuccess callback if provided
173
+ options.logger?.debug(`${contextPrefix}Success (attempt ${attempt}/${maxAttempts})`);
169
174
  if (options.onSuccess) {
170
175
  try {
171
176
  await options.onSuccess(result, context);
@@ -185,8 +190,17 @@ async function waitUntilSuccess(options = {}, operation, operationDescription, .
185
190
  options.logger?.debug(`${contextPrefix}Max attempts (${maxAttempts}) reached`);
186
191
  throw error;
187
192
  }
188
- options.logger?.debug(`${contextPrefix}Error on attempt ${attempt}: ${error}`);
189
- options.logger?.debug(`${contextPrefix}Waiting ${delay}ms before next attempt`);
193
+ const pendingMessage = statusRetryMessageFromError(error, attempt, maxAttempts, delay);
194
+ if (pendingMessage) {
195
+ options.logger?.debug(`${contextPrefix}${pendingMessage}`);
196
+ }
197
+ else {
198
+ let errorMessage = error instanceof Error ? error.message : String(error);
199
+ if (errorMessage.includes('<!doctype html>') || errorMessage.includes('<html')) {
200
+ errorMessage = errorMessage.replace(/<!doctype html>[\s\S]*?<\/html>/gi, '[HTML response]');
201
+ }
202
+ options.logger?.debug(`${contextPrefix}attempt=${attempt}/${maxAttempts} failed; retry_in=${delay}ms; error=${errorMessage}`);
203
+ }
190
204
  await (0, exports.sleep)(delay);
191
205
  attempt++;
192
206
  }
@@ -195,6 +209,44 @@ async function waitUntilSuccess(options = {}, operation, operationDescription, .
195
209
  function formatObjectForLogging(obj) {
196
210
  return JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() : value));
197
211
  }
212
+ function statusRetryMessageFromError(error, attempt, maxAttempts, delay) {
213
+ const prefix = 'Result is not successful: ';
214
+ const message = String(error);
215
+ const index = message.indexOf(prefix);
216
+ if (index < 0) {
217
+ return null;
218
+ }
219
+ const payloadString = message.slice(index + prefix.length).trim();
220
+ let payload;
221
+ try {
222
+ payload = JSON.parse(payloadString);
223
+ }
224
+ catch {
225
+ return null;
226
+ }
227
+ if (typeof payload !== 'object' || payload === null) {
228
+ return null;
229
+ }
230
+ const statusPayload = payload;
231
+ if (statusPayload.stage === undefined &&
232
+ statusPayload.success === undefined &&
233
+ statusPayload.transactions === undefined) {
234
+ return null;
235
+ }
236
+ const stage = typeof statusPayload.stage === 'string' && statusPayload.stage ? statusPayload.stage : 'unknown';
237
+ const success = typeof statusPayload.success === 'boolean' ? String(statusPayload.success) : 'unknown';
238
+ let txHash = '-';
239
+ if (Array.isArray(statusPayload.transactions) && statusPayload.transactions.length > 0) {
240
+ const first = statusPayload.transactions[0];
241
+ if (typeof first === 'object' && first !== null && 'hash' in first) {
242
+ const maybeHash = first.hash;
243
+ if (typeof maybeHash === 'string' && maybeHash) {
244
+ txHash = maybeHash;
245
+ }
246
+ }
247
+ }
248
+ return `pending attempt=${attempt}/${maxAttempts} stage=${stage} success=${success} tx=${txHash} retry_in=${delay}ms`;
249
+ }
198
250
  function getBouncedAddress(tvmAddress) {
199
251
  return ton_1.Address.parse(tvmAddress).toString({
200
252
  bounceable: true,
@@ -310,3 +362,99 @@ function muldivr(a, b, c) {
310
362
  }
311
363
  return (a * b + c / 2n) / c;
312
364
  }
365
+ /**
366
+ * Normalize hash string to base64 format
367
+ * Accepts: base64, hex, or raw string
368
+ */
369
+ function normalizeHashToBase64(hash) {
370
+ const input = hash.trim();
371
+ if (!input)
372
+ return input;
373
+ const hex = input.startsWith('0x') ? input.slice(2) : input;
374
+ if (/^[0-9a-fA-F]{64}$/.test(hex)) {
375
+ return Buffer.from(hex, 'hex').toString('base64');
376
+ }
377
+ const decoded = decodeBase64Like(input);
378
+ if (decoded) {
379
+ return decoded.toString('base64');
380
+ }
381
+ return input;
382
+ }
383
+ /**
384
+ * Normalize hash string to hex format
385
+ * Accepts: base64, hex
386
+ */
387
+ function normalizeHashToHex(hash) {
388
+ const input = hash.trim();
389
+ if (!input)
390
+ return input;
391
+ const maybeHex = input.startsWith('0x') ? input.slice(2) : input;
392
+ if (/^[0-9a-fA-F]+$/.test(maybeHex) && maybeHex.length % 2 === 0) {
393
+ return maybeHex.toLowerCase();
394
+ }
395
+ const decoded = decodeBase64Like(input);
396
+ if (decoded) {
397
+ return decoded.toString('hex');
398
+ }
399
+ return input;
400
+ }
401
+ function decodeBase64Like(input) {
402
+ const normalized = input.replace(/-/g, '+').replace(/_/g, '/');
403
+ const padLength = normalized.length % 4;
404
+ const padded = padLength === 0 ? normalized : normalized + '='.repeat(4 - padLength);
405
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(padded)) {
406
+ return null;
407
+ }
408
+ try {
409
+ const buf = Buffer.from(padded, 'base64');
410
+ return buf.length > 0 ? buf : null;
411
+ }
412
+ catch {
413
+ return null;
414
+ }
415
+ }
416
+ function getNormalizedExtMessageHash(message) {
417
+ if (message.info.type !== 'external-in') {
418
+ throw new Error(`Message must be "external-in", got ${message.info.type}`);
419
+ }
420
+ const info = {
421
+ ...message.info,
422
+ src: undefined,
423
+ importFee: 0n,
424
+ };
425
+ const normalizedMessage = {
426
+ ...message,
427
+ init: null,
428
+ info: info,
429
+ };
430
+ return (0, ton_1.beginCell)()
431
+ .store((0, ton_1.storeMessage)(normalizedMessage, { forceRef: true }))
432
+ .endCell()
433
+ .hash()
434
+ .toString('base64');
435
+ }
436
+ async function retry(fn, options) {
437
+ let lastError;
438
+ for (let i = 0; i < options.retries; i++) {
439
+ try {
440
+ return await fn();
441
+ }
442
+ catch (e) {
443
+ if (e instanceof Error) {
444
+ lastError = e;
445
+ }
446
+ await new Promise((resolve) => setTimeout(resolve, options.delay));
447
+ }
448
+ }
449
+ throw lastError;
450
+ }
451
+ function recurisivelyCollectCellStats(cell) {
452
+ let bits = cell.bits.length;
453
+ let cells = 1;
454
+ for (const ref of cell.refs) {
455
+ const stats = recurisivelyCollectCellStats(ref);
456
+ bits += stats.bits;
457
+ cells += stats.cells;
458
+ }
459
+ return { bits, cells };
460
+ }
@@ -38,7 +38,16 @@ class BatchSender {
38
38
  for (const group of groups) {
39
39
  try {
40
40
  const result = await this.sendGroup(group, contractOpener);
41
+ // Extract BoC if it's a string, or from sandbox result
42
+ let externalMsgBoc = '';
43
+ if (typeof result === 'string') {
44
+ externalMsgBoc = result;
45
+ }
46
+ else if (result?.result) {
47
+ externalMsgBoc = result.result;
48
+ }
41
49
  results.push({
50
+ boc: externalMsgBoc,
42
51
  success: true,
43
52
  result,
44
53
  lastMessageIndex: currentMessageIndex + group.length - 1,
@@ -46,6 +55,7 @@ class BatchSender {
46
55
  }
47
56
  catch (error) {
48
57
  results.push({
58
+ boc: '',
49
59
  success: false,
50
60
  error: error,
51
61
  lastMessageIndex: currentMessageIndex - 1,
@@ -118,7 +128,16 @@ class BatchSender {
118
128
  }));
119
129
  }
120
130
  const result = await this.sendGroup(messages, contractOpener);
131
+ // Extract BoC if it's a string, or from sandbox result
132
+ let externalMsgBoc = '';
133
+ if (typeof result === 'string') {
134
+ externalMsgBoc = result;
135
+ }
136
+ else if (result?.result) {
137
+ externalMsgBoc = result.result;
138
+ }
121
139
  return {
140
+ boc: externalMsgBoc,
122
141
  success: true,
123
142
  result,
124
143
  lastMessageIndex: shardTransaction.messages.length - 1,
@@ -0,0 +1,2 @@
1
+ import { SenderAbstraction } from '../interfaces';
2
+ export declare const getMockSender: (senderAddress: string) => SenderAbstraction;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMockSender = void 0;
4
+ const getMockSender = (senderAddress) => {
5
+ return {
6
+ getSenderAddress: () => senderAddress,
7
+ sendShardTransaction: async () => ({ success: true, boc: '' }),
8
+ sendShardTransactions: async () => [],
9
+ getBalance: async () => 0n,
10
+ getBalanceOf: async () => 0n,
11
+ };
12
+ };
13
+ exports.getMockSender = getMockSender;
@@ -34,7 +34,16 @@ class RawSender {
34
34
  for (const batch of batches) {
35
35
  try {
36
36
  const result = await this.sendBatch(batch, contractOpener);
37
+ // Extract BoC if it's a string, or from sandbox result
38
+ let externalMsgBoc = '';
39
+ if (typeof result === 'string') {
40
+ externalMsgBoc = result;
41
+ }
42
+ else if (result?.result) {
43
+ externalMsgBoc = result.result;
44
+ }
37
45
  results.push({
46
+ boc: externalMsgBoc,
38
47
  success: true,
39
48
  result,
40
49
  lastMessageIndex: currentMessageIndex + batch.length - 1,
@@ -42,6 +51,7 @@ class RawSender {
42
51
  }
43
52
  catch (error) {
44
53
  results.push({
54
+ boc: '',
45
55
  success: false,
46
56
  error: error,
47
57
  lastMessageIndex: currentMessageIndex - 1,
@@ -63,12 +73,26 @@ class RawSender {
63
73
  async sendBatch(messages, contractOpener) {
64
74
  const walletContract = contractOpener.open(this.wallet);
65
75
  const seqno = await walletContract.getSeqno();
66
- return walletContract.sendTransfer({
76
+ // Try to create BoC locally for standard wallets
77
+ const msg = this.wallet.createTransfer({
67
78
  seqno,
68
79
  secretKey: this.secretKey,
69
80
  messages,
70
81
  sendMode: ton_2.SendMode.PAY_GAS_SEPARATELY,
71
82
  });
83
+ let neededInit = null;
84
+ if (this.wallet.init && (await contractOpener.getContractState(this.wallet.address)).state !== 'active') {
85
+ neededInit = this.wallet.init;
86
+ }
87
+ const ext = (0, ton_1.external)({
88
+ to: this.wallet.address,
89
+ init: neededInit,
90
+ body: msg,
91
+ });
92
+ const boc = (0, ton_1.beginCell)().store((0, ton_1.storeMessage)(ext)).endCell().toBoc().toString('base64');
93
+ // Send the transaction
94
+ const result = await walletContract.send(msg);
95
+ return result || boc;
72
96
  }
73
97
  getSenderAddress() {
74
98
  return this.wallet.address.toString();
@@ -84,7 +108,16 @@ class RawSender {
84
108
  }));
85
109
  }
86
110
  const result = await this.sendBatch(messages, contractOpener);
111
+ // Extract BoC if it's a string, or from sandbox result
112
+ let externalMsgBoc = '';
113
+ if (typeof result === 'string') {
114
+ externalMsgBoc = result;
115
+ }
116
+ else if (result?.result) {
117
+ externalMsgBoc = result.result;
118
+ }
87
119
  return {
120
+ boc: externalMsgBoc,
88
121
  success: true,
89
122
  result,
90
123
  lastMessageIndex: shardTransaction.messages.length - 1,
@@ -51,7 +51,7 @@ class SenderFactory {
51
51
  config.timeout = params.options?.highloadV3?.timeout ?? HighloadWalletV3_1.DEFAULT_TIMEOUT;
52
52
  }
53
53
  const wallet = exports.wallets[params.version].create(config);
54
- if (params.version === 'HIGHLOAD_V3') {
54
+ if (wallet instanceof HighloadWalletV3_1.HighloadWalletV3) {
55
55
  return new BatchSender_1.BatchSender(wallet, keypair.secretKey);
56
56
  }
57
57
  return new RawSender_1.RawSender(wallet, keypair.secretKey, params.version === 'V5R1' ? 254 : 4);
@@ -35,6 +35,7 @@ class TonConnectSender {
35
35
  responses.push({
36
36
  success: true,
37
37
  result: response,
38
+ boc: response.boc,
38
39
  lastMessageIndex: currentMessageIndex + chunk.length - 1,
39
40
  });
40
41
  currentMessageIndex += chunk.length;
@@ -42,6 +43,7 @@ class TonConnectSender {
42
43
  catch (error) {
43
44
  responses.push({
44
45
  success: false,
46
+ boc: '',
45
47
  error: error,
46
48
  lastMessageIndex: currentMessageIndex - 1,
47
49
  });
@@ -1,3 +1,4 @@
1
1
  export * from '../interfaces/SenderAbstraction';
2
2
  export * from './BatchSender';
3
+ export * from './MockSender';
3
4
  export * from './SenderFactory';
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("../interfaces/SenderAbstraction"), exports);
18
18
  __exportStar(require("./BatchSender"), exports);
19
+ __exportStar(require("./MockSender"), exports);
19
20
  __exportStar(require("./SenderFactory"), exports);
@@ -1,4 +1,4 @@
1
- import { Cell } from '@ton/ton';
1
+ import { Address, Cell } from '@ton/ton';
2
2
  import { AbstractProvider, ethers } from 'ethers';
3
3
  import { ICrossChainLayer, ISAFactory, ISettings, ITokenUtils } from '../../artifacts/tacTypes';
4
4
  import { ContractOpener } from '../interfaces';
@@ -7,6 +7,10 @@ export type ShardMessage = {
7
7
  address: string;
8
8
  value: bigint;
9
9
  payload: Cell;
10
+ extra: {
11
+ tonNetworkFee: bigint;
12
+ tacEstimatedGas?: bigint;
13
+ };
10
14
  };
11
15
  export type ShardTransaction = {
12
16
  validUntil: number;
@@ -32,6 +36,8 @@ export type InternalTONParams = {
32
36
  jettonWalletCode: Cell;
33
37
  nftItemCode: Cell;
34
38
  nftCollectionCode: Cell;
39
+ feesParams: TONFeesParams;
40
+ contractFeeUsageParams: ContractFeeUsageParams;
35
41
  };
36
42
  export type InternalTACParams = {
37
43
  provider: AbstractProvider;
@@ -61,6 +67,7 @@ export type OperationIdWithLogIndex = {
61
67
  export type OperationIdWithLogIndexResponse = ResponseBase<OperationIdWithLogIndex>;
62
68
  export interface SendResult {
63
69
  success: boolean;
70
+ boc: string;
64
71
  result?: unknown;
65
72
  error?: Error;
66
73
  lastMessageIndex?: number;
@@ -68,11 +75,11 @@ export interface SendResult {
68
75
  export type ToncenterTransaction = {
69
76
  description: {
70
77
  aborted: boolean;
71
- action: {
78
+ action?: {
72
79
  resultCode: number;
73
80
  success: boolean;
74
81
  };
75
- computePh: {
82
+ computePh?: {
76
83
  exitCode: number;
77
84
  success: boolean;
78
85
  };
@@ -82,21 +89,24 @@ export type ToncenterTransaction = {
82
89
  inMsg: {
83
90
  hash: string;
84
91
  opcode: string;
92
+ value: string;
85
93
  };
86
94
  outMsgs: {
87
95
  hash: string;
88
96
  }[];
89
97
  };
90
98
  export type TransactionDepth = {
99
+ address?: Address;
91
100
  hash: string;
92
101
  depth: number;
102
+ hashType?: 'unknown' | 'in' | 'out';
93
103
  };
94
104
  export type AdjacentTransactionsResponse = {
95
105
  transactions: ToncenterTransaction[];
96
106
  };
97
107
  export type TxFinalizerConfig = {
98
108
  urlBuilder: (hash: string) => string;
99
- authorization: {
109
+ authorization?: {
100
110
  header: string;
101
111
  value: string;
102
112
  };
@@ -114,3 +124,87 @@ export type ConvertedCurrencyRawResult = {
114
124
  tacPrice: USDPriceInfoRaw;
115
125
  tonPrice: USDPriceInfoRaw;
116
126
  };
127
+ export type TONFeesParams = {
128
+ accountBitPrice: number;
129
+ accountCellPrice: number;
130
+ lumpPrice: number;
131
+ gasPrice: number;
132
+ firstFrac: number;
133
+ ihrPriceFactor: number;
134
+ msgBitPrice: number;
135
+ msgCellPrice: number;
136
+ };
137
+ export type ContractFeeUsageParams = {
138
+ crossChainLayer: {
139
+ accountBits: number;
140
+ accountCells: number;
141
+ gas: {
142
+ tvmMsgToEvm: number;
143
+ };
144
+ };
145
+ jettonWallet: {
146
+ accountBits: number;
147
+ accountCells: number;
148
+ estimatedAccountBits: number;
149
+ estimatedAccountCells: number;
150
+ initStateBits: number;
151
+ initStateCells: number;
152
+ gas: {
153
+ internalTransfer: number;
154
+ receive: number;
155
+ burn: number;
156
+ estimatedSendTransfer: number;
157
+ estimatedReceiveTransfer: number;
158
+ };
159
+ };
160
+ jettonProxy: {
161
+ accountBits: number;
162
+ accountCells: number;
163
+ gas: {
164
+ ownershipAssigned: number;
165
+ transferNotification: number;
166
+ errorNotification: number;
167
+ };
168
+ };
169
+ jettonMinter: {
170
+ accountBits: number;
171
+ accountCells: number;
172
+ gas: {
173
+ burnNotification: number;
174
+ mintAfterError: number;
175
+ };
176
+ };
177
+ nftItem: {
178
+ accountBits: number;
179
+ accountCells: number;
180
+ gas: {
181
+ send: number;
182
+ burn: number;
183
+ errorNotification: number;
184
+ };
185
+ };
186
+ nftProxy: {
187
+ accountBits: number;
188
+ accountCells: number;
189
+ gas: {
190
+ ownershipAssigned: number;
191
+ errorNotification: number;
192
+ };
193
+ };
194
+ };
195
+ export type TransactionFeeCalculationStep = {
196
+ accountBits: number;
197
+ accountCells: number;
198
+ gasUsed: number;
199
+ msgBits: number;
200
+ msgCells: number;
201
+ timeDelta: number;
202
+ };
203
+ export type TONFeeCalculationParams = TransactionFeeCalculationStep & TONFeesParams;
204
+ export type TacGasPriceResponse = {
205
+ gasPrices: {
206
+ average: number;
207
+ fast: number;
208
+ slow: number;
209
+ };
210
+ };