@ton/blueprint 0.10.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/CHANGELOG.md +146 -0
- package/README.md +114 -0
- package/dist/cli/build.d.ts +4 -0
- package/dist/cli/build.js +68 -0
- package/dist/cli/cli.d.ts +7 -0
- package/dist/cli/cli.js +106 -0
- package/dist/cli/create.d.ts +6 -0
- package/dist/cli/create.js +96 -0
- package/dist/cli/help.d.ts +2 -0
- package/dist/cli/help.js +55 -0
- package/dist/cli/run.d.ts +2 -0
- package/dist/cli/run.js +18 -0
- package/dist/cli/test.d.ts +2 -0
- package/dist/cli/test.js +9 -0
- package/dist/compile/CompilerConfig.d.ts +21 -0
- package/dist/compile/CompilerConfig.js +2 -0
- package/dist/compile/OverwritableVirtualFileSystem.d.ts +10 -0
- package/dist/compile/OverwritableVirtualFileSystem.js +24 -0
- package/dist/compile/compile.d.ts +14 -0
- package/dist/compile/compile.js +115 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +10 -0
- package/dist/network/NetworkProvider.d.ts +22 -0
- package/dist/network/NetworkProvider.js +2 -0
- package/dist/network/createNetworkProvider.d.ts +3 -0
- package/dist/network/createNetworkProvider.js +282 -0
- package/dist/network/send/DeeplinkProvider.d.ts +10 -0
- package/dist/network/send/DeeplinkProvider.js +44 -0
- package/dist/network/send/MnemonicProvider.d.ts +19 -0
- package/dist/network/send/MnemonicProvider.js +80 -0
- package/dist/network/send/SendProvider.d.ts +6 -0
- package/dist/network/send/SendProvider.js +2 -0
- package/dist/network/send/TonConnectProvider.d.ts +12 -0
- package/dist/network/send/TonConnectProvider.js +108 -0
- package/dist/network/send/TonHubProvider.d.ts +16 -0
- package/dist/network/send/TonHubProvider.js +110 -0
- package/dist/network/storage/FSStorage.d.ts +8 -0
- package/dist/network/storage/FSStorage.js +53 -0
- package/dist/network/storage/Storage.d.ts +18 -0
- package/dist/network/storage/Storage.js +2 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +19 -0
- package/dist/template.d.ts +4 -0
- package/dist/template.js +15 -0
- package/dist/templates/func/common/wrappers/compile.ts.template +7 -0
- package/dist/templates/func/counter/contracts/contract.fc.template +72 -0
- package/dist/templates/func/counter/scripts/deploy.ts.template +22 -0
- package/dist/templates/func/counter/scripts/increment.ts.template +38 -0
- package/dist/templates/func/counter/tests/spec.ts.template +81 -0
- package/dist/templates/func/counter/wrappers/wrapper.ts.template +67 -0
- package/dist/templates/func/empty/contracts/contract.fc.template +6 -0
- package/dist/templates/func/empty/scripts/deploy.ts.template +14 -0
- package/dist/templates/func/empty/tests/spec.ts.template +39 -0
- package/dist/templates/func/empty/wrappers/wrapper.ts.template +30 -0
- package/dist/templates/tact/common/wrappers/compile.ts.template +7 -0
- package/dist/templates/tact/common/wrappers/wrapper.ts.template +2 -0
- package/dist/templates/tact/counter/contracts/contract.tact.template +29 -0
- package/dist/templates/tact/counter/scripts/deploy.ts.template +23 -0
- package/dist/templates/tact/counter/scripts/increment.ts.template +45 -0
- package/dist/templates/tact/counter/tests/spec.ts.template +82 -0
- package/dist/templates/tact/empty/contracts/contract.tact.template +8 -0
- package/dist/templates/tact/empty/scripts/deploy.ts.template +23 -0
- package/dist/templates/tact/empty/tests/spec.ts.template +41 -0
- package/dist/ui/InquirerUIProvider.d.ts +12 -0
- package/dist/ui/InquirerUIProvider.js +70 -0
- package/dist/ui/UIProvider.d.ts +8 -0
- package/dist/ui/UIProvider.js +2 -0
- package/dist/utils.d.ts +39 -0
- package/dist/utils.js +122 -0
- package/package.json +51 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { VirtualFileSystem } from '@tact-lang/compiler';
|
|
3
|
+
export declare class OverwritableVirtualFileSystem implements VirtualFileSystem {
|
|
4
|
+
root: string;
|
|
5
|
+
overwrites: Map<string, Buffer>;
|
|
6
|
+
resolve(...path: string[]): string;
|
|
7
|
+
exists(path: string): boolean;
|
|
8
|
+
readFile(path: string): Buffer;
|
|
9
|
+
writeFile(path: string, content: string | Buffer): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OverwritableVirtualFileSystem = void 0;
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
class OverwritableVirtualFileSystem {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.root = '/';
|
|
9
|
+
this.overwrites = new Map();
|
|
10
|
+
}
|
|
11
|
+
resolve(...path) {
|
|
12
|
+
return (0, path_1.resolve)(...path);
|
|
13
|
+
}
|
|
14
|
+
exists(path) {
|
|
15
|
+
return (0, fs_1.existsSync)(path);
|
|
16
|
+
}
|
|
17
|
+
readFile(path) {
|
|
18
|
+
return this.overwrites.get(path) ?? (0, fs_1.readFileSync)(path);
|
|
19
|
+
}
|
|
20
|
+
writeFile(path, content) {
|
|
21
|
+
this.overwrites.set(path, typeof content === 'string' ? Buffer.from(content, 'utf-8') : content);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.OverwritableVirtualFileSystem = OverwritableVirtualFileSystem;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Cell } from 'ton-core';
|
|
3
|
+
export type FuncCompileResult = {
|
|
4
|
+
lang: 'func';
|
|
5
|
+
code: Cell;
|
|
6
|
+
};
|
|
7
|
+
export type TactCompileResult = {
|
|
8
|
+
lang: 'tact';
|
|
9
|
+
fs: Map<string, Buffer>;
|
|
10
|
+
code: Cell;
|
|
11
|
+
};
|
|
12
|
+
export type CompileResult = TactCompileResult | FuncCompileResult;
|
|
13
|
+
export declare function doCompile(name: string): Promise<CompileResult>;
|
|
14
|
+
export declare function compile(name: string): Promise<Cell>;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.compile = exports.doCompile = void 0;
|
|
30
|
+
const func_js_1 = require("@ton-community/func-js");
|
|
31
|
+
const fs_1 = require("fs");
|
|
32
|
+
const path_1 = __importDefault(require("path"));
|
|
33
|
+
const ton_core_1 = require("ton-core");
|
|
34
|
+
const paths_1 = require("../paths");
|
|
35
|
+
const compiler_1 = require("@tact-lang/compiler");
|
|
36
|
+
const OverwritableVirtualFileSystem_1 = require("./OverwritableVirtualFileSystem");
|
|
37
|
+
async function getCompilerConfigForContract(name) {
|
|
38
|
+
var _a;
|
|
39
|
+
require('ts-node/register');
|
|
40
|
+
const mod = await (_a = path_1.default.join(paths_1.WRAPPERS_DIR, name + '.compile.ts'), Promise.resolve().then(() => __importStar(require(_a))));
|
|
41
|
+
if (typeof mod.compile !== 'object') {
|
|
42
|
+
throw new Error(`Object 'compile' is missing`);
|
|
43
|
+
}
|
|
44
|
+
return mod.compile;
|
|
45
|
+
}
|
|
46
|
+
async function doCompileFunc(config) {
|
|
47
|
+
const cr = await (0, func_js_1.compileFunc)(config);
|
|
48
|
+
if (cr.status === 'error')
|
|
49
|
+
throw new Error(cr.message);
|
|
50
|
+
return {
|
|
51
|
+
lang: 'func',
|
|
52
|
+
code: ton_core_1.Cell.fromBase64(cr.codeBoc),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function findTactBoc(fs) {
|
|
56
|
+
let buf = undefined;
|
|
57
|
+
for (const [k, v] of fs) {
|
|
58
|
+
if (k.endsWith('.code.boc')) {
|
|
59
|
+
buf = v;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (buf === undefined) {
|
|
64
|
+
throw new Error('Could not find boc in tact compilation result');
|
|
65
|
+
}
|
|
66
|
+
return ton_core_1.Cell.fromBoc(buf)[0];
|
|
67
|
+
}
|
|
68
|
+
async function doCompileTact(config, name) {
|
|
69
|
+
const fs = new OverwritableVirtualFileSystem_1.OverwritableVirtualFileSystem();
|
|
70
|
+
const res = await (0, compiler_1.build)({
|
|
71
|
+
config: {
|
|
72
|
+
name: 'tact',
|
|
73
|
+
path: path_1.default.join(process.cwd(), config.target),
|
|
74
|
+
output: path_1.default.join(paths_1.BUILD_DIR, name),
|
|
75
|
+
},
|
|
76
|
+
stdlib: '/stdlib',
|
|
77
|
+
project: fs,
|
|
78
|
+
});
|
|
79
|
+
if (!res) {
|
|
80
|
+
throw new Error('Could not compile tact');
|
|
81
|
+
}
|
|
82
|
+
const code = findTactBoc(fs.overwrites);
|
|
83
|
+
return {
|
|
84
|
+
lang: 'tact',
|
|
85
|
+
fs: fs.overwrites,
|
|
86
|
+
code,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function doCompileInner(name, config) {
|
|
90
|
+
if (config.lang === 'tact') {
|
|
91
|
+
return await doCompileTact(config, name);
|
|
92
|
+
}
|
|
93
|
+
return await doCompileFunc({
|
|
94
|
+
targets: config.targets,
|
|
95
|
+
sources: config.sources ?? ((path) => (0, fs_1.readFileSync)(path).toString()),
|
|
96
|
+
optLevel: config.optLevel,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async function doCompile(name) {
|
|
100
|
+
const config = await getCompilerConfigForContract(name);
|
|
101
|
+
if (config.preCompileHook !== undefined) {
|
|
102
|
+
await config.preCompileHook();
|
|
103
|
+
}
|
|
104
|
+
const res = await doCompileInner(name, config);
|
|
105
|
+
if (config.postCompileHook !== undefined) {
|
|
106
|
+
await config.postCompileHook(res.code);
|
|
107
|
+
}
|
|
108
|
+
return res;
|
|
109
|
+
}
|
|
110
|
+
exports.doCompile = doCompile;
|
|
111
|
+
async function compile(name) {
|
|
112
|
+
const result = await doCompile(name);
|
|
113
|
+
return result.code;
|
|
114
|
+
}
|
|
115
|
+
exports.compile = compile;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { tonDeepLink, sleep } from './utils';
|
|
2
|
+
export { NetworkProvider } from './network/NetworkProvider';
|
|
3
|
+
export { createNetworkProvider } from './network/createNetworkProvider';
|
|
4
|
+
export { compile } from './compile/compile';
|
|
5
|
+
export { CompilerConfig } from './compile/CompilerConfig';
|
|
6
|
+
export { UIProvider } from './ui/UIProvider';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compile = exports.createNetworkProvider = exports.sleep = exports.tonDeepLink = void 0;
|
|
4
|
+
var utils_1 = require("./utils");
|
|
5
|
+
Object.defineProperty(exports, "tonDeepLink", { enumerable: true, get: function () { return utils_1.tonDeepLink; } });
|
|
6
|
+
Object.defineProperty(exports, "sleep", { enumerable: true, get: function () { return utils_1.sleep; } });
|
|
7
|
+
var createNetworkProvider_1 = require("./network/createNetworkProvider");
|
|
8
|
+
Object.defineProperty(exports, "createNetworkProvider", { enumerable: true, get: function () { return createNetworkProvider_1.createNetworkProvider; } });
|
|
9
|
+
var compile_1 = require("./compile/compile");
|
|
10
|
+
Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_1.compile; } });
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TonClient4 } from 'ton';
|
|
2
|
+
import { Address, Cell, Contract, ContractProvider, OpenedContract, Sender } from 'ton-core';
|
|
3
|
+
import { UIProvider } from '../ui/UIProvider';
|
|
4
|
+
export interface NetworkProvider {
|
|
5
|
+
network(): 'mainnet' | 'testnet';
|
|
6
|
+
sender(): Sender;
|
|
7
|
+
api(): TonClient4;
|
|
8
|
+
provider(address: Address, init?: {
|
|
9
|
+
code?: Cell;
|
|
10
|
+
data?: Cell;
|
|
11
|
+
}): ContractProvider;
|
|
12
|
+
isContractDeployed(address: Address): Promise<boolean>;
|
|
13
|
+
waitForDeploy(address: Address, attempts?: number, sleepDuration?: number): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* @deprecated
|
|
16
|
+
*
|
|
17
|
+
* Use your Contract's `sendDeploy` method (or similar) together with `waitForDeploy` instead.
|
|
18
|
+
*/
|
|
19
|
+
deploy(contract: Contract, value: bigint, body?: Cell, waitAttempts?: number): Promise<void>;
|
|
20
|
+
open<T extends Contract>(contract: T): OpenedContract<T>;
|
|
21
|
+
ui(): UIProvider;
|
|
22
|
+
}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _SendProviderSender_provider, _WrappedContractProvider_address, _WrappedContractProvider_provider, _WrappedContractProvider_init, _NetworkProviderImpl_tc, _NetworkProviderImpl_sender, _NetworkProviderImpl_network, _NetworkProviderImpl_explorer, _NetworkProviderImpl_ui;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.createNetworkProvider = void 0;
|
|
19
|
+
const utils_1 = require("../utils");
|
|
20
|
+
const arg_1 = __importDefault(require("arg"));
|
|
21
|
+
const DeeplinkProvider_1 = require("./send/DeeplinkProvider");
|
|
22
|
+
const TonConnectProvider_1 = require("./send/TonConnectProvider");
|
|
23
|
+
const TonHubProvider_1 = require("./send/TonHubProvider");
|
|
24
|
+
const ton_core_1 = require("ton-core");
|
|
25
|
+
const ton_1 = require("ton");
|
|
26
|
+
const ton_access_1 = require("@orbs-network/ton-access");
|
|
27
|
+
const FSStorage_1 = require("./storage/FSStorage");
|
|
28
|
+
const path_1 = __importDefault(require("path"));
|
|
29
|
+
const paths_1 = require("../paths");
|
|
30
|
+
const ton_crypto_1 = require("ton-crypto");
|
|
31
|
+
const MnemonicProvider_1 = require("./send/MnemonicProvider");
|
|
32
|
+
const argSpec = {
|
|
33
|
+
'--mainnet': Boolean,
|
|
34
|
+
'--testnet': Boolean,
|
|
35
|
+
'--tonconnect': Boolean,
|
|
36
|
+
'--deeplink': Boolean,
|
|
37
|
+
'--tonhub': Boolean,
|
|
38
|
+
'--mnemonic': Boolean,
|
|
39
|
+
'--tonscan': Boolean,
|
|
40
|
+
'--tonapi': Boolean,
|
|
41
|
+
'--toncx': Boolean,
|
|
42
|
+
'--dton': Boolean,
|
|
43
|
+
};
|
|
44
|
+
class SendProviderSender {
|
|
45
|
+
constructor(provider) {
|
|
46
|
+
_SendProviderSender_provider.set(this, void 0);
|
|
47
|
+
__classPrivateFieldSet(this, _SendProviderSender_provider, provider, "f");
|
|
48
|
+
this.address = provider.address();
|
|
49
|
+
}
|
|
50
|
+
async send(args) {
|
|
51
|
+
if (args.bounce !== undefined) {
|
|
52
|
+
console.warn("Warning: blueprint's Sender does not support `bounce` flag, because it is ignored by all used Sender APIs");
|
|
53
|
+
console.warn('To silence this warning, change your `bounce` flags passed to Senders to unset or undefined');
|
|
54
|
+
}
|
|
55
|
+
if (!(args.sendMode === undefined || args.sendMode == ton_core_1.SendMode.PAY_GAS_SEPARATELY)) {
|
|
56
|
+
throw new Error('Deployer sender does not support `sendMode` other than `PAY_GAS_SEPARATELY`');
|
|
57
|
+
}
|
|
58
|
+
await __classPrivateFieldGet(this, _SendProviderSender_provider, "f").sendTransaction(args.to, args.value, args.body ?? undefined, args.init ?? undefined);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
_SendProviderSender_provider = new WeakMap();
|
|
62
|
+
class WrappedContractProvider {
|
|
63
|
+
constructor(address, provider, init) {
|
|
64
|
+
_WrappedContractProvider_address.set(this, void 0);
|
|
65
|
+
_WrappedContractProvider_provider.set(this, void 0);
|
|
66
|
+
_WrappedContractProvider_init.set(this, void 0);
|
|
67
|
+
__classPrivateFieldSet(this, _WrappedContractProvider_address, address, "f");
|
|
68
|
+
__classPrivateFieldSet(this, _WrappedContractProvider_provider, provider, "f");
|
|
69
|
+
__classPrivateFieldSet(this, _WrappedContractProvider_init, init, "f");
|
|
70
|
+
}
|
|
71
|
+
async getState() {
|
|
72
|
+
return await __classPrivateFieldGet(this, _WrappedContractProvider_provider, "f").getState();
|
|
73
|
+
}
|
|
74
|
+
async get(name, args) {
|
|
75
|
+
return await __classPrivateFieldGet(this, _WrappedContractProvider_provider, "f").get(name, args);
|
|
76
|
+
}
|
|
77
|
+
async external(message) {
|
|
78
|
+
return await __classPrivateFieldGet(this, _WrappedContractProvider_provider, "f").external(message);
|
|
79
|
+
}
|
|
80
|
+
async internal(via, args) {
|
|
81
|
+
const init = __classPrivateFieldGet(this, _WrappedContractProvider_init, "f") && (await this.getState()).state.type !== 'active' ? __classPrivateFieldGet(this, _WrappedContractProvider_init, "f") : undefined;
|
|
82
|
+
return await via.send({
|
|
83
|
+
to: __classPrivateFieldGet(this, _WrappedContractProvider_address, "f"),
|
|
84
|
+
value: typeof args.value === 'string' ? (0, ton_core_1.toNano)(args.value) : args.value,
|
|
85
|
+
sendMode: args.sendMode,
|
|
86
|
+
bounce: args.bounce,
|
|
87
|
+
init,
|
|
88
|
+
body: typeof args.body === 'string' ? (0, ton_core_1.comment)(args.body) : args.body,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
_WrappedContractProvider_address = new WeakMap(), _WrappedContractProvider_provider = new WeakMap(), _WrappedContractProvider_init = new WeakMap();
|
|
93
|
+
class NetworkProviderImpl {
|
|
94
|
+
constructor(tc, sender, network, explorer, ui) {
|
|
95
|
+
_NetworkProviderImpl_tc.set(this, void 0);
|
|
96
|
+
_NetworkProviderImpl_sender.set(this, void 0);
|
|
97
|
+
_NetworkProviderImpl_network.set(this, void 0);
|
|
98
|
+
_NetworkProviderImpl_explorer.set(this, void 0);
|
|
99
|
+
_NetworkProviderImpl_ui.set(this, void 0);
|
|
100
|
+
__classPrivateFieldSet(this, _NetworkProviderImpl_tc, tc, "f");
|
|
101
|
+
__classPrivateFieldSet(this, _NetworkProviderImpl_sender, sender, "f");
|
|
102
|
+
__classPrivateFieldSet(this, _NetworkProviderImpl_network, network, "f");
|
|
103
|
+
__classPrivateFieldSet(this, _NetworkProviderImpl_explorer, explorer, "f");
|
|
104
|
+
__classPrivateFieldSet(this, _NetworkProviderImpl_ui, ui, "f");
|
|
105
|
+
}
|
|
106
|
+
network() {
|
|
107
|
+
return __classPrivateFieldGet(this, _NetworkProviderImpl_network, "f");
|
|
108
|
+
}
|
|
109
|
+
explorer() {
|
|
110
|
+
return __classPrivateFieldGet(this, _NetworkProviderImpl_explorer, "f");
|
|
111
|
+
}
|
|
112
|
+
sender() {
|
|
113
|
+
return __classPrivateFieldGet(this, _NetworkProviderImpl_sender, "f");
|
|
114
|
+
}
|
|
115
|
+
api() {
|
|
116
|
+
return __classPrivateFieldGet(this, _NetworkProviderImpl_tc, "f");
|
|
117
|
+
}
|
|
118
|
+
provider(address, init) {
|
|
119
|
+
return new WrappedContractProvider(address, __classPrivateFieldGet(this, _NetworkProviderImpl_tc, "f").provider(address, init ? { code: init.code ?? new ton_core_1.Cell(), data: init.data ?? new ton_core_1.Cell() } : undefined), init);
|
|
120
|
+
}
|
|
121
|
+
async isContractDeployed(address) {
|
|
122
|
+
return __classPrivateFieldGet(this, _NetworkProviderImpl_tc, "f").isContractDeployed((await __classPrivateFieldGet(this, _NetworkProviderImpl_tc, "f").getLastBlock()).last.seqno, address);
|
|
123
|
+
}
|
|
124
|
+
async waitForDeploy(address, attempts = 10, sleepDuration = 2000) {
|
|
125
|
+
if (attempts <= 0) {
|
|
126
|
+
throw new Error('Attempt number must be positive');
|
|
127
|
+
}
|
|
128
|
+
for (let i = 1; i <= attempts; i++) {
|
|
129
|
+
__classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").setActionPrompt(`Awaiting contract deployment... [Attempt ${i}/${attempts}]`);
|
|
130
|
+
const isDeployed = await this.isContractDeployed(address);
|
|
131
|
+
if (isDeployed) {
|
|
132
|
+
__classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").clearActionPrompt();
|
|
133
|
+
__classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").write(`Contract deployed at address ${address.toString()}`);
|
|
134
|
+
__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"))}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
await (0, utils_1.sleep)(sleepDuration);
|
|
138
|
+
}
|
|
139
|
+
__classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f").clearActionPrompt();
|
|
140
|
+
throw new Error("Contract was not deployed. Check your wallet's transactions");
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* @deprecated
|
|
144
|
+
*
|
|
145
|
+
* Use your Contract's `sendDeploy` method (or similar) together with `waitForDeploy` instead.
|
|
146
|
+
*/
|
|
147
|
+
async deploy(contract, value, body, waitAttempts = 10) {
|
|
148
|
+
const isDeployed = await this.isContractDeployed(contract.address);
|
|
149
|
+
if (isDeployed) {
|
|
150
|
+
throw new Error('Contract is already deployed!');
|
|
151
|
+
}
|
|
152
|
+
if (!contract.init) {
|
|
153
|
+
throw new Error('Contract has no init!');
|
|
154
|
+
}
|
|
155
|
+
await __classPrivateFieldGet(this, _NetworkProviderImpl_sender, "f").send({
|
|
156
|
+
to: contract.address,
|
|
157
|
+
value,
|
|
158
|
+
body,
|
|
159
|
+
init: contract.init,
|
|
160
|
+
});
|
|
161
|
+
if (waitAttempts <= 0)
|
|
162
|
+
return;
|
|
163
|
+
await this.waitForDeploy(contract.address, waitAttempts);
|
|
164
|
+
}
|
|
165
|
+
open(contract) {
|
|
166
|
+
return (0, ton_core_1.openContract)(contract, (params) => this.provider(params.address, params.init ?? undefined));
|
|
167
|
+
}
|
|
168
|
+
ui() {
|
|
169
|
+
return __classPrivateFieldGet(this, _NetworkProviderImpl_ui, "f");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
_NetworkProviderImpl_tc = new WeakMap(), _NetworkProviderImpl_sender = new WeakMap(), _NetworkProviderImpl_network = new WeakMap(), _NetworkProviderImpl_explorer = new WeakMap(), _NetworkProviderImpl_ui = new WeakMap();
|
|
173
|
+
async function createMnemonicProvider(client, ui) {
|
|
174
|
+
const mnemonic = process.env.WALLET_MNEMONIC ?? '';
|
|
175
|
+
const walletVersion = process.env.WALLET_VERSION ?? '';
|
|
176
|
+
if (mnemonic.length === 0 || walletVersion.length === 0) {
|
|
177
|
+
throw new Error('Mnemonic deployer was chosen, but env variables WALLET_MNEMONIC and WALLET_VERSION are not set');
|
|
178
|
+
}
|
|
179
|
+
const keyPair = await (0, ton_crypto_1.mnemonicToPrivateKey)(mnemonic.split(' '));
|
|
180
|
+
return new MnemonicProvider_1.MnemonicProvider({
|
|
181
|
+
version: walletVersion.toLowerCase(),
|
|
182
|
+
client,
|
|
183
|
+
secretKey: keyPair.secretKey,
|
|
184
|
+
ui,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
class NetworkProviderBuilder {
|
|
188
|
+
constructor(args, ui) {
|
|
189
|
+
this.args = args;
|
|
190
|
+
this.ui = ui;
|
|
191
|
+
}
|
|
192
|
+
async chooseNetwork() {
|
|
193
|
+
let network = (0, utils_1.oneOrZeroOf)({
|
|
194
|
+
mainnet: this.args['--mainnet'],
|
|
195
|
+
testnet: this.args['--testnet'],
|
|
196
|
+
});
|
|
197
|
+
if (!network) {
|
|
198
|
+
network = await this.ui.choose('Which network do you want to use?', ['mainnet', 'testnet'], (c) => c);
|
|
199
|
+
}
|
|
200
|
+
return network;
|
|
201
|
+
}
|
|
202
|
+
chooseExplorer() {
|
|
203
|
+
return ((0, utils_1.oneOrZeroOf)({
|
|
204
|
+
tonscan: this.args['--tonscan'],
|
|
205
|
+
tonapi: this.args['--tonapi'],
|
|
206
|
+
toncx: this.args['--toncx'],
|
|
207
|
+
dton: this.args['--dton'],
|
|
208
|
+
}) ?? 'tonscan');
|
|
209
|
+
}
|
|
210
|
+
async chooseSendProvider(network, client) {
|
|
211
|
+
let deployUsing = (0, utils_1.oneOrZeroOf)({
|
|
212
|
+
tonconnect: this.args['--tonconnect'],
|
|
213
|
+
deeplink: this.args['--deeplink'],
|
|
214
|
+
tonhub: this.args['--tonhub'],
|
|
215
|
+
mnemonic: this.args['--mnemonic'],
|
|
216
|
+
});
|
|
217
|
+
if (!deployUsing) {
|
|
218
|
+
deployUsing = (await this.ui.choose('Which wallet are you using?', [
|
|
219
|
+
{
|
|
220
|
+
name: 'TON Connect compatible mobile wallet (example: Tonkeeper)',
|
|
221
|
+
value: 'tonconnect',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
name: 'Create a ton:// deep link',
|
|
225
|
+
value: 'deeplink',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: 'Tonhub wallet',
|
|
229
|
+
value: 'tonhub',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
name: 'Mnemonic',
|
|
233
|
+
value: 'mnemonic',
|
|
234
|
+
},
|
|
235
|
+
], (c) => c.name)).value;
|
|
236
|
+
}
|
|
237
|
+
const storagePath = path_1.default.join(paths_1.TEMP_DIR, network, deployUsing + '.json');
|
|
238
|
+
let provider;
|
|
239
|
+
switch (deployUsing) {
|
|
240
|
+
case 'deeplink':
|
|
241
|
+
provider = new DeeplinkProvider_1.DeeplinkProvider(this.ui);
|
|
242
|
+
break;
|
|
243
|
+
case 'tonconnect':
|
|
244
|
+
provider = new TonConnectProvider_1.TonConnectProvider(new FSStorage_1.FSStorage(storagePath), this.ui);
|
|
245
|
+
break;
|
|
246
|
+
case 'tonhub':
|
|
247
|
+
provider = new TonHubProvider_1.TonHubProvider(network, new FSStorage_1.FSStorage(storagePath), this.ui);
|
|
248
|
+
break;
|
|
249
|
+
case 'mnemonic':
|
|
250
|
+
provider = await createMnemonicProvider(client, this.ui);
|
|
251
|
+
break;
|
|
252
|
+
default:
|
|
253
|
+
throw new Error('Unknown deploy option');
|
|
254
|
+
}
|
|
255
|
+
return provider;
|
|
256
|
+
}
|
|
257
|
+
async build() {
|
|
258
|
+
const network = await this.chooseNetwork();
|
|
259
|
+
const explorer = this.chooseExplorer();
|
|
260
|
+
const tc = new ton_1.TonClient4({
|
|
261
|
+
endpoint: await (0, ton_access_1.getHttpV4Endpoint)({ network }),
|
|
262
|
+
});
|
|
263
|
+
const sendProvider = await this.chooseSendProvider(network, tc);
|
|
264
|
+
try {
|
|
265
|
+
await sendProvider.connect();
|
|
266
|
+
}
|
|
267
|
+
catch (e) {
|
|
268
|
+
console.error('Unable to connect to wallet.');
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
this.ui.setActionPrompt('');
|
|
273
|
+
}
|
|
274
|
+
const sender = new SendProviderSender(sendProvider);
|
|
275
|
+
return new NetworkProviderImpl(tc, sender, network, explorer, this.ui);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async function createNetworkProvider(ui) {
|
|
279
|
+
const args = (0, arg_1.default)(argSpec);
|
|
280
|
+
return await new NetworkProviderBuilder(args, ui).build();
|
|
281
|
+
}
|
|
282
|
+
exports.createNetworkProvider = createNetworkProvider;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Address, Cell, StateInit } from 'ton-core';
|
|
2
|
+
import { SendProvider } from './SendProvider';
|
|
3
|
+
import { UIProvider } from '../../ui/UIProvider';
|
|
4
|
+
export declare class DeeplinkProvider implements SendProvider {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(ui: UIProvider);
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
sendTransaction(address: Address, amount: bigint, payload?: Cell, stateInit?: StateInit): Promise<void>;
|
|
9
|
+
address(): Address | undefined;
|
|
10
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _DeeplinkProvider_ui;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.DeeplinkProvider = void 0;
|
|
19
|
+
const ton_core_1 = require("ton-core");
|
|
20
|
+
const utils_1 = require("../../utils");
|
|
21
|
+
const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
|
|
22
|
+
class DeeplinkProvider {
|
|
23
|
+
constructor(ui) {
|
|
24
|
+
_DeeplinkProvider_ui.set(this, void 0);
|
|
25
|
+
__classPrivateFieldSet(this, _DeeplinkProvider_ui, ui, "f");
|
|
26
|
+
}
|
|
27
|
+
async connect() {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
async sendTransaction(address, amount, payload, stateInit) {
|
|
31
|
+
const deepLink = (0, utils_1.tonDeepLink)(address, amount, payload, stateInit ? (0, ton_core_1.beginCell)().storeWritable((0, ton_core_1.storeStateInit)(stateInit)).endCell() : undefined);
|
|
32
|
+
__classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").write('\n');
|
|
33
|
+
qrcode_terminal_1.default.generate(deepLink, { small: true }, (qr) => __classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").write(qr));
|
|
34
|
+
__classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").write('\n');
|
|
35
|
+
__classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").write(deepLink);
|
|
36
|
+
__classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").write('\nScan the QR code above, or open the ton:// link to send this transaction');
|
|
37
|
+
await __classPrivateFieldGet(this, _DeeplinkProvider_ui, "f").prompt('Press enter when transaction was issued');
|
|
38
|
+
}
|
|
39
|
+
address() {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.DeeplinkProvider = DeeplinkProvider;
|
|
44
|
+
_DeeplinkProvider_ui = new WeakMap();
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { TonClient4 } from 'ton';
|
|
3
|
+
import { Address, Cell, StateInit } from 'ton-core';
|
|
4
|
+
import { SendProvider } from './SendProvider';
|
|
5
|
+
import { UIProvider } from '../../ui/UIProvider';
|
|
6
|
+
export type WalletVersion = 'v1r1' | 'v1r2' | 'v1r3' | 'v2r1' | 'v2r2' | 'v3r1' | 'v3r2' | 'v4';
|
|
7
|
+
export declare class MnemonicProvider implements SendProvider {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(params: {
|
|
10
|
+
version: WalletVersion;
|
|
11
|
+
workchain?: number;
|
|
12
|
+
secretKey: Buffer;
|
|
13
|
+
client: TonClient4;
|
|
14
|
+
ui: UIProvider;
|
|
15
|
+
});
|
|
16
|
+
connect(): Promise<void>;
|
|
17
|
+
sendTransaction(address: Address, amount: bigint, payload?: Cell | undefined, stateInit?: StateInit | undefined): Promise<void>;
|
|
18
|
+
address(): Address;
|
|
19
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _MnemonicProvider_wallet, _MnemonicProvider_secretKey, _MnemonicProvider_client, _MnemonicProvider_ui;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MnemonicProvider = void 0;
|
|
16
|
+
const ton_1 = require("ton");
|
|
17
|
+
const ton_core_1 = require("ton-core");
|
|
18
|
+
const ton_crypto_1 = require("ton-crypto");
|
|
19
|
+
const wallets = {
|
|
20
|
+
v1r1: ton_1.WalletContractV1R1,
|
|
21
|
+
v1r2: ton_1.WalletContractV1R2,
|
|
22
|
+
v1r3: ton_1.WalletContractV1R3,
|
|
23
|
+
v2r1: ton_1.WalletContractV2R1,
|
|
24
|
+
v2r2: ton_1.WalletContractV2R2,
|
|
25
|
+
v3r1: ton_1.WalletContractV3R1,
|
|
26
|
+
v3r2: ton_1.WalletContractV3R2,
|
|
27
|
+
v4: ton_1.WalletContractV4,
|
|
28
|
+
};
|
|
29
|
+
class MnemonicProvider {
|
|
30
|
+
constructor(params) {
|
|
31
|
+
_MnemonicProvider_wallet.set(this, void 0);
|
|
32
|
+
_MnemonicProvider_secretKey.set(this, void 0);
|
|
33
|
+
_MnemonicProvider_client.set(this, void 0);
|
|
34
|
+
_MnemonicProvider_ui.set(this, void 0);
|
|
35
|
+
if (!(params.version in wallets)) {
|
|
36
|
+
throw new Error(`Unknown wallet version ${params.version}`);
|
|
37
|
+
}
|
|
38
|
+
const kp = (0, ton_crypto_1.keyPairFromSecretKey)(params.secretKey);
|
|
39
|
+
__classPrivateFieldSet(this, _MnemonicProvider_client, params.client, "f");
|
|
40
|
+
__classPrivateFieldSet(this, _MnemonicProvider_wallet, (0, ton_core_1.openContract)(wallets[params.version].create({
|
|
41
|
+
workchain: params.workchain ?? 0,
|
|
42
|
+
publicKey: kp.publicKey,
|
|
43
|
+
}), (params) => __classPrivateFieldGet(this, _MnemonicProvider_client, "f").provider(params.address, params.init)), "f");
|
|
44
|
+
__classPrivateFieldSet(this, _MnemonicProvider_secretKey, kp.secretKey, "f");
|
|
45
|
+
__classPrivateFieldSet(this, _MnemonicProvider_ui, params.ui, "f");
|
|
46
|
+
}
|
|
47
|
+
async connect() {
|
|
48
|
+
__classPrivateFieldGet(this, _MnemonicProvider_ui, "f").write(`Connected to wallet at address: ${this.address()}\n`);
|
|
49
|
+
}
|
|
50
|
+
async sendTransaction(address, amount, payload, stateInit) {
|
|
51
|
+
await __classPrivateFieldGet(this, _MnemonicProvider_wallet, "f").sendTransfer({
|
|
52
|
+
seqno: await __classPrivateFieldGet(this, _MnemonicProvider_wallet, "f").getSeqno(),
|
|
53
|
+
secretKey: __classPrivateFieldGet(this, _MnemonicProvider_secretKey, "f"),
|
|
54
|
+
messages: [
|
|
55
|
+
{
|
|
56
|
+
init: stateInit,
|
|
57
|
+
body: payload ?? new ton_core_1.Cell(),
|
|
58
|
+
info: {
|
|
59
|
+
type: 'internal',
|
|
60
|
+
ihrDisabled: true,
|
|
61
|
+
ihrFee: 0n,
|
|
62
|
+
bounce: true,
|
|
63
|
+
bounced: false,
|
|
64
|
+
dest: address,
|
|
65
|
+
value: { coins: amount },
|
|
66
|
+
forwardFee: 0n,
|
|
67
|
+
createdAt: 0,
|
|
68
|
+
createdLt: 0n,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
});
|
|
73
|
+
__classPrivateFieldGet(this, _MnemonicProvider_ui, "f").write('Sent transaction');
|
|
74
|
+
}
|
|
75
|
+
address() {
|
|
76
|
+
return __classPrivateFieldGet(this, _MnemonicProvider_wallet, "f").address;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.MnemonicProvider = MnemonicProvider;
|
|
80
|
+
_MnemonicProvider_wallet = new WeakMap(), _MnemonicProvider_secretKey = new WeakMap(), _MnemonicProvider_client = new WeakMap(), _MnemonicProvider_ui = new WeakMap();
|