@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.
- package/LICENSE +20 -20
- package/README.md +198 -198
- package/dist/artifacts/dev/index.d.ts +2 -2
- package/dist/artifacts/dev/index.js +2 -1
- package/dist/artifacts/dev/tac/endpoints.d.ts +1 -0
- package/dist/artifacts/dev/tac/endpoints.js +2 -1
- package/dist/artifacts/dev/ton/internal/build/CrossChainLayer.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/build/Executor.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/build/JettonProxy.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/build/JettonWallet.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/build/NFTItem.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/build/NFTProxy.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/build/Settings.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/wrappers/CrossChainLayer.d.ts +53 -6
- package/dist/artifacts/dev/ton/internal/wrappers/CrossChainLayer.js +130 -17
- package/dist/artifacts/dev/ton/internal/wrappers/JettonMinter.d.ts +2 -0
- package/dist/artifacts/dev/ton/internal/wrappers/JettonMinter.js +3 -1
- package/dist/artifacts/dev/ton/internal/wrappers/JettonProxy.d.ts +9 -0
- package/dist/artifacts/dev/ton/internal/wrappers/JettonProxy.js +10 -1
- package/dist/artifacts/dev/ton/internal/wrappers/JettonWallet.d.ts +7 -0
- package/dist/artifacts/dev/ton/internal/wrappers/JettonWallet.js +9 -2
- package/dist/artifacts/dev/ton/internal/wrappers/NFTCollection.d.ts +9 -0
- package/dist/artifacts/dev/ton/internal/wrappers/NFTCollection.js +9 -0
- package/dist/artifacts/dev/ton/internal/wrappers/NFTItem.d.ts +7 -0
- package/dist/artifacts/dev/ton/internal/wrappers/NFTItem.js +7 -0
- package/dist/artifacts/dev/ton/internal/wrappers/NFTProxy.d.ts +7 -0
- package/dist/artifacts/dev/ton/internal/wrappers/NFTProxy.js +8 -1
- package/dist/artifacts/dev/ton/internal/wrappers/Settings.d.ts +1 -0
- package/dist/artifacts/dev/ton/internal/wrappers/Settings.js +1 -0
- package/dist/artifacts/dev/ton/internal/wrappers/utils/CrossChainLayerPayload.d.ts +10 -0
- package/dist/artifacts/dev/ton/internal/wrappers/utils/CrossChainLayerPayload.js +24 -0
- package/dist/artifacts/dev/ton/internal/wrappers/utils/MerkleRoots.d.ts +2 -1
- package/dist/artifacts/dev/ton/internal/wrappers/utils/MerkleRoots.js +9 -1
- package/dist/artifacts/mainnet/index.d.ts +2 -2
- package/dist/artifacts/mainnet/index.js +2 -1
- package/dist/artifacts/mainnet/tac/endpoints.d.ts +1 -0
- package/dist/artifacts/mainnet/tac/endpoints.js +2 -1
- package/dist/artifacts/mainnet/ton/endpoints.d.ts +1 -1
- package/dist/artifacts/mainnet/ton/endpoints.js +1 -1
- package/dist/artifacts/mainnet/ton/internal/build/CrossChainLayer.compiled.json +1 -1
- package/dist/artifacts/mainnet/ton/internal/build/Executor.compiled.json +1 -1
- package/dist/artifacts/mainnet/ton/internal/build/JettonMinter.compiled.json +1 -1
- package/dist/artifacts/mainnet/ton/internal/build/JettonProxy.compiled.json +1 -1
- package/dist/artifacts/mainnet/ton/internal/build/JettonWallet.compiled.json +1 -1
- package/dist/artifacts/mainnet/ton/internal/build/NFTItem.compiled.json +1 -1
- package/dist/artifacts/mainnet/ton/internal/build/NFTProxy.compiled.json +1 -1
- package/dist/artifacts/mainnet/ton/internal/wrappers/CrossChainLayer.d.ts +1 -13
- package/dist/artifacts/mainnet/ton/internal/wrappers/CrossChainLayer.js +7 -45
- package/dist/artifacts/mainnet/ton/internal/wrappers/JettonMinter.d.ts +2 -2
- package/dist/artifacts/mainnet/ton/internal/wrappers/JettonMinter.js +2 -2
- package/dist/artifacts/testnet/index.d.ts +2 -2
- package/dist/artifacts/testnet/index.js +2 -1
- package/dist/artifacts/testnet/tac/endpoints.d.ts +1 -0
- package/dist/artifacts/testnet/tac/endpoints.js +2 -1
- package/dist/artifacts/testnet/ton/endpoints.d.ts +1 -1
- package/dist/artifacts/testnet/ton/endpoints.js +1 -1
- package/dist/artifacts/testnet/ton/internal/build/CrossChainLayer.compiled.json +1 -1
- package/dist/artifacts/testnet/ton/internal/build/Executor.compiled.json +1 -1
- package/dist/artifacts/testnet/ton/internal/build/JettonProxy.compiled.json +1 -1
- package/dist/artifacts/testnet/ton/internal/build/JettonWallet.compiled.json +1 -1
- package/dist/artifacts/testnet/ton/internal/build/NFTItem.compiled.json +1 -1
- package/dist/artifacts/testnet/ton/internal/build/NFTProxy.compiled.json +1 -1
- package/dist/artifacts/testnet/ton/internal/build/Settings.compiled.json +1 -1
- package/dist/artifacts/testnet/ton/internal/wrappers/CrossChainLayer.d.ts +53 -6
- package/dist/artifacts/testnet/ton/internal/wrappers/CrossChainLayer.js +130 -17
- package/dist/artifacts/testnet/ton/internal/wrappers/JettonMinter.d.ts +2 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/JettonMinter.js +3 -1
- package/dist/artifacts/testnet/ton/internal/wrappers/JettonProxy.d.ts +9 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/JettonProxy.js +10 -1
- package/dist/artifacts/testnet/ton/internal/wrappers/JettonWallet.d.ts +7 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/JettonWallet.js +9 -2
- package/dist/artifacts/testnet/ton/internal/wrappers/NFTCollection.d.ts +9 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/NFTCollection.js +9 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/NFTItem.d.ts +7 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/NFTItem.js +7 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/NFTProxy.d.ts +7 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/NFTProxy.js +8 -1
- package/dist/artifacts/testnet/ton/internal/wrappers/Settings.d.ts +1 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/Settings.js +1 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/utils/CrossChainLayerPayload.d.ts +10 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/utils/CrossChainLayerPayload.js +24 -0
- package/dist/artifacts/testnet/ton/internal/wrappers/utils/MerkleRoots.d.ts +2 -1
- package/dist/artifacts/testnet/ton/internal/wrappers/utils/MerkleRoots.js +9 -1
- package/dist/src/adapters/BaseContractOpener.d.ts +76 -0
- package/dist/src/adapters/BaseContractOpener.js +440 -0
- package/dist/src/adapters/LiteClientOpener.d.ts +38 -0
- package/dist/src/adapters/LiteClientOpener.js +141 -0
- package/dist/src/adapters/OpenerUtils.d.ts +3 -0
- package/dist/src/adapters/OpenerUtils.js +40 -0
- package/dist/src/adapters/RetryableContractOpener.d.ts +40 -0
- package/dist/src/adapters/RetryableContractOpener.js +290 -0
- package/dist/src/adapters/SandboxOpener.d.ts +15 -0
- package/dist/src/adapters/SandboxOpener.js +35 -0
- package/dist/src/adapters/TonClient4Opener.d.ts +24 -0
- package/dist/src/adapters/TonClient4Opener.js +95 -0
- package/dist/src/adapters/TonClientOpener.d.ts +19 -0
- package/dist/src/adapters/TonClientOpener.js +82 -0
- package/dist/src/adapters/index.d.ts +7 -2
- package/dist/src/adapters/index.js +7 -2
- package/dist/src/assets/AssetCache.d.ts +8 -8
- package/dist/src/assets/AssetCache.js +3 -0
- package/dist/src/assets/AssetFactory.js +8 -2
- package/dist/src/assets/FT.d.ts +2 -3
- package/dist/src/assets/FT.js +4 -7
- package/dist/src/assets/NFT.d.ts +1 -1
- package/dist/src/assets/NFT.js +1 -1
- package/dist/src/assets/TON.d.ts +3 -2
- package/dist/src/assets/TON.js +2 -1
- package/dist/src/errors/errors.d.ts +12 -1
- package/dist/src/errors/errors.js +66 -2
- package/dist/src/errors/index.d.ts +2 -2
- package/dist/src/errors/index.js +4 -1
- package/dist/src/errors/instances.d.ts +7 -2
- package/dist/src/errors/instances.js +67 -2
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.js +6 -4
- package/dist/src/interfaces/Asset.d.ts +4 -9
- package/dist/src/interfaces/ContractOpener.d.ts +76 -2
- package/dist/src/interfaces/IOperationTracker.d.ts +22 -22
- package/dist/src/interfaces/ISimulator.d.ts +9 -1
- package/dist/src/interfaces/ITONTransactionManager.d.ts +20 -1
- package/dist/src/interfaces/ITacExplorerClient.d.ts +8 -0
- package/dist/src/interfaces/ITacExplorerClient.js +2 -0
- package/dist/src/interfaces/ITacSDK.d.ts +25 -1
- package/dist/src/interfaces/ITxFinalizer.d.ts +4 -0
- package/dist/src/interfaces/ITxFinalizer.js +2 -0
- package/dist/src/interfaces/WalletInstanse.d.ts +4 -8
- package/dist/src/interfaces/index.d.ts +1 -0
- package/dist/src/interfaces/index.js +1 -0
- package/dist/src/sdk/Configuration.d.ts +5 -3
- package/dist/src/sdk/Configuration.js +54 -7
- package/dist/src/sdk/Consts.d.ts +18 -1
- package/dist/src/sdk/Consts.js +21 -2
- package/dist/src/sdk/Fees.d.ts +21 -0
- package/dist/src/sdk/Fees.js +201 -0
- package/dist/src/sdk/LiteSequencerClient.d.ts +1 -0
- package/dist/src/sdk/LiteSequencerClient.js +39 -17
- package/dist/src/sdk/OperationTracker.d.ts +11 -11
- package/dist/src/sdk/OperationTracker.js +46 -94
- package/dist/src/sdk/Simulator.d.ts +10 -2
- package/dist/src/sdk/Simulator.js +102 -0
- package/dist/src/sdk/StartTracking.d.ts +12 -7
- package/dist/src/sdk/StartTracking.js +75 -49
- package/dist/src/sdk/TONTransactionManager.d.ts +5 -4
- package/dist/src/sdk/TONTransactionManager.js +63 -8
- package/dist/src/sdk/TacExplorerClient.d.ts +8 -0
- package/dist/src/sdk/TacExplorerClient.js +22 -0
- package/dist/src/sdk/TacSdk.d.ts +8 -2
- package/dist/src/sdk/TacSdk.js +27 -4
- package/dist/src/sdk/TxFinalizer.d.ts +4 -3
- package/dist/src/sdk/TxFinalizer.js +41 -41
- package/dist/src/sdk/Utils.d.ts +20 -1
- package/dist/src/sdk/Utils.js +158 -10
- package/dist/src/sender/BatchSender.js +19 -0
- package/dist/src/sender/MockSender.d.ts +2 -0
- package/dist/src/sender/MockSender.js +13 -0
- package/dist/src/sender/RawSender.js +34 -1
- package/dist/src/sender/SenderFactory.js +1 -1
- package/dist/src/sender/TonConnectSender.js +2 -0
- package/dist/src/sender/index.d.ts +1 -0
- package/dist/src/sender/index.js +1 -0
- package/dist/src/structs/InternalStruct.d.ts +98 -4
- package/dist/src/structs/Struct.d.ts +183 -7
- package/dist/src/structs/Struct.js +4 -3
- package/dist/src/wrappers/HighloadWalletV3.d.ts +5 -3
- package/dist/src/wrappers/HighloadWalletV3.js +14 -3
- package/package.json +121 -117
- package/dist/src/adapters/contractOpener.d.ts +0 -20
- package/dist/src/adapters/contractOpener.js +0 -126
- package/dist/src/adapters/retryableContractOpener.d.ts +0 -24
- package/dist/src/adapters/retryableContractOpener.js +0 -111
package/dist/src/sdk/Utils.d.ts
CHANGED
|
@@ -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
|
+
};
|
package/dist/src/sdk/Utils.js
CHANGED
|
@@ -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 ??
|
|
147
|
-
const maxAttempts = options.maxAttempts ??
|
|
148
|
-
const delay = options.delay ??
|
|
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}
|
|
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
|
-
|
|
189
|
-
|
|
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,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
|
-
|
|
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 (
|
|
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
|
});
|
package/dist/src/sender/index.js
CHANGED
|
@@ -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
|
+
};
|