@ton/blueprint 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +98 -12
  3. package/dist/cli/Runner.d.ts +2 -0
  4. package/dist/cli/Runner.js +9 -1
  5. package/dist/cli/build.d.ts +1 -2
  6. package/dist/cli/build.js +3 -6
  7. package/dist/cli/cli.js +8 -1
  8. package/dist/cli/constants.d.ts +4 -0
  9. package/dist/cli/constants.js +44 -6
  10. package/dist/cli/create.js +2 -13
  11. package/dist/cli/help.js +2 -1
  12. package/dist/cli/pack.d.ts +2 -0
  13. package/dist/cli/pack.js +98 -0
  14. package/dist/cli/rename.d.ts +6 -0
  15. package/dist/cli/rename.js +101 -0
  16. package/dist/cli/rename.spec.d.ts +1 -0
  17. package/dist/cli/rename.spec.js +59 -0
  18. package/dist/cli/run.js +2 -1
  19. package/dist/cli/snapshot.d.ts +6 -0
  20. package/dist/cli/snapshot.js +36 -0
  21. package/dist/cli/test.d.ts +4 -0
  22. package/dist/cli/test.js +20 -4
  23. package/dist/compile/compile.d.ts +16 -0
  24. package/dist/compile/compile.js +23 -7
  25. package/dist/compile/tact/compile.tact.d.ts +2 -1
  26. package/dist/compile/tact/compile.tact.js +9 -5
  27. package/dist/config/Config.d.ts +15 -0
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.js +3 -1
  30. package/dist/network/Network.d.ts +1 -0
  31. package/dist/network/Network.js +2 -0
  32. package/dist/network/createNetworkProvider.js +20 -6
  33. package/dist/network/send/DeeplinkProvider.d.ts +2 -1
  34. package/dist/network/send/DeeplinkProvider.js +6 -4
  35. package/dist/network/send/MnemonicProvider.d.ts +14 -7
  36. package/dist/network/send/MnemonicProvider.js +28 -8
  37. package/dist/network/send/TonConnectProvider.d.ts +2 -1
  38. package/dist/network/send/TonConnectProvider.js +10 -4
  39. package/dist/paths.d.ts +3 -0
  40. package/dist/paths.js +4 -1
  41. package/dist/templates/func/common/contracts/imports/stdlib.fc.template +8 -7
  42. package/dist/templates/func/not-separated-common/contracts/imports/stdlib.fc.template +8 -7
  43. package/dist/templates/tact/counter/scripts/deploy.ts.template +1 -1
  44. package/dist/templates/tact/counter/scripts/increment.ts.template +1 -1
  45. package/dist/templates/tact/empty/scripts/deploy.ts.template +1 -1
  46. package/dist/utils/selection.utils.js +9 -4
  47. package/dist/utils/string.utils.d.ts +3 -0
  48. package/dist/utils/string.utils.js +20 -0
  49. package/dist/utils/ton.utils.d.ts +2 -1
  50. package/dist/utils/ton.utils.js +3 -1
  51. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const rename_1 = require("./rename");
9
+ (0, node_test_1.describe)('Rename', function () {
10
+ (0, node_test_1.it)('It should rename exact match', function () {
11
+ const replaces = {
12
+ a: 'b',
13
+ };
14
+ const result = (0, rename_1.renameExactIfRequired)('a a', replaces);
15
+ node_assert_1.default.strictEqual(result.isRenamed, true);
16
+ node_assert_1.default.strictEqual(result.newValue, 'b b');
17
+ });
18
+ (0, node_test_1.it)('It should not rename not exact match', function () {
19
+ const replaces = {
20
+ a: 'b',
21
+ };
22
+ const result = (0, rename_1.renameExactIfRequired)('and', replaces);
23
+ node_assert_1.default.strictEqual(result.isRenamed, false);
24
+ node_assert_1.default.strictEqual(result.newValue, 'and');
25
+ });
26
+ (0, node_test_1.it)('It should not rename another case', function () {
27
+ const replaces = {
28
+ a: 'b',
29
+ };
30
+ const result = (0, rename_1.renameExactIfRequired)('A', replaces);
31
+ node_assert_1.default.strictEqual(result.isRenamed, false);
32
+ node_assert_1.default.strictEqual(result.newValue, 'A');
33
+ });
34
+ (0, node_test_1.it)('It should rename contract name in brackets', function () {
35
+ const replaces = {
36
+ ['MyContract']: 'NotMyContract',
37
+ };
38
+ const result = (0, rename_1.renameExactIfRequired)(`compile('MyContract')`, replaces);
39
+ node_assert_1.default.strictEqual(result.isRenamed, true);
40
+ node_assert_1.default.strictEqual(result.newValue, `compile('NotMyContract')`);
41
+ });
42
+ (0, node_test_1.it)('It should not rename contract name if not exact match', function () {
43
+ const replaces = {
44
+ ['MyContract']: 'NotMyContract',
45
+ };
46
+ const result = (0, rename_1.renameExactIfRequired)(`compile('MyContract2')`, replaces);
47
+ node_assert_1.default.strictEqual(result.isRenamed, false);
48
+ node_assert_1.default.strictEqual(result.newValue, `compile('MyContract2')`);
49
+ });
50
+ (0, node_test_1.it)('It should do multiple replaces', function () {
51
+ const replaces = {
52
+ ['myContract']: 'notMyContract',
53
+ ['MyContract']: 'NotMyContract',
54
+ };
55
+ const result = (0, rename_1.renameExactIfRequired)(`let myContract: MyContract;`, replaces);
56
+ node_assert_1.default.strictEqual(result.isRenamed, true);
57
+ node_assert_1.default.strictEqual(result.newValue, `let notMyContract: NotMyContract;`);
58
+ });
59
+ });
package/dist/cli/run.js CHANGED
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.run = void 0;
7
+ const Runner_1 = require("./Runner");
7
8
  const createNetworkProvider_1 = require("../network/createNetworkProvider");
8
9
  const utils_1 = require("../utils");
9
10
  const arg_1 = __importDefault(require("arg"));
@@ -16,7 +17,7 @@ const run = async (args, ui, context) => {
16
17
  }
17
18
  const { module: mod } = await (0, utils_1.selectFile)(await (0, utils_1.findScripts)(), {
18
19
  ui,
19
- hint: localArgs._.length > 1 && localArgs._[1].length > 0 ? localArgs._[1] : undefined,
20
+ hint: (0, Runner_1.extractFirstArg)(localArgs),
20
21
  });
21
22
  if (typeof mod.run !== 'function') {
22
23
  throw new Error('Function `run` is missing!');
@@ -0,0 +1,6 @@
1
+ import { Runner } from './Runner';
2
+ export declare const argSpec: {
3
+ '--label': StringConstructor;
4
+ '-l': string;
5
+ };
6
+ export declare const snapshot: Runner;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.snapshot = exports.argSpec = void 0;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const arg_1 = __importDefault(require("arg"));
9
+ const constants_1 = require("./constants");
10
+ exports.argSpec = {
11
+ '--label': String,
12
+ '-l': '--label',
13
+ };
14
+ const snapshot = async (args, ui) => {
15
+ const localArgs = (0, arg_1.default)({ ...exports.argSpec, ...constants_1.helpArgs });
16
+ if (localArgs['--help']) {
17
+ ui.write(constants_1.helpMessages['snapshot']);
18
+ return;
19
+ }
20
+ let comment = localArgs['--label'];
21
+ let testArgs = args._.slice(1); // first argument is `snapshot`, need to get rid of it
22
+ if (typeof comment === 'undefined') {
23
+ comment = await ui.input('Enter comment:');
24
+ }
25
+ else {
26
+ testArgs = testArgs.slice(2);
27
+ }
28
+ (0, node_child_process_1.execSync)(`npm test -- ${testArgs.join(' ')}`, {
29
+ stdio: 'inherit',
30
+ env: {
31
+ ...process.env,
32
+ BENCH_NEW: comment,
33
+ },
34
+ });
35
+ };
36
+ exports.snapshot = snapshot;
@@ -1,2 +1,6 @@
1
1
  import { Runner } from './Runner';
2
+ export declare const argSpec: {
3
+ '--gas-report': BooleanConstructor;
4
+ '-g': string;
5
+ };
2
6
  export declare const test: Runner;
package/dist/cli/test.js CHANGED
@@ -3,17 +3,33 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.test = void 0;
6
+ exports.test = exports.argSpec = void 0;
7
7
  const child_process_1 = require("child_process");
8
8
  const arg_1 = __importDefault(require("arg"));
9
9
  const constants_1 = require("./constants");
10
+ exports.argSpec = {
11
+ '--gas-report': Boolean,
12
+ '-g': '--gas-report',
13
+ };
10
14
  const test = async (args, ui) => {
11
- const localArgs = (0, arg_1.default)(constants_1.helpArgs);
15
+ const localArgs = (0, arg_1.default)({
16
+ ...constants_1.helpArgs,
17
+ ...exports.argSpec,
18
+ });
12
19
  if (localArgs['--help']) {
13
20
  ui.write(constants_1.helpMessages['test']);
14
21
  return;
15
22
  }
16
- const testArgs = args._.slice(1); // first argument is `test`, need to get rid of it
17
- (0, child_process_1.execSync)(`npm test ${testArgs.join(' ')}`, { stdio: 'inherit' });
23
+ let testArgs = args._.slice(1); // first argument is `test`, need to get rid of it
24
+ if (localArgs['--gas-report']) {
25
+ testArgs = testArgs.slice(1);
26
+ }
27
+ (0, child_process_1.execSync)(`npm test -- ${testArgs.join(' ')}`, {
28
+ stdio: 'inherit',
29
+ env: {
30
+ ...process.env,
31
+ BENCH_DIFF: localArgs['--gas-report'] ? 'true' : 'false',
32
+ },
33
+ });
18
34
  };
19
35
  exports.test = test;
@@ -6,6 +6,22 @@ import { TolkCompileResult } from './tolk/compile.tolk';
6
6
  export declare function getCompilablesDirectory(): Promise<string>;
7
7
  export declare function extractCompilableConfig(path: string): CompilableConfig;
8
8
  export declare const COMPILE_END = ".compile.ts";
9
+ /**
10
+ * Retrieves the compiler configuration for a specific contract.
11
+ *
12
+ * This function checks if a Tact configuration exists for the given contract
13
+ * `tact.config.json`. If found, it returns that configuration. Otherwise, it falls back
14
+ * to loading and extracting the `.compile.ts` configuration file from the appropriate
15
+ * compilables directory (`compilables/` or `wrappers/`).
16
+ *
17
+ * @param {string} name - The name of the contract
18
+ *
19
+ * @throws Error Throws if configuration is invalid or not found.
20
+ *
21
+ * @example
22
+ * const config = await getCompilerConfigForContract('MyContract');
23
+ * console.log('Compiler config:', config);
24
+ */
9
25
  export declare function getCompilerConfigForContract(name: string): Promise<CompilerConfig>;
10
26
  export type CompileResult = TactCompileResult | FuncCompileResult | TolkCompileResult;
11
27
  export declare function getCompilerOptions(config: CompilerConfig): Promise<{
@@ -1,7 +1,4 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.COMPILE_END = void 0;
7
4
  exports.getCompilablesDirectory = getCompilablesDirectory;
@@ -11,13 +8,13 @@ exports.getCompilerOptions = getCompilerOptions;
11
8
  exports.doCompile = doCompile;
12
9
  exports.compile = compile;
13
10
  const fs_1 = require("fs");
14
- const path_1 = __importDefault(require("path"));
15
11
  const paths_1 = require("../paths");
16
12
  const CompilerConfig_1 = require("./CompilerConfig");
17
13
  const utils_1 = require("../config/utils");
18
14
  const compile_func_1 = require("./func/compile.func");
19
15
  const compile_tact_1 = require("./tact/compile.tact");
20
16
  const compile_tolk_1 = require("./tolk/compile.tolk");
17
+ const utils_2 = require("../utils");
21
18
  async function getCompilablesDirectory() {
22
19
  const config = await (0, utils_1.getConfig)();
23
20
  if (config?.separateCompilables) {
@@ -34,14 +31,33 @@ function extractCompilableConfig(path) {
34
31
  return mod.compile;
35
32
  }
36
33
  exports.COMPILE_END = '.compile.ts';
37
- // contracts in tact.config.json and .compile.ts may overlap. In this case configuration from tact.config.json would be taken
34
+ /**
35
+ * Retrieves the compiler configuration for a specific contract.
36
+ *
37
+ * This function checks if a Tact configuration exists for the given contract
38
+ * `tact.config.json`. If found, it returns that configuration. Otherwise, it falls back
39
+ * to loading and extracting the `.compile.ts` configuration file from the appropriate
40
+ * compilables directory (`compilables/` or `wrappers/`).
41
+ *
42
+ * @param {string} name - The name of the contract
43
+ *
44
+ * @throws Error Throws if configuration is invalid or not found.
45
+ *
46
+ * @example
47
+ * const config = await getCompilerConfigForContract('MyContract');
48
+ * console.log('Compiler config:', config);
49
+ */
38
50
  async function getCompilerConfigForContract(name) {
39
51
  const tactConfig = (0, compile_tact_1.getTactConfigForContract)(name);
40
52
  if (tactConfig) {
41
53
  return tactConfig;
42
54
  }
43
- const compilablesDirectory = await getCompilablesDirectory();
44
- return extractCompilableConfig(path_1.default.join(compilablesDirectory, name + exports.COMPILE_END));
55
+ const compilables = await (0, utils_2.findCompiles)();
56
+ const compilable = compilables.find((c) => c.name === name);
57
+ if (compilable === undefined) {
58
+ throw new Error(`Contract '${name}' not found`);
59
+ }
60
+ return extractCompilableConfig(compilable.path);
45
61
  }
46
62
  async function doCompileInner(name, config) {
47
63
  if ((0, CompilerConfig_1.isCompilableConfig)(config)) {
@@ -1,4 +1,4 @@
1
- import { Options } from '@tact-lang/compiler';
1
+ import { Options, Project } from '@tact-lang/compiler';
2
2
  import { Cell } from '@ton/core';
3
3
  import { TactCompilerConfig, TactLegacyCompilerConfig } from './config';
4
4
  export type TactCompileResult = {
@@ -10,4 +10,5 @@ export type TactCompileResult = {
10
10
  };
11
11
  export declare function getTactConfigForContract(name: string): TactCompilerConfig | undefined;
12
12
  export declare function getTactVersion(): Promise<any>;
13
+ export declare function extractContractConfig(config: TactCompilerConfig, name: string): Project;
13
14
  export declare function doCompileTact(config: TactLegacyCompilerConfig | TactCompilerConfig, name: string): Promise<TactCompileResult>;
@@ -38,6 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.getTactConfigForContract = getTactConfigForContract;
40
40
  exports.getTactVersion = getTactVersion;
41
+ exports.extractContractConfig = extractContractConfig;
41
42
  exports.doCompileTact = doCompileTact;
42
43
  const path_1 = __importDefault(require("path"));
43
44
  const compiler_1 = require("@tact-lang/compiler");
@@ -85,6 +86,13 @@ async function getTactVersion() {
85
86
  function isLegacyTactConfig(config) {
86
87
  return 'lang' in config;
87
88
  }
89
+ function extractContractConfig(config, name) {
90
+ const project = config.projects.find((p) => p.name === name);
91
+ if (!project) {
92
+ throw new Error(`Config for project ${name} not found`);
93
+ }
94
+ return project;
95
+ }
88
96
  function getTactBuildProject(config, name) {
89
97
  if (isLegacyTactConfig(config)) {
90
98
  const rootConfigOptions = getRootTactConfigOptionsForContract(name);
@@ -95,11 +103,7 @@ function getTactBuildProject(config, name) {
95
103
  options: { ...rootConfigOptions, ...config.options },
96
104
  };
97
105
  }
98
- const project = config.projects.find((p) => p.name === name);
99
- if (!project) {
100
- throw new Error(`Config for project ${name} not found`);
101
- }
102
- return project;
106
+ return extractContractConfig(config, name);
103
107
  }
104
108
  async function doCompileTact(config, name) {
105
109
  const fs = new OverwritableVirtualFileSystem_1.OverwritableVirtualFileSystem(process.cwd());
@@ -37,4 +37,19 @@ export interface Config {
37
37
  * @default false
38
38
  */
39
39
  separateCompilables?: boolean;
40
+ /**
41
+ * HTTP request timeout in milliseconds.
42
+ *
43
+ * @example
44
+ * export const config: Config = {
45
+ * requestTimeout: 10000 // 10 seconds
46
+ * };
47
+ */
48
+ requestTimeout?: number;
49
+ /**
50
+ * If true, the `wrappers`/`compilables` directory will be searched recursively for contracts.
51
+ *
52
+ * @default false
53
+ */
54
+ recursiveWrappers?: boolean;
40
55
  }
package/dist/index.d.ts CHANGED
@@ -10,3 +10,4 @@ export { PluginRunner, Plugin } from './config/Plugin';
10
10
  export { CustomNetwork } from './config/CustomNetwork';
11
11
  export { buildOne, buildAll, buildAllTact } from './build';
12
12
  export { SourceSnapshot } from "./compile/SourceSnapshot";
13
+ export { getCompilerConfigForContract } from './compile/compile';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildAllTact = exports.buildAll = exports.buildOne = exports.compile = exports.createNetworkProvider = exports.sleep = exports.tonDeepLink = void 0;
3
+ exports.getCompilerConfigForContract = exports.buildAllTact = exports.buildAll = exports.buildOne = exports.compile = exports.createNetworkProvider = exports.sleep = exports.tonDeepLink = void 0;
4
4
  var utils_1 = require("./utils");
5
5
  Object.defineProperty(exports, "tonDeepLink", { enumerable: true, get: function () { return utils_1.tonDeepLink; } });
6
6
  Object.defineProperty(exports, "sleep", { enumerable: true, get: function () { return utils_1.sleep; } });
@@ -12,3 +12,5 @@ var build_1 = require("./build");
12
12
  Object.defineProperty(exports, "buildOne", { enumerable: true, get: function () { return build_1.buildOne; } });
13
13
  Object.defineProperty(exports, "buildAll", { enumerable: true, get: function () { return build_1.buildAll; } });
14
14
  Object.defineProperty(exports, "buildAllTact", { enumerable: true, get: function () { return build_1.buildAllTact; } });
15
+ var compile_2 = require("./compile/compile");
16
+ Object.defineProperty(exports, "getCompilerConfigForContract", { enumerable: true, get: function () { return compile_2.getCompilerConfigForContract; } });
@@ -0,0 +1 @@
1
+ export type Network = 'mainnet' | 'testnet' | 'custom';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -148,9 +148,10 @@ class NetworkProviderImpl {
148
148
  __classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").setActionPrompt(`Awaiting contract deployment... [Attempt ${i}/${attempts}]`);
149
149
  const isDeployed = await this.isContractDeployed(address);
150
150
  if (isDeployed) {
151
+ const formattedAddress = address.toString({ testOnly: __classPrivateFieldGet(this, _NetworkProviderImpl_network, "f") === 'testnet' });
151
152
  __classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").clearActionPrompt();
152
- __classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").write(`Contract deployed at address ${address.toString()}`);
153
- __classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").write(`You can view it at ${(0, utils_1.getExplorerLink)(address.toString(), __classPrivateFieldGet(this, _NetworkProviderImpl_network, "f"), __classPrivateFieldGet(this, _NetworkProviderImpl_explorer, "f"))}`);
153
+ __classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").write(`Contract deployed at address ${formattedAddress}`);
154
+ __classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").write(`You can view it at ${(0, utils_1.getExplorerLink)(formattedAddress, __classPrivateFieldGet(this, _NetworkProviderImpl_network, "f"), __classPrivateFieldGet(this, _NetworkProviderImpl_explorer, "f"))}`);
154
155
  return;
155
156
  }
156
157
  await (0, utils_1.sleep)(sleepDuration);
@@ -189,18 +190,30 @@ class NetworkProviderImpl {
189
190
  }
190
191
  }
191
192
  _NetworkProviderImpl_tc = new WeakMap(), _NetworkProviderImpl_sender = new WeakMap(), _NetworkProviderImpl_network = new WeakMap(), _NetworkProviderImpl_explorer = new WeakMap(), _NetworkProviderImpl_ui = new WeakMap();
192
- async function createMnemonicProvider(client, ui) {
193
+ function getOptionalNumberEnv(envName) {
194
+ const value = process.env[envName] ? Number(process.env[envName]) : undefined;
195
+ if (value !== undefined && Number.isNaN(value)) {
196
+ throw new Error(`Invalid ${envName} provided`);
197
+ }
198
+ return value;
199
+ }
200
+ async function createMnemonicProvider(client, network, ui) {
193
201
  const mnemonic = process.env.WALLET_MNEMONIC ?? '';
194
202
  const walletVersion = process.env.WALLET_VERSION ?? '';
195
203
  if (mnemonic.length === 0 || walletVersion.length === 0) {
196
204
  throw new Error('Mnemonic deployer was chosen, but env variables WALLET_MNEMONIC and WALLET_VERSION are not set');
197
205
  }
206
+ const walletId = getOptionalNumberEnv('WALLET_ID');
207
+ const subwalletNumber = getOptionalNumberEnv('SUBWALLET_NUMBER');
198
208
  const keyPair = await (0, crypto_1.mnemonicToPrivateKey)(mnemonic.split(' '));
199
209
  return new MnemonicProvider_1.MnemonicProvider({
200
210
  version: walletVersion.toLowerCase(),
201
211
  client,
202
212
  secretKey: keyPair.secretKey,
203
213
  ui,
214
+ walletId,
215
+ subwalletNumber,
216
+ network,
204
217
  });
205
218
  }
206
219
  class NetworkProviderBuilder {
@@ -265,15 +278,15 @@ class NetworkProviderBuilder {
265
278
  let provider;
266
279
  switch (deployUsing) {
267
280
  case 'deeplink':
268
- provider = new DeeplinkProvider_1.DeeplinkProvider(this.ui);
281
+ provider = new DeeplinkProvider_1.DeeplinkProvider(network, this.ui);
269
282
  break;
270
283
  case 'tonconnect':
271
284
  if (network === 'custom')
272
285
  throw new Error('Tonkeeper cannot work with custom network.');
273
- provider = new TonConnectProvider_1.TonConnectProvider(new FSStorage_1.FSStorage(storagePath), this.ui);
286
+ provider = new TonConnectProvider_1.TonConnectProvider(new FSStorage_1.FSStorage(storagePath), this.ui, network);
274
287
  break;
275
288
  case 'mnemonic':
276
- provider = await createMnemonicProvider(client, this.ui);
289
+ provider = await createMnemonicProvider(client, network, this.ui);
277
290
  break;
278
291
  default:
279
292
  throw new Error('Unknown deploy option');
@@ -373,6 +386,7 @@ class NetworkProviderBuilder {
373
386
  }
374
387
  };
375
388
  tc = new ton_1.TonClient({
389
+ timeout: this.config?.requestTimeout,
376
390
  endpoint: network === 'mainnet'
377
391
  ? 'https://toncenter.com/api/v2/jsonRPC'
378
392
  : 'https://testnet.toncenter.com/api/v2/jsonRPC',
@@ -1,9 +1,10 @@
1
1
  import { Address, Cell, StateInit } from '@ton/core';
2
2
  import { SendProvider } from './SendProvider';
3
3
  import { UIProvider } from '../../ui/UIProvider';
4
+ import { Network } from '../Network';
4
5
  export declare class DeeplinkProvider implements SendProvider {
5
6
  #private;
6
- constructor(ui: UIProvider);
7
+ constructor(network: Network, ui: UIProvider);
7
8
  connect(): Promise<void>;
8
9
  sendTransaction(address: Address, amount: bigint, payload?: Cell, stateInit?: StateInit): Promise<void>;
9
10
  address(): Address | undefined;
@@ -13,22 +13,24 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _DeeplinkProvider_ui;
16
+ var _DeeplinkProvider_network, _DeeplinkProvider_ui;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.DeeplinkProvider = void 0;
19
19
  const core_1 = require("@ton/core");
20
20
  const utils_1 = require("../../utils");
21
21
  const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
22
22
  class DeeplinkProvider {
23
- constructor(ui) {
23
+ constructor(network, ui) {
24
+ _DeeplinkProvider_network.set(this, void 0);
24
25
  _DeeplinkProvider_ui.set(this, void 0);
26
+ __classPrivateFieldSet(this, _DeeplinkProvider_network, network, "f");
25
27
  __classPrivateFieldSet(this, _DeeplinkProvider_ui, ui, "f");
26
28
  }
27
29
  async connect() {
28
30
  return;
29
31
  }
30
32
  async sendTransaction(address, amount, payload, stateInit) {
31
- const deepLink = (0, utils_1.tonDeepLink)(address, amount, payload, stateInit ? (0, core_1.beginCell)().storeWritable((0, core_1.storeStateInit)(stateInit)).endCell() : undefined);
33
+ const deepLink = (0, utils_1.tonDeepLink)(address, amount, payload, stateInit ? (0, core_1.beginCell)().storeWritable((0, core_1.storeStateInit)(stateInit)).endCell() : undefined, __classPrivateFieldGet(this, _DeeplinkProvider_network, "f") === 'testnet');
32
34
  try {
33
35
  __classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").write('\n');
34
36
  qrcode_terminal_1.default.generate(deepLink, { small: true }, (qr) => __classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").write(qr));
@@ -52,4 +54,4 @@ class DeeplinkProvider {
52
54
  }
53
55
  }
54
56
  exports.DeeplinkProvider = DeeplinkProvider;
55
- _DeeplinkProvider_ui = new WeakMap();
57
+ _DeeplinkProvider_network = new WeakMap(), _DeeplinkProvider_ui = new WeakMap();
@@ -2,17 +2,24 @@ import { Address, Cell, StateInit } from '@ton/core';
2
2
  import { SendProvider } from './SendProvider';
3
3
  import { UIProvider } from '../../ui/UIProvider';
4
4
  import { BlueprintTonClient } from '../NetworkProvider';
5
+ import { Network } from '../Network';
5
6
  export type WalletVersion = 'v1r1' | 'v1r2' | 'v1r3' | 'v2r1' | 'v2r2' | 'v3r1' | 'v3r2' | 'v4' | 'v5r1';
7
+ type MnemonicProviderParams = {
8
+ version: WalletVersion;
9
+ workchain?: number;
10
+ walletId?: number;
11
+ subwalletNumber?: number;
12
+ secretKey: Buffer;
13
+ client: BlueprintTonClient;
14
+ ui: UIProvider;
15
+ network: Network;
16
+ };
6
17
  export declare class MnemonicProvider implements SendProvider {
7
18
  #private;
8
- constructor(params: {
9
- version: WalletVersion;
10
- workchain?: number;
11
- secretKey: Buffer;
12
- client: BlueprintTonClient;
13
- ui: UIProvider;
14
- });
19
+ constructor(params: MnemonicProviderParams);
20
+ private createWallet;
15
21
  connect(): Promise<void>;
16
22
  sendTransaction(address: Address, amount: bigint, payload?: Cell | undefined, stateInit?: StateInit | undefined): Promise<void>;
17
23
  address(): Address;
18
24
  }
25
+ export {};
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _MnemonicProvider_wallet, _MnemonicProvider_secretKey, _MnemonicProvider_client, _MnemonicProvider_ui;
13
+ var _MnemonicProvider_wallet, _MnemonicProvider_secretKey, _MnemonicProvider_client, _MnemonicProvider_ui, _MnemonicProvider_network;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.MnemonicProvider = void 0;
16
16
  const ton_1 = require("@ton/ton");
@@ -33,15 +33,14 @@ class MnemonicProvider {
33
33
  _MnemonicProvider_secretKey.set(this, void 0);
34
34
  _MnemonicProvider_client.set(this, void 0);
35
35
  _MnemonicProvider_ui.set(this, void 0);
36
+ _MnemonicProvider_network.set(this, void 0);
36
37
  if (!(params.version in wallets)) {
37
38
  throw new Error(`Unknown wallet version ${params.version}`);
38
39
  }
39
- const kp = (0, crypto_1.keyPairFromSecretKey)(params.secretKey);
40
40
  __classPrivateFieldSet(this, _MnemonicProvider_client, params.client, "f");
41
- __classPrivateFieldSet(this, _MnemonicProvider_wallet, (0, core_1.openContract)(wallets[params.version].create({
42
- workchain: params.workchain ?? 0,
43
- publicKey: kp.publicKey,
44
- }), (params) => __classPrivateFieldGet(this, _MnemonicProvider_client, "f").provider(params.address, params.init && {
41
+ __classPrivateFieldSet(this, _MnemonicProvider_network, params.network, "f");
42
+ const kp = (0, crypto_1.keyPairFromSecretKey)(params.secretKey);
43
+ __classPrivateFieldSet(this, _MnemonicProvider_wallet, (0, core_1.openContract)(this.createWallet(params, kp), (params) => __classPrivateFieldGet(this, _MnemonicProvider_client, "f").provider(params.address, params.init && {
45
44
  ...params.init,
46
45
  data: params.init.data ?? undefined,
47
46
  code: params.init.code ?? undefined,
@@ -49,8 +48,29 @@ class MnemonicProvider {
49
48
  __classPrivateFieldSet(this, _MnemonicProvider_secretKey, kp.secretKey, "f");
50
49
  __classPrivateFieldSet(this, _MnemonicProvider_ui, params.ui, "f");
51
50
  }
51
+ createWallet(params, kp) {
52
+ if (params.version === 'v5r1') {
53
+ return wallets[params.version].create({
54
+ publicKey: kp.publicKey,
55
+ walletId: {
56
+ networkGlobalId: params.network === 'testnet' ? -3 : -239, // networkGlobalId: -3 for Testnet, -239 for Mainnet
57
+ context: {
58
+ workchain: params.workchain ?? 0,
59
+ subwalletNumber: params.subwalletNumber ?? 0,
60
+ walletVersion: 'v5r1',
61
+ },
62
+ },
63
+ });
64
+ }
65
+ return wallets[params.version].create({
66
+ workchain: params.workchain ?? 0,
67
+ publicKey: kp.publicKey,
68
+ walletId: params.walletId,
69
+ });
70
+ }
52
71
  async connect() {
53
- __classPrivateFieldGet(this, _MnemonicProvider_ui, "f").write(`Connected to wallet at address: ${this.address()}\n`);
72
+ const formattedAddress = this.address().toString({ testOnly: __classPrivateFieldGet(this, _MnemonicProvider_network, "f") === 'testnet', bounceable: false });
73
+ __classPrivateFieldGet(this, _MnemonicProvider_ui, "f").write(`Connected to wallet at address: ${formattedAddress}\n`);
54
74
  }
55
75
  async sendTransaction(address, amount, payload, stateInit) {
56
76
  await __classPrivateFieldGet(this, _MnemonicProvider_wallet, "f").sendTransfer({
@@ -83,4 +103,4 @@ class MnemonicProvider {
83
103
  }
84
104
  }
85
105
  exports.MnemonicProvider = MnemonicProvider;
86
- _MnemonicProvider_wallet = new WeakMap(), _MnemonicProvider_secretKey = new WeakMap(), _MnemonicProvider_client = new WeakMap(), _MnemonicProvider_ui = new WeakMap();
106
+ _MnemonicProvider_wallet = new WeakMap(), _MnemonicProvider_secretKey = new WeakMap(), _MnemonicProvider_client = new WeakMap(), _MnemonicProvider_ui = new WeakMap(), _MnemonicProvider_network = new WeakMap();
@@ -2,9 +2,10 @@ import { Address, Cell, StateInit } from '@ton/core';
2
2
  import { SendProvider } from './SendProvider';
3
3
  import { Storage } from '../storage/Storage';
4
4
  import { UIProvider } from '../../ui/UIProvider';
5
+ import { Network } from '../Network';
5
6
  export declare class TonConnectProvider implements SendProvider {
6
7
  #private;
7
- constructor(storage: Storage, ui: UIProvider);
8
+ constructor(storage: Storage, ui: UIProvider, network: Network);
8
9
  connect(): Promise<void>;
9
10
  address(): Address | undefined;
10
11
  private connectWallet;
@@ -13,7 +13,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _TonConnectStorage_inner, _TonConnectProvider_connector, _TonConnectProvider_ui;
16
+ var _TonConnectStorage_inner, _TonConnectProvider_connector, _TonConnectProvider_ui, _TonConnectProvider_network;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.TonConnectProvider = void 0;
19
19
  const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
@@ -39,18 +39,24 @@ function isRemote(walletInfo) {
39
39
  return 'universalLink' in walletInfo && 'bridgeUrl' in walletInfo;
40
40
  }
41
41
  class TonConnectProvider {
42
- constructor(storage, ui) {
42
+ constructor(storage, ui, network) {
43
43
  _TonConnectProvider_connector.set(this, void 0);
44
44
  _TonConnectProvider_ui.set(this, void 0);
45
+ _TonConnectProvider_network.set(this, void 0);
45
46
  __classPrivateFieldSet(this, _TonConnectProvider_connector, new sdk_1.default({
46
47
  storage: new TonConnectStorage(storage),
47
48
  manifestUrl: 'https://raw.githubusercontent.com/ton-org/blueprint/main/tonconnect/manifest.json',
48
49
  }), "f");
49
50
  __classPrivateFieldSet(this, _TonConnectProvider_ui, ui, "f");
51
+ __classPrivateFieldSet(this, _TonConnectProvider_network, network, "f");
50
52
  }
51
53
  async connect() {
52
54
  await this.connectWallet();
53
- __classPrivateFieldGet(this, _TonConnectProvider_ui, "f").write(`Connected to wallet at address: ${core_1.Address.parse(__classPrivateFieldGet(this, _TonConnectProvider_connector, "f").wallet.account.address).toString()}\n`);
55
+ const formattedAddress = core_1.Address.parse(__classPrivateFieldGet(this, _TonConnectProvider_connector, "f").wallet.account.address).toString({
56
+ testOnly: __classPrivateFieldGet(this, _TonConnectProvider_network, "f") === 'testnet',
57
+ bounceable: false,
58
+ });
59
+ __classPrivateFieldGet(this, _TonConnectProvider_ui, "f").write(`Connected to wallet at address: ${formattedAddress}\n`);
54
60
  }
55
61
  address() {
56
62
  if (!__classPrivateFieldGet(this, _TonConnectProvider_connector, "f").wallet)
@@ -105,4 +111,4 @@ class TonConnectProvider {
105
111
  }
106
112
  }
107
113
  exports.TonConnectProvider = TonConnectProvider;
108
- _TonConnectProvider_connector = new WeakMap(), _TonConnectProvider_ui = new WeakMap();
114
+ _TonConnectProvider_connector = new WeakMap(), _TonConnectProvider_ui = new WeakMap(), _TonConnectProvider_network = new WeakMap();
package/dist/paths.d.ts CHANGED
@@ -12,5 +12,8 @@ export declare const BUILD_DIR: string;
12
12
  export declare const TEMP_DIR: string;
13
13
  export declare const CONTRACTS_DIR: string;
14
14
  export declare const TESTS_DIR: string;
15
+ export declare const PACKAGE_ENTRY_POINT: string;
15
16
  export declare const BLUEPRINT_CONFIG: string;
16
17
  export declare const TACT_ROOT_CONFIG: string;
18
+ export declare const TYPESCRIPT_CONFIG: string;
19
+ export declare const PACKAGE_JSON: string;