@ton/blueprint 0.44.0-dev.20260119142423.e17fd42 → 0.44.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.
- package/README.md +1 -0
- package/dist/cli/constants.js +3 -2
- package/dist/config/Config.d.ts +1 -1
- package/dist/config/CustomNetwork.d.ts +1 -0
- package/dist/network/Network.d.ts +2 -1
- package/dist/network/constants.d.ts +7 -0
- package/dist/network/constants.js +11 -0
- package/dist/network/createNetworkProvider.d.ts +2 -0
- package/dist/network/createNetworkProvider.js +54 -33
- package/dist/network/send/MnemonicProvider.d.ts +3 -0
- package/dist/network/send/MnemonicProvider.js +16 -1
- package/dist/network/utils.d.ts +2 -0
- package/dist/network/utils.js +15 -0
- package/dist/utils/ton.utils.d.ts +1 -1
- package/dist/utils/ton.utils.js +8 -2
- package/package.json +69 -69
package/README.md
CHANGED
|
@@ -136,6 +136,7 @@ Start by adding the following environment variables to your `.env` file:
|
|
|
136
136
|
**Optional variables:**
|
|
137
137
|
* **`WALLET_ID`**: The wallet ID (can be used with versions below `v5r1`).
|
|
138
138
|
* **`SUBWALLET_NUMBER`**: The subwallet number used to build the wallet ID (can be used with `v5r1` wallets).
|
|
139
|
+
* **`WALLET_NETWORK_ID`**: Network ID used to build the wallet ID (v5 wallets). Defaults: `-3` testnet, `-239` mainnet and other networks (tetra, custom).
|
|
139
140
|
|
|
140
141
|
Once your environment is set up, you can use the mnemonic wallet for deployment with the appropriate configuration.
|
|
141
142
|
|
package/dist/cli/constants.js
CHANGED
|
@@ -108,6 +108,7 @@ ${chalk_1.default.cyan('--custom')} [api-endpoint] - use a custom API
|
|
|
108
108
|
${chalk_1.default.cyan('--custom-version')} - API version (v2, v4)
|
|
109
109
|
${chalk_1.default.cyan('--custom-key')} - API key (v2 only)
|
|
110
110
|
${chalk_1.default.cyan('--custom-type')} - network type (custom, mainnet, testnet)
|
|
111
|
+
${chalk_1.default.cyan('--custom-global-id')} - network global ID (for custom l2 domain)
|
|
111
112
|
${chalk_1.default.cyan('--tonconnect')}, ${chalk_1.default.cyan('--deeplink')}, ${chalk_1.default.cyan('--mnemonic')} - deployer options
|
|
112
113
|
${chalk_1.default.cyan('--tonscan')}, ${chalk_1.default.cyan('--tonviewer')}, ${chalk_1.default.cyan('--toncx')}, ${chalk_1.default.cyan('--dton')} - explorer (default: tonviewer)
|
|
113
114
|
${chalk_1.default.gray('[...args]')} (array of strings, optional) - Arguments passed directly to the script.
|
|
@@ -141,14 +142,14 @@ ${chalk_1.default.bold('SEE ALSO')}
|
|
|
141
142
|
Verifies a deployed contract on ${chalk_1.default.underline('https://verifier.ton.org')}.
|
|
142
143
|
|
|
143
144
|
${chalk_1.default.bold('Flags:')}
|
|
144
|
-
${chalk_1.default.cyan('--mainnet')}, ${chalk_1.default.cyan('--testnet')} - selects network
|
|
145
|
+
${chalk_1.default.cyan('--mainnet')}, ${chalk_1.default.cyan('--testnet')}, ${chalk_1.default.cyan('--tetra')} - selects network
|
|
145
146
|
${chalk_1.default.cyan('--verifier')} - specifies the verifier ID to use (default: ${chalk_1.default.cyan('verifier.ton.org')})
|
|
146
147
|
${chalk_1.default.cyan('--list-verifiers')} - lists all available verifiers for the selected network (or both networks if none selected)
|
|
147
148
|
${chalk_1.default.cyan('--compiler-version')} - specifies the exact compiler version to use (e.g. ${chalk_1.default.cyan('0.4.4-newops.1')}). Note: this does not change the underlying compiler itself.
|
|
148
149
|
${chalk_1.default.cyan('--custom')} [api-endpoint] - use custom API (requires --custom-type)
|
|
149
150
|
${chalk_1.default.cyan('--custom-version')} - API version (v2 default)
|
|
150
151
|
${chalk_1.default.cyan('--custom-key')} - API key (v2 only)
|
|
151
|
-
${chalk_1.default.cyan('--custom-type')} - network type (mainnet, testnet)`,
|
|
152
|
+
${chalk_1.default.cyan('--custom-type')} - network type (mainnet, testnet, tetra)`,
|
|
152
153
|
convert: `${chalk_1.default.bold('Usage:')} blueprint ${chalk_1.default.cyan('convert')} ${chalk_1.default.yellow('[path to build script]')}
|
|
153
154
|
|
|
154
155
|
Attempts to convert a legacy bash build script to a Blueprint compile wrapper.`,
|
package/dist/config/Config.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ export interface Config {
|
|
|
29
29
|
* },
|
|
30
30
|
* };
|
|
31
31
|
*/
|
|
32
|
-
network?: 'mainnet' | 'testnet' | CustomNetwork;
|
|
32
|
+
network?: 'mainnet' | 'testnet' | 'tetra' | CustomNetwork;
|
|
33
33
|
/**
|
|
34
34
|
* If true, keeps compilable files (`*.compile.ts`) in a separate directory `compilables`.
|
|
35
35
|
* When false or unset, compilables are stored in `wrappers` directory.
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { AVAILABLE_NETWORKS } from './constants';
|
|
2
|
+
export type Network = (typeof AVAILABLE_NETWORKS)[number];
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const AVAILABLE_NETWORKS: ["mainnet", "testnet", "tetra", "custom"];
|
|
2
|
+
export declare const MAINNET_NETWORK_GLOBAL_ID = -239;
|
|
3
|
+
export declare const TESTNET_NETWORK_GLOBAL_ID = -3;
|
|
4
|
+
export declare const TETRA_DOMAIN: {
|
|
5
|
+
readonly type: "l2";
|
|
6
|
+
readonly globalId: 662387;
|
|
7
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TETRA_DOMAIN = exports.TESTNET_NETWORK_GLOBAL_ID = exports.MAINNET_NETWORK_GLOBAL_ID = exports.AVAILABLE_NETWORKS = void 0;
|
|
4
|
+
exports.AVAILABLE_NETWORKS = ['mainnet', 'testnet', 'tetra', 'custom'];
|
|
5
|
+
exports.MAINNET_NETWORK_GLOBAL_ID = -239;
|
|
6
|
+
exports.TESTNET_NETWORK_GLOBAL_ID = -3;
|
|
7
|
+
const TETRA_NETWORK_GLOBAL_ID = 662387;
|
|
8
|
+
exports.TETRA_DOMAIN = {
|
|
9
|
+
type: 'l2',
|
|
10
|
+
globalId: TETRA_NETWORK_GLOBAL_ID,
|
|
11
|
+
};
|
|
@@ -5,10 +5,12 @@ import { Config } from '../config/Config';
|
|
|
5
5
|
export declare const argSpec: {
|
|
6
6
|
'--mainnet': BooleanConstructor;
|
|
7
7
|
'--testnet': BooleanConstructor;
|
|
8
|
+
'--tetra': BooleanConstructor;
|
|
8
9
|
'--custom': StringConstructor;
|
|
9
10
|
'--custom-type': StringConstructor;
|
|
10
11
|
'--custom-version': StringConstructor;
|
|
11
12
|
'--custom-key': StringConstructor;
|
|
13
|
+
'--custom-global-id': NumberConstructor;
|
|
12
14
|
'--compiler-version': StringConstructor;
|
|
13
15
|
'--tonconnect': BooleanConstructor;
|
|
14
16
|
'--deeplink': BooleanConstructor;
|
|
@@ -19,16 +19,19 @@ const TonConnectProvider_1 = require("./send/TonConnectProvider");
|
|
|
19
19
|
const FSStorage_1 = require("./storage/FSStorage");
|
|
20
20
|
const paths_1 = require("../paths");
|
|
21
21
|
const MnemonicProvider_1 = require("./send/MnemonicProvider");
|
|
22
|
+
const constants_1 = require("./constants");
|
|
22
23
|
const INITIAL_DELAY = 400;
|
|
23
24
|
const MAX_ATTEMPTS = 4;
|
|
24
25
|
const CONFIG_ADDRESS = core_1.Address.parse('-1:5555555555555555555555555555555555555555555555555555555555555555');
|
|
25
26
|
exports.argSpec = {
|
|
26
27
|
'--mainnet': Boolean,
|
|
27
28
|
'--testnet': Boolean,
|
|
29
|
+
'--tetra': Boolean,
|
|
28
30
|
'--custom': String,
|
|
29
31
|
'--custom-type': String,
|
|
30
32
|
'--custom-version': String,
|
|
31
33
|
'--custom-key': String,
|
|
34
|
+
'--custom-global-id': Number,
|
|
32
35
|
'--compiler-version': String,
|
|
33
36
|
'--tonconnect': Boolean,
|
|
34
37
|
'--deeplink': Boolean,
|
|
@@ -276,7 +279,7 @@ function getOptionalNumberEnv(envName) {
|
|
|
276
279
|
}
|
|
277
280
|
return value;
|
|
278
281
|
}
|
|
279
|
-
async function createMnemonicProvider(client, network, ui) {
|
|
282
|
+
async function createMnemonicProvider(client, network, ui, globalId) {
|
|
280
283
|
const mnemonic = process.env.WALLET_MNEMONIC ?? '';
|
|
281
284
|
const walletVersion = process.env.WALLET_VERSION ?? '';
|
|
282
285
|
if (mnemonic.length === 0 || walletVersion.length === 0) {
|
|
@@ -284,6 +287,7 @@ async function createMnemonicProvider(client, network, ui) {
|
|
|
284
287
|
}
|
|
285
288
|
const walletId = getOptionalNumberEnv('WALLET_ID');
|
|
286
289
|
const subwalletNumber = getOptionalNumberEnv('SUBWALLET_NUMBER');
|
|
290
|
+
const walletNetworkId = getOptionalNumberEnv('WALLET_NETWORK_ID');
|
|
287
291
|
const keyPair = await (0, crypto_1.mnemonicToPrivateKey)(mnemonic.split(' '));
|
|
288
292
|
return new MnemonicProvider_1.MnemonicProvider({
|
|
289
293
|
version: walletVersion.toLowerCase(),
|
|
@@ -293,6 +297,8 @@ async function createMnemonicProvider(client, network, ui) {
|
|
|
293
297
|
walletId,
|
|
294
298
|
subwalletNumber,
|
|
295
299
|
network,
|
|
300
|
+
globalId,
|
|
301
|
+
networkId: walletNetworkId,
|
|
296
302
|
});
|
|
297
303
|
}
|
|
298
304
|
function intToIP(int) {
|
|
@@ -333,6 +339,7 @@ class NetworkProviderBuilder {
|
|
|
333
339
|
let network = (0, utils_1.oneOrZeroOf)({
|
|
334
340
|
mainnet: this.args['--mainnet'],
|
|
335
341
|
testnet: this.args['--testnet'],
|
|
342
|
+
tetra: this.args['--tetra'],
|
|
336
343
|
custom: this.args['--custom'] !== undefined,
|
|
337
344
|
});
|
|
338
345
|
if (network !== undefined) {
|
|
@@ -341,7 +348,7 @@ class NetworkProviderBuilder {
|
|
|
341
348
|
if (this.config?.network !== undefined) {
|
|
342
349
|
return typeof this.config.network === 'string' ? this.config.network : 'custom';
|
|
343
350
|
}
|
|
344
|
-
network = await this.ui.choose('Which network do you want to use?',
|
|
351
|
+
network = await this.ui.choose('Which network do you want to use?', constants_1.AVAILABLE_NETWORKS, (c) => c);
|
|
345
352
|
if (network === 'custom') {
|
|
346
353
|
const defaultCustomEndpoint = 'http://localhost:8081/';
|
|
347
354
|
this.args['--custom'] = (await this.ui.input(`Provide a custom API v2 endpoint (default is ${defaultCustomEndpoint})`)).trim();
|
|
@@ -391,9 +398,14 @@ class NetworkProviderBuilder {
|
|
|
391
398
|
throw new Error('Tonkeeper cannot work with custom network.');
|
|
392
399
|
provider = new TonConnectProvider_1.TonConnectProvider(new FSStorage_1.FSStorage(storagePath), this.ui, network, this.config?.manifestUrl);
|
|
393
400
|
break;
|
|
394
|
-
case 'mnemonic':
|
|
395
|
-
|
|
401
|
+
case 'mnemonic': {
|
|
402
|
+
let globalId = undefined;
|
|
403
|
+
if (typeof this.config?.network === 'object') {
|
|
404
|
+
globalId = this.config.network.globalId;
|
|
405
|
+
}
|
|
406
|
+
provider = await createMnemonicProvider(client, network, this.ui, globalId);
|
|
396
407
|
break;
|
|
408
|
+
}
|
|
397
409
|
default:
|
|
398
410
|
throw new Error('Unknown deploy option');
|
|
399
411
|
}
|
|
@@ -401,7 +413,6 @@ class NetworkProviderBuilder {
|
|
|
401
413
|
}
|
|
402
414
|
async build() {
|
|
403
415
|
let network = await this.chooseNetwork();
|
|
404
|
-
const explorer = this.chooseExplorer();
|
|
405
416
|
if (network !== 'custom' &&
|
|
406
417
|
(this.args['--custom-key'] !== undefined ||
|
|
407
418
|
this.args['--custom-type'] !== undefined ||
|
|
@@ -425,10 +436,12 @@ class NetworkProviderBuilder {
|
|
|
425
436
|
if (inputType !== undefined) {
|
|
426
437
|
type = inputType; // checks come later
|
|
427
438
|
}
|
|
439
|
+
const globalId = this.args['--custom-global-id'];
|
|
428
440
|
configNetwork = {
|
|
429
441
|
endpoint: this.args['--custom'],
|
|
430
442
|
version,
|
|
431
443
|
key: this.args['--custom-key'],
|
|
444
|
+
globalId,
|
|
432
445
|
type,
|
|
433
446
|
};
|
|
434
447
|
}
|
|
@@ -463,7 +476,7 @@ class NetworkProviderBuilder {
|
|
|
463
476
|
}
|
|
464
477
|
if (configNetwork.type !== undefined) {
|
|
465
478
|
const ct = configNetwork.type.toLowerCase();
|
|
466
|
-
if (!
|
|
479
|
+
if (!constants_1.AVAILABLE_NETWORKS.includes(ct)) {
|
|
467
480
|
throw new Error('Unknown network type: ' + ct);
|
|
468
481
|
}
|
|
469
482
|
network = ct;
|
|
@@ -473,34 +486,41 @@ class NetworkProviderBuilder {
|
|
|
473
486
|
}
|
|
474
487
|
}
|
|
475
488
|
else {
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
489
|
+
if (network === 'tetra') {
|
|
490
|
+
tc = new ton_adapter_1.ContractAdapter(new client_1.TonApiClient({
|
|
491
|
+
baseUrl: 'https://tetra.tonapi.io',
|
|
492
|
+
}));
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
const httpAdapter = async (config) => {
|
|
496
|
+
let r;
|
|
497
|
+
let delay = INITIAL_DELAY;
|
|
498
|
+
let attempts = 0;
|
|
499
|
+
while (true) {
|
|
500
|
+
r = await (0, axios_1.default)({
|
|
501
|
+
...config,
|
|
502
|
+
adapter: undefined,
|
|
503
|
+
validateStatus: (status) => (status >= 200 && status < 300) || status === 429,
|
|
504
|
+
});
|
|
505
|
+
if (r.status !== 429) {
|
|
506
|
+
return r;
|
|
507
|
+
}
|
|
508
|
+
await (0, utils_1.sleep)(delay);
|
|
509
|
+
delay *= 2;
|
|
510
|
+
attempts++;
|
|
511
|
+
if (attempts >= MAX_ATTEMPTS) {
|
|
512
|
+
throw new Error('Max attempts reached');
|
|
513
|
+
}
|
|
494
514
|
}
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
}
|
|
515
|
+
};
|
|
516
|
+
tc = new ton_1.TonClient({
|
|
517
|
+
timeout: this.config?.requestTimeout,
|
|
518
|
+
endpoint: network === 'mainnet'
|
|
519
|
+
? 'https://toncenter.com/api/v2/jsonRPC'
|
|
520
|
+
: 'https://testnet.toncenter.com/api/v2/jsonRPC',
|
|
521
|
+
httpAdapter,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
504
524
|
}
|
|
505
525
|
const sendProvider = await this.chooseSendProvider(network, tc);
|
|
506
526
|
try {
|
|
@@ -514,6 +534,7 @@ class NetworkProviderBuilder {
|
|
|
514
534
|
this.ui.setActionPrompt('');
|
|
515
535
|
}
|
|
516
536
|
const sender = new SendProviderSender(sendProvider);
|
|
537
|
+
const explorer = network === 'tetra' ? 'tonviewer' : this.chooseExplorer();
|
|
517
538
|
return new NetworkProviderImpl(tc, sender, network, explorer, this.ui);
|
|
518
539
|
}
|
|
519
540
|
}
|
|
@@ -14,6 +14,8 @@ type MnemonicProviderParams = {
|
|
|
14
14
|
client: BlueprintTonClient;
|
|
15
15
|
ui: UIProvider;
|
|
16
16
|
network: Network;
|
|
17
|
+
globalId?: number;
|
|
18
|
+
networkId?: number;
|
|
17
19
|
};
|
|
18
20
|
export declare class MnemonicProvider implements SendProvider {
|
|
19
21
|
private readonly wallet;
|
|
@@ -22,6 +24,7 @@ export declare class MnemonicProvider implements SendProvider {
|
|
|
22
24
|
private readonly ui;
|
|
23
25
|
private readonly network;
|
|
24
26
|
constructor(params: MnemonicProviderParams);
|
|
27
|
+
private getDomain;
|
|
25
28
|
private createWallet;
|
|
26
29
|
connect(): Promise<void>;
|
|
27
30
|
sendTransaction(address: Address, amount: bigint, payload?: Cell | undefined, stateInit?: StateInit | undefined): Promise<void>;
|
|
@@ -4,6 +4,8 @@ exports.MnemonicProvider = void 0;
|
|
|
4
4
|
const core_1 = require("@ton/core");
|
|
5
5
|
const crypto_1 = require("@ton/crypto");
|
|
6
6
|
const wallets_1 = require("./wallets");
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
|
+
const constants_1 = require("../constants");
|
|
7
9
|
class MnemonicProvider {
|
|
8
10
|
constructor(params) {
|
|
9
11
|
if (!(params.version in wallets_1.wallets)) {
|
|
@@ -20,24 +22,37 @@ class MnemonicProvider {
|
|
|
20
22
|
this.secretKey = kp.secretKey;
|
|
21
23
|
this.ui = params.ui;
|
|
22
24
|
}
|
|
25
|
+
getDomain(params) {
|
|
26
|
+
if (params.globalId !== undefined) {
|
|
27
|
+
return { type: 'l2', globalId: params.globalId };
|
|
28
|
+
}
|
|
29
|
+
if (params.network === 'tetra') {
|
|
30
|
+
return constants_1.TETRA_DOMAIN;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
23
34
|
createWallet(params, kp) {
|
|
35
|
+
const domain = this.getDomain(params);
|
|
24
36
|
if (params.version === 'v5r1') {
|
|
37
|
+
const networkGlobalId = params.networkId ?? (0, utils_1.getW5NetworkGlobalId)(params.network);
|
|
25
38
|
return wallets_1.wallets[params.version].create({
|
|
26
39
|
publicKey: kp.publicKey,
|
|
27
40
|
walletId: {
|
|
28
|
-
networkGlobalId:
|
|
41
|
+
networkGlobalId: networkGlobalId,
|
|
29
42
|
context: {
|
|
30
43
|
workchain: params.workchain ?? 0,
|
|
31
44
|
subwalletNumber: params.subwalletNumber ?? 0,
|
|
32
45
|
walletVersion: 'v5r1',
|
|
33
46
|
},
|
|
34
47
|
},
|
|
48
|
+
domain,
|
|
35
49
|
});
|
|
36
50
|
}
|
|
37
51
|
return wallets_1.wallets[params.version].create({
|
|
38
52
|
workchain: params.workchain ?? 0,
|
|
39
53
|
publicKey: kp.publicKey,
|
|
40
54
|
walletId: params.walletId,
|
|
55
|
+
domain,
|
|
41
56
|
});
|
|
42
57
|
}
|
|
43
58
|
async connect() {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getW5NetworkGlobalId = getW5NetworkGlobalId;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
function getW5NetworkGlobalId(network) {
|
|
6
|
+
switch (network) {
|
|
7
|
+
case 'testnet':
|
|
8
|
+
return constants_1.TESTNET_NETWORK_GLOBAL_ID;
|
|
9
|
+
case 'mainnet':
|
|
10
|
+
return constants_1.MAINNET_NETWORK_GLOBAL_ID;
|
|
11
|
+
case 'tetra':
|
|
12
|
+
return constants_1.MAINNET_NETWORK_GLOBAL_ID;
|
|
13
|
+
}
|
|
14
|
+
return constants_1.MAINNET_NETWORK_GLOBAL_ID;
|
|
15
|
+
}
|
|
@@ -22,7 +22,7 @@ export declare const tonDeepLink: (address: Address, amount: bigint, body?: Cell
|
|
|
22
22
|
* dynamically adds the testnet prefix when needed.
|
|
23
23
|
*
|
|
24
24
|
* @param {string} address - The TON address to view in explorer.
|
|
25
|
-
* @param {string} network - The target network
|
|
25
|
+
* @param {string} network - The target network.
|
|
26
26
|
* @param {string} explorer - The desired explorer. Supported values: 'tonscan', 'tonviewer', 'toncx', 'dton'.
|
|
27
27
|
* @returns {string} A full URL pointing to the address in the selected explorer.
|
|
28
28
|
*
|
package/dist/utils/ton.utils.js
CHANGED
|
@@ -25,6 +25,12 @@ const tonDeepLink = (address, amount, body, stateInit, testOnly) => `ton://trans
|
|
|
25
25
|
bounceable: true,
|
|
26
26
|
})}?amount=${amount.toString()}${body ? '&bin=' + body.toBoc().toString('base64url') : ''}${stateInit ? '&init=' + stateInit.toBoc().toString('base64url') : ''}`;
|
|
27
27
|
exports.tonDeepLink = tonDeepLink;
|
|
28
|
+
function getNetworkPrefix(network) {
|
|
29
|
+
if (network === 'testnet' || network === 'tetra') {
|
|
30
|
+
return `${network}.`;
|
|
31
|
+
}
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
28
34
|
/**
|
|
29
35
|
* Generates a link to view a TON address in a selected blockchain explorer.
|
|
30
36
|
*
|
|
@@ -32,7 +38,7 @@ exports.tonDeepLink = tonDeepLink;
|
|
|
32
38
|
* dynamically adds the testnet prefix when needed.
|
|
33
39
|
*
|
|
34
40
|
* @param {string} address - The TON address to view in explorer.
|
|
35
|
-
* @param {string} network - The target network
|
|
41
|
+
* @param {string} network - The target network.
|
|
36
42
|
* @param {string} explorer - The desired explorer. Supported values: 'tonscan', 'tonviewer', 'toncx', 'dton'.
|
|
37
43
|
* @returns {string} A full URL pointing to the address in the selected explorer.
|
|
38
44
|
*
|
|
@@ -41,7 +47,7 @@ exports.tonDeepLink = tonDeepLink;
|
|
|
41
47
|
* // "https://testnet.tonscan.org/address/EQC..."
|
|
42
48
|
*/
|
|
43
49
|
function getExplorerLink(address, network, explorer) {
|
|
44
|
-
const networkPrefix = network
|
|
50
|
+
const networkPrefix = getNetworkPrefix(network);
|
|
45
51
|
switch (explorer) {
|
|
46
52
|
case 'tonscan':
|
|
47
53
|
return `https://${networkPrefix}tonscan.org/address/${address}`;
|
package/package.json
CHANGED
|
@@ -1,71 +1,71 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
2
|
+
"name": "@ton/blueprint",
|
|
3
|
+
"version": "0.44.0",
|
|
4
|
+
"description": "Framework for development of TON smart contracts",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": "./dist/cli/cli.js",
|
|
7
|
+
"author": "TonTech",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/ton-org/blueprint.git"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/**/*"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "rm -rf dist && tsc && cp -r src/templates dist/",
|
|
18
|
+
"test": "jest src",
|
|
19
|
+
"release": "yarn build && yarn publish --access public",
|
|
20
|
+
"lint": "eslint . --max-warnings 0",
|
|
21
|
+
"lint:fix": "eslint . --max-warnings 0 --fix"
|
|
22
|
+
},
|
|
23
|
+
"prettier": "@ton/toolchain/prettier",
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@tact-lang/compiler": "^1.6.13",
|
|
26
|
+
"@ton-community/func-js": "^0.10.0",
|
|
27
|
+
"@ton/core": "^0.63.1",
|
|
28
|
+
"@ton/crypto": "^3.3.0",
|
|
29
|
+
"@ton/sandbox": "^0.40.0",
|
|
30
|
+
"@ton/tolk-js": "^1.0.0",
|
|
31
|
+
"@ton/ton": "^16.2.2",
|
|
32
|
+
"@ton/toolchain": "the-ton-tech/toolchain#v1.6.0",
|
|
33
|
+
"@types/inquirer": "^8.2.6",
|
|
34
|
+
"@types/jest": "^30.0.0",
|
|
35
|
+
"@types/node": "^20.2.5",
|
|
36
|
+
"@types/qrcode-terminal": "^0.12.0",
|
|
37
|
+
"eslint": "^9.28.0",
|
|
38
|
+
"globals": "^16.4.0",
|
|
39
|
+
"jest": "^30.0.5",
|
|
40
|
+
"ts-jest": "^29.4.1",
|
|
41
|
+
"typescript": "^5.8.3"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@tact-lang/compiler": ">=1.6.5",
|
|
45
|
+
"@ton-community/func-js": ">=0.10.0",
|
|
46
|
+
"@ton/core": ">=0.63.1",
|
|
47
|
+
"@ton/crypto": ">=3.3.0",
|
|
48
|
+
"@ton/sandbox": ">=0.40.0",
|
|
49
|
+
"@ton/tolk-js": ">=0.13.0",
|
|
50
|
+
"@ton/ton": ">=16.2.2"
|
|
51
|
+
},
|
|
52
|
+
"peerDependenciesMeta": {
|
|
53
|
+
"@ton/sandbox": {
|
|
54
|
+
"optional": true
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@ton-api/client": "^0.2.0",
|
|
59
|
+
"@ton-api/ton-adapter": "^0.2.0",
|
|
60
|
+
"@tonconnect/sdk": "^2.2.0",
|
|
61
|
+
"arg": "^5.0.2",
|
|
62
|
+
"axios": "^1.7.7",
|
|
63
|
+
"chalk": "^4.1.0",
|
|
64
|
+
"dotenv": "^16.1.4",
|
|
65
|
+
"inquirer": "^8.2.5",
|
|
66
|
+
"qrcode-terminal": "^0.12.0",
|
|
67
|
+
"ton-lite-client": "^3.1.1",
|
|
68
|
+
"ts-node": "^10.9.1"
|
|
69
|
+
},
|
|
70
|
+
"packageManager": "yarn@4.9.2"
|
|
71
71
|
}
|