@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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Address, Contract, OpenedContract, Transaction } from '@ton/ton';
|
|
2
|
+
import { ILogger } from '../interfaces';
|
|
3
|
+
import { AddressInformation, ContractState, GetTransactionsOptions, Network } from '../structs/Struct';
|
|
4
|
+
import { BaseContractOpener } from './BaseContractOpener';
|
|
5
|
+
type LiteServer = {
|
|
6
|
+
ip: number;
|
|
7
|
+
port: number;
|
|
8
|
+
id: {
|
|
9
|
+
'@type': string;
|
|
10
|
+
key: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export declare class LiteClientOpener extends BaseContractOpener {
|
|
14
|
+
private readonly client;
|
|
15
|
+
private readonly engine;
|
|
16
|
+
private readonly singleEngines;
|
|
17
|
+
private isClosing;
|
|
18
|
+
private isClosed;
|
|
19
|
+
private constructor();
|
|
20
|
+
static create(options: {
|
|
21
|
+
liteservers: LiteServer[];
|
|
22
|
+
} | {
|
|
23
|
+
network: Network;
|
|
24
|
+
}, logger?: ILogger): Promise<LiteClientOpener>;
|
|
25
|
+
open<T extends Contract>(contract: T): OpenedContract<T>;
|
|
26
|
+
private disableReconnect;
|
|
27
|
+
closeConnections(): void;
|
|
28
|
+
getContractState(addr: Address): Promise<ContractState>;
|
|
29
|
+
getTransactions(address: Address, opts: GetTransactionsOptions): Promise<Transaction[]>;
|
|
30
|
+
getAddressInformation(addr: Address): Promise<AddressInformation>;
|
|
31
|
+
getConfig(): Promise<string>;
|
|
32
|
+
}
|
|
33
|
+
export declare function liteClientOpener(options: {
|
|
34
|
+
liteservers: LiteServer[];
|
|
35
|
+
} | {
|
|
36
|
+
network: Network;
|
|
37
|
+
}, logger?: ILogger): Promise<LiteClientOpener>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LiteClientOpener = void 0;
|
|
4
|
+
exports.liteClientOpener = liteClientOpener;
|
|
5
|
+
const ton_1 = require("@ton/ton");
|
|
6
|
+
const ton_lite_client_1 = require("@tonappchain/ton-lite-client");
|
|
7
|
+
const artifacts_1 = require("../../artifacts");
|
|
8
|
+
const Consts_1 = require("../sdk/Consts");
|
|
9
|
+
const Struct_1 = require("../structs/Struct");
|
|
10
|
+
const BaseContractOpener_1 = require("./BaseContractOpener");
|
|
11
|
+
function intToIP(int) {
|
|
12
|
+
const part1 = int & 255;
|
|
13
|
+
const part2 = (int >> 8) & 255;
|
|
14
|
+
const part3 = (int >> 16) & 255;
|
|
15
|
+
const part4 = (int >> 24) & 255;
|
|
16
|
+
return part4 + '.' + part3 + '.' + part2 + '.' + part1;
|
|
17
|
+
}
|
|
18
|
+
async function getDefaultLiteServers(network) {
|
|
19
|
+
const url = network === Struct_1.Network.TESTNET || network === Struct_1.Network.DEV
|
|
20
|
+
? artifacts_1.testnet.DEFAULT_LITESERVERS
|
|
21
|
+
: artifacts_1.mainnet.DEFAULT_LITESERVERS;
|
|
22
|
+
const resp = await fetch(url);
|
|
23
|
+
const liteClients = await resp.json();
|
|
24
|
+
return liteClients.liteservers;
|
|
25
|
+
}
|
|
26
|
+
class LiteClientOpener extends BaseContractOpener_1.BaseContractOpener {
|
|
27
|
+
constructor(client, engine, logger, singleEngines = []) {
|
|
28
|
+
super(logger);
|
|
29
|
+
this.client = client;
|
|
30
|
+
this.engine = engine;
|
|
31
|
+
this.isClosing = false;
|
|
32
|
+
this.isClosed = false;
|
|
33
|
+
this.singleEngines = singleEngines;
|
|
34
|
+
}
|
|
35
|
+
static async create(options, logger) {
|
|
36
|
+
const liteservers = 'liteservers' in options ? options.liteservers : await getDefaultLiteServers(options.network);
|
|
37
|
+
const engines = [];
|
|
38
|
+
for (const server of liteservers) {
|
|
39
|
+
const engine = await ton_lite_client_1.LiteSingleEngine.create({
|
|
40
|
+
host: `tcp://${intToIP(server.ip)}:${server.port}`,
|
|
41
|
+
publicKey: Buffer.from(server.id.key, 'base64'),
|
|
42
|
+
});
|
|
43
|
+
engines.push(engine);
|
|
44
|
+
}
|
|
45
|
+
const engine = new ton_lite_client_1.LiteRoundRobinEngine(engines);
|
|
46
|
+
const client = new ton_lite_client_1.LiteClient({ engine });
|
|
47
|
+
return new LiteClientOpener(client, engine, logger, engines);
|
|
48
|
+
}
|
|
49
|
+
open(contract) {
|
|
50
|
+
return this.client.open(contract);
|
|
51
|
+
}
|
|
52
|
+
disableReconnect(singleEngine) {
|
|
53
|
+
const engine = singleEngine;
|
|
54
|
+
engine.connect = async () => undefined;
|
|
55
|
+
engine.onClosed = () => undefined;
|
|
56
|
+
}
|
|
57
|
+
closeConnections() {
|
|
58
|
+
if (this.isClosing || this.isClosed) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.isClosing = true;
|
|
62
|
+
try {
|
|
63
|
+
for (const singleEngine of this.singleEngines) {
|
|
64
|
+
this.disableReconnect(singleEngine);
|
|
65
|
+
singleEngine.close();
|
|
66
|
+
}
|
|
67
|
+
this.engine.close();
|
|
68
|
+
this.isClosed = true;
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
this.isClosing = false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async getContractState(addr) {
|
|
75
|
+
const block = await this.client.getMasterchainInfo();
|
|
76
|
+
const state = await this.client.getAccountState(addr, block.last);
|
|
77
|
+
const accountState = state.state?.storage?.state;
|
|
78
|
+
const code = accountState?.type === 'active' ? accountState?.state?.code?.toBoc() : null;
|
|
79
|
+
return {
|
|
80
|
+
balance: state.balance.coins,
|
|
81
|
+
state: state.state.storage.state.type === 'uninit' ? 'uninitialized' : state.state.storage.state.type,
|
|
82
|
+
code: code ?? null,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async getTransactions(address, opts) {
|
|
86
|
+
// LiteClient requires valid lt and hash to fetch transactions
|
|
87
|
+
// If not provided, fetch from the latest transaction
|
|
88
|
+
let lt;
|
|
89
|
+
let hash;
|
|
90
|
+
if (opts.lt && opts.hash) {
|
|
91
|
+
lt = opts.lt;
|
|
92
|
+
hash = Buffer.from(opts.hash, 'base64');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Get latest transaction info first
|
|
96
|
+
const block = await this.client.getMasterchainInfo();
|
|
97
|
+
const state = await this.client.getAccountState(address, block.last);
|
|
98
|
+
if (!state.lastTx) {
|
|
99
|
+
// No transactions for this account
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
lt = state.lastTx.lt.toString();
|
|
103
|
+
hash = Buffer.from(state.lastTx.hash.toString(16).padStart(64, '0'), 'hex');
|
|
104
|
+
}
|
|
105
|
+
const txsBuffered = await this.client
|
|
106
|
+
.getAccountTransactions(address, lt, hash, opts.limit ?? Consts_1.DEFAULT_FIND_TX_LIMIT)
|
|
107
|
+
.then((r) => r.transactions);
|
|
108
|
+
const cell = ton_1.Cell.fromBoc(txsBuffered);
|
|
109
|
+
let txs = cell.map((c) => (0, ton_1.loadTransaction)(c.beginParse()));
|
|
110
|
+
// Apply to_lt filter if specified
|
|
111
|
+
if (opts.to_lt) {
|
|
112
|
+
const toLt = BigInt(opts.to_lt);
|
|
113
|
+
txs = txs.filter((tx) => {
|
|
114
|
+
const comparison = tx.lt > toLt;
|
|
115
|
+
return opts.inclusive ? tx.lt >= toLt : comparison;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return txs;
|
|
119
|
+
}
|
|
120
|
+
async getAddressInformation(addr) {
|
|
121
|
+
const block = await this.client.getMasterchainInfo();
|
|
122
|
+
const state = await this.client.getAccountState(addr, block.last);
|
|
123
|
+
const lastHashHex = state.lastTx ? state.lastTx.hash.toString(16).padStart(64, '0') : '';
|
|
124
|
+
const lastHashB64 = lastHashHex ? Buffer.from(lastHashHex, 'hex').toString('base64') : '';
|
|
125
|
+
return {
|
|
126
|
+
lastTransaction: {
|
|
127
|
+
lt: state.lastTx?.lt.toString() ?? '',
|
|
128
|
+
hash: lastHashB64,
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async getConfig() {
|
|
133
|
+
const block = await this.client.getMasterchainInfo();
|
|
134
|
+
const { config } = await this.client.getConfig(block.last);
|
|
135
|
+
return (0, ton_1.beginCell)().storeDictDirect(config).endCell().toBoc().toString('base64');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.LiteClientOpener = LiteClientOpener;
|
|
139
|
+
async function liteClientOpener(options, logger) {
|
|
140
|
+
return LiteClientOpener.create(options, logger);
|
|
141
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { Network } from '../structs/Struct';
|
|
2
|
+
export declare function getHttpEndpointWithRetry(network: Network, maxRetries?: number, delay?: number): Promise<string>;
|
|
3
|
+
export declare function getHttpV4EndpointWithRetry(network: Network, maxRetries?: number, delay?: number): Promise<string>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getHttpEndpointWithRetry = getHttpEndpointWithRetry;
|
|
4
|
+
exports.getHttpV4EndpointWithRetry = getHttpV4EndpointWithRetry;
|
|
5
|
+
const ton_access_1 = require("@orbs-network/ton-access");
|
|
6
|
+
const Consts_1 = require("../sdk/Consts");
|
|
7
|
+
const Utils_1 = require("../sdk/Utils");
|
|
8
|
+
const Struct_1 = require("../structs/Struct");
|
|
9
|
+
async function getHttpEndpointWithRetry(network, maxRetries = Consts_1.DEFAULT_RETRY_MAX_COUNT, delay = Consts_1.DEFAULT_RETRY_DELAY_MS) {
|
|
10
|
+
let lastError;
|
|
11
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
12
|
+
try {
|
|
13
|
+
const tonNetwork = network === Struct_1.Network.MAINNET ? 'mainnet' : 'testnet';
|
|
14
|
+
return await (0, ton_access_1.getHttpEndpoint)({ network: tonNetwork });
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
lastError = error;
|
|
18
|
+
if (attempt < maxRetries - 1) {
|
|
19
|
+
await (0, Utils_1.sleep)(delay);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
throw lastError || new Error('Failed to get HTTP endpoint after retries');
|
|
24
|
+
}
|
|
25
|
+
async function getHttpV4EndpointWithRetry(network, maxRetries = Consts_1.DEFAULT_RETRY_MAX_COUNT, delay = Consts_1.DEFAULT_RETRY_DELAY_MS) {
|
|
26
|
+
let lastError;
|
|
27
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
28
|
+
try {
|
|
29
|
+
const tonNetwork = network === Struct_1.Network.MAINNET ? 'mainnet' : 'testnet';
|
|
30
|
+
return await (0, ton_access_1.getHttpV4Endpoint)({ network: tonNetwork });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
lastError = error;
|
|
34
|
+
if (attempt < maxRetries - 1) {
|
|
35
|
+
await (0, Utils_1.sleep)(delay);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
throw lastError || new Error('Failed to get HTTP V4 endpoint after retries');
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SandboxContract } from '@ton/sandbox';
|
|
2
|
+
import { Address, Contract, OpenedContract, Transaction } from '@ton/ton';
|
|
3
|
+
import { ContractOpener, ILogger } from '../interfaces';
|
|
4
|
+
import { AddressInformation, ContractState, GetTransactionsOptions, Network, TrackTransactionTreeParams, TrackTransactionTreeResult } from '../structs/Struct';
|
|
5
|
+
export interface OpenerConfig {
|
|
6
|
+
/** Underlying opener implementation to use for this slot. */
|
|
7
|
+
opener: ContractOpener;
|
|
8
|
+
/** Number of retry attempts before falling back to the next opener. */
|
|
9
|
+
retries: number;
|
|
10
|
+
/** Delay in milliseconds between retries for this opener. */
|
|
11
|
+
retryDelay: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class RetryableContractOpener implements ContractOpener {
|
|
14
|
+
private readonly openerConfigs;
|
|
15
|
+
private logger?;
|
|
16
|
+
constructor(openerConfigs: OpenerConfig[], logger?: ILogger);
|
|
17
|
+
setLogger(logger: ILogger): void;
|
|
18
|
+
private applyLoggerToOpeners;
|
|
19
|
+
getTransactions(address: Address, opts: GetTransactionsOptions): Promise<Transaction[]>;
|
|
20
|
+
getTransactionByHash(address: Address, hash: string, opts?: GetTransactionsOptions): Promise<Transaction | null>;
|
|
21
|
+
getAdjacentTransactions(address: Address, hash: string, opts?: GetTransactionsOptions): Promise<Transaction[]>;
|
|
22
|
+
open<T extends Contract>(src: T): OpenedContract<T> | SandboxContract<T>;
|
|
23
|
+
getContractState(address: Address): Promise<ContractState>;
|
|
24
|
+
getAddressInformation(address: Address): Promise<AddressInformation>;
|
|
25
|
+
getConfig(): Promise<string>;
|
|
26
|
+
getTransactionByTxHash(address: Address, txHash: string, opts?: GetTransactionsOptions): Promise<Transaction | null>;
|
|
27
|
+
getTransactionByInMsgHash(address: Address, msgHash: string, opts?: GetTransactionsOptions): Promise<Transaction | null>;
|
|
28
|
+
getTransactionByOutMsgHash(address: Address, msgHash: string, opts?: GetTransactionsOptions): Promise<Transaction | null>;
|
|
29
|
+
closeConnections(): void;
|
|
30
|
+
trackTransactionTree(address: string, hash: string, params?: TrackTransactionTreeParams): Promise<void>;
|
|
31
|
+
trackTransactionTreeWithResult(address: string, hash: string, params?: TrackTransactionTreeParams): Promise<TrackTransactionTreeResult>;
|
|
32
|
+
private executeWithFallback;
|
|
33
|
+
private trySingleAttempt;
|
|
34
|
+
private tryWithRetries;
|
|
35
|
+
private isContractExecutionError;
|
|
36
|
+
private isTransportError;
|
|
37
|
+
private createRetryableContract;
|
|
38
|
+
private callMethodAcrossOpeners;
|
|
39
|
+
}
|
|
40
|
+
export declare function createDefaultRetryableOpener(tonRpcEndpoint: string, networkType: Network, maxRetries?: number, retryDelay?: number, logger?: ILogger): Promise<RetryableContractOpener>;
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RetryableContractOpener = void 0;
|
|
4
|
+
exports.createDefaultRetryableOpener = createDefaultRetryableOpener;
|
|
5
|
+
const ton_1 = require("@ton/ton");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
const instances_1 = require("../errors/instances");
|
|
8
|
+
const Consts_1 = require("../sdk/Consts");
|
|
9
|
+
const Struct_1 = require("../structs/Struct");
|
|
10
|
+
const TonClient4Opener_1 = require("./TonClient4Opener");
|
|
11
|
+
const TonClientOpener_1 = require("./TonClientOpener");
|
|
12
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
13
|
+
class RetryableContractOpener {
|
|
14
|
+
constructor(openerConfigs, logger) {
|
|
15
|
+
if (openerConfigs.length === 0) {
|
|
16
|
+
throw new Error('No ContractOpener instances available');
|
|
17
|
+
}
|
|
18
|
+
this.openerConfigs = openerConfigs;
|
|
19
|
+
this.logger = logger;
|
|
20
|
+
if (logger) {
|
|
21
|
+
this.applyLoggerToOpeners(logger);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
setLogger(logger) {
|
|
25
|
+
if (!this.logger) {
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
}
|
|
28
|
+
this.applyLoggerToOpeners(logger);
|
|
29
|
+
}
|
|
30
|
+
applyLoggerToOpeners(logger) {
|
|
31
|
+
for (const config of this.openerConfigs) {
|
|
32
|
+
config.opener.setLogger(logger);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async getTransactions(address, opts) {
|
|
36
|
+
const result = await this.executeWithFallback((config) => config.opener.getTransactions(address, opts), {
|
|
37
|
+
operationName: 'getTransactions',
|
|
38
|
+
});
|
|
39
|
+
if (result.success && result.data !== undefined) {
|
|
40
|
+
return result.data;
|
|
41
|
+
}
|
|
42
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get transactions');
|
|
43
|
+
}
|
|
44
|
+
async getTransactionByHash(address, hash, opts) {
|
|
45
|
+
const result = await this.executeWithFallback((config) => config.opener.getTransactionByHash(address, hash, opts), { operationName: 'getTransactionByHash' });
|
|
46
|
+
if (result.success) {
|
|
47
|
+
return result.data ?? null;
|
|
48
|
+
}
|
|
49
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get transaction by hash');
|
|
50
|
+
}
|
|
51
|
+
async getAdjacentTransactions(address, hash, opts) {
|
|
52
|
+
const result = await this.executeWithFallback((config) => config.opener.getAdjacentTransactions(address, hash, opts), { operationName: 'getAdjacentTransactions' });
|
|
53
|
+
if (result.success && result.data !== undefined) {
|
|
54
|
+
return result.data;
|
|
55
|
+
}
|
|
56
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get adjacent transactions');
|
|
57
|
+
}
|
|
58
|
+
open(src) {
|
|
59
|
+
const firstConfig = this.openerConfigs[0];
|
|
60
|
+
const contract = firstConfig.opener.open(src);
|
|
61
|
+
return this.createRetryableContract(contract, src);
|
|
62
|
+
}
|
|
63
|
+
async getContractState(address) {
|
|
64
|
+
const result = await this.executeWithFallback((config) => config.opener.getContractState(address), {
|
|
65
|
+
operationName: 'getContractState',
|
|
66
|
+
});
|
|
67
|
+
if (result.success && result.data !== undefined) {
|
|
68
|
+
return result.data;
|
|
69
|
+
}
|
|
70
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get contract state');
|
|
71
|
+
}
|
|
72
|
+
async getAddressInformation(address) {
|
|
73
|
+
const result = await this.executeWithFallback((config) => config.opener.getAddressInformation(address), {
|
|
74
|
+
operationName: 'getAddressInformation',
|
|
75
|
+
});
|
|
76
|
+
if (result.success && result.data !== undefined) {
|
|
77
|
+
return result.data;
|
|
78
|
+
}
|
|
79
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get address information');
|
|
80
|
+
}
|
|
81
|
+
async getConfig() {
|
|
82
|
+
const result = await this.executeWithFallback((config) => config.opener.getConfig(), {
|
|
83
|
+
operationName: 'getConfig',
|
|
84
|
+
});
|
|
85
|
+
if (result.success && result.data !== undefined) {
|
|
86
|
+
return result.data;
|
|
87
|
+
}
|
|
88
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get blockchain config');
|
|
89
|
+
}
|
|
90
|
+
async getTransactionByTxHash(address, txHash, opts) {
|
|
91
|
+
const result = await this.executeWithFallback((config) => config.opener.getTransactionByTxHash(address, txHash, opts), { operationName: 'getTransactionByTxHash' });
|
|
92
|
+
if (result.success) {
|
|
93
|
+
return result.data ?? null;
|
|
94
|
+
}
|
|
95
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get transaction by transaction hash');
|
|
96
|
+
}
|
|
97
|
+
async getTransactionByInMsgHash(address, msgHash, opts) {
|
|
98
|
+
const result = await this.executeWithFallback((config) => config.opener.getTransactionByInMsgHash(address, msgHash, opts), { operationName: 'getTransactionByInMsgHash' });
|
|
99
|
+
if (result.success) {
|
|
100
|
+
return result.data ?? null;
|
|
101
|
+
}
|
|
102
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get transaction by message hash');
|
|
103
|
+
}
|
|
104
|
+
async getTransactionByOutMsgHash(address, msgHash, opts) {
|
|
105
|
+
const result = await this.executeWithFallback((config) => config.opener.getTransactionByOutMsgHash(address, msgHash, opts), { operationName: 'getTransactionByOutMsgHash' });
|
|
106
|
+
if (result.success) {
|
|
107
|
+
return result.data ?? null;
|
|
108
|
+
}
|
|
109
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to get transaction by outgoing message hash');
|
|
110
|
+
}
|
|
111
|
+
closeConnections() {
|
|
112
|
+
for (const config of this.openerConfigs) {
|
|
113
|
+
config.opener.closeConnections?.();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async trackTransactionTree(address, hash, params) {
|
|
117
|
+
const result = await this.executeWithFallback(async (config) => config.opener.trackTransactionTree(address, hash, params), {
|
|
118
|
+
shouldFallbackOnError: (error) => this.isTransportError(error),
|
|
119
|
+
operationName: 'trackTransactionTree',
|
|
120
|
+
});
|
|
121
|
+
if (!result.success) {
|
|
122
|
+
if (result.lastError instanceof errors_1.TransactionError) {
|
|
123
|
+
throw result.lastError;
|
|
124
|
+
}
|
|
125
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to track transaction tree');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async trackTransactionTreeWithResult(address, hash, params) {
|
|
129
|
+
const result = await this.executeWithFallback(async (config) => config.opener.trackTransactionTreeWithResult(address, hash, params), {
|
|
130
|
+
shouldFallbackOnError: (error) => this.isTransportError(error),
|
|
131
|
+
operationName: 'trackTransactionTreeWithResult',
|
|
132
|
+
});
|
|
133
|
+
if (!result.success) {
|
|
134
|
+
if (result.lastError instanceof errors_1.TransactionError) {
|
|
135
|
+
throw result.lastError;
|
|
136
|
+
}
|
|
137
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('Failed to track transaction tree with result');
|
|
138
|
+
}
|
|
139
|
+
return result.data;
|
|
140
|
+
}
|
|
141
|
+
async executeWithFallback(operation, options = {}) {
|
|
142
|
+
const { useRetries = true, shouldFallbackOnError, operationName = 'operation' } = options;
|
|
143
|
+
let lastError;
|
|
144
|
+
for (let index = 0; index < this.openerConfigs.length; index++) {
|
|
145
|
+
const config = this.openerConfigs[index];
|
|
146
|
+
const openerLabel = `opener ${index + 1}/${this.openerConfigs.length}`;
|
|
147
|
+
this.logger?.debug(`[RetryableContractOpener] ${operationName}: trying ${openerLabel}`);
|
|
148
|
+
const result = useRetries
|
|
149
|
+
? await this.tryWithRetries(() => operation(config), config, `${operationName} ${openerLabel}`)
|
|
150
|
+
: await this.trySingleAttempt(() => operation(config));
|
|
151
|
+
if (result.success) {
|
|
152
|
+
return { success: true, data: result.data };
|
|
153
|
+
}
|
|
154
|
+
lastError = result.lastError;
|
|
155
|
+
const isTransactionError = lastError instanceof errors_1.TransactionError;
|
|
156
|
+
const isContractExecutionError = !!lastError && this.isContractExecutionError(lastError);
|
|
157
|
+
const shouldStopOnNonTransportError = !!lastError && !!shouldFallbackOnError && !shouldFallbackOnError(lastError);
|
|
158
|
+
if (lastError) {
|
|
159
|
+
const stopReason = isTransactionError
|
|
160
|
+
? 'TransactionError'
|
|
161
|
+
: isContractExecutionError
|
|
162
|
+
? 'contract execution error'
|
|
163
|
+
: shouldStopOnNonTransportError
|
|
164
|
+
? 'non-transport error'
|
|
165
|
+
: undefined;
|
|
166
|
+
this.logger?.debug(`[RetryableContractOpener] ${operationName}: ${openerLabel} failed${stopReason ? ` (stopping fallback because of ${stopReason})` : ''}: ${lastError.message}`);
|
|
167
|
+
}
|
|
168
|
+
if (isTransactionError) {
|
|
169
|
+
return { success: false, lastError };
|
|
170
|
+
}
|
|
171
|
+
if (isContractExecutionError) {
|
|
172
|
+
return { success: false, lastError };
|
|
173
|
+
}
|
|
174
|
+
if (shouldStopOnNonTransportError) {
|
|
175
|
+
return { success: false, lastError };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return { success: false, lastError };
|
|
179
|
+
}
|
|
180
|
+
async trySingleAttempt(operation) {
|
|
181
|
+
try {
|
|
182
|
+
const data = await operation();
|
|
183
|
+
return { success: true, data };
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
return { success: false, lastError: error };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async tryWithRetries(operation, config, operationContext = 'operation') {
|
|
190
|
+
let lastError;
|
|
191
|
+
for (let attempt = 0; attempt <= config.retries; attempt++) {
|
|
192
|
+
try {
|
|
193
|
+
const data = await operation();
|
|
194
|
+
return { success: true, data };
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
lastError = error;
|
|
198
|
+
if (lastError instanceof errors_1.TransactionError || this.isContractExecutionError(lastError)) {
|
|
199
|
+
return { success: false, lastError };
|
|
200
|
+
}
|
|
201
|
+
if (attempt < config.retries) {
|
|
202
|
+
this.logger?.debug(`[RetryableContractOpener] ${operationContext}: attempt ${attempt + 1}/${config.retries + 1} failed (${lastError.message}), retrying in ${config.retryDelay}ms`);
|
|
203
|
+
await sleep(config.retryDelay);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return { success: false, lastError };
|
|
208
|
+
}
|
|
209
|
+
isContractExecutionError(error) {
|
|
210
|
+
const errorWithExit = error;
|
|
211
|
+
if (typeof errorWithExit.exitCode === 'number' ||
|
|
212
|
+
typeof errorWithExit.vmExitCode === 'number' ||
|
|
213
|
+
typeof errorWithExit.exit_code === 'number') {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
const message = String(error.message ?? error);
|
|
217
|
+
return (/unable to execute get method/i.test(message) ||
|
|
218
|
+
/exit[_\s-]*code\s*:\s*\d+/i.test(message) ||
|
|
219
|
+
/vm exit code\s*:\s*\d+/i.test(message));
|
|
220
|
+
}
|
|
221
|
+
isTransportError(error) {
|
|
222
|
+
if (error instanceof errors_1.TransactionError) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
const errorWithResponse = error;
|
|
226
|
+
const status = errorWithResponse.response?.status ?? errorWithResponse.response?.statusCode;
|
|
227
|
+
if (typeof status === 'number') {
|
|
228
|
+
return status === 429 || status >= 500;
|
|
229
|
+
}
|
|
230
|
+
const code = errorWithResponse.code ?? '';
|
|
231
|
+
if (['ETIMEDOUT', 'ECONNRESET', 'ENOTFOUND', 'EAI_AGAIN'].includes(code)) {
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
const message = String(error.message ?? error);
|
|
235
|
+
return /too many requests|timeout|timed out|network|connection/i.test(message);
|
|
236
|
+
}
|
|
237
|
+
createRetryableContract(contract, src) {
|
|
238
|
+
return new Proxy(contract, {
|
|
239
|
+
get: (target, prop) => {
|
|
240
|
+
const value = Reflect.get(target, prop);
|
|
241
|
+
if (typeof value !== 'function')
|
|
242
|
+
return value;
|
|
243
|
+
return async (...args) => {
|
|
244
|
+
return this.callMethodAcrossOpeners(prop, args, src);
|
|
245
|
+
};
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
async callMethodAcrossOpeners(methodName, args, src) {
|
|
250
|
+
const addressLabel = src.address ? src.address.toString() : 'unknown';
|
|
251
|
+
const result = await this.executeWithFallback((config) => {
|
|
252
|
+
const contract = config.opener.open(src);
|
|
253
|
+
const method = Reflect.get(contract, methodName);
|
|
254
|
+
if (typeof method !== 'function') {
|
|
255
|
+
throw new Error(`Method ${String(methodName)} is not a function`);
|
|
256
|
+
}
|
|
257
|
+
return method.call(contract, ...args);
|
|
258
|
+
}, { operationName: `${String(methodName)} (address=${addressLabel})` });
|
|
259
|
+
if (result.success)
|
|
260
|
+
return result.data;
|
|
261
|
+
throw result.lastError || (0, instances_1.allContractOpenerFailedError)('failed to call method in contract');
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
exports.RetryableContractOpener = RetryableContractOpener;
|
|
265
|
+
async function createDefaultRetryableOpener(tonRpcEndpoint, networkType, maxRetries = Consts_1.DEFAULT_RETRY_MAX_COUNT, retryDelay = Consts_1.DEFAULT_RETRY_DELAY_MS, logger) {
|
|
266
|
+
const openers = [];
|
|
267
|
+
const tonClient = new ton_1.TonClient({
|
|
268
|
+
endpoint: new URL('api/v2/jsonRPC', tonRpcEndpoint).toString(),
|
|
269
|
+
timeout: Consts_1.DEFAULT_HTTP_CLIENT_TIMEOUT_MS,
|
|
270
|
+
});
|
|
271
|
+
const opener = (0, TonClientOpener_1.tonClientOpener)(tonClient, logger);
|
|
272
|
+
openers.push({ opener, retries: maxRetries, retryDelay });
|
|
273
|
+
if (networkType !== Struct_1.Network.DEV) {
|
|
274
|
+
try {
|
|
275
|
+
const opener = await (0, TonClientOpener_1.orbsOpener)(networkType, logger);
|
|
276
|
+
openers.push({ opener: opener, retries: maxRetries, retryDelay });
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// skip opener in case of failure
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
const opener4 = await (0, TonClient4Opener_1.orbsOpener4)(networkType, Consts_1.DEFAULT_HTTP_CLIENT_TIMEOUT_MS, logger);
|
|
283
|
+
openers.push({ opener: opener4, retries: maxRetries, retryDelay });
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// skip opener in case of failure
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return new RetryableContractOpener(openers, logger);
|
|
290
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Blockchain, SandboxContract } from '@ton/sandbox';
|
|
2
|
+
import { Address, Contract, Transaction } from '@ton/ton';
|
|
3
|
+
import { ContractOpener } from '../interfaces';
|
|
4
|
+
import { AddressInformation, ContractState } from '../structs/Struct';
|
|
5
|
+
import { BaseContractOpener } from './BaseContractOpener';
|
|
6
|
+
export declare class SandboxOpener extends BaseContractOpener {
|
|
7
|
+
private readonly blockchain;
|
|
8
|
+
constructor(blockchain: Blockchain);
|
|
9
|
+
open<T extends Contract>(contract: T): SandboxContract<T>;
|
|
10
|
+
getContractState(address: Address): Promise<ContractState>;
|
|
11
|
+
getTransactions(): Promise<Transaction[]>;
|
|
12
|
+
getAddressInformation(): Promise<AddressInformation>;
|
|
13
|
+
getConfig(): Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
export declare function sandboxOpener(blockchain: Blockchain): ContractOpener;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SandboxOpener = void 0;
|
|
4
|
+
exports.sandboxOpener = sandboxOpener;
|
|
5
|
+
const BaseContractOpener_1 = require("./BaseContractOpener");
|
|
6
|
+
class SandboxOpener extends BaseContractOpener_1.BaseContractOpener {
|
|
7
|
+
constructor(blockchain) {
|
|
8
|
+
super();
|
|
9
|
+
this.blockchain = blockchain;
|
|
10
|
+
}
|
|
11
|
+
open(contract) {
|
|
12
|
+
return this.blockchain.openContract(contract);
|
|
13
|
+
}
|
|
14
|
+
async getContractState(address) {
|
|
15
|
+
const state = await this.blockchain.provider(address).getState();
|
|
16
|
+
return {
|
|
17
|
+
balance: state.balance,
|
|
18
|
+
code: 'code' in state.state ? (state.state.code ?? null) : null,
|
|
19
|
+
state: state.state.type === 'uninit' ? 'uninitialized' : state.state.type,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async getTransactions() {
|
|
23
|
+
throw new Error('getTransactions not implemented for sandboxOpener');
|
|
24
|
+
}
|
|
25
|
+
async getAddressInformation() {
|
|
26
|
+
throw new Error('getAddressInformation not implemented for sandboxOpener');
|
|
27
|
+
}
|
|
28
|
+
async getConfig() {
|
|
29
|
+
return this.blockchain.config.toBoc().toString('base64');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.SandboxOpener = SandboxOpener;
|
|
33
|
+
function sandboxOpener(blockchain) {
|
|
34
|
+
return new SandboxOpener(blockchain);
|
|
35
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Address, Contract, OpenedContract, TonClient4, Transaction } from '@ton/ton';
|
|
2
|
+
import { ILogger } from '../interfaces';
|
|
3
|
+
import { AddressInformation, ContractState, GetTransactionsOptions, Network } from '../structs/Struct';
|
|
4
|
+
import { BaseContractOpener } from './BaseContractOpener';
|
|
5
|
+
export declare class TonClient4Opener extends BaseContractOpener {
|
|
6
|
+
private readonly client4;
|
|
7
|
+
constructor(client4: TonClient4, logger?: ILogger);
|
|
8
|
+
static create(endpoint: string, timeout?: number, logger?: ILogger): TonClient4Opener;
|
|
9
|
+
open<T extends Contract>(contract: T): OpenedContract<T>;
|
|
10
|
+
getContractState(address: Address): Promise<ContractState>;
|
|
11
|
+
getTransactions(address: Address, opts: GetTransactionsOptions): Promise<Transaction[]>;
|
|
12
|
+
getAddressInformation(addr: Address): Promise<AddressInformation>;
|
|
13
|
+
getConfig(): Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates a TonClient4Opener instance using TonHub public API
|
|
17
|
+
* @param network Network to connect to (mainnet or testnet)
|
|
18
|
+
* @param timeout Request timeout in milliseconds
|
|
19
|
+
* @param logger
|
|
20
|
+
*/
|
|
21
|
+
export declare function tonHubApi4Opener(network: Network, timeout?: number, logger?: ILogger): TonClient4Opener;
|
|
22
|
+
export declare function tonClient4Opener(client: TonClient4, logger?: ILogger): TonClient4Opener;
|
|
23
|
+
export declare function orbsOpener4(network: Network, timeout?: number, logger?: ILogger): Promise<TonClient4Opener>;
|
|
24
|
+
export declare function getOrbsOpener4WithRetry(network: Network, timeout?: number, logger?: ILogger, maxRetries?: number, delay?: number): Promise<TonClient4Opener>;
|