@meshconnect/uwc-ton-connector 0.5.2-snapshot.ff0e2d8 → 0.5.3
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/dist/ton-connect-connector.d.ts +1 -0
- package/dist/ton-connect-connector.d.ts.map +1 -1
- package/dist/ton-connect-connector.js +15 -35
- package/dist/ton-connect-connector.js.map +1 -1
- package/package.json +3 -3
- package/src/ton-connect-connector.test.ts +114 -0
- package/src/ton-connect-connector.ts +18 -46
|
@@ -11,6 +11,7 @@ export declare class TonConnectConnector implements Connector {
|
|
|
11
11
|
private connectInFlight;
|
|
12
12
|
private abortPendingConnect;
|
|
13
13
|
private pendingConnectPromise;
|
|
14
|
+
private connectGeneration;
|
|
14
15
|
constructor(config: TonConnectConfig);
|
|
15
16
|
/** Connect to a TON wallet via HTTP Bridge (QR code / deeplink). */
|
|
16
17
|
connect(network: Network, provider?: TonConnectWalletProvider): Promise<ConnectorResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-connect-connector.d.ts","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EAExB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EAGd,MAAM,wBAAwB,CAAA;AA4B/B,qBAAa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,uBAAuB,CAEhB;IACf,OAAO,CAAC,qBAAqB,CAAiD;IAC9E,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,qBAAqB,CAAwC;
|
|
1
|
+
{"version":3,"file":"ton-connect-connector.d.ts","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EAExB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EAGd,MAAM,wBAAwB,CAAA;AA4B/B,qBAAa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,uBAAuB,CAEhB;IACf,OAAO,CAAC,qBAAqB,CAAiD;IAC9E,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,qBAAqB,CAAwC;IACrE,OAAO,CAAC,iBAAiB,CAAI;gBAEjB,MAAM,EAAE,gBAAgB;IAIpC,oEAAoE;IAC9D,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,wBAAwB,GAClC,OAAO,CAAC,eAAe,CAAC;YA6Bb,cAAc;IAkG5B,sEAAsE;IACtE,gBAAgB,IAAI,MAAM;IAO1B,iDAAiD;IAC3C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB1D,uDAAuD;IACjD,eAAe,CACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC;IA2B7B,qEAAqE;IAC/D,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOnE,yDAAyD;IACnD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,4DAA4D;IACtD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAIhB,qBAAqB;IAuEnC,OAAO,CAAC,sBAAsB;YAWhB,UAAU;IAWxB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,uBAAuB;CAQhC"}
|
|
@@ -16,6 +16,7 @@ export class TonConnectConnector {
|
|
|
16
16
|
connectInFlight = false;
|
|
17
17
|
abortPendingConnect = null;
|
|
18
18
|
pendingConnectPromise = null;
|
|
19
|
+
connectGeneration = 0;
|
|
19
20
|
constructor(config) {
|
|
20
21
|
this.config = config;
|
|
21
22
|
}
|
|
@@ -27,30 +28,25 @@ export class TonConnectConnector {
|
|
|
27
28
|
if (!provider.walletListAppName) {
|
|
28
29
|
throw new Error('walletListAppName is required — set it on TonConnectWalletProvider, or ensure the wallet has a jsBridgeKey in extensionInjectedProvider.tvm');
|
|
29
30
|
}
|
|
30
|
-
console.log('[UWC:TonConnect] connect() called', {
|
|
31
|
-
connectInFlight: this.connectInFlight,
|
|
32
|
-
hasPendingPromise: !!this.pendingConnectPromise,
|
|
33
|
-
hasSdk: !!this.sdk,
|
|
34
|
-
network: network.id,
|
|
35
|
-
wallet: provider.walletListAppName
|
|
36
|
-
});
|
|
37
31
|
if (this.connectInFlight && this.pendingConnectPromise) {
|
|
38
|
-
console.log('[UWC:TonConnect] reusing in-flight connection');
|
|
39
32
|
return this.pendingConnectPromise;
|
|
40
33
|
}
|
|
41
34
|
if (this.sdk) {
|
|
42
|
-
console.log('[UWC:TonConnect] cleaning up stale SDK before new connect');
|
|
43
35
|
await this.disconnect();
|
|
44
36
|
}
|
|
45
37
|
this.connectInFlight = true;
|
|
46
|
-
|
|
38
|
+
this.connectGeneration++;
|
|
39
|
+
const generation = this.connectGeneration;
|
|
40
|
+
const connectExecution = this.executeConnect(network, provider, generation);
|
|
47
41
|
this.pendingConnectPromise = connectExecution;
|
|
48
42
|
return connectExecution;
|
|
49
43
|
}
|
|
50
|
-
async executeConnect(network, provider) {
|
|
51
|
-
console.log('[UWC:TonConnect] executeConnect() starting');
|
|
44
|
+
async executeConnect(network, provider, generation) {
|
|
52
45
|
try {
|
|
53
46
|
const { TonConnect, toUserFriendlyAddress, UserRejectsError } = await import('@tonconnect/sdk');
|
|
47
|
+
if (this.connectGeneration !== generation) {
|
|
48
|
+
throw new Error('TON Connect connection was cancelled');
|
|
49
|
+
}
|
|
54
50
|
this.toUserFriendlyAddressFn = toUserFriendlyAddress;
|
|
55
51
|
this.UserRejectsErrorClass = UserRejectsError;
|
|
56
52
|
const resolvedManifestUrl = typeof this.config.manifestUrl === 'function'
|
|
@@ -88,9 +84,7 @@ export class TonConnectConnector {
|
|
|
88
84
|
if (!walletInfo) {
|
|
89
85
|
throw new Error(`Wallet '${provider.walletListAppName}' not found in TonConnect wallet list, or missing bridge/universalLink`);
|
|
90
86
|
}
|
|
91
|
-
console.log('[UWC:TonConnect] waiting for wallet approval via bridge');
|
|
92
87
|
const walletResult = await this.waitForWalletApproval(sdkRef, walletInfo.universalLink, walletInfo.bridgeUrl);
|
|
93
|
-
console.log('[UWC:TonConnect] wallet approved, address:', walletResult.address.slice(0, 10) + '...');
|
|
94
88
|
this.connectionURI = undefined; // URI consumed — clear before notify fires
|
|
95
89
|
const friendlyAddress = this.toUserFriendlyAddressFn
|
|
96
90
|
? toFriendlyAddress(walletResult.address, this.toUserFriendlyAddressFn)
|
|
@@ -107,14 +101,11 @@ export class TonConnectConnector {
|
|
|
107
101
|
availableAddresses
|
|
108
102
|
};
|
|
109
103
|
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
console.log('[UWC:TonConnect] executeConnect() error:', error.message);
|
|
112
|
-
throw error;
|
|
113
|
-
}
|
|
114
104
|
finally {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
105
|
+
if (this.connectGeneration === generation) {
|
|
106
|
+
this.connectInFlight = false;
|
|
107
|
+
this.pendingConnectPromise = null;
|
|
108
|
+
}
|
|
118
109
|
}
|
|
119
110
|
}
|
|
120
111
|
/** Return the connection URI generated by the last connect() call. */
|
|
@@ -152,12 +143,8 @@ export class TonConnectConnector {
|
|
|
152
143
|
const tonRequest = request;
|
|
153
144
|
const senderRawAddress = this.sdk.account?.address;
|
|
154
145
|
const txRequest = buildTonTransactionRequest(tonRequest, senderRawAddress);
|
|
155
|
-
console.log('[UWC:TonConnect] sendTransaction() called', {
|
|
156
|
-
to: tonRequest.to
|
|
157
|
-
});
|
|
158
146
|
try {
|
|
159
147
|
const result = await this.sdk.sendTransaction(txRequest);
|
|
160
|
-
console.log('[UWC:TonConnect] sendTransaction() succeeded');
|
|
161
148
|
const boc = unwrapBoc(result);
|
|
162
149
|
return bocToHash(boc);
|
|
163
150
|
}
|
|
@@ -181,11 +168,6 @@ export class TonConnectConnector {
|
|
|
181
168
|
}
|
|
182
169
|
/** Disconnect from the wallet and clean up resources. */
|
|
183
170
|
async disconnect() {
|
|
184
|
-
console.log('[UWC:TonConnect] disconnect() called', {
|
|
185
|
-
hasSdk: !!this.sdk,
|
|
186
|
-
connectInFlight: this.connectInFlight,
|
|
187
|
-
hasAbort: !!this.abortPendingConnect
|
|
188
|
-
});
|
|
189
171
|
this.abortPendingConnect?.();
|
|
190
172
|
this.abortPendingConnect = null;
|
|
191
173
|
this.pendingConnectPromise = null;
|
|
@@ -219,7 +201,6 @@ export class TonConnectConnector {
|
|
|
219
201
|
this.cleanupSdk(sdk);
|
|
220
202
|
};
|
|
221
203
|
this.abortPendingConnect = () => {
|
|
222
|
-
console.log('[UWC:TonConnect] abortPendingConnect called, settled:', settled);
|
|
223
204
|
if (settled)
|
|
224
205
|
return;
|
|
225
206
|
settled = true;
|
|
@@ -231,17 +212,15 @@ export class TonConnectConnector {
|
|
|
231
212
|
if (settled)
|
|
232
213
|
return;
|
|
233
214
|
settled = true;
|
|
215
|
+
this.abortPendingConnect = null;
|
|
234
216
|
cleanup();
|
|
235
217
|
reject(new Error('TON wallet connection timed out'));
|
|
236
218
|
}, CONNECT_TIMEOUT_MS);
|
|
237
219
|
unsubscribe = sdk.onStatusChange(wallet => {
|
|
238
|
-
console.log('[UWC:TonConnect] onStatusChange fired', {
|
|
239
|
-
settled,
|
|
240
|
-
hasAddress: !!wallet?.account?.address
|
|
241
|
-
});
|
|
242
220
|
if (settled)
|
|
243
221
|
return;
|
|
244
222
|
settled = true;
|
|
223
|
+
this.abortPendingConnect = null;
|
|
245
224
|
if (wallet?.account?.address) {
|
|
246
225
|
this.clearConnectTimeout();
|
|
247
226
|
unsubscribe();
|
|
@@ -260,6 +239,7 @@ export class TonConnectConnector {
|
|
|
260
239
|
if (settled)
|
|
261
240
|
return;
|
|
262
241
|
settled = true;
|
|
242
|
+
this.abortPendingConnect = null;
|
|
263
243
|
const errorObj = error;
|
|
264
244
|
const message = errorObj?.payload?.message ||
|
|
265
245
|
this.extractSdkErrorMessage(error) ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-connect-connector.js","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAM7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,SAAS,EACT,iBAAiB,EAClB,MAAM,yBAAyB,CAAA;AAEhC,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AASxC,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAkB;IACxB,GAAG,GAAuB,IAAI,CAAA;IAC9B,aAAa,CAAoB;IACjC,gBAAgB,GAAkB,IAAI,CAAA;IACtC,kBAAkB,GAAqB,IAAI,CAAA;IAC3C,cAAc,GAAyC,IAAI,CAAA;IAC3D,uBAAuB,GAEpB,IAAI,CAAA;IACP,qBAAqB,GAA6C,IAAI,CAAA;IACtE,eAAe,GAAG,KAAK,CAAA;IACvB,mBAAmB,GAAwB,IAAI,CAAA;IAC/C,qBAAqB,GAAoC,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"ton-connect-connector.js","sourceRoot":"","sources":["../src/ton-connect-connector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meshconnect/uwc-ton-connector",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "TON Connect connector for Universal Wallet Connector — mobile QR/URI wallet connections",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@ton/core": "^0.63.1",
|
|
20
20
|
"@tonconnect/sdk": "^3.0.5",
|
|
21
|
-
"@meshconnect/uwc-constants": "0.5.7
|
|
22
|
-
"@meshconnect/uwc-types": "0.11.1
|
|
21
|
+
"@meshconnect/uwc-constants": "0.5.7",
|
|
22
|
+
"@meshconnect/uwc-types": "0.11.1"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"typescript": "^5.9.3"
|
|
@@ -319,6 +319,38 @@ describe('TonConnectConnector', () => {
|
|
|
319
319
|
expect(mockDisconnect).toHaveBeenCalled()
|
|
320
320
|
})
|
|
321
321
|
|
|
322
|
+
it('extracts last line from multiline SDK error message', async () => {
|
|
323
|
+
mockSdkConnect.mockReturnValue('tc://uri')
|
|
324
|
+
mockDisconnect.mockResolvedValue(undefined)
|
|
325
|
+
mockOnStatusChange.mockImplementation((_callback, errorCallback) => {
|
|
326
|
+
setTimeout(
|
|
327
|
+
() =>
|
|
328
|
+
errorCallback({
|
|
329
|
+
message: 'TonConnectError\nActual error on last line'
|
|
330
|
+
}),
|
|
331
|
+
10
|
|
332
|
+
)
|
|
333
|
+
return vi.fn()
|
|
334
|
+
})
|
|
335
|
+
|
|
336
|
+
await expect(connector.connect(TON_NETWORK, PROVIDER)).rejects.toThrow(
|
|
337
|
+
'Actual error on last line'
|
|
338
|
+
)
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
it('falls back to default message when error has no payload or message', async () => {
|
|
342
|
+
mockSdkConnect.mockReturnValue('tc://uri')
|
|
343
|
+
mockDisconnect.mockResolvedValue(undefined)
|
|
344
|
+
mockOnStatusChange.mockImplementation((_callback, errorCallback) => {
|
|
345
|
+
setTimeout(() => errorCallback({}), 10)
|
|
346
|
+
return vi.fn()
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
await expect(connector.connect(TON_NETWORK, PROVIDER)).rejects.toThrow(
|
|
350
|
+
'TON wallet connection was rejected'
|
|
351
|
+
)
|
|
352
|
+
})
|
|
353
|
+
|
|
322
354
|
it('times out after 5 minutes and cleans up', async () => {
|
|
323
355
|
vi.useFakeTimers()
|
|
324
356
|
|
|
@@ -402,6 +434,72 @@ describe('TonConnectConnector', () => {
|
|
|
402
434
|
)
|
|
403
435
|
})
|
|
404
436
|
|
|
437
|
+
it('does not clear in-flight state when stale executeConnect settles after disconnect + reconnect', async () => {
|
|
438
|
+
// First connect starts but never settles (wallet doesn't approve)
|
|
439
|
+
mockOnStatusChange.mockReturnValue(vi.fn())
|
|
440
|
+
mockSdkConnect.mockReturnValue('tc://mock-uri')
|
|
441
|
+
|
|
442
|
+
const first = connector
|
|
443
|
+
.connect(TON_NETWORK, PROVIDER)
|
|
444
|
+
.catch((e: unknown) => e)
|
|
445
|
+
await new Promise(r => setTimeout(r, 0))
|
|
446
|
+
|
|
447
|
+
// Disconnect cancels first, then immediately start a second connect
|
|
448
|
+
await connector.disconnect()
|
|
449
|
+
|
|
450
|
+
// Second connect starts — should set its own in-flight state
|
|
451
|
+
simulateSuccessfulConnect()
|
|
452
|
+
mockDisconnect.mockResolvedValue(undefined)
|
|
453
|
+
|
|
454
|
+
const second = connector.connect(TON_NETWORK, PROVIDER)
|
|
455
|
+
|
|
456
|
+
// First connect's rejection settles — its finally block should NOT
|
|
457
|
+
// clear the second connect's in-flight state
|
|
458
|
+
await first
|
|
459
|
+
|
|
460
|
+
// Second connect should still resolve successfully
|
|
461
|
+
const result = await second
|
|
462
|
+
expect(result.address).toBeDefined()
|
|
463
|
+
})
|
|
464
|
+
|
|
465
|
+
it('passes walletsListSource to SDK when configured', async () => {
|
|
466
|
+
const customConnector = new TonConnectConnector({
|
|
467
|
+
manifestUrl: 'https://example.com/tonconnect-manifest.json',
|
|
468
|
+
walletsListSource: 'https://custom-wallets.example.com/list.json'
|
|
469
|
+
})
|
|
470
|
+
simulateSuccessfulConnect()
|
|
471
|
+
|
|
472
|
+
await customConnector.connect(TON_NETWORK, PROVIDER)
|
|
473
|
+
|
|
474
|
+
const sdkInstance = getLastSdkInstance()
|
|
475
|
+
expect(
|
|
476
|
+
(sdkInstance as unknown as { __options: { walletsListSource: string } })
|
|
477
|
+
.__options.walletsListSource
|
|
478
|
+
).toBe('https://custom-wallets.example.com/list.json')
|
|
479
|
+
})
|
|
480
|
+
|
|
481
|
+
it('cancels stale executeConnect if generation changes during setup', async () => {
|
|
482
|
+
mockOnStatusChange.mockReturnValue(vi.fn())
|
|
483
|
+
mockSdkConnect.mockReturnValue('tc://mock-uri')
|
|
484
|
+
|
|
485
|
+
const first = connector
|
|
486
|
+
.connect(TON_NETWORK, PROVIDER)
|
|
487
|
+
.catch((e: unknown) => e)
|
|
488
|
+
await new Promise(r => setTimeout(r, 0))
|
|
489
|
+
|
|
490
|
+
// disconnect increments generation indirectly by resetting state
|
|
491
|
+
await connector.disconnect()
|
|
492
|
+
|
|
493
|
+
// Start new connect
|
|
494
|
+
simulateSuccessfulConnect()
|
|
495
|
+
const result = await connector.connect(TON_NETWORK, PROVIDER)
|
|
496
|
+
expect(result.address).toBeDefined()
|
|
497
|
+
|
|
498
|
+
// First should have been cancelled
|
|
499
|
+
const firstResult = await first
|
|
500
|
+
expect(firstResult).toBeInstanceOf(Error)
|
|
501
|
+
})
|
|
502
|
+
|
|
405
503
|
it('disconnects stale session from NamespacedStorage on fresh SDK', async () => {
|
|
406
504
|
setNextConnectedState(true)
|
|
407
505
|
mockDisconnect.mockResolvedValue(undefined)
|
|
@@ -593,6 +691,22 @@ describe('TonConnectConnector', () => {
|
|
|
593
691
|
expect((error as WalletConnectorError).type).toBe('rejected')
|
|
594
692
|
expect((error as WalletConnectorError).message).toContain('rejected')
|
|
595
693
|
})
|
|
694
|
+
|
|
695
|
+
it('rethrows non-UserRejectsError errors', async () => {
|
|
696
|
+
simulateSuccessfulConnect()
|
|
697
|
+
await connector.connect(TON_NETWORK, PROVIDER)
|
|
698
|
+
|
|
699
|
+
getLastSdkInstance().account = { address: '0:abc', chain: '-239' }
|
|
700
|
+
mockSendTransaction.mockRejectedValue(new Error('network timeout'))
|
|
701
|
+
|
|
702
|
+
await expect(
|
|
703
|
+
connector.sendTransaction!({
|
|
704
|
+
to: 'UQBxyz',
|
|
705
|
+
amount: '1000000000',
|
|
706
|
+
from: 'UQBabc'
|
|
707
|
+
})
|
|
708
|
+
).rejects.toThrow('network timeout')
|
|
709
|
+
})
|
|
596
710
|
})
|
|
597
711
|
|
|
598
712
|
describe('switchNetwork', () => {
|
|
@@ -53,6 +53,7 @@ export class TonConnectConnector implements Connector {
|
|
|
53
53
|
private connectInFlight = false
|
|
54
54
|
private abortPendingConnect: (() => void) | null = null
|
|
55
55
|
private pendingConnectPromise: Promise<ConnectorResult> | null = null
|
|
56
|
+
private connectGeneration = 0
|
|
56
57
|
|
|
57
58
|
constructor(config: TonConnectConfig) {
|
|
58
59
|
this.config = config
|
|
@@ -74,26 +75,18 @@ export class TonConnectConnector implements Connector {
|
|
|
74
75
|
)
|
|
75
76
|
}
|
|
76
77
|
|
|
77
|
-
console.log('[UWC:TonConnect] connect() called', {
|
|
78
|
-
connectInFlight: this.connectInFlight,
|
|
79
|
-
hasPendingPromise: !!this.pendingConnectPromise,
|
|
80
|
-
hasSdk: !!this.sdk,
|
|
81
|
-
network: network.id,
|
|
82
|
-
wallet: provider.walletListAppName
|
|
83
|
-
})
|
|
84
|
-
|
|
85
78
|
if (this.connectInFlight && this.pendingConnectPromise) {
|
|
86
|
-
console.log('[UWC:TonConnect] reusing in-flight connection')
|
|
87
79
|
return this.pendingConnectPromise
|
|
88
80
|
}
|
|
89
81
|
|
|
90
82
|
if (this.sdk) {
|
|
91
|
-
console.log('[UWC:TonConnect] cleaning up stale SDK before new connect')
|
|
92
83
|
await this.disconnect()
|
|
93
84
|
}
|
|
94
85
|
this.connectInFlight = true
|
|
86
|
+
this.connectGeneration++
|
|
95
87
|
|
|
96
|
-
const
|
|
88
|
+
const generation = this.connectGeneration
|
|
89
|
+
const connectExecution = this.executeConnect(network, provider, generation)
|
|
97
90
|
this.pendingConnectPromise = connectExecution
|
|
98
91
|
|
|
99
92
|
return connectExecution
|
|
@@ -101,12 +94,17 @@ export class TonConnectConnector implements Connector {
|
|
|
101
94
|
|
|
102
95
|
private async executeConnect(
|
|
103
96
|
network: Network,
|
|
104
|
-
provider: TonConnectWalletProvider
|
|
97
|
+
provider: TonConnectWalletProvider,
|
|
98
|
+
generation: number
|
|
105
99
|
): Promise<ConnectorResult> {
|
|
106
|
-
console.log('[UWC:TonConnect] executeConnect() starting')
|
|
107
100
|
try {
|
|
108
101
|
const { TonConnect, toUserFriendlyAddress, UserRejectsError } =
|
|
109
102
|
await import('@tonconnect/sdk')
|
|
103
|
+
|
|
104
|
+
if (this.connectGeneration !== generation) {
|
|
105
|
+
throw new Error('TON Connect connection was cancelled')
|
|
106
|
+
}
|
|
107
|
+
|
|
110
108
|
this.toUserFriendlyAddressFn = toUserFriendlyAddress
|
|
111
109
|
this.UserRejectsErrorClass = UserRejectsError
|
|
112
110
|
|
|
@@ -157,16 +155,11 @@ export class TonConnectConnector implements Connector {
|
|
|
157
155
|
)
|
|
158
156
|
}
|
|
159
157
|
|
|
160
|
-
console.log('[UWC:TonConnect] waiting for wallet approval via bridge')
|
|
161
158
|
const walletResult = await this.waitForWalletApproval(
|
|
162
159
|
sdkRef,
|
|
163
160
|
walletInfo.universalLink,
|
|
164
161
|
walletInfo.bridgeUrl
|
|
165
162
|
)
|
|
166
|
-
console.log(
|
|
167
|
-
'[UWC:TonConnect] wallet approved, address:',
|
|
168
|
-
walletResult.address.slice(0, 10) + '...'
|
|
169
|
-
)
|
|
170
163
|
this.connectionURI = undefined // URI consumed — clear before notify fires
|
|
171
164
|
|
|
172
165
|
const friendlyAddress = this.toUserFriendlyAddressFn
|
|
@@ -189,18 +182,11 @@ export class TonConnectConnector implements Connector {
|
|
|
189
182
|
: {}),
|
|
190
183
|
availableAddresses
|
|
191
184
|
}
|
|
192
|
-
} catch (error) {
|
|
193
|
-
console.log(
|
|
194
|
-
'[UWC:TonConnect] executeConnect() error:',
|
|
195
|
-
(error as Error).message
|
|
196
|
-
)
|
|
197
|
-
throw error
|
|
198
185
|
} finally {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
this.pendingConnectPromise = null
|
|
186
|
+
if (this.connectGeneration === generation) {
|
|
187
|
+
this.connectInFlight = false
|
|
188
|
+
this.pendingConnectPromise = null
|
|
189
|
+
}
|
|
204
190
|
}
|
|
205
191
|
}
|
|
206
192
|
|
|
@@ -247,12 +233,8 @@ export class TonConnectConnector implements Connector {
|
|
|
247
233
|
const senderRawAddress = this.sdk.account?.address
|
|
248
234
|
const txRequest = buildTonTransactionRequest(tonRequest, senderRawAddress)
|
|
249
235
|
|
|
250
|
-
console.log('[UWC:TonConnect] sendTransaction() called', {
|
|
251
|
-
to: tonRequest.to
|
|
252
|
-
})
|
|
253
236
|
try {
|
|
254
237
|
const result = await this.sdk.sendTransaction(txRequest)
|
|
255
|
-
console.log('[UWC:TonConnect] sendTransaction() succeeded')
|
|
256
238
|
const boc = unwrapBoc(result as string | { boc: string })
|
|
257
239
|
return bocToHash(boc)
|
|
258
240
|
} catch (error) {
|
|
@@ -279,11 +261,6 @@ export class TonConnectConnector implements Connector {
|
|
|
279
261
|
|
|
280
262
|
/** Disconnect from the wallet and clean up resources. */
|
|
281
263
|
async disconnect(): Promise<void> {
|
|
282
|
-
console.log('[UWC:TonConnect] disconnect() called', {
|
|
283
|
-
hasSdk: !!this.sdk,
|
|
284
|
-
connectInFlight: this.connectInFlight,
|
|
285
|
-
hasAbort: !!this.abortPendingConnect
|
|
286
|
-
})
|
|
287
264
|
this.abortPendingConnect?.()
|
|
288
265
|
this.abortPendingConnect = null
|
|
289
266
|
this.pendingConnectPromise = null
|
|
@@ -325,10 +302,6 @@ export class TonConnectConnector implements Connector {
|
|
|
325
302
|
}
|
|
326
303
|
|
|
327
304
|
this.abortPendingConnect = () => {
|
|
328
|
-
console.log(
|
|
329
|
-
'[UWC:TonConnect] abortPendingConnect called, settled:',
|
|
330
|
-
settled
|
|
331
|
-
)
|
|
332
305
|
if (settled) return
|
|
333
306
|
settled = true
|
|
334
307
|
this.clearConnectTimeout()
|
|
@@ -339,18 +312,16 @@ export class TonConnectConnector implements Connector {
|
|
|
339
312
|
this.connectTimeout = setTimeout(() => {
|
|
340
313
|
if (settled) return
|
|
341
314
|
settled = true
|
|
315
|
+
this.abortPendingConnect = null
|
|
342
316
|
cleanup()
|
|
343
317
|
reject(new Error('TON wallet connection timed out'))
|
|
344
318
|
}, CONNECT_TIMEOUT_MS)
|
|
345
319
|
|
|
346
320
|
unsubscribe = sdk.onStatusChange(
|
|
347
321
|
wallet => {
|
|
348
|
-
console.log('[UWC:TonConnect] onStatusChange fired', {
|
|
349
|
-
settled,
|
|
350
|
-
hasAddress: !!wallet?.account?.address
|
|
351
|
-
})
|
|
352
322
|
if (settled) return
|
|
353
323
|
settled = true
|
|
324
|
+
this.abortPendingConnect = null
|
|
354
325
|
if (wallet?.account?.address) {
|
|
355
326
|
this.clearConnectTimeout()
|
|
356
327
|
unsubscribe()
|
|
@@ -368,6 +339,7 @@ export class TonConnectConnector implements Connector {
|
|
|
368
339
|
error => {
|
|
369
340
|
if (settled) return
|
|
370
341
|
settled = true
|
|
342
|
+
this.abortPendingConnect = null
|
|
371
343
|
const errorObj = error as TonConnectErrorEvent
|
|
372
344
|
const message =
|
|
373
345
|
errorObj?.payload?.message ||
|