@ton/blueprint 0.40.0 → 0.41.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 +10 -0
- package/README.md +20 -12
- package/dist/cli/cli.js +16 -23
- package/dist/cli/constants.d.ts +7 -0
- package/dist/cli/constants.js +44 -14
- package/dist/cli/create.d.ts +2 -0
- package/dist/cli/create.js +22 -2
- package/dist/cli/rename.js +9 -2
- package/dist/cli/test.d.ts +2 -0
- package/dist/cli/test.js +11 -0
- package/dist/cli/verify.js +1 -1
- package/dist/jest/CoverageReporter.d.ts +11 -0
- package/dist/jest/CoverageReporter.js +77 -0
- package/dist/jest/coverageSetup.d.ts +1 -0
- package/dist/jest/coverageSetup.js +53 -0
- package/dist/network/Explorer.d.ts +1 -0
- package/dist/network/Explorer.js +2 -0
- package/dist/network/NetworkProvider.d.ts +6 -0
- package/dist/network/createNetworkProvider.js +52 -75
- package/dist/network/send/DeeplinkProvider.d.ts +2 -1
- package/dist/network/send/DeeplinkProvider.js +12 -27
- package/dist/network/send/MnemonicProvider.d.ts +5 -1
- package/dist/network/send/MnemonicProvider.js +13 -31
- package/dist/network/send/TonConnectProvider.d.ts +3 -1
- package/dist/network/send/TonConnectProvider.js +28 -46
- package/dist/network/storage/FSStorage.d.ts +3 -1
- package/dist/network/storage/FSStorage.js +18 -31
- package/dist/templates/tolk/empty/contracts/contract.tolk.template +1 -1
- package/dist/ui/InquirerUIProvider.d.ts +1 -1
- package/dist/ui/InquirerUIProvider.js +5 -19
- package/dist/utils/string.utils.d.ts +1 -1
- package/dist/utils/string.utils.js +6 -5
- package/dist/utils/ton.utils.d.ts +3 -2
- package/package.json +7 -6
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
-
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");
|
|
5
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
-
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");
|
|
11
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
-
};
|
|
13
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
4
|
};
|
|
16
|
-
var _SendProviderSender_provider, _SendProviderSender_lastSendResult, _WrappedContractProvider_address, _WrappedContractProvider_provider, _WrappedContractProvider_init, _WrappedContractProvider_factory, _NetworkProviderImpl_tc, _NetworkProviderImpl_sender, _NetworkProviderImpl_network, _NetworkProviderImpl_explorer, _NetworkProviderImpl_ui;
|
|
17
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
6
|
exports.argSpec = void 0;
|
|
19
7
|
exports.createNetworkProvider = createNetworkProvider;
|
|
@@ -52,12 +40,10 @@ exports.argSpec = {
|
|
|
52
40
|
};
|
|
53
41
|
class SendProviderSender {
|
|
54
42
|
get lastSendResult() {
|
|
55
|
-
return
|
|
43
|
+
return this._lastSendResult;
|
|
56
44
|
}
|
|
57
45
|
constructor(provider) {
|
|
58
|
-
|
|
59
|
-
_SendProviderSender_lastSendResult.set(this, void 0);
|
|
60
|
-
__classPrivateFieldSet(this, _SendProviderSender_provider, provider, "f");
|
|
46
|
+
this.provider = provider;
|
|
61
47
|
this.address = provider.address();
|
|
62
48
|
}
|
|
63
49
|
async send(args) {
|
|
@@ -68,34 +54,32 @@ class SendProviderSender {
|
|
|
68
54
|
if (!(args.sendMode === undefined || args.sendMode === core_1.SendMode.PAY_GAS_SEPARATELY)) {
|
|
69
55
|
throw new Error('Deployer sender does not support `sendMode` other than `PAY_GAS_SEPARATELY`');
|
|
70
56
|
}
|
|
71
|
-
|
|
57
|
+
this._lastSendResult = await this.provider.sendTransaction(args.to, args.value, args.body ?? undefined, args.init ?? undefined);
|
|
72
58
|
}
|
|
73
59
|
}
|
|
74
|
-
_SendProviderSender_provider = new WeakMap(), _SendProviderSender_lastSendResult = new WeakMap();
|
|
75
60
|
class WrappedContractProvider {
|
|
76
|
-
constructor(address, factory, init) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
__classPrivateFieldSet(this, _WrappedContractProvider_factory, factory, "f");
|
|
61
|
+
constructor(address, factory, init = null) {
|
|
62
|
+
this.address = address;
|
|
63
|
+
this.factory = factory;
|
|
64
|
+
this.init = init;
|
|
65
|
+
this.address = address;
|
|
66
|
+
this.provider = factory({ address, init });
|
|
67
|
+
this.init = init;
|
|
68
|
+
this.factory = factory;
|
|
85
69
|
}
|
|
86
70
|
async getState() {
|
|
87
|
-
return await
|
|
71
|
+
return await this.provider.getState();
|
|
88
72
|
}
|
|
89
73
|
async get(name, args) {
|
|
90
|
-
return await
|
|
74
|
+
return await this.provider.get(name, args);
|
|
91
75
|
}
|
|
92
76
|
async external(message) {
|
|
93
|
-
return await
|
|
77
|
+
return await this.provider.external(message);
|
|
94
78
|
}
|
|
95
79
|
async internal(via, args) {
|
|
96
|
-
const init =
|
|
80
|
+
const init = this.init && (await this.getState()).state.type !== 'active' ? this.init : undefined;
|
|
97
81
|
return await via.send({
|
|
98
|
-
to:
|
|
82
|
+
to: this.address,
|
|
99
83
|
value: typeof args.value === 'string' ? (0, core_1.toNano)(args.value) : args.value,
|
|
100
84
|
sendMode: args.sendMode,
|
|
101
85
|
bounce: args.bounce,
|
|
@@ -104,40 +88,34 @@ class WrappedContractProvider {
|
|
|
104
88
|
});
|
|
105
89
|
}
|
|
106
90
|
open(contract) {
|
|
107
|
-
return (0, core_1.openContract)(contract, (params) => new WrappedContractProvider(params.address,
|
|
91
|
+
return (0, core_1.openContract)(contract, (params) => new WrappedContractProvider(params.address, this.factory, params.init));
|
|
108
92
|
}
|
|
109
93
|
getTransactions(address, lt, hash, limit) {
|
|
110
|
-
return
|
|
94
|
+
return this.provider.getTransactions(address, lt, hash, limit);
|
|
111
95
|
}
|
|
112
96
|
}
|
|
113
|
-
_WrappedContractProvider_address = new WeakMap(), _WrappedContractProvider_provider = new WeakMap(), _WrappedContractProvider_init = new WeakMap(), _WrappedContractProvider_factory = new WeakMap();
|
|
114
97
|
class NetworkProviderImpl {
|
|
115
|
-
constructor(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
__classPrivateFieldSet(this, _NetworkProviderImpl_tc, tc, "f");
|
|
122
|
-
__classPrivateFieldSet(this, _NetworkProviderImpl_sender, sender, "f");
|
|
123
|
-
__classPrivateFieldSet(this, _NetworkProviderImpl_network, network, "f");
|
|
124
|
-
__classPrivateFieldSet(this, _NetworkProviderImpl_explorer, explorer, "f");
|
|
125
|
-
__classPrivateFieldSet(this, _NetworkProviderImpl_ui, ui, "f");
|
|
98
|
+
constructor(_tc, _sender, _network, _explorer, _ui) {
|
|
99
|
+
this._tc = _tc;
|
|
100
|
+
this._sender = _sender;
|
|
101
|
+
this._network = _network;
|
|
102
|
+
this._explorer = _explorer;
|
|
103
|
+
this._ui = _ui;
|
|
126
104
|
}
|
|
127
105
|
network() {
|
|
128
|
-
return
|
|
106
|
+
return this._network;
|
|
129
107
|
}
|
|
130
108
|
explorer() {
|
|
131
|
-
return
|
|
109
|
+
return this._explorer;
|
|
132
110
|
}
|
|
133
111
|
sender() {
|
|
134
|
-
return
|
|
112
|
+
return this._sender;
|
|
135
113
|
}
|
|
136
114
|
api() {
|
|
137
|
-
return
|
|
115
|
+
return this._tc;
|
|
138
116
|
}
|
|
139
117
|
provider(address, init) {
|
|
140
|
-
const factory = (params) =>
|
|
118
|
+
const factory = (params) => this._tc.provider(params.address, params.init && {
|
|
141
119
|
...params.init,
|
|
142
120
|
data: params.init.data ?? undefined,
|
|
143
121
|
code: params.init.code ?? undefined,
|
|
@@ -145,7 +123,7 @@ class NetworkProviderImpl {
|
|
|
145
123
|
return new WrappedContractProvider(address, factory, init);
|
|
146
124
|
}
|
|
147
125
|
async isContractDeployed(address) {
|
|
148
|
-
return (await
|
|
126
|
+
return (await this._tc.provider(address).getState()).state.type === 'active';
|
|
149
127
|
}
|
|
150
128
|
async getConfig(address = CONFIG_ADDRESS) {
|
|
151
129
|
const state = await this.getContractState(address);
|
|
@@ -164,29 +142,29 @@ class NetworkProviderImpl {
|
|
|
164
142
|
return (0, ton_1.parseFullConfig)(params);
|
|
165
143
|
}
|
|
166
144
|
async getContractState(address) {
|
|
167
|
-
return await
|
|
145
|
+
return await this._tc.provider(address).getState();
|
|
168
146
|
}
|
|
169
147
|
async waitForDeploy(address, attempts = 20, sleepDuration = 2000) {
|
|
170
148
|
if (attempts <= 0) {
|
|
171
149
|
throw new Error('Attempt number must be positive');
|
|
172
150
|
}
|
|
173
151
|
for (let i = 1; i <= attempts; i++) {
|
|
174
|
-
|
|
152
|
+
this._ui.setActionPrompt(`Awaiting contract deployment... [Attempt ${i}/${attempts}]`);
|
|
175
153
|
const isDeployed = await this.isContractDeployed(address);
|
|
176
154
|
if (isDeployed) {
|
|
177
|
-
const formattedAddress = address.toString({ testOnly:
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
155
|
+
const formattedAddress = address.toString({ testOnly: this._network === 'testnet' });
|
|
156
|
+
this._ui.clearActionPrompt();
|
|
157
|
+
this._ui.write(`Contract deployed at address ${formattedAddress}`);
|
|
158
|
+
this._ui.write(`You can view it at ${(0, utils_1.getExplorerLink)(formattedAddress, this._network, this._explorer)}`);
|
|
181
159
|
return;
|
|
182
160
|
}
|
|
183
161
|
await (0, utils_1.sleep)(sleepDuration);
|
|
184
162
|
}
|
|
185
|
-
|
|
163
|
+
this._ui.clearActionPrompt();
|
|
186
164
|
throw new Error("Contract was not deployed. Check your wallet's transactions");
|
|
187
165
|
}
|
|
188
166
|
obtainInMessageHash() {
|
|
189
|
-
const { lastSendResult } =
|
|
167
|
+
const { lastSendResult } = this._sender;
|
|
190
168
|
if (typeof lastSendResult === 'object' &&
|
|
191
169
|
lastSendResult !== null &&
|
|
192
170
|
'boc' in lastSendResult &&
|
|
@@ -198,10 +176,10 @@ class NetworkProviderImpl {
|
|
|
198
176
|
throw new Error('Not implemented');
|
|
199
177
|
}
|
|
200
178
|
async getLastTransactions(address) {
|
|
201
|
-
if (
|
|
202
|
-
return
|
|
179
|
+
if (this._tc instanceof ton_1.TonClient) {
|
|
180
|
+
return this._tc.getTransactions(address, { limit: 100, archival: true }); // without archival not working with tonclient
|
|
203
181
|
}
|
|
204
|
-
const provider =
|
|
182
|
+
const provider = this._tc.provider(address);
|
|
205
183
|
const { last } = await provider.getState();
|
|
206
184
|
if (!last) {
|
|
207
185
|
return [];
|
|
@@ -209,7 +187,7 @@ class NetworkProviderImpl {
|
|
|
209
187
|
return provider.getTransactions(address, last.lt, last.hash);
|
|
210
188
|
}
|
|
211
189
|
async isTransactionApplied(address, targetInMessageHash) {
|
|
212
|
-
const provider =
|
|
190
|
+
const provider = this._tc.provider(address);
|
|
213
191
|
const { last } = await provider.getState();
|
|
214
192
|
if (!last) {
|
|
215
193
|
return { isApplied: false };
|
|
@@ -237,22 +215,22 @@ class NetworkProviderImpl {
|
|
|
237
215
|
if (attempts <= 0) {
|
|
238
216
|
throw new Error('Attempt number must be positive');
|
|
239
217
|
}
|
|
240
|
-
if (!
|
|
218
|
+
if (!this._sender.address) {
|
|
241
219
|
throw new Error('Sender must have an address');
|
|
242
220
|
}
|
|
243
221
|
const inMessageHash = this.obtainInMessageHash();
|
|
244
222
|
for (let i = 1; i <= attempts; i++) {
|
|
245
|
-
|
|
246
|
-
const result = await this.isTransactionApplied(
|
|
223
|
+
this._ui.setActionPrompt(`Awaiting transaction... [Attempt ${i}/${attempts}]`);
|
|
224
|
+
const result = await this.isTransactionApplied(this._sender.address, inMessageHash);
|
|
247
225
|
if (result.isApplied) {
|
|
248
226
|
const { transaction } = result;
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
227
|
+
this._ui.clearActionPrompt();
|
|
228
|
+
this._ui.write(`Transaction ${inMessageHash.toString('hex')} successfully applied!`);
|
|
229
|
+
this._ui.write(`You can view it at ${(0, utils_1.getTransactionLink)({
|
|
252
230
|
...transaction,
|
|
253
231
|
hash: transaction.hash(),
|
|
254
|
-
address:
|
|
255
|
-
},
|
|
232
|
+
address: this._sender.address,
|
|
233
|
+
}, this._network, this._explorer)}`);
|
|
256
234
|
return;
|
|
257
235
|
}
|
|
258
236
|
await (0, utils_1.sleep)(sleepDuration);
|
|
@@ -272,7 +250,7 @@ class NetworkProviderImpl {
|
|
|
272
250
|
if (!contract.init) {
|
|
273
251
|
throw new Error('Contract has no init!');
|
|
274
252
|
}
|
|
275
|
-
await
|
|
253
|
+
await this._sender.send({
|
|
276
254
|
to: contract.address,
|
|
277
255
|
value,
|
|
278
256
|
body,
|
|
@@ -286,10 +264,9 @@ class NetworkProviderImpl {
|
|
|
286
264
|
return (0, core_1.openContract)(contract, (params) => this.provider(params.address, params.init ?? null));
|
|
287
265
|
}
|
|
288
266
|
ui() {
|
|
289
|
-
return
|
|
267
|
+
return this._ui;
|
|
290
268
|
}
|
|
291
269
|
}
|
|
292
|
-
_NetworkProviderImpl_tc = new WeakMap(), _NetworkProviderImpl_sender = new WeakMap(), _NetworkProviderImpl_network = new WeakMap(), _NetworkProviderImpl_explorer = new WeakMap(), _NetworkProviderImpl_ui = new WeakMap();
|
|
293
270
|
function getOptionalNumberEnv(envName) {
|
|
294
271
|
const value = process.env[envName] ? Number(process.env[envName]) : undefined;
|
|
295
272
|
if (value !== undefined && Number.isNaN(value)) {
|
|
@@ -3,7 +3,8 @@ import { SendProvider } from './SendProvider';
|
|
|
3
3
|
import { UIProvider } from '../../ui/UIProvider';
|
|
4
4
|
import { Network } from '../Network';
|
|
5
5
|
export declare class DeeplinkProvider implements SendProvider {
|
|
6
|
-
|
|
6
|
+
private readonly network;
|
|
7
|
+
private readonly ui;
|
|
7
8
|
constructor(network: Network, ui: UIProvider);
|
|
8
9
|
connect(): Promise<void>;
|
|
9
10
|
sendTransaction(address: Address, amount: bigint, payload?: Cell, stateInit?: StateInit): Promise<void>;
|
|
@@ -1,19 +1,7 @@
|
|
|
1
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
4
|
};
|
|
16
|
-
var _DeeplinkProvider_network, _DeeplinkProvider_ui;
|
|
17
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
6
|
exports.DeeplinkProvider = void 0;
|
|
19
7
|
const core_1 = require("@ton/core");
|
|
@@ -21,29 +9,27 @@ const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
|
|
|
21
9
|
const utils_1 = require("../../utils");
|
|
22
10
|
class DeeplinkProvider {
|
|
23
11
|
constructor(network, ui) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
__classPrivateFieldSet(this, _DeeplinkProvider_network, network, "f");
|
|
27
|
-
__classPrivateFieldSet(this, _DeeplinkProvider_ui, ui, "f");
|
|
12
|
+
this.network = network;
|
|
13
|
+
this.ui = ui;
|
|
28
14
|
}
|
|
29
15
|
async connect() {
|
|
30
16
|
return;
|
|
31
17
|
}
|
|
32
18
|
async sendTransaction(address, amount, payload, stateInit) {
|
|
33
|
-
const deepLink = (0, utils_1.tonDeepLink)(address, amount, payload, stateInit ? (0, core_1.beginCell)().storeWritable((0, core_1.storeStateInit)(stateInit)).endCell() : undefined,
|
|
19
|
+
const deepLink = (0, utils_1.tonDeepLink)(address, amount, payload, stateInit ? (0, core_1.beginCell)().storeWritable((0, core_1.storeStateInit)(stateInit)).endCell() : undefined, this.network === 'testnet');
|
|
34
20
|
try {
|
|
35
|
-
|
|
36
|
-
qrcode_terminal_1.default.generate(deepLink, { small: true }, (qr) =>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
await
|
|
21
|
+
this.ui.write('\n');
|
|
22
|
+
qrcode_terminal_1.default.generate(deepLink, { small: true }, (qr) => this.ui.write(qr));
|
|
23
|
+
this.ui.write('\n');
|
|
24
|
+
this.ui.write(deepLink);
|
|
25
|
+
this.ui.write('\nScan the QR code above, or open the ton:// link to send this transaction');
|
|
26
|
+
await this.ui.prompt('Press enter when transaction was issued');
|
|
41
27
|
}
|
|
42
28
|
catch (err) {
|
|
43
|
-
|
|
44
|
-
|
|
29
|
+
this.ui.write(deepLink);
|
|
30
|
+
this.ui.write('\n');
|
|
45
31
|
if (err instanceof Error && err.message.includes('code length overflow')) {
|
|
46
|
-
|
|
32
|
+
this.ui.write('Message is too large to be sent via QR code. Please use the ton:// link or another method.');
|
|
47
33
|
process.exit(1);
|
|
48
34
|
}
|
|
49
35
|
throw err;
|
|
@@ -54,4 +40,3 @@ class DeeplinkProvider {
|
|
|
54
40
|
}
|
|
55
41
|
}
|
|
56
42
|
exports.DeeplinkProvider = DeeplinkProvider;
|
|
57
|
-
_DeeplinkProvider_network = new WeakMap(), _DeeplinkProvider_ui = new WeakMap();
|
|
@@ -16,7 +16,11 @@ type MnemonicProviderParams = {
|
|
|
16
16
|
network: Network;
|
|
17
17
|
};
|
|
18
18
|
export declare class MnemonicProvider implements SendProvider {
|
|
19
|
-
|
|
19
|
+
private readonly wallet;
|
|
20
|
+
private readonly secretKey;
|
|
21
|
+
private readonly client;
|
|
22
|
+
private readonly ui;
|
|
23
|
+
private readonly network;
|
|
20
24
|
constructor(params: MnemonicProviderParams);
|
|
21
25
|
private createWallet;
|
|
22
26
|
connect(): Promise<void>;
|
|
@@ -1,16 +1,4 @@
|
|
|
1
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, _MnemonicProvider_network;
|
|
14
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
3
|
exports.MnemonicProvider = void 0;
|
|
16
4
|
const core_1 = require("@ton/core");
|
|
@@ -18,24 +6,19 @@ const crypto_1 = require("@ton/crypto");
|
|
|
18
6
|
const wallets_1 = require("./wallets");
|
|
19
7
|
class MnemonicProvider {
|
|
20
8
|
constructor(params) {
|
|
21
|
-
_MnemonicProvider_wallet.set(this, void 0);
|
|
22
|
-
_MnemonicProvider_secretKey.set(this, void 0);
|
|
23
|
-
_MnemonicProvider_client.set(this, void 0);
|
|
24
|
-
_MnemonicProvider_ui.set(this, void 0);
|
|
25
|
-
_MnemonicProvider_network.set(this, void 0);
|
|
26
9
|
if (!(params.version in wallets_1.wallets)) {
|
|
27
10
|
throw new Error(`Unknown wallet version ${params.version}, expected one of ${Object.keys(wallets_1.wallets).join(', ')}`);
|
|
28
11
|
}
|
|
29
|
-
|
|
30
|
-
|
|
12
|
+
this.client = params.client;
|
|
13
|
+
this.network = params.network;
|
|
31
14
|
const kp = (0, crypto_1.keyPairFromSecretKey)(params.secretKey);
|
|
32
|
-
|
|
15
|
+
this.wallet = (0, core_1.openContract)(this.createWallet(params, kp), (params) => this.client.provider(params.address, params.init && {
|
|
33
16
|
...params.init,
|
|
34
17
|
data: params.init.data ?? undefined,
|
|
35
18
|
code: params.init.code ?? undefined,
|
|
36
|
-
}))
|
|
37
|
-
|
|
38
|
-
|
|
19
|
+
}));
|
|
20
|
+
this.secretKey = kp.secretKey;
|
|
21
|
+
this.ui = params.ui;
|
|
39
22
|
}
|
|
40
23
|
createWallet(params, kp) {
|
|
41
24
|
if (params.version === 'v5r1') {
|
|
@@ -59,15 +42,15 @@ class MnemonicProvider {
|
|
|
59
42
|
}
|
|
60
43
|
async connect() {
|
|
61
44
|
const formattedAddress = this.address().toString({
|
|
62
|
-
testOnly:
|
|
45
|
+
testOnly: this.network === 'testnet',
|
|
63
46
|
bounceable: false,
|
|
64
47
|
});
|
|
65
|
-
|
|
48
|
+
this.ui.write(`Connected to wallet at address: ${formattedAddress}\n`);
|
|
66
49
|
}
|
|
67
50
|
async sendTransaction(address, amount, payload, stateInit) {
|
|
68
|
-
await
|
|
69
|
-
seqno: await
|
|
70
|
-
secretKey:
|
|
51
|
+
await this.wallet.sendTransfer({
|
|
52
|
+
seqno: await this.wallet.getSeqno(),
|
|
53
|
+
secretKey: this.secretKey,
|
|
71
54
|
messages: [
|
|
72
55
|
{
|
|
73
56
|
init: stateInit,
|
|
@@ -88,11 +71,10 @@ class MnemonicProvider {
|
|
|
88
71
|
],
|
|
89
72
|
sendMode: core_1.SendMode.PAY_GAS_SEPARATELY,
|
|
90
73
|
});
|
|
91
|
-
|
|
74
|
+
this.ui.write('Sent transaction');
|
|
92
75
|
}
|
|
93
76
|
address() {
|
|
94
|
-
return
|
|
77
|
+
return this.wallet.address;
|
|
95
78
|
}
|
|
96
79
|
}
|
|
97
80
|
exports.MnemonicProvider = MnemonicProvider;
|
|
98
|
-
_MnemonicProvider_wallet = new WeakMap(), _MnemonicProvider_secretKey = new WeakMap(), _MnemonicProvider_client = new WeakMap(), _MnemonicProvider_ui = new WeakMap(), _MnemonicProvider_network = new WeakMap();
|
|
@@ -4,7 +4,9 @@ import { Storage } from '../storage/Storage';
|
|
|
4
4
|
import { UIProvider } from '../../ui/UIProvider';
|
|
5
5
|
import { Network } from '../Network';
|
|
6
6
|
export declare class TonConnectProvider implements SendProvider {
|
|
7
|
-
|
|
7
|
+
private readonly connector;
|
|
8
|
+
private readonly ui;
|
|
9
|
+
private readonly network;
|
|
8
10
|
constructor(storage: Storage, ui: UIProvider, network: Network, manifestUrl?: string);
|
|
9
11
|
connect(): Promise<void>;
|
|
10
12
|
address(): Address | undefined;
|
|
@@ -1,19 +1,7 @@
|
|
|
1
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
4
|
};
|
|
16
|
-
var _TonConnectStorage_inner, _TonConnectProvider_connector, _TonConnectProvider_ui, _TonConnectProvider_network;
|
|
17
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
6
|
exports.TonConnectProvider = void 0;
|
|
19
7
|
const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
|
|
@@ -21,66 +9,61 @@ const sdk_1 = __importDefault(require("@tonconnect/sdk"));
|
|
|
21
9
|
const core_1 = require("@ton/core");
|
|
22
10
|
class TonConnectStorage {
|
|
23
11
|
constructor(inner) {
|
|
24
|
-
|
|
25
|
-
__classPrivateFieldSet(this, _TonConnectStorage_inner, inner, "f");
|
|
12
|
+
this.inner = inner;
|
|
26
13
|
}
|
|
27
14
|
async setItem(key, value) {
|
|
28
|
-
return await
|
|
15
|
+
return await this.inner.setItem(key, value);
|
|
29
16
|
}
|
|
30
17
|
async getItem(key) {
|
|
31
|
-
return await
|
|
18
|
+
return await this.inner.getItem(key);
|
|
32
19
|
}
|
|
33
20
|
async removeItem(key) {
|
|
34
|
-
return await
|
|
21
|
+
return await this.inner.removeItem(key);
|
|
35
22
|
}
|
|
36
23
|
}
|
|
37
|
-
_TonConnectStorage_inner = new WeakMap();
|
|
38
24
|
function isRemote(walletInfo) {
|
|
39
25
|
return 'universalLink' in walletInfo && 'bridgeUrl' in walletInfo;
|
|
40
26
|
}
|
|
41
27
|
class TonConnectProvider {
|
|
42
28
|
constructor(storage, ui, network, manifestUrl = 'https://raw.githubusercontent.com/ton-org/blueprint/main/tonconnect/manifest.json') {
|
|
43
|
-
|
|
44
|
-
_TonConnectProvider_ui.set(this, void 0);
|
|
45
|
-
_TonConnectProvider_network.set(this, void 0);
|
|
46
|
-
__classPrivateFieldSet(this, _TonConnectProvider_connector, new sdk_1.default({
|
|
29
|
+
this.connector = new sdk_1.default({
|
|
47
30
|
storage: new TonConnectStorage(storage),
|
|
48
31
|
manifestUrl,
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
|
|
32
|
+
});
|
|
33
|
+
this.ui = ui;
|
|
34
|
+
this.network = network;
|
|
52
35
|
}
|
|
53
36
|
async connect() {
|
|
54
37
|
await this.connectWallet();
|
|
55
|
-
const formattedAddress = core_1.Address.parse(
|
|
56
|
-
testOnly:
|
|
38
|
+
const formattedAddress = core_1.Address.parse(this.connector.wallet.account.address).toString({
|
|
39
|
+
testOnly: this.network === 'testnet',
|
|
57
40
|
bounceable: false,
|
|
58
41
|
});
|
|
59
|
-
|
|
42
|
+
this.ui.write(`Connected to wallet at address: ${formattedAddress}\n`);
|
|
60
43
|
}
|
|
61
44
|
address() {
|
|
62
|
-
if (!
|
|
45
|
+
if (!this.connector.wallet)
|
|
63
46
|
return undefined;
|
|
64
|
-
return core_1.Address.parse(
|
|
47
|
+
return core_1.Address.parse(this.connector.wallet.account.address);
|
|
65
48
|
}
|
|
66
49
|
async connectWallet() {
|
|
67
|
-
const wallets = (await
|
|
68
|
-
await
|
|
69
|
-
if (
|
|
50
|
+
const wallets = (await this.connector.getWallets()).filter(isRemote);
|
|
51
|
+
await this.connector.restoreConnection();
|
|
52
|
+
if (this.connector.wallet) {
|
|
70
53
|
return;
|
|
71
54
|
}
|
|
72
|
-
const wallet = await
|
|
73
|
-
|
|
74
|
-
const url =
|
|
55
|
+
const wallet = await this.ui.choose('Choose your wallet', wallets, (w) => w.name);
|
|
56
|
+
this.ui.setActionPrompt('Connecting to wallet...');
|
|
57
|
+
const url = this.connector.connect({
|
|
75
58
|
universalLink: wallet.universalLink,
|
|
76
59
|
bridgeUrl: wallet.bridgeUrl,
|
|
77
60
|
});
|
|
78
|
-
|
|
79
|
-
qrcode_terminal_1.default.generate(url, { small: true }, (qr) =>
|
|
80
|
-
|
|
81
|
-
|
|
61
|
+
this.ui.write('\n');
|
|
62
|
+
qrcode_terminal_1.default.generate(url, { small: true }, (qr) => this.ui.write(qr));
|
|
63
|
+
this.ui.write('\n' + url + '\n\n');
|
|
64
|
+
this.ui.setActionPrompt('Scan the QR code in your wallet or open the link...');
|
|
82
65
|
return new Promise((resolve, reject) => {
|
|
83
|
-
|
|
66
|
+
this.connector.onStatusChange((w) => {
|
|
84
67
|
if (w) {
|
|
85
68
|
resolve();
|
|
86
69
|
}
|
|
@@ -91,8 +74,8 @@ class TonConnectProvider {
|
|
|
91
74
|
});
|
|
92
75
|
}
|
|
93
76
|
async sendTransaction(address, amount, payload, stateInit) {
|
|
94
|
-
|
|
95
|
-
const result = await
|
|
77
|
+
this.ui.setActionPrompt('Sending transaction. Approve in your wallet...');
|
|
78
|
+
const result = await this.connector.sendTransaction({
|
|
96
79
|
validUntil: Date.now() + 5 * 60 * 1000,
|
|
97
80
|
messages: [
|
|
98
81
|
{
|
|
@@ -105,10 +88,9 @@ class TonConnectProvider {
|
|
|
105
88
|
},
|
|
106
89
|
],
|
|
107
90
|
});
|
|
108
|
-
|
|
109
|
-
|
|
91
|
+
this.ui.clearActionPrompt();
|
|
92
|
+
this.ui.write('Sent transaction');
|
|
110
93
|
return result;
|
|
111
94
|
}
|
|
112
95
|
}
|
|
113
96
|
exports.TonConnectProvider = TonConnectProvider;
|
|
114
|
-
_TonConnectProvider_connector = new WeakMap(), _TonConnectProvider_ui = new WeakMap(), _TonConnectProvider_network = new WeakMap();
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Storage } from './Storage';
|
|
2
2
|
export declare class FSStorage implements Storage {
|
|
3
|
-
|
|
3
|
+
private readonly path;
|
|
4
4
|
constructor(path: string);
|
|
5
|
+
private readObject;
|
|
6
|
+
private writeObject;
|
|
5
7
|
setItem(key: string, value: string): Promise<void>;
|
|
6
8
|
getItem(key: string): Promise<string | null>;
|
|
7
9
|
removeItem(key: string): Promise<void>;
|