@tonappchain/sdk 0.7.3-rc8 → 0.8.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 (89) hide show
  1. package/dist/artifacts/dev/tac/internal/artifacts/contracts/interfaces/ICrossChainLayer.sol/ICrossChainLayer.json +0 -7
  2. package/dist/artifacts/dev/tac/internal/artifacts/contracts/interfaces/ISettings.sol/ISettings.json +0 -7
  3. package/dist/artifacts/dev/tac/internal/artifacts/contracts/interfaces/ITokenUtils.sol/ITokenUtils.json +0 -7
  4. package/dist/artifacts/dev/tac/internal/artifacts/contracts/smart-account/interfaces/ISAFactory.sol/ISAFactory.json +0 -7
  5. package/dist/artifacts/dev/tac/internal/typechain-types/contracts/interfaces/ICrossChainLayer.d.ts +1 -5
  6. package/dist/artifacts/dev/tac/internal/typechain-types/contracts/interfaces/ISettings.d.ts +1 -5
  7. package/dist/artifacts/dev/tac/internal/typechain-types/contracts/interfaces/ITokenUtils.d.ts +1 -5
  8. package/dist/artifacts/dev/tac/internal/typechain-types/contracts/smart-account/interfaces/ISAFactory.d.ts +1 -5
  9. package/dist/artifacts/dev/ton/internal/build/Settings.compiled.json +1 -1
  10. package/dist/artifacts/dev/ton/internal/wrappers/Settings.d.ts +1 -0
  11. package/dist/artifacts/dev/ton/internal/wrappers/Settings.js +11 -7
  12. package/dist/artifacts/index.d.ts +5 -3
  13. package/dist/artifacts/index.js +6 -3
  14. package/dist/artifacts/mainnet/tac/internal/artifacts/contracts/interfaces/ICrossChainLayer.sol/ICrossChainLayer.json +0 -7
  15. package/dist/artifacts/mainnet/tac/internal/artifacts/contracts/interfaces/ISettings.sol/ISettings.json +0 -7
  16. package/dist/artifacts/mainnet/tac/internal/artifacts/contracts/interfaces/ITokenUtils.sol/ITokenUtils.json +0 -7
  17. package/dist/artifacts/mainnet/tac/internal/artifacts/contracts/smart-account/interfaces/ISAFactory.sol/ISAFactory.json +0 -7
  18. package/dist/artifacts/mainnet/tac/internal/typechain-types/contracts/interfaces/ICrossChainLayer.d.ts +1 -5
  19. package/dist/artifacts/mainnet/tac/internal/typechain-types/contracts/interfaces/ISettings.d.ts +1 -5
  20. package/dist/artifacts/mainnet/tac/internal/typechain-types/contracts/interfaces/ITokenUtils.d.ts +1 -5
  21. package/dist/artifacts/mainnet/tac/internal/typechain-types/contracts/smart-account/interfaces/ISAFactory.d.ts +1 -5
  22. package/dist/artifacts/mainnet/ton/internal/build/CrossChainLayer.compiled.json +1 -1
  23. package/dist/artifacts/mainnet/ton/internal/build/Executor.compiled.json +1 -1
  24. package/dist/artifacts/mainnet/ton/internal/build/JettonMinter.compiled.json +1 -1
  25. package/dist/artifacts/mainnet/ton/internal/build/JettonProxy.compiled.json +1 -1
  26. package/dist/artifacts/mainnet/ton/internal/build/JettonWallet.compiled.json +1 -1
  27. package/dist/artifacts/mainnet/ton/internal/build/NFTCollection.compiled.json +1 -1
  28. package/dist/artifacts/mainnet/ton/internal/build/NFTItem.compiled.json +1 -1
  29. package/dist/artifacts/mainnet/ton/internal/build/NFTProxy.compiled.json +1 -1
  30. package/dist/artifacts/mainnet/ton/internal/build/Settings.compiled.json +1 -1
  31. package/dist/artifacts/mainnet/ton/internal/wrappers/CrossChainLayer.d.ts +65 -6
  32. package/dist/artifacts/mainnet/ton/internal/wrappers/CrossChainLayer.js +169 -18
  33. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonMinter.d.ts +4 -2
  34. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonMinter.js +5 -3
  35. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonProxy.d.ts +9 -0
  36. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonProxy.js +11 -2
  37. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonWallet.d.ts +7 -0
  38. package/dist/artifacts/mainnet/ton/internal/wrappers/JettonWallet.js +9 -2
  39. package/dist/artifacts/mainnet/ton/internal/wrappers/NFTCollection.d.ts +11 -1
  40. package/dist/artifacts/mainnet/ton/internal/wrappers/NFTCollection.js +17 -5
  41. package/dist/artifacts/mainnet/ton/internal/wrappers/NFTItem.d.ts +9 -1
  42. package/dist/artifacts/mainnet/ton/internal/wrappers/NFTItem.js +15 -5
  43. package/dist/artifacts/mainnet/ton/internal/wrappers/NFTProxy.d.ts +9 -1
  44. package/dist/artifacts/mainnet/ton/internal/wrappers/NFTProxy.js +16 -6
  45. package/dist/artifacts/mainnet/ton/internal/wrappers/Settings.d.ts +2 -0
  46. package/dist/artifacts/mainnet/ton/internal/wrappers/Settings.js +11 -6
  47. package/dist/artifacts/mainnet/ton/internal/wrappers/utils/CrossChainLayerPayload.d.ts +10 -0
  48. package/dist/artifacts/mainnet/ton/internal/wrappers/utils/CrossChainLayerPayload.js +24 -0
  49. package/dist/artifacts/mainnet/ton/internal/wrappers/utils/MerkleRoots.d.ts +2 -1
  50. package/dist/artifacts/mainnet/ton/internal/wrappers/utils/MerkleRoots.js +9 -1
  51. package/dist/artifacts/testnet/tac/internal/artifacts/contracts/interfaces/ICrossChainLayer.sol/ICrossChainLayer.json +0 -7
  52. package/dist/artifacts/testnet/tac/internal/artifacts/contracts/interfaces/ISettings.sol/ISettings.json +0 -7
  53. package/dist/artifacts/testnet/tac/internal/artifacts/contracts/interfaces/ITokenUtils.sol/ITokenUtils.json +0 -7
  54. package/dist/artifacts/testnet/tac/internal/artifacts/contracts/smart-account/interfaces/ISAFactory.sol/ISAFactory.json +0 -7
  55. package/dist/artifacts/testnet/tac/internal/typechain-types/contracts/interfaces/ICrossChainLayer.d.ts +1 -5
  56. package/dist/artifacts/testnet/tac/internal/typechain-types/contracts/interfaces/ISettings.d.ts +1 -5
  57. package/dist/artifacts/testnet/tac/internal/typechain-types/contracts/interfaces/ITokenUtils.d.ts +1 -5
  58. package/dist/artifacts/testnet/tac/internal/typechain-types/contracts/smart-account/interfaces/ISAFactory.d.ts +1 -5
  59. package/dist/artifacts/testnet/ton/internal/build/Settings.compiled.json +1 -1
  60. package/dist/artifacts/testnet/ton/internal/wrappers/Settings.d.ts +1 -0
  61. package/dist/artifacts/testnet/ton/internal/wrappers/Settings.js +11 -7
  62. package/dist/src/adapters/RetryableContractOpener.js +5 -2
  63. package/dist/src/adapters/ToncenterV3Indexer.js +1 -1
  64. package/dist/src/assets/AssetCache.d.ts +4 -4
  65. package/dist/src/assets/AssetCache.js +11 -6
  66. package/dist/src/assets/AssetFactory.js +2 -2
  67. package/dist/src/errors/index.d.ts +1 -1
  68. package/dist/src/errors/index.js +2 -1
  69. package/dist/src/errors/instances.d.ts +1 -0
  70. package/dist/src/errors/instances.js +3 -1
  71. package/dist/src/index.d.ts +1 -0
  72. package/dist/src/index.js +3 -1
  73. package/dist/src/interfaces/IConfiguration.d.ts +2 -2
  74. package/dist/src/sdk/Artifacts.d.ts +3 -0
  75. package/dist/src/sdk/Artifacts.js +17 -0
  76. package/dist/src/sdk/Configuration.d.ts +4 -4
  77. package/dist/src/sdk/Configuration.js +3 -3
  78. package/dist/src/sdk/Consts.d.ts +0 -1
  79. package/dist/src/sdk/Consts.js +1 -2
  80. package/dist/src/sdk/LiteSequencerClient.js +2 -1
  81. package/dist/src/sdk/StartTracking.js +2 -2
  82. package/dist/src/sdk/TACTransactionManager.js +5 -5
  83. package/dist/src/sdk/TONTransactionManager.js +23 -21
  84. package/dist/src/sdk/TacExplorerClient.js +4 -3
  85. package/dist/src/sdk/TacSdk.js +2 -15
  86. package/dist/src/sdk/TxFinalizer.js +1 -1
  87. package/dist/src/sdk/Utils.js +37 -4
  88. package/dist/src/structs/Struct.d.ts +4 -4
  89. package/package.json +1 -1
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Settings = exports.SettingsErrors = exports.SettingsOpCodes = void 0;
4
4
  exports.settingsConfigToCell = settingsConfigToCell;
5
+ exports.createSettingsSetValueBody = createSettingsSetValueBody;
5
6
  const core_1 = require("@ton/core");
6
7
  const GasUtils_1 = require("./utils/GasUtils");
7
8
  exports.SettingsOpCodes = {
@@ -29,6 +30,14 @@ function settingsConfigToCell(config) {
29
30
  .storeDict(config.settings)
30
31
  .endCell();
31
32
  }
33
+ function createSettingsSetValueBody(params) {
34
+ return (0, core_1.beginCell)()
35
+ .storeUint(exports.SettingsOpCodes.admin_setValue, 32)
36
+ .storeUint(params.queryId ?? 0, 64)
37
+ .storeUint(params.key, 256)
38
+ .storeRef(params.value)
39
+ .endCell();
40
+ }
32
41
  class Settings {
33
42
  constructor(address, init, configuration) {
34
43
  this.address = address;
@@ -54,12 +63,7 @@ class Settings {
54
63
  await provider.internal(via, {
55
64
  value,
56
65
  sendMode: core_1.SendMode.PAY_GAS_SEPARATELY,
57
- body: (0, core_1.beginCell)()
58
- .storeUint(exports.SettingsOpCodes.admin_setValue, 32)
59
- .storeUint(params.queryId ?? 0, 64)
60
- .storeUint(params.key, 256)
61
- .storeRef(params.value)
62
- .endCell(),
66
+ body: createSettingsSetValueBody(params),
63
67
  });
64
68
  }
65
69
  async sendGetValue(provider, via, value, params) {
@@ -148,6 +152,6 @@ class Settings {
148
152
  }
149
153
  }
150
154
  exports.Settings = Settings;
151
- Settings.storageStats = new GasUtils_1.StorageStats(39375n, 118n);
155
+ Settings.storageStats = new GasUtils_1.StorageStats(39175n, 118n);
152
156
  Settings.minStorageDuration = 10 * 365 * 24 * 3600; // 10 years
153
157
  Settings.minStorageStats = new GasUtils_1.StorageStats(29557n, 104n);
@@ -146,7 +146,7 @@ class RetryableContractOpener {
146
146
  const openerLabel = `opener ${index + 1}/${this.openerConfigs.length}`;
147
147
  this.logger?.debug(`[RetryableContractOpener] ${operationName}: trying ${openerLabel}`);
148
148
  const result = useRetries
149
- ? await this.tryWithRetries(() => operation(config), config, `${operationName} ${openerLabel}`)
149
+ ? await this.tryWithRetries(() => operation(config), config, `${operationName} ${openerLabel}`, shouldFallbackOnError)
150
150
  : await this.trySingleAttempt(() => operation(config));
151
151
  if (result.success) {
152
152
  return { success: true, data: result.data };
@@ -186,7 +186,7 @@ class RetryableContractOpener {
186
186
  return { success: false, lastError: error };
187
187
  }
188
188
  }
189
- async tryWithRetries(operation, config, operationContext = 'operation') {
189
+ async tryWithRetries(operation, config, operationContext = 'operation', shouldRetryError) {
190
190
  let lastError;
191
191
  for (let attempt = 0; attempt <= config.retries; attempt++) {
192
192
  try {
@@ -198,6 +198,9 @@ class RetryableContractOpener {
198
198
  if (lastError instanceof errors_1.TransactionError || this.isContractExecutionError(lastError)) {
199
199
  return { success: false, lastError };
200
200
  }
201
+ if (shouldRetryError && !shouldRetryError(lastError)) {
202
+ return { success: false, lastError };
203
+ }
201
204
  if (attempt < config.retries) {
202
205
  const retryDelay = this.getRetryDelay(config, attempt);
203
206
  this.logger?.debug(`[RetryableContractOpener] ${operationContext}: attempt ${attempt + 1}/${config.retries + 1} failed (${lastError.message}), retrying in ${retryDelay}ms`);
@@ -11,7 +11,7 @@ const Utils_1 = require("../sdk/Utils");
11
11
  * traversing a linked chain of TON transactions until it finds the sequencer-collected event transaction on CCL.
12
12
  */
13
13
  class ToncenterV3Indexer {
14
- constructor(endpoint, httpClient = new AxiosHttpClient_1.AxiosHttpClient()) {
14
+ constructor(endpoint, httpClient = new AxiosHttpClient_1.AxiosHttpClient({ timeout: Consts_1.DEFAULT_HTTP_CLIENT_TIMEOUT_MS })) {
15
15
  this.endpoint = endpoint;
16
16
  this.httpClient = httpClient;
17
17
  }
@@ -1,19 +1,19 @@
1
- import { Asset } from '../interfaces';
1
+ import type { Asset, IConfiguration } from '../interfaces';
2
2
  type AssetCacheToken = {
3
3
  address: string;
4
4
  index?: bigint;
5
5
  tokenType?: string;
6
6
  };
7
7
  export declare class AssetCache {
8
- private static readonly cache;
8
+ private static cache;
9
9
  /**
10
10
  * Get asset from cache
11
11
  */
12
- static get(token: AssetCacheToken): Asset | undefined;
12
+ static get(configuration: IConfiguration, token: AssetCacheToken): Asset | undefined;
13
13
  /**
14
14
  * Set asset in cache
15
15
  */
16
- static set(token: AssetCacheToken, asset: Asset): void;
16
+ static set(configuration: IConfiguration, token: AssetCacheToken, asset: Asset): void;
17
17
  /**
18
18
  * Clear the cache
19
19
  */
@@ -5,22 +5,27 @@ class AssetCache {
5
5
  /**
6
6
  * Get asset from cache
7
7
  */
8
- static get(token) {
8
+ static get(configuration, token) {
9
9
  const key = this.generateKey(token);
10
- return this.cache.get(key);
10
+ return this.cache.get(configuration)?.get(key);
11
11
  }
12
12
  /**
13
13
  * Set asset in cache
14
14
  */
15
- static set(token, asset) {
15
+ static set(configuration, token, asset) {
16
16
  const key = this.generateKey(token);
17
- this.cache.set(key, asset);
17
+ let scopedCache = this.cache.get(configuration);
18
+ if (!scopedCache) {
19
+ scopedCache = new Map();
20
+ this.cache.set(configuration, scopedCache);
21
+ }
22
+ scopedCache.set(key, asset);
18
23
  }
19
24
  /**
20
25
  * Clear the cache
21
26
  */
22
27
  static clear() {
23
- this.cache.clear();
28
+ this.cache = new WeakMap();
24
29
  }
25
30
  static generateKey(token) {
26
31
  // Normalize address to lowercase for consistency
@@ -36,4 +41,4 @@ class AssetCache {
36
41
  }
37
42
  }
38
43
  exports.AssetCache = AssetCache;
39
- AssetCache.cache = new Map();
44
+ AssetCache.cache = new WeakMap();
@@ -18,14 +18,14 @@ class AssetFactory {
18
18
  throw (0, errors_1.unknownTokenTypeError)(token.address, 'detected TON, but token type is not FT');
19
19
  return TON_1.TON.create(configuration);
20
20
  }
21
- const cachedAsset = AssetCache_1.AssetCache.get(token);
21
+ const cachedAsset = AssetCache_1.AssetCache.get(configuration, token);
22
22
  if (cachedAsset) {
23
23
  return cachedAsset.clone.withRawAmount(0n);
24
24
  }
25
25
  const asset = token.tokenType === Struct_1.AssetType.FT
26
26
  ? await this.createFTAsset(configuration, token.address)
27
27
  : await this.createNFTAsset(configuration, token.address, token.addressType, token.addressType === Struct_1.NFTAddressType.COLLECTION ? token.index : undefined);
28
- AssetCache_1.AssetCache.set(token, asset);
28
+ AssetCache_1.AssetCache.set(configuration, token, asset);
29
29
  return asset;
30
30
  }
31
31
  static async createFTAsset(configuration, address) {
@@ -1,2 +1,2 @@
1
1
  export { AddressError, BitError, ContractError, EVMCallError, FetchError, FormatError, KeyError, MetadataError, SettingError, TokenError, TransactionError, WalletError, } from './errors';
2
- export { allEndpointsFailedError, blockGasLimitFetchError, emptyArrayError, emptyContractError, emptySettingError, estimatedGasExceedsBlockGasLimitError, evmAddressError, executedInTONStageFailedError, externalInMessageRequiredError, gasPriceFetchError, indexRequiredError, insufficientBalanceError, insufficientFeeParamsError, invalidMethodNameError, invalidTonExternalMessageBocError, missingDecimals, missingFeeParamsError, missingGasLimitError, missingJettonDataError, missingTvmExecutorFeeError, notMultiplyOf8Error, operationFetchError, operationIdRequiredForFinalizationError, prefixError, profilingFetchError, simulationFetchError, statusFetchError, tonIndexerRequiredForTonTransactionBocError, tvmAddressError, txFinalizationError, unknownTokenTypeError, unknownWalletError, unsupportedFormatError, unsupportedKeyError, zeroRawAmountError, } from './instances';
2
+ export { allEndpointsFailedError, blockGasLimitFetchError, emptyArrayError, emptyContractError, emptySettingError, estimatedGasExceedsBlockGasLimitError, evmAddressError, executedInTONStageFailedError, externalInMessageRequiredError, gasPriceFetchError, indexRequiredError, insufficientBalanceError, insufficientFeeParamsError, invalidAmountError, invalidMethodNameError, invalidTonExternalMessageBocError, missingDecimals, missingFeeParamsError, missingGasLimitError, missingJettonDataError, missingTvmExecutorFeeError, notMultiplyOf8Error, operationFetchError, operationIdRequiredForFinalizationError, prefixError, profilingFetchError, simulationFetchError, statusFetchError, tonIndexerRequiredForTonTransactionBocError, tvmAddressError, txFinalizationError, unknownTokenTypeError, unknownWalletError, unsupportedFormatError, unsupportedKeyError, zeroRawAmountError, } from './instances';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.zeroRawAmountError = exports.unsupportedKeyError = exports.unsupportedFormatError = exports.unknownWalletError = exports.unknownTokenTypeError = exports.txFinalizationError = exports.tvmAddressError = exports.tonIndexerRequiredForTonTransactionBocError = exports.statusFetchError = exports.simulationFetchError = exports.profilingFetchError = exports.prefixError = exports.operationIdRequiredForFinalizationError = exports.operationFetchError = exports.notMultiplyOf8Error = exports.missingTvmExecutorFeeError = exports.missingJettonDataError = exports.missingGasLimitError = exports.missingFeeParamsError = exports.missingDecimals = exports.invalidTonExternalMessageBocError = exports.invalidMethodNameError = exports.insufficientFeeParamsError = exports.insufficientBalanceError = exports.indexRequiredError = exports.gasPriceFetchError = exports.externalInMessageRequiredError = exports.executedInTONStageFailedError = exports.evmAddressError = exports.estimatedGasExceedsBlockGasLimitError = exports.emptySettingError = exports.emptyContractError = exports.emptyArrayError = exports.blockGasLimitFetchError = exports.allEndpointsFailedError = exports.WalletError = exports.TransactionError = exports.TokenError = exports.SettingError = exports.MetadataError = exports.KeyError = exports.FormatError = exports.FetchError = exports.EVMCallError = exports.ContractError = exports.BitError = exports.AddressError = void 0;
3
+ exports.zeroRawAmountError = exports.unsupportedKeyError = exports.unsupportedFormatError = exports.unknownWalletError = exports.unknownTokenTypeError = exports.txFinalizationError = exports.tvmAddressError = exports.tonIndexerRequiredForTonTransactionBocError = exports.statusFetchError = exports.simulationFetchError = exports.profilingFetchError = exports.prefixError = exports.operationIdRequiredForFinalizationError = exports.operationFetchError = exports.notMultiplyOf8Error = exports.missingTvmExecutorFeeError = exports.missingJettonDataError = exports.missingGasLimitError = exports.missingFeeParamsError = exports.missingDecimals = exports.invalidTonExternalMessageBocError = exports.invalidMethodNameError = exports.invalidAmountError = exports.insufficientFeeParamsError = exports.insufficientBalanceError = exports.indexRequiredError = exports.gasPriceFetchError = exports.externalInMessageRequiredError = exports.executedInTONStageFailedError = exports.evmAddressError = exports.estimatedGasExceedsBlockGasLimitError = exports.emptySettingError = exports.emptyContractError = exports.emptyArrayError = exports.blockGasLimitFetchError = exports.allEndpointsFailedError = exports.WalletError = exports.TransactionError = exports.TokenError = exports.SettingError = exports.MetadataError = exports.KeyError = exports.FormatError = exports.FetchError = exports.EVMCallError = exports.ContractError = exports.BitError = exports.AddressError = void 0;
4
4
  var errors_1 = require("./errors");
5
5
  Object.defineProperty(exports, "AddressError", { enumerable: true, get: function () { return errors_1.AddressError; } });
6
6
  Object.defineProperty(exports, "BitError", { enumerable: true, get: function () { return errors_1.BitError; } });
@@ -28,6 +28,7 @@ Object.defineProperty(exports, "gasPriceFetchError", { enumerable: true, get: fu
28
28
  Object.defineProperty(exports, "indexRequiredError", { enumerable: true, get: function () { return instances_1.indexRequiredError; } });
29
29
  Object.defineProperty(exports, "insufficientBalanceError", { enumerable: true, get: function () { return instances_1.insufficientBalanceError; } });
30
30
  Object.defineProperty(exports, "insufficientFeeParamsError", { enumerable: true, get: function () { return instances_1.insufficientFeeParamsError; } });
31
+ Object.defineProperty(exports, "invalidAmountError", { enumerable: true, get: function () { return instances_1.invalidAmountError; } });
31
32
  Object.defineProperty(exports, "invalidMethodNameError", { enumerable: true, get: function () { return instances_1.invalidMethodNameError; } });
32
33
  Object.defineProperty(exports, "invalidTonExternalMessageBocError", { enumerable: true, get: function () { return instances_1.invalidTonExternalMessageBocError; } });
33
34
  Object.defineProperty(exports, "missingDecimals", { enumerable: true, get: function () { return instances_1.missingDecimals; } });
@@ -44,3 +44,4 @@ export declare const estimatedGasExceedsBlockGasLimitError: (txName: string, est
44
44
  export declare const invalidTonExternalMessageBocError: (reason?: string) => FormatError;
45
45
  export declare const externalInMessageRequiredError: (actualType: string) => FormatError;
46
46
  export declare const tonIndexerRequiredForTonTransactionBocError: SettingError;
47
+ export declare const invalidAmountError: (reason: string) => FormatError;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tonIndexerRequiredForTonTransactionBocError = exports.externalInMessageRequiredError = exports.invalidTonExternalMessageBocError = exports.estimatedGasExceedsBlockGasLimitError = exports.blockGasLimitFetchError = exports.executedInTONStageFailedError = exports.operationIdRequiredForFinalizationError = exports.insufficientFeeParamsError = exports.txFinalizationError = exports.gasPriceFetchError = exports.unknownAssetOriginError = exports.convertCurrencyNegativeOrZeroValueError = exports.sendCrossChainTransactionFailedError = exports.zeroRawAmountError = exports.missingJettonDataError = exports.missingDecimals = exports.missingGasLimitError = exports.missingTvmExecutorFeeError = exports.missingFeeParamsError = exports.getTONFeeInfoFetchError = exports.simulationFetchError = exports.convertCurrencyFetchError = exports.indexRequiredError = exports.unknownTokenTypeError = exports.insufficientBalanceError = exports.allContractOpenerFailedError = exports.allEndpointsFailedError = exports.noValidGroupFoundError = exports.prepareMessageGroupError = exports.invalidAssetType = exports.emptyArrayError = exports.profilingFetchError = exports.invalidMethodNameError = exports.emptySettingError = exports.prefixError = exports.notMultiplyOf8Error = exports.unsupportedFormatError = exports.unsupportedKeyError = exports.unknownWalletError = exports.evmAddressError = exports.tvmAddressError = exports.statusFetchError = exports.operationFetchError = exports.emptyContractError = void 0;
3
+ exports.invalidAmountError = exports.tonIndexerRequiredForTonTransactionBocError = exports.externalInMessageRequiredError = exports.invalidTonExternalMessageBocError = exports.estimatedGasExceedsBlockGasLimitError = exports.blockGasLimitFetchError = exports.executedInTONStageFailedError = exports.operationIdRequiredForFinalizationError = exports.insufficientFeeParamsError = exports.txFinalizationError = exports.gasPriceFetchError = exports.unknownAssetOriginError = exports.convertCurrencyNegativeOrZeroValueError = exports.sendCrossChainTransactionFailedError = exports.zeroRawAmountError = exports.missingJettonDataError = exports.missingDecimals = exports.missingGasLimitError = exports.missingTvmExecutorFeeError = exports.missingFeeParamsError = exports.getTONFeeInfoFetchError = exports.simulationFetchError = exports.convertCurrencyFetchError = exports.indexRequiredError = exports.unknownTokenTypeError = exports.insufficientBalanceError = exports.allContractOpenerFailedError = exports.allEndpointsFailedError = exports.noValidGroupFoundError = exports.prepareMessageGroupError = exports.invalidAssetType = exports.emptyArrayError = exports.profilingFetchError = exports.invalidMethodNameError = exports.emptySettingError = exports.prefixError = exports.notMultiplyOf8Error = exports.unsupportedFormatError = exports.unsupportedKeyError = exports.unknownWalletError = exports.evmAddressError = exports.tvmAddressError = exports.statusFetchError = exports.operationFetchError = exports.emptyContractError = void 0;
4
4
  const errors_1 = require("./errors");
5
5
  exports.emptyContractError = new errors_1.ContractError('unexpected empty contract code of given jetton.', 100);
6
6
  const operationFetchError = (msg, inner) => new errors_1.FetchError(`failed to fetch OperationId: ${msg}`, 101, inner);
@@ -132,3 +132,5 @@ exports.invalidTonExternalMessageBocError = invalidTonExternalMessageBocError;
132
132
  const externalInMessageRequiredError = (actualType) => new errors_1.FormatError(`Expected external-in TON message, got ${actualType}`, 142);
133
133
  exports.externalInMessageRequiredError = externalInMessageRequiredError;
134
134
  exports.tonIndexerRequiredForTonTransactionBocError = new errors_1.SettingError('TON indexer is required to resolve operation ID by TON transaction BOC', 143);
135
+ const invalidAmountError = (reason) => new errors_1.FormatError(`Invalid amount: ${reason}`, 144);
136
+ exports.invalidAmountError = invalidAmountError;
@@ -4,6 +4,7 @@ export * as AgnosticStructs from './agnosticSdk/AgnosticStructs';
4
4
  export * from './assets';
5
5
  export * from './errors';
6
6
  export * from './interfaces';
7
+ export { getArtifacts } from './sdk/Artifacts';
7
8
  export { AxiosHttpClient } from './sdk/AxiosHttpClient';
8
9
  export { Configuration } from './sdk/Configuration';
9
10
  export { LiteSequencerClient } from './sdk/LiteSequencerClient';
package/dist/src/index.js CHANGED
@@ -36,7 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  };
37
37
  })();
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.TonTxFinalizer = exports.TONTransactionManager = exports.TACTransactionManager = exports.TacSdk = exports.TacExplorerClient = exports.Simulator = exports.OperationTracker = exports.NoopLogger = exports.ConsoleLogger = exports.LiteSequencerClient = exports.Configuration = exports.AxiosHttpClient = exports.AgnosticStructs = exports.AgnosticProxySDK = void 0;
39
+ exports.TonTxFinalizer = exports.TONTransactionManager = exports.TACTransactionManager = exports.TacSdk = exports.TacExplorerClient = exports.Simulator = exports.OperationTracker = exports.NoopLogger = exports.ConsoleLogger = exports.LiteSequencerClient = exports.Configuration = exports.AxiosHttpClient = exports.getArtifacts = exports.AgnosticStructs = exports.AgnosticProxySDK = void 0;
40
40
  __exportStar(require("./adapters"), exports);
41
41
  var AgnosticSdk_1 = require("./agnosticSdk/AgnosticSdk");
42
42
  Object.defineProperty(exports, "AgnosticProxySDK", { enumerable: true, get: function () { return AgnosticSdk_1.AgnosticProxySDK; } });
@@ -44,6 +44,8 @@ exports.AgnosticStructs = __importStar(require("./agnosticSdk/AgnosticStructs"))
44
44
  __exportStar(require("./assets"), exports);
45
45
  __exportStar(require("./errors"), exports);
46
46
  __exportStar(require("./interfaces"), exports);
47
+ var Artifacts_1 = require("./sdk/Artifacts");
48
+ Object.defineProperty(exports, "getArtifacts", { enumerable: true, get: function () { return Artifacts_1.getArtifacts; } });
47
49
  var AxiosHttpClient_1 = require("./sdk/AxiosHttpClient");
48
50
  Object.defineProperty(exports, "AxiosHttpClient", { enumerable: true, get: function () { return AxiosHttpClient_1.AxiosHttpClient; } });
49
51
  var Configuration_1 = require("./sdk/Configuration");
@@ -1,11 +1,11 @@
1
- import { dev, mainnet, testnet } from '../../artifacts';
1
+ import type { NetworkArtifacts } from '../../artifacts';
2
2
  import { InternalTACParams, InternalTONParams } from '../structs/InternalStruct';
3
3
  import { Network } from '../structs/Struct';
4
4
  export interface IConfiguration {
5
5
  /** Current network the SDK is configured for (e.g., MAINNET/TESTNET). */
6
6
  readonly network: Network;
7
7
  /** Resolved artifacts bundle for the selected network (contract ABIs/addresses). */
8
- readonly artifacts: typeof testnet | typeof mainnet | typeof dev;
8
+ readonly artifacts: NetworkArtifacts;
9
9
  /** Low-level TON client parameters and dependencies. */
10
10
  readonly TONParams: InternalTONParams;
11
11
  /** Low-level TAC (EVM-side) client parameters and dependencies. */
@@ -0,0 +1,3 @@
1
+ import type { NetworkArtifacts } from '../../artifacts';
2
+ import { Network } from '../structs/Struct';
3
+ export declare function getArtifacts(network: Network): NetworkArtifacts;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getArtifacts = getArtifacts;
4
+ const artifacts_1 = require("../../artifacts");
5
+ const Struct_1 = require("../structs/Struct");
6
+ function getArtifacts(network) {
7
+ switch (network) {
8
+ case Struct_1.Network.MAINNET:
9
+ return artifacts_1.mainnet;
10
+ case Struct_1.Network.TESTNET:
11
+ return artifacts_1.testnet;
12
+ case Struct_1.Network.DEV:
13
+ return artifacts_1.dev;
14
+ default:
15
+ throw new Error(`Unsupported network: ${network}`);
16
+ }
17
+ }
@@ -1,16 +1,16 @@
1
- import { dev, mainnet, testnet } from '../../artifacts';
1
+ import type { NetworkArtifacts } from '../../artifacts';
2
2
  import { IConfiguration, ILogger } from '../interfaces';
3
3
  import { InternalTACParams, InternalTONParams } from '../structs/InternalStruct';
4
4
  import { Network, TACParams, TONParams } from '../structs/Struct';
5
5
  export declare class Configuration implements IConfiguration {
6
6
  readonly network: Network;
7
- readonly artifacts: typeof testnet | typeof mainnet | typeof dev;
7
+ readonly artifacts: NetworkArtifacts;
8
8
  readonly TONParams: InternalTONParams;
9
9
  readonly TACParams: InternalTACParams;
10
10
  readonly liteSequencerEndpoints: string[];
11
11
  readonly logger: ILogger;
12
- constructor(network: Network, artifacts: typeof testnet | typeof mainnet | typeof dev, TONParams: InternalTONParams, TACParams: InternalTACParams, liteSequencerEndpoints: string[], logger: ILogger);
13
- static create(network: Network, artifacts: typeof testnet | typeof mainnet | typeof dev, TONParams?: TONParams, TACParams?: TACParams, customLiteSequencerEndpoints?: string[], delay?: number, logger?: ILogger, passLoggerToOpeners?: boolean): Promise<Configuration>;
12
+ constructor(network: Network, artifacts: NetworkArtifacts, TONParams: InternalTONParams, TACParams: InternalTACParams, liteSequencerEndpoints: string[], logger: ILogger);
13
+ static create(network: Network, artifacts: NetworkArtifacts, TONParams?: TONParams, TACParams?: TACParams, customLiteSequencerEndpoints?: string[], delay?: number, logger?: ILogger, passLoggerToOpeners?: boolean): Promise<Configuration>;
14
14
  private static prepareTONParams;
15
15
  private static prepareTACParams;
16
16
  private static loadTACSettingsViaMulticall;
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Configuration = void 0;
4
4
  const ton_1 = require("@ton/ton");
5
5
  const ethers_1 = require("ethers");
6
- const artifacts_1 = require("../../artifacts");
7
6
  const adapters_1 = require("../adapters");
8
7
  const Struct_1 = require("../structs/Struct");
8
+ const Artifacts_1 = require("./Artifacts");
9
9
  const Consts_1 = require("./Consts");
10
10
  const Fees_1 = require("./Fees");
11
11
  const Logger_1 = require("./Logger");
@@ -98,7 +98,7 @@ class Configuration {
98
98
  };
99
99
  }
100
100
  static async prepareTACParams(network, TACParams) {
101
- const artifacts = network === Struct_1.Network.MAINNET ? artifacts_1.mainnet : network === Struct_1.Network.TESTNET ? artifacts_1.testnet : artifacts_1.dev;
101
+ const artifacts = (0, Artifacts_1.getArtifacts)(network);
102
102
  let provider;
103
103
  let settingsAddress;
104
104
  let saFactoryAddress;
@@ -163,7 +163,7 @@ class Configuration {
163
163
  // skip multicall in dev, because it's not guaranteed that multicall contract is deployed
164
164
  return null;
165
165
  }
166
- const artifacts = network === Struct_1.Network.MAINNET ? artifacts_1.mainnet : artifacts_1.testnet;
166
+ const artifacts = (0, Artifacts_1.getArtifacts)(network);
167
167
  const multicallAddress = artifacts.MULTICALL_3_ADDRESS;
168
168
  const multicallAbi = artifacts.tac.multicall.MULTICALL_ABI_ETHERS;
169
169
  try {
@@ -49,6 +49,5 @@ export declare const IGNORE_MSG_VALUE_1_NANO = 1n;
49
49
  export declare const CROSS_CHAIN_MESSAGE_VERSION_V1 = 1n;
50
50
  export declare const NFT_BRIDGE_AMOUNT = 1n;
51
51
  export declare const DEFAULT_EIP1559_PRIORITY_FEE = 0n;
52
- export declare const SHARDS_KEY_RANDOM_RANGE = 1000000000000000000;
53
52
  export declare const IGNORE_OPCODE: number[];
54
53
  export declare const HTTP_NOT_FOUND_STATUS_CODE = 404;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NFT_BRIDGE_AMOUNT = exports.CROSS_CHAIN_MESSAGE_VERSION_V1 = exports.IGNORE_MSG_VALUE_1_NANO = exports.DEFAULT_RETRY_ON_NOT_FOUND_DELAY_MS = exports.DEFAULT_RETRY_ON_NOT_FOUND_RETRIES = exports.DEFAULT_RETRY_ON_NOT_FOUND = exports.DEFAULT_FIND_TX_MAX_DEPTH = exports.DEFAULT_MAX_SCANNED_TRANSACTIONS = exports.DEFAULT_FIND_TX_LIMIT = exports.DEFAULT_WAIT_DELAY_MS = exports.DEFAULT_WAIT_MAX_ATTEMPTS = exports.DEFAULT_WAIT_TIMEOUT_MS = exports.DEFAULT_RETRY_BACKOFF_MULTIPLIER = exports.DEFAULT_RETRY_MAX_DELAY_MS = exports.DEFAULT_RETRY_DELAY_MS = exports.DEFAULT_RETRY_MAX_COUNT = exports.DEFAULT_HTTP_CLIENT_TIMEOUT_MS = exports.TON_BURN_ADDRESS = exports.MINUTE = exports.FIVE_MINUTES = exports.TAC_DECIMALS = exports.TON_DECIMALS = exports.ONE_YEAR_SECONDS = exports.FIFTEEN_MINUTES = exports.TAC_SYMBOL = exports.TON_SYMBOL = exports.MAX_MSG_DEPTH = exports.MAX_HIGHLOAD_GROUP_MSG_NUM = exports.MAX_EXT_MSG_SIZE = exports.SOLIDITY_METHOD_NAME_REGEX = exports.SOLIDITY_SIGNATURE_REGEX = exports.DEFAULT_DELAY = exports.MAX_ITERATION_COUNT = exports.FIXED_POINT_SHIFT = exports.DYNAMIC_JETTON_WALLET_CODE_HASHES = exports.USDT_JETTON_WALLET_CODE_HASH = exports.LEGACY_NFT_TRANSFER_WITH_FORWARD_OUTBOUND_MESSAGE_COUNT = exports.LEGACY_NFT_TRANSFER_BASE_OUTBOUND_MESSAGE_COUNT = exports.LEGACY_NFT_ITEM_MIN_TONS_FOR_STORAGE = exports.LEGACY_JETTON_WALLET_TRANSFER_GAS_AND_STORAGE = exports.LEGACY_JETTON_TRANSFER_WITH_FORWARD_OUTBOUND_MESSAGE_COUNT = exports.LEGACY_JETTON_TRANSFER_BASE_OUTBOUND_MESSAGE_COUNT = exports.LEGACY_JETTON_WALLET_GAS_CONSUMPTION_COUNT = exports.LEGACY_JETTON_WALLET_GAS_CONSUMPTION = exports.LEGACY_JETTON_WALLET_MIN_TONS_FOR_STORAGE = exports.LEGACY_STRICTLY_GREATER_THAN_FEE_EPSILON = exports.LEGACY_FORWARD_FEE_ESTIMATE_DENOMINATOR = exports.LEGACY_FORWARD_FEE_ESTIMATE_NUMERATOR = exports.NFT_TRANSFER_FORWARD_TON_AMOUNT = exports.JETTON_TRANSFER_FORWARD_TON_AMOUNT = void 0;
4
- exports.HTTP_NOT_FOUND_STATUS_CODE = exports.IGNORE_OPCODE = exports.SHARDS_KEY_RANDOM_RANGE = exports.DEFAULT_EIP1559_PRIORITY_FEE = void 0;
4
+ exports.HTTP_NOT_FOUND_STATUS_CODE = exports.IGNORE_OPCODE = exports.DEFAULT_EIP1559_PRIORITY_FEE = void 0;
5
5
  const ton_1 = require("@ton/ton");
6
6
  exports.JETTON_TRANSFER_FORWARD_TON_AMOUNT = (0, ton_1.toNano)(0.2);
7
7
  exports.NFT_TRANSFER_FORWARD_TON_AMOUNT = (0, ton_1.toNano)(0.3);
@@ -55,7 +55,6 @@ exports.IGNORE_MSG_VALUE_1_NANO = 1n;
55
55
  exports.CROSS_CHAIN_MESSAGE_VERSION_V1 = 1n;
56
56
  exports.NFT_BRIDGE_AMOUNT = 1n;
57
57
  exports.DEFAULT_EIP1559_PRIORITY_FEE = 0n;
58
- exports.SHARDS_KEY_RANDOM_RANGE = 1e18;
59
58
  exports.IGNORE_OPCODE = [
60
59
  0xd53276db, // Excess
61
60
  ];
@@ -4,9 +4,10 @@ exports.LiteSequencerClient = void 0;
4
4
  const errors_1 = require("../errors");
5
5
  const instances_1 = require("../errors/instances");
6
6
  const AxiosHttpClient_1 = require("./AxiosHttpClient");
7
+ const Consts_1 = require("./Consts");
7
8
  const Utils_1 = require("./Utils");
8
9
  class LiteSequencerClient {
9
- constructor(endpoint, maxChunkSize = 100, httpClient = new AxiosHttpClient_1.AxiosHttpClient()) {
10
+ constructor(endpoint, maxChunkSize = 100, httpClient = new AxiosHttpClient_1.AxiosHttpClient({ timeout: Consts_1.DEFAULT_HTTP_CLIENT_TIMEOUT_MS })) {
10
11
  this.endpoint = endpoint;
11
12
  this.maxChunkSize = maxChunkSize;
12
13
  this.httpClient = httpClient;
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.startTracking = startTracking;
4
4
  exports.startTrackingMultiple = startTrackingMultiple;
5
5
  exports.printExecutionStagesTable = printExecutionStagesTable;
6
- const artifacts_1 = require("../../artifacts");
7
6
  const Struct_1 = require("../structs/Struct");
7
+ const Artifacts_1 = require("./Artifacts");
8
8
  const Configuration_1 = require("./Configuration");
9
9
  const Consts_1 = require("./Consts");
10
10
  const Logger_1 = require("./Logger");
@@ -16,7 +16,7 @@ const Utils_1 = require("./Utils");
16
16
  */
17
17
  async function startTracking(transactionLinker, network, options) {
18
18
  const { customLiteSequencerEndpoints, delay = 10, maxIterationCount = Consts_1.MAX_ITERATION_COUNT, returnValue = false, tableView = true, logger = new Logger_1.NoopLogger(), txFinalizer, contractOpener, cclAddress, } = options || {};
19
- const artifacts = network === Struct_1.Network.MAINNET ? artifacts_1.mainnet : network === Struct_1.Network.TESTNET ? artifacts_1.testnet : artifacts_1.dev;
19
+ const artifacts = (0, Artifacts_1.getArtifacts)(network);
20
20
  const liteSequencerEndpoints = customLiteSequencerEndpoints && customLiteSequencerEndpoints.length !== 0
21
21
  ? customLiteSequencerEndpoints
22
22
  : artifacts.PUBLIC_LITE_SEQUENCER_ENDPOINTS;
@@ -37,7 +37,7 @@ class TACTransactionManager {
37
37
  tvmExecutorFee = BigInt(suggestedFee.inTAC);
38
38
  }
39
39
  const protocolFee = await this.config.TACParams.crossChainLayer.getProtocolFee();
40
- const shardsKey = BigInt(Math.round(Math.random() * Consts_1.SHARDS_KEY_RANDOM_RANGE));
40
+ const shardsKey = BigInt((0, Utils_1.generateRandomNumberByTimestamp)().randomNumber);
41
41
  this.logger.debug(`Shards key: ${shardsKey}, Protocol fee: ${protocolFee}`);
42
42
  const [toBridge, toBridgeNFT] = await Promise.all([
43
43
  Promise.all(assets
@@ -189,11 +189,11 @@ class TACTransactionManager {
189
189
  if (!shouldWaitForOperationId) {
190
190
  return { txHash: tx.hash };
191
191
  }
192
- const waitOptions = options?.waitOptions ?? {};
193
- waitOptions.successCheck = waitOptions.successCheck ?? ((id) => !!id);
194
- waitOptions.logger = waitOptions.logger ?? this.logger;
192
+ const waitOperationIdOptions = options?.waitOperationIdOptions ?? {};
193
+ waitOperationIdOptions.successCheck = waitOperationIdOptions.successCheck ?? ((id) => !!id);
194
+ waitOperationIdOptions.logger = waitOperationIdOptions.logger ?? this.logger;
195
195
  const operationId = await this.operationTracker
196
- .getOperationIdByTransactionHash(tx.hash, waitOptions)
196
+ .getOperationIdByTransactionHash(tx.hash, waitOperationIdOptions)
197
197
  .catch((error) => {
198
198
  this.logger.error(`Error while waiting for operation ID by transaction hash: ${error}`);
199
199
  return undefined;
@@ -188,10 +188,10 @@ class TONTransactionManager {
188
188
  await this.config.TONParams.contractOpener.trackTransactionTree(sender.getSenderAddress(), hash);
189
189
  this.logger.info(`Transaction tree successful`);
190
190
  }
191
- const waitOptions = tx.options?.waitOptions ?? {};
192
- waitOptions.successCheck = waitOptions.successCheck ?? ((id) => !!id);
193
- waitOptions.logger = waitOptions.logger ?? this.logger;
194
- const operationId = await this.resolveOperationId(sendTransactionResult.boc, transactionLinker, waitOptions);
191
+ const waitOperationIdOptions = tx.options?.waitOperationIdOptions ?? {};
192
+ waitOperationIdOptions.successCheck = waitOperationIdOptions.successCheck ?? ((id) => !!id);
193
+ waitOperationIdOptions.logger = waitOperationIdOptions.logger ?? this.logger;
194
+ const operationId = await this.resolveOperationId(sendTransactionResult.boc, transactionLinker, waitOperationIdOptions);
195
195
  const shouldWaitForFinalization = tx.options?.waitFinalization ?? true;
196
196
  if (!shouldWaitForFinalization) {
197
197
  return { sendTransactionResult, operationId, ...transactionLinker };
@@ -219,18 +219,20 @@ class TONTransactionManager {
219
219
  await this.operationTracker.getStageProfiling(operationId, finalizationWaitOptions);
220
220
  return { sendTransactionResult, operationId, ...transactionLinker };
221
221
  }
222
- async resolveOperationId(boc, transactionLinker, waitOptions) {
223
- const operationId = await this.operationTracker
224
- .getOperationIdByTonTransactionBoc(boc, waitOptions)
225
- .catch((error) => {
226
- this.logger.error(`Error while waiting for operation ID by TON transaction BOC: ${error}`);
227
- return undefined;
228
- });
229
- if (operationId) {
230
- return operationId;
222
+ async resolveOperationId(boc, transactionLinker, waitOperationIdOptions) {
223
+ if (this.config.TONParams.tonIndexer) {
224
+ const operationId = await this.operationTracker
225
+ .getOperationIdByTonTransactionBoc(boc, waitOperationIdOptions)
226
+ .catch((error) => {
227
+ this.logger.error(`Error while waiting for operation ID by TON transaction BOC: ${error}`);
228
+ return undefined;
229
+ });
230
+ if (operationId) {
231
+ return operationId;
232
+ }
233
+ this.logger.debug('Operation ID by TON transaction BOC not found; trying transaction linker');
231
234
  }
232
- this.logger.debug('Operation ID by TON transaction BOC not found; trying transaction linker');
233
- return this.operationTracker.getOperationId(transactionLinker, waitOptions).catch((error) => {
235
+ return this.operationTracker.getOperationId(transactionLinker, waitOperationIdOptions).catch((error) => {
234
236
  this.logger.error(`Error while waiting for operation ID by transaction linker: ${error}`);
235
237
  return undefined;
236
238
  });
@@ -249,7 +251,7 @@ class TONTransactionManager {
249
251
  }
250
252
  const shouldWaitForOperationIds = options?.waitOperationIds ?? true;
251
253
  return shouldWaitForOperationIds
252
- ? await this.waitForOperationIds(transactionLinkers, caller, options?.waitOptions ?? {})
254
+ ? await this.waitForOperationIds(transactionLinkers, caller, options?.waitOperationIdOptions ?? {})
253
255
  : transactionLinkers;
254
256
  }
255
257
  async prepareBatchTransactions(txs, sender) {
@@ -271,15 +273,15 @@ class TONTransactionManager {
271
273
  transactionLinkers: results.map((r) => r.transactionLinker),
272
274
  };
273
275
  }
274
- async waitForOperationIds(transactionLinkers, caller, waitOptions) {
276
+ async waitForOperationIds(transactionLinkers, caller, waitOperationIdOptions) {
275
277
  this.logger.debug(`Waiting for operation IDs`);
276
278
  try {
277
- waitOptions.successCheck =
278
- waitOptions.successCheck ??
279
+ waitOperationIdOptions.successCheck =
280
+ waitOperationIdOptions.successCheck ??
279
281
  ((operationIds) => Object.keys(operationIds).length == transactionLinkers.length &&
280
282
  Object.values(operationIds).every((ids) => ids.operationIds.length > 0));
281
- waitOptions.logger = waitOptions.logger ?? this.logger;
282
- const operationIds = await this.operationTracker.getOperationIdsByShardsKeys(transactionLinkers.map((linker) => linker.shardsKey), caller, waitOptions);
283
+ waitOperationIdOptions.logger = waitOperationIdOptions.logger ?? this.logger;
284
+ const operationIds = await this.operationTracker.getOperationIdsByShardsKeys(transactionLinkers.map((linker) => linker.shardsKey), caller, waitOperationIdOptions);
283
285
  this.logger.debug(`Operation IDs: ${(0, Utils_1.formatObjectForLogging)(operationIds)}`);
284
286
  return transactionLinkers.map((linker) => ({
285
287
  ...linker,
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TacExplorerClient = void 0;
4
- const instances_1 = require("../errors/instances");
4
+ const errors_1 = require("../errors");
5
5
  const AxiosHttpClient_1 = require("./AxiosHttpClient");
6
+ const Consts_1 = require("./Consts");
6
7
  const Utils_1 = require("./Utils");
7
8
  class TacExplorerClient {
8
- constructor(explorerApiEndpoint, httpClient = new AxiosHttpClient_1.AxiosHttpClient()) {
9
+ constructor(explorerApiEndpoint, httpClient = new AxiosHttpClient_1.AxiosHttpClient({ timeout: Consts_1.DEFAULT_HTTP_CLIENT_TIMEOUT_MS })) {
9
10
  this.explorerApiEndpoint = explorerApiEndpoint;
10
11
  this.httpClient = httpClient;
11
12
  }
@@ -15,7 +16,7 @@ class TacExplorerClient {
15
16
  return response.data;
16
17
  }
17
18
  catch (error) {
18
- throw (0, instances_1.gasPriceFetchError)(`endpoint ${this.explorerApiEndpoint} failed to complete request`, error);
19
+ throw (0, errors_1.gasPriceFetchError)(`endpoint ${this.explorerApiEndpoint} failed to complete request`, error);
19
20
  }
20
21
  }
21
22
  }
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TacSdk = void 0;
4
- const artifacts_1 = require("../../artifacts");
5
4
  const assets_1 = require("../assets");
6
5
  const Struct_1 = require("../structs/Struct");
6
+ const Artifacts_1 = require("./Artifacts");
7
7
  const Configuration_1 = require("./Configuration");
8
8
  const Consts_1 = require("./Consts");
9
9
  const Logger_1 = require("./Logger");
@@ -27,20 +27,7 @@ class TacSdk {
27
27
  const network = sdkParams.network;
28
28
  const delay = sdkParams.delay ?? Consts_1.DEFAULT_DELAY;
29
29
  const passLoggerToOpeners = sdkParams.passLoggerToOpeners ?? true;
30
- let artifacts;
31
- switch (network) {
32
- case Struct_1.Network.MAINNET:
33
- artifacts = artifacts_1.mainnet;
34
- break;
35
- case Struct_1.Network.TESTNET:
36
- artifacts = artifacts_1.testnet;
37
- break;
38
- case Struct_1.Network.DEV:
39
- artifacts = artifacts_1.dev;
40
- break;
41
- default:
42
- throw new Error(`Unsupported network: ${network}`);
43
- }
30
+ const artifacts = (0, Artifacts_1.getArtifacts)(network);
44
31
  const config = await Configuration_1.Configuration.create(network, artifacts, sdkParams.TONParams, sdkParams.TACParams, sdkParams.customLiteSequencerEndpoints, delay, logger, passLoggerToOpeners);
45
32
  const operationTracker = new OperationTracker_1.OperationTracker(config, logger);
46
33
  const explorerClient = new TacExplorerClient_1.TacExplorerClient(artifacts.TAC_EXPLORER_API_ENDPOINT);
@@ -7,7 +7,7 @@ const Consts_1 = require("./Consts");
7
7
  const Logger_1 = require("./Logger");
8
8
  const Utils_1 = require("./Utils");
9
9
  class TonTxFinalizer {
10
- constructor(apiConfig, logger = new Logger_1.NoopLogger(), httpClient = new AxiosHttpClient_1.AxiosHttpClient()) {
10
+ constructor(apiConfig, logger = new Logger_1.NoopLogger(), httpClient = new AxiosHttpClient_1.AxiosHttpClient({ timeout: Consts_1.DEFAULT_HTTP_CLIENT_TIMEOUT_MS })) {
11
11
  this.apiConfig = apiConfig;
12
12
  this.logger = logger;
13
13
  this.httpClient = httpClient;
@@ -108,11 +108,44 @@ const convertKeysToCamelCase = (data) => {
108
108
  return data;
109
109
  };
110
110
  exports.convertKeysToCamelCase = convertKeysToCamelCase;
111
+ function formatFiniteNumber(amount) {
112
+ const amountString = amount.toString();
113
+ if (!amountString.includes('e')) {
114
+ return amountString;
115
+ }
116
+ const [coefficient, exponentString] = amountString.split('e');
117
+ const exponent = Number(exponentString);
118
+ const [integerPart, fractionalPart = ''] = coefficient.split('.');
119
+ const digits = integerPart + fractionalPart;
120
+ const decimalIndex = integerPart.length + exponent;
121
+ let expanded;
122
+ if (decimalIndex <= 0) {
123
+ expanded = `0.${'0'.repeat(-decimalIndex)}${digits}`;
124
+ }
125
+ else if (decimalIndex >= digits.length) {
126
+ expanded = `${digits}${'0'.repeat(decimalIndex - digits.length)}`;
127
+ }
128
+ else {
129
+ expanded = `${digits.slice(0, decimalIndex)}.${digits.slice(decimalIndex)}`;
130
+ }
131
+ return expanded;
132
+ }
111
133
  const calculateRawAmount = (amount, decimals) => {
112
- const [integerPart, fractionalPart = ''] = amount.toString().split('.');
113
- // Ensure the fractional part has enough digits
114
- const paddedFraction = fractionalPart.padEnd(decimals, '0').slice(0, decimals);
115
- return BigInt(integerPart + paddedFraction);
134
+ if (!Number.isFinite(amount)) {
135
+ throw (0, errors_1.invalidAmountError)('Amount must be finite');
136
+ }
137
+ if (amount < 0) {
138
+ throw (0, errors_1.invalidAmountError)('Amount must be non-negative');
139
+ }
140
+ if (!Number.isInteger(decimals) || decimals < 0) {
141
+ throw (0, errors_1.invalidAmountError)('Token decimals must be a non-negative integer');
142
+ }
143
+ const amountString = formatFiniteNumber(amount);
144
+ const [integerPart, fractionalPart = ''] = amountString.split('.');
145
+ if (fractionalPart.length > decimals) {
146
+ throw (0, errors_1.invalidAmountError)('Amount has more fractional digits than token decimals');
147
+ }
148
+ return BigInt(integerPart + fractionalPart.padEnd(decimals, '0'));
116
149
  };
117
150
  exports.calculateRawAmount = calculateRawAmount;
118
151
  const calculateAmount = (rawAmount, decimals) => {