@meshconnect/uwc-injected-connector 0.10.8 → 0.11.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/dist/injected-connector.d.ts.map +1 -1
- package/dist/injected-connector.js +1 -1
- package/dist/injected-connector.js.map +1 -1
- package/dist/services/ton/ton-transaction-service.d.ts.map +1 -1
- package/dist/services/ton/ton-transaction-service.js +9 -3
- package/dist/services/ton/ton-transaction-service.js.map +1 -1
- package/dist/services/ton/ton-wallet-service.d.ts +4 -1
- package/dist/services/ton/ton-wallet-service.d.ts.map +1 -1
- package/dist/services/ton/ton-wallet-service.js +38 -16
- package/dist/services/ton/ton-wallet-service.js.map +1 -1
- package/dist/utils/error-utils.d.ts.map +1 -1
- package/dist/utils/error-utils.js +5 -0
- package/dist/utils/error-utils.js.map +1 -1
- package/package.json +4 -4
- package/src/injected-connector.ts +4 -1
- package/src/services/ton/ton-transaction-service.ts +17 -3
- package/src/services/ton/ton-wallet-service.test.ts +243 -7
- package/src/services/ton/ton-wallet-service.ts +46 -14
- package/src/utils/error-utils.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injected-connector.d.ts","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAEP,yBAAyB,EACzB,iCAAiC,EACjC,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EAEjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EACjB,MAAM,wBAAwB,CAAA;AAY/B,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,qBAAqB,CAAqC;gBAGhE,aAAa,GAAE,aAAkB,EACjC,eAAe,GAAE,cAAc,EAAO,EACtC,gBAAgB,CAAC,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"injected-connector.d.ts","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAEP,yBAAyB,EACzB,iCAAiC,EACjC,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EAEjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EACjB,MAAM,wBAAwB,CAAA;AAY/B,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,qBAAqB,CAAqC;gBAGhE,aAAa,GAAE,aAAkB,EACjC,eAAe,GAAE,cAAc,EAAO,EACtC,gBAAgB,CAAC,EAAE,gBAAgB;IA8BrC;;OAEG;IACG,mBAAmB,CACvB,SAAS,EAAE,SAAS,EACpB,eAAe,GAAE,cAAc,EAAO,GACrC,OAAO,CACN,yBAAyB,EAAE,GAC3B,wBAAwB,EAAE,GAC1B,sBAAsB,EAAE,GACxB,qBAAqB,EAAE,CAC1B;IAwDD;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,eAAe,CAAC;IAyC3B;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,mBAAmB,CAAC;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,aAAa,CAAC;IAiFzB;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,yBAAyB,GAAG,iCAAiC,GACtE,OAAO,CAAC,iBAAiB,CAAC;IA+D7B;;;;OAIG;IACG,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAQ5C"}
|
|
@@ -25,7 +25,7 @@ export class InjectedConnector {
|
|
|
25
25
|
this.ethereumService = new EthereumWalletService();
|
|
26
26
|
this.solanaService = new SolanaWalletService(this.storageService);
|
|
27
27
|
this.tronService = new TronWalletService();
|
|
28
|
-
this.tonService = new TonWalletService(this.tonConnectManifestUrl);
|
|
28
|
+
this.tonService = new TonWalletService(this.tonConnectManifestUrl, tonConnectConfig?.onSessionRestored);
|
|
29
29
|
this.connectionManager = new ConnectionManager(this.ethereumService, this.solanaService, this.tronService, this.tonService);
|
|
30
30
|
this.signatureService = new SignatureService();
|
|
31
31
|
this.transactionService = new TransactionService(this.networkRpcMap);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injected-connector.js","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAEnE,MAAM,OAAO,iBAAiB;IACX,cAAc,CAAgB;IACvC,eAAe,CAAuB;IACtC,aAAa,CAAqB;IAClC,WAAW,CAAmB;IAC9B,UAAU,CAAkB;IAC5B,iBAAiB,CAAmB;IACpC,gBAAgB,CAAkB;IAClC,kBAAkB,CAAoB;IACtC,aAAa,CAAe;IAC5B,qBAAqB,CAAqC;IAElE,YACE,gBAA+B,EAAE,EACjC,kBAAoC,EAAE,EACtC,gBAAmC;QAEnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,qBAAqB,GAAG,gBAAgB,EAAE,WAAW,CAAA;QAE1D,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,qBAAqB,EAAE,CAAA;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACjE,IAAI,CAAC,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"injected-connector.js","sourceRoot":"","sources":["../src/injected-connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-transaction-service.d.ts","sourceRoot":"","sources":["../../../src/services/ton/ton-transaction-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EACnB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"ton-transaction-service.d.ts","sourceRoot":"","sources":["../../../src/services/ton/ton-transaction-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EACnB,MAAM,wBAAwB,CAAA;AAa/B;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAuB;;IAMtC;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,wBAAwB,EACjC,GAAG,EAAE,UAAU,EACf,gBAAgB,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,GAAG,IAAI,GAC1D,OAAO,CAAC,iBAAiB,CAAC;IAiB7B;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,UAAU,EACf,gBAAgB,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,GAAG,IAAI,EAC3D,eAAe,CAAC,EAAE,kBAAkB,GACnC,OAAO,CAAC,aAAa,CAAC;IAkBzB,OAAO,CAAC,aAAa;CAetB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WalletConnectorError } from '@meshconnect/uwc-types';
|
|
2
|
+
import { buildSignDataPayload, executeSignData, unwrapBoc, bocToHash, TON_CONNECT_INJECTED_STORAGE_PREFIX, withWalletResponseTimeout } from '@meshconnect/uwc-ton-connector';
|
|
2
3
|
import { extractTonSdkErrorMessage, parseError } from '../../utils/error-utils';
|
|
3
4
|
import { TonTransactionBuilder } from './ton-transaction-builder';
|
|
4
5
|
/**
|
|
@@ -15,7 +16,7 @@ export class TonTransactionService {
|
|
|
15
16
|
async sendTransaction(request, sdk, UserRejectsError) {
|
|
16
17
|
try {
|
|
17
18
|
const txRequest = this.builder.buildNativeTransfer(request, sdk.account?.address);
|
|
18
|
-
const result = await sdk.sendTransaction(txRequest);
|
|
19
|
+
const result = await withWalletResponseTimeout(sdk.sendTransaction(txRequest), TON_CONNECT_INJECTED_STORAGE_PREFIX);
|
|
19
20
|
const boc = unwrapBoc(result);
|
|
20
21
|
return await bocToHash(boc);
|
|
21
22
|
}
|
|
@@ -32,13 +33,18 @@ export class TonTransactionService {
|
|
|
32
33
|
}
|
|
33
34
|
try {
|
|
34
35
|
const payload = buildSignDataPayload(message, payloadOverride);
|
|
35
|
-
return await executeSignData(sdk, payload);
|
|
36
|
+
return await withWalletResponseTimeout(executeSignData(sdk, payload), TON_CONNECT_INJECTED_STORAGE_PREFIX);
|
|
36
37
|
}
|
|
37
38
|
catch (error) {
|
|
38
39
|
this.toWalletError(error, UserRejectsError);
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
toWalletError(error, UserRejectsError) {
|
|
43
|
+
// Already-typed connector errors (e.g. the `expired` timeout) must pass
|
|
44
|
+
// through — the normalization below would downgrade them.
|
|
45
|
+
if (error instanceof WalletConnectorError) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
42
48
|
const isRejected = UserRejectsError != null && error instanceof UserRejectsError;
|
|
43
49
|
const message = extractTonSdkErrorMessage(error) || 'TON wallet operation failed';
|
|
44
50
|
parseError({ code: isRejected ? 4001 : undefined, message });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-transaction-service.js","sourceRoot":"","sources":["../../../src/services/ton/ton-transaction-service.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,SAAS,
|
|
1
|
+
{"version":3,"file":"ton-transaction-service.js","sourceRoot":"","sources":["../../../src/services/ton/ton-transaction-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,SAAS,EACT,SAAS,EACT,mCAAmC,EACnC,yBAAyB,EAC1B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEjE;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACxB,OAAO,CAAuB;IAEtC;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAA;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,OAAiC,EACjC,GAAe,EACf,gBAA2D;QAE3D,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAChD,OAAO,EACP,GAAG,CAAC,OAAO,EAAE,OAAO,CACrB,CAAA;YACD,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAC5C,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,EAC9B,mCAAmC,CACpC,CAAA;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;YAC7B,OAAO,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,OAAe,EACf,GAAe,EACf,gBAA2D,EAC3D,eAAoC;QAEpC,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAA;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;YAC9D,OAAO,MAAM,yBAAyB,CACpC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,EAC7B,mCAAmC,CACpC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAEO,aAAa,CACnB,KAAc,EACd,gBAA2D;QAE3D,wEAAwE;QACxE,0DAA0D;QAC1D,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,MAAM,KAAK,CAAA;QACb,CAAC;QACD,MAAM,UAAU,GACd,gBAAgB,IAAI,IAAI,IAAI,KAAK,YAAY,gBAAgB,CAAA;QAC/D,MAAM,OAAO,GACX,yBAAyB,CAAC,KAAK,CAAC,IAAI,6BAA6B,CAAA;QACnE,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IAC9D,CAAC;CACF"}
|
|
@@ -6,10 +6,13 @@ export declare class TonWalletService {
|
|
|
6
6
|
private connectedJsBridgeKey;
|
|
7
7
|
private sdkInstance;
|
|
8
8
|
private manifestUrl;
|
|
9
|
+
private onSessionRestored;
|
|
9
10
|
private toUserFriendlyAddress;
|
|
10
11
|
private UserRejectsError;
|
|
11
12
|
private transactionService;
|
|
12
|
-
|
|
13
|
+
private abortPendingConnect;
|
|
14
|
+
private connectGeneration;
|
|
15
|
+
constructor(manifestUrl?: string | (() => string), onSessionRestored?: () => void);
|
|
13
16
|
initializeDiscovery(expectedWallets?: WalletMetadata[]): Promise<void>;
|
|
14
17
|
getDetectedWallets(): DetectedTonWallet[];
|
|
15
18
|
findWalletByUuid(uuid: string): DetectedTonWallet | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-wallet-service.d.ts","sourceRoot":"","sources":["../../../src/services/ton/ton-wallet-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EACnB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"ton-wallet-service.d.ts","sourceRoot":"","sources":["../../../src/services/ton/ton-wallet-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EACnB,MAAM,wBAAwB,CAAA;AAO/B,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAW3E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,qBAAqB,CAEd;IACf,OAAO,CAAC,gBAAgB,CAAiD;IACzE,OAAO,CAAC,kBAAkB,CAAuB;IAEjD,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,iBAAiB,CAAI;gBAG3B,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACrC,iBAAiB,CAAC,EAAE,MAAM,IAAI;IAO1B,mBAAmB,CAAC,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,kBAAkB,IAAI,iBAAiB,EAAE;IAIzC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;YAI/C,UAAU;IAWlB,OAAO,CACX,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAqH7C,WAAW,CACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,kBAAkB,GACnC,OAAO,CAAC,aAAa,CAAC;IAanB,eAAe,CACnB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,iBAAiB,CAAC;IAYvB,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBvD,uBAAuB,CACrB,mBAAmB,EAAE,MAAM,EAAE,EAC7B,OAAO,EAAE,MAAM,GACd,gBAAgB,EAAE;IAMrB,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,uBAAuB,IAAI,MAAM,GAAG,IAAI;IAIxC,WAAW,IAAI,OAAO;IAItB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI1C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBjC,mCAAmC,CACjC,eAAe,GAAE,cAAc,EAAO,GACrC,MAAM,EAAE;CAOZ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NamespacedStorage, toFriendlyAddress } from '@meshconnect/uwc-ton-connector';
|
|
1
|
+
import { NamespacedStorage, TON_CONNECT_INJECTED_STORAGE_PREFIX, toFriendlyAddress, tryRestoreInjectedSession } from '@meshconnect/uwc-ton-connector';
|
|
2
2
|
import { getTonWallets } from '../../ton-discovery';
|
|
3
3
|
import { extractTonSdkErrorMessage } from '../../utils/error-utils';
|
|
4
4
|
import { TonTransactionService } from './ton-transaction-service';
|
|
@@ -9,11 +9,16 @@ export class TonWalletService {
|
|
|
9
9
|
connectedJsBridgeKey = null;
|
|
10
10
|
sdkInstance = null;
|
|
11
11
|
manifestUrl;
|
|
12
|
+
onSessionRestored;
|
|
12
13
|
toUserFriendlyAddress = null;
|
|
13
14
|
UserRejectsError = null;
|
|
14
15
|
transactionService;
|
|
15
|
-
|
|
16
|
+
// Restore preflight bookkeeping — mirrors TonConnectConnector.
|
|
17
|
+
abortPendingConnect = null;
|
|
18
|
+
connectGeneration = 0;
|
|
19
|
+
constructor(manifestUrl, onSessionRestored) {
|
|
16
20
|
this.manifestUrl = manifestUrl;
|
|
21
|
+
this.onSessionRestored = onSessionRestored;
|
|
17
22
|
this.transactionService = new TonTransactionService();
|
|
18
23
|
}
|
|
19
24
|
async initializeDiscovery(expectedWallets) {
|
|
@@ -43,28 +48,40 @@ export class TonWalletService {
|
|
|
43
48
|
if (!resolvedManifestUrl) {
|
|
44
49
|
throw new Error('TON Connect manifestUrl is required. Pass tonConnectConfig to the connector.');
|
|
45
50
|
}
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
await this.cleanupSdk(this.sdkInstance);
|
|
49
|
-
}
|
|
51
|
+
// Tear down any prior SDK and abort an in-flight restore before reconnecting.
|
|
52
|
+
await this.disconnect();
|
|
50
53
|
const { TonConnect, toUserFriendlyAddress, UserRejectsError } = await import('@tonconnect/sdk');
|
|
51
54
|
this.toUserFriendlyAddress = toUserFriendlyAddress;
|
|
52
55
|
this.UserRejectsError = UserRejectsError;
|
|
53
|
-
this.
|
|
54
|
-
|
|
56
|
+
this.connectGeneration++;
|
|
57
|
+
const generation = this.connectGeneration;
|
|
58
|
+
const sdkRef = new TonConnect({
|
|
59
|
+
storage: new NamespacedStorage(TON_CONNECT_INJECTED_STORAGE_PREFIX),
|
|
55
60
|
manifestUrl: resolvedManifestUrl,
|
|
56
61
|
analytics: { mode: 'off' }
|
|
57
62
|
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
63
|
+
this.sdkInstance = sdkRef;
|
|
64
|
+
// Resume an existing injected session before a fresh handshake.
|
|
65
|
+
const restored = await tryRestoreInjectedSession({ requestedJsBridgeKey: jsBridgeKey, sdk: sdkRef, generation }, {
|
|
66
|
+
getCurrentGeneration: () => this.connectGeneration,
|
|
67
|
+
setAbortHook: fn => {
|
|
68
|
+
this.abortPendingConnect = fn;
|
|
69
|
+
},
|
|
70
|
+
toUserFriendlyAddressFn: this.toUserFriendlyAddress,
|
|
71
|
+
...(this.onSessionRestored
|
|
72
|
+
? { onSessionRestored: this.onSessionRestored }
|
|
73
|
+
: {})
|
|
74
|
+
}).catch(async (error) => {
|
|
75
|
+
await this.cleanupSdk(sdkRef);
|
|
76
|
+
throw error;
|
|
77
|
+
});
|
|
78
|
+
if (restored) {
|
|
79
|
+
this.connectedAddress = restored.address;
|
|
80
|
+
this.connectedJsBridgeKey = jsBridgeKey;
|
|
81
|
+
return restored;
|
|
65
82
|
}
|
|
83
|
+
// No prior session — fresh handshake (preflight cleaned any stale state).
|
|
66
84
|
// Listen BEFORE connect — sdk.connect() is fire-and-forget
|
|
67
|
-
const sdkRef = this.sdkInstance;
|
|
68
85
|
const walletPromise = new Promise((resolve, reject) => {
|
|
69
86
|
let settled = false;
|
|
70
87
|
const timeout = setTimeout(async () => {
|
|
@@ -168,6 +185,11 @@ export class TonWalletService {
|
|
|
168
185
|
this.connectedAddress = address;
|
|
169
186
|
}
|
|
170
187
|
async disconnect() {
|
|
188
|
+
// Advancing the generation cancels an in-flight restore still parked in its
|
|
189
|
+
// pre-hook storage read, where the abort hook isn't registered yet.
|
|
190
|
+
this.connectGeneration++;
|
|
191
|
+
this.abortPendingConnect?.();
|
|
192
|
+
this.abortPendingConnect = null;
|
|
171
193
|
if (this.sdkInstance) {
|
|
172
194
|
try {
|
|
173
195
|
await this.sdkInstance.disconnect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton-wallet-service.js","sourceRoot":"","sources":["../../../src/services/ton/ton-wallet-service.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ton-wallet-service.js","sourceRoot":"","sources":["../../../src/services/ton/ton-wallet-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-utils.d.ts","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkBhE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"error-utils.d.ts","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkBhE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CA8DhD"}
|
|
@@ -26,6 +26,11 @@ export function extractTonSdkErrorMessage(error) {
|
|
|
26
26
|
* Detects if the error is a user rejection or an unknown error
|
|
27
27
|
*/
|
|
28
28
|
export function parseError(error) {
|
|
29
|
+
// Already-typed connector errors (e.g. the `expired` timeout) must pass
|
|
30
|
+
// through — re-deriving the type here would downgrade them to 'unknown'.
|
|
31
|
+
if (error instanceof WalletConnectorError) {
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
29
34
|
let message;
|
|
30
35
|
let isRejected = false;
|
|
31
36
|
// Handle different error formats
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-utils.js","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,MAAM,GAAG,GACP,KAAK,YAAY,KAAK;QACpB,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,KAAK;YACH,OAAO,KAAK,KAAK,QAAQ;YACzB,SAAS,IAAI,KAAK;YAClB,OAAQ,KAA8B,CAAC,OAAO,KAAK,QAAQ;YAC7D,CAAC,CAAE,KAA6B,CAAC,OAAO;YACxC,CAAC,CAAC,EAAE,CAAA;IAEV,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IAEnB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IACtC,IAAI,QAAQ,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAe,CAAA;IACnB,IAAI,UAAU,GAAG,KAAK,CAAA;IAEtB,iCAAiC;IACjC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,KAAY,CAAA;QAE7B,gCAAgC;QAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAClE,UAAU,GAAG,IAAI,CAAA;QACnB,CAAC;QAED,kBAAkB;QAClB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC5B,CAAC;aAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACnC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,iBAAiB,GAAG;YACxB,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,eAAe;YACf,kBAAkB;YAClB,gBAAgB;YAChB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;YAClB,eAAe;YACf,iBAAiB;YACjB,gBAAgB;YAChB,cAAc;SACf,CAAA;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAC1C,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC5C,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAC7C,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACzC,OAAO;KACR,CAAA;IAED,MAAM,IAAI,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAC7C,CAAC"}
|
|
1
|
+
{"version":3,"file":"error-utils.js","sourceRoot":"","sources":["../../src/utils/error-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,MAAM,GAAG,GACP,KAAK,YAAY,KAAK;QACpB,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,KAAK;YACH,OAAO,KAAK,KAAK,QAAQ;YACzB,SAAS,IAAI,KAAK;YAClB,OAAQ,KAA8B,CAAC,OAAO,KAAK,QAAQ;YAC7D,CAAC,CAAE,KAA6B,CAAC,OAAO;YACxC,CAAC,CAAC,EAAE,CAAA;IAEV,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IAEnB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IACtC,IAAI,QAAQ,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,wEAAwE;IACxE,yEAAyE;IACzE,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;QAC1C,MAAM,KAAK,CAAA;IACb,CAAC;IAED,IAAI,OAAe,CAAA;IACnB,IAAI,UAAU,GAAG,KAAK,CAAA;IAEtB,iCAAiC;IACjC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,KAAY,CAAA;QAE7B,gCAAgC;QAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAClE,UAAU,GAAG,IAAI,CAAA;QACnB,CAAC;QAED,kBAAkB;QAClB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC5B,CAAC;aAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACnC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,iBAAiB,GAAG;YACxB,eAAe;YACf,aAAa;YACb,gBAAgB;YAChB,eAAe;YACf,kBAAkB;YAClB,gBAAgB;YAChB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;YAClB,eAAe;YACf,iBAAiB;YACjB,gBAAgB;YAChB,cAAc;SACf,CAAA;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAC1C,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC5C,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAC7C,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACzC,OAAO;KACR,CAAA;IAED,MAAM,IAAI,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meshconnect/uwc-injected-connector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Injected connector for Universal Wallet Connector",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"uuid": "^13.0.0",
|
|
29
29
|
"viem": "^2.44.4",
|
|
30
30
|
"@meshconnect/uwc-bridge-child": "0.2.1",
|
|
31
|
-
"@meshconnect/uwc-constants": "0.6.
|
|
32
|
-
"@meshconnect/uwc-ton-connector": "0.
|
|
33
|
-
"@meshconnect/uwc-types": "0.
|
|
31
|
+
"@meshconnect/uwc-constants": "0.6.2",
|
|
32
|
+
"@meshconnect/uwc-ton-connector": "0.6.0",
|
|
33
|
+
"@meshconnect/uwc-types": "0.13.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"typescript": "^5.9.3"
|
|
@@ -55,7 +55,10 @@ export class InjectedConnector implements Connector {
|
|
|
55
55
|
this.ethereumService = new EthereumWalletService()
|
|
56
56
|
this.solanaService = new SolanaWalletService(this.storageService)
|
|
57
57
|
this.tronService = new TronWalletService()
|
|
58
|
-
this.tonService = new TonWalletService(
|
|
58
|
+
this.tonService = new TonWalletService(
|
|
59
|
+
this.tonConnectManifestUrl,
|
|
60
|
+
tonConnectConfig?.onSessionRestored
|
|
61
|
+
)
|
|
59
62
|
this.connectionManager = new ConnectionManager(
|
|
60
63
|
this.ethereumService,
|
|
61
64
|
this.solanaService,
|
|
@@ -5,11 +5,14 @@ import type {
|
|
|
5
5
|
SignatureType,
|
|
6
6
|
TonSignDataPayload
|
|
7
7
|
} from '@meshconnect/uwc-types'
|
|
8
|
+
import { WalletConnectorError } from '@meshconnect/uwc-types'
|
|
8
9
|
import {
|
|
9
10
|
buildSignDataPayload,
|
|
10
11
|
executeSignData,
|
|
11
12
|
unwrapBoc,
|
|
12
|
-
bocToHash
|
|
13
|
+
bocToHash,
|
|
14
|
+
TON_CONNECT_INJECTED_STORAGE_PREFIX,
|
|
15
|
+
withWalletResponseTimeout
|
|
13
16
|
} from '@meshconnect/uwc-ton-connector'
|
|
14
17
|
import { extractTonSdkErrorMessage, parseError } from '../../utils/error-utils'
|
|
15
18
|
import { TonTransactionBuilder } from './ton-transaction-builder'
|
|
@@ -37,7 +40,10 @@ export class TonTransactionService {
|
|
|
37
40
|
request,
|
|
38
41
|
sdk.account?.address
|
|
39
42
|
)
|
|
40
|
-
const result = await
|
|
43
|
+
const result = await withWalletResponseTimeout(
|
|
44
|
+
sdk.sendTransaction(txRequest),
|
|
45
|
+
TON_CONNECT_INJECTED_STORAGE_PREFIX
|
|
46
|
+
)
|
|
41
47
|
const boc = unwrapBoc(result)
|
|
42
48
|
return await bocToHash(boc)
|
|
43
49
|
} catch (error) {
|
|
@@ -62,7 +68,10 @@ export class TonTransactionService {
|
|
|
62
68
|
|
|
63
69
|
try {
|
|
64
70
|
const payload = buildSignDataPayload(message, payloadOverride)
|
|
65
|
-
return await
|
|
71
|
+
return await withWalletResponseTimeout(
|
|
72
|
+
executeSignData(sdk, payload),
|
|
73
|
+
TON_CONNECT_INJECTED_STORAGE_PREFIX
|
|
74
|
+
)
|
|
66
75
|
} catch (error) {
|
|
67
76
|
this.toWalletError(error, UserRejectsError)
|
|
68
77
|
}
|
|
@@ -72,6 +81,11 @@ export class TonTransactionService {
|
|
|
72
81
|
error: unknown,
|
|
73
82
|
UserRejectsError?: (new (...args: never[]) => Error) | null
|
|
74
83
|
): never {
|
|
84
|
+
// Already-typed connector errors (e.g. the `expired` timeout) must pass
|
|
85
|
+
// through — the normalization below would downgrade them.
|
|
86
|
+
if (error instanceof WalletConnectorError) {
|
|
87
|
+
throw error
|
|
88
|
+
}
|
|
75
89
|
const isRejected =
|
|
76
90
|
UserRejectsError != null && error instanceof UserRejectsError
|
|
77
91
|
const message =
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
2
2
|
|
|
3
3
|
const {
|
|
4
4
|
mockConnect,
|
|
5
5
|
mockDisconnect,
|
|
6
6
|
mockOnStatusChange,
|
|
7
|
+
mockRestoreConnection,
|
|
7
8
|
mockSendTransaction,
|
|
8
9
|
mockSignData,
|
|
9
10
|
MockTonConnect,
|
|
@@ -13,6 +14,7 @@ const {
|
|
|
13
14
|
const mockConnect = vi.fn()
|
|
14
15
|
const mockDisconnect = vi.fn()
|
|
15
16
|
const mockOnStatusChange = vi.fn()
|
|
17
|
+
const mockRestoreConnection = vi.fn()
|
|
16
18
|
const mockSendTransaction = vi.fn()
|
|
17
19
|
const mockSignData = vi.fn()
|
|
18
20
|
|
|
@@ -32,6 +34,7 @@ const {
|
|
|
32
34
|
connect = mockConnect
|
|
33
35
|
disconnect = mockDisconnect
|
|
34
36
|
onStatusChange = mockOnStatusChange
|
|
37
|
+
restoreConnection = mockRestoreConnection
|
|
35
38
|
sendTransaction = mockSendTransaction
|
|
36
39
|
signData = mockSignData
|
|
37
40
|
__options: any
|
|
@@ -45,6 +48,7 @@ const {
|
|
|
45
48
|
mockConnect,
|
|
46
49
|
mockDisconnect,
|
|
47
50
|
mockOnStatusChange,
|
|
51
|
+
mockRestoreConnection,
|
|
48
52
|
mockSendTransaction,
|
|
49
53
|
mockSignData,
|
|
50
54
|
MockTonConnect,
|
|
@@ -71,6 +75,10 @@ vi.mock('@meshconnect/uwc-ton-connector', async () => {
|
|
|
71
75
|
})
|
|
72
76
|
|
|
73
77
|
import { TonWalletService } from './ton-wallet-service'
|
|
78
|
+
import {
|
|
79
|
+
WALLET_RESPONSE_TIMEOUT_MS,
|
|
80
|
+
NamespacedStorage
|
|
81
|
+
} from '@meshconnect/uwc-ton-connector'
|
|
74
82
|
|
|
75
83
|
async function connectService(
|
|
76
84
|
svc: TonWalletService
|
|
@@ -91,9 +99,18 @@ describe('TonWalletService', () => {
|
|
|
91
99
|
|
|
92
100
|
beforeEach(() => {
|
|
93
101
|
vi.clearAllMocks()
|
|
102
|
+
localStorage.clear()
|
|
103
|
+
// Default: restoreConnection is a no-op resolve. Individual tests can
|
|
104
|
+
// override to simulate a wallet that emits a wallet on restore.
|
|
105
|
+
mockRestoreConnection.mockResolvedValue(undefined)
|
|
94
106
|
service = new TonWalletService('https://example.com/manifest.json')
|
|
95
107
|
})
|
|
96
108
|
|
|
109
|
+
afterEach(() => {
|
|
110
|
+
// Some tests switch to fake timers; never let that leak into the next test.
|
|
111
|
+
vi.useRealTimers()
|
|
112
|
+
})
|
|
113
|
+
|
|
97
114
|
describe('connect', () => {
|
|
98
115
|
it('sets up onStatusChange listener before calling sdk.connect', async () => {
|
|
99
116
|
const callOrder: string[] = []
|
|
@@ -270,9 +287,87 @@ describe('TonWalletService', () => {
|
|
|
270
287
|
expect(mockDisconnect).toHaveBeenCalled()
|
|
271
288
|
})
|
|
272
289
|
|
|
273
|
-
it('
|
|
274
|
-
|
|
275
|
-
|
|
290
|
+
it('invokes onSessionRestored when restoration succeeds', async () => {
|
|
291
|
+
localStorage.setItem(
|
|
292
|
+
'uwc-ton-injected:ton-connect-storage_bridge-connection',
|
|
293
|
+
JSON.stringify({
|
|
294
|
+
type: 'injected',
|
|
295
|
+
jsBridgeKey: 'tonkeeper',
|
|
296
|
+
nextRpcRequestId: 0
|
|
297
|
+
})
|
|
298
|
+
)
|
|
299
|
+
mockRestoreConnection.mockResolvedValue(undefined)
|
|
300
|
+
mockOnStatusChange.mockImplementation(callback => {
|
|
301
|
+
queueMicrotask(() => callback({ account: { address: '0:abc' } }))
|
|
302
|
+
return vi.fn()
|
|
303
|
+
})
|
|
304
|
+
|
|
305
|
+
const onSessionRestored = vi.fn()
|
|
306
|
+
const restoringService = new TonWalletService(
|
|
307
|
+
'https://example.com/manifest.json',
|
|
308
|
+
onSessionRestored
|
|
309
|
+
)
|
|
310
|
+
await restoringService.connect('tonkeeper')
|
|
311
|
+
|
|
312
|
+
expect(onSessionRestored).toHaveBeenCalledTimes(1)
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
it('does not invoke onSessionRestored on a fresh handshake', async () => {
|
|
316
|
+
const onSessionRestored = vi.fn()
|
|
317
|
+
const freshService = new TonWalletService(
|
|
318
|
+
'https://example.com/manifest.json',
|
|
319
|
+
onSessionRestored
|
|
320
|
+
)
|
|
321
|
+
mockOnStatusChange.mockImplementation(callback => {
|
|
322
|
+
setTimeout(() => {
|
|
323
|
+
callback({ account: { address: 'UQBfresh' } })
|
|
324
|
+
}, 10)
|
|
325
|
+
return vi.fn()
|
|
326
|
+
})
|
|
327
|
+
mockConnect.mockResolvedValue(undefined)
|
|
328
|
+
|
|
329
|
+
await freshService.connect('tonkeeper')
|
|
330
|
+
|
|
331
|
+
expect(onSessionRestored).not.toHaveBeenCalled()
|
|
332
|
+
})
|
|
333
|
+
|
|
334
|
+
it('restores from storage without prompting when an injected session matches the requested jsBridgeKey', async () => {
|
|
335
|
+
// Seed a prior injected session in the same namespace the service uses.
|
|
336
|
+
localStorage.setItem(
|
|
337
|
+
'uwc-ton-injected:ton-connect-storage_bridge-connection',
|
|
338
|
+
JSON.stringify({
|
|
339
|
+
type: 'injected',
|
|
340
|
+
jsBridgeKey: 'tonkeeper',
|
|
341
|
+
nextRpcRequestId: 0
|
|
342
|
+
})
|
|
343
|
+
)
|
|
344
|
+
mockRestoreConnection.mockImplementation(() => Promise.resolve())
|
|
345
|
+
mockOnStatusChange.mockImplementation(callback => {
|
|
346
|
+
queueMicrotask(() =>
|
|
347
|
+
callback({ account: { address: '0:restoredHex' } })
|
|
348
|
+
)
|
|
349
|
+
return vi.fn()
|
|
350
|
+
})
|
|
351
|
+
|
|
352
|
+
const result = await service.connect('tonkeeper')
|
|
353
|
+
|
|
354
|
+
expect(result.address).toBe('UQ_converted_restored')
|
|
355
|
+
expect(mockRestoreConnection).toHaveBeenCalledTimes(1)
|
|
356
|
+
// Fresh handshake must NOT run when restore succeeds.
|
|
357
|
+
expect(mockConnect).not.toHaveBeenCalled()
|
|
358
|
+
})
|
|
359
|
+
|
|
360
|
+
it('falls through to fresh connect when stored session targets a different wallet', async () => {
|
|
361
|
+
const storageKey =
|
|
362
|
+
'uwc-ton-injected:ton-connect-storage_bridge-connection'
|
|
363
|
+
localStorage.setItem(
|
|
364
|
+
storageKey,
|
|
365
|
+
JSON.stringify({
|
|
366
|
+
type: 'injected',
|
|
367
|
+
jsBridgeKey: 'mytonwallet',
|
|
368
|
+
nextRpcRequestId: 0
|
|
369
|
+
})
|
|
370
|
+
)
|
|
276
371
|
|
|
277
372
|
mockOnStatusChange.mockImplementation(callback => {
|
|
278
373
|
setTimeout(() => {
|
|
@@ -283,10 +378,14 @@ describe('TonWalletService', () => {
|
|
|
283
378
|
mockConnect.mockResolvedValue(undefined)
|
|
284
379
|
|
|
285
380
|
const result = await service.connect('tonkeeper')
|
|
286
|
-
expect(result.address).toBe('UQBfresh')
|
|
287
|
-
expect(mockDisconnect).toHaveBeenCalled()
|
|
288
381
|
|
|
289
|
-
|
|
382
|
+
expect(result.address).toBe('UQBfresh')
|
|
383
|
+
// Preflight wipes the stale session (directly, without calling
|
|
384
|
+
// sdk.disconnect — which would throw on a fresh SDK) and the fresh
|
|
385
|
+
// handshake runs.
|
|
386
|
+
expect(localStorage.getItem(storageKey)).toBeNull()
|
|
387
|
+
expect(mockDisconnect).not.toHaveBeenCalled()
|
|
388
|
+
expect(mockConnect).toHaveBeenCalled()
|
|
290
389
|
})
|
|
291
390
|
|
|
292
391
|
it('ignores late timeout after successful connection (settled guard)', async () => {
|
|
@@ -363,6 +462,117 @@ describe('TonWalletService', () => {
|
|
|
363
462
|
|
|
364
463
|
vi.useRealTimers()
|
|
365
464
|
})
|
|
465
|
+
|
|
466
|
+
it('cleans up the freshly-created SDK and rethrows when the restore preflight throws', async () => {
|
|
467
|
+
const tonConnector = await import('@meshconnect/uwc-ton-connector')
|
|
468
|
+
const spy = vi
|
|
469
|
+
.spyOn(tonConnector, 'tryRestoreInjectedSession')
|
|
470
|
+
.mockRejectedValue(new Error('TON Connect connection was cancelled'))
|
|
471
|
+
mockDisconnect.mockResolvedValue(undefined)
|
|
472
|
+
|
|
473
|
+
await expect(service.connect('tonkeeper')).rejects.toThrow('cancelled')
|
|
474
|
+
// The SDK created for this connect must not be orphaned on a restore throw.
|
|
475
|
+
expect(mockDisconnect).toHaveBeenCalled()
|
|
476
|
+
expect(service.getAccount()).toBeNull()
|
|
477
|
+
|
|
478
|
+
spy.mockRestore()
|
|
479
|
+
})
|
|
480
|
+
|
|
481
|
+
it('aborts an in-flight restore when a newer connect starts, so the first connect rejects instead of lingering', async () => {
|
|
482
|
+
// Seed a restorable session so connect #1 enters the restore preflight.
|
|
483
|
+
localStorage.setItem(
|
|
484
|
+
'uwc-ton-injected:ton-connect-storage_bridge-connection',
|
|
485
|
+
JSON.stringify({
|
|
486
|
+
type: 'injected',
|
|
487
|
+
jsBridgeKey: 'tonkeeper',
|
|
488
|
+
nextRpcRequestId: 0
|
|
489
|
+
})
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
// Restore parks: the wallet never emits and restoreConnection never
|
|
493
|
+
// settles, so connect #1 sits in awaitRestoredAccount. That hook is
|
|
494
|
+
// registered immediately before onStatusChange subscribes, so the
|
|
495
|
+
// subscription is a deterministic "connect #1 is parked" signal —
|
|
496
|
+
// no wall-clock sleep.
|
|
497
|
+
let resolveSubscribed: () => void = () => undefined
|
|
498
|
+
const subscribed = new Promise<void>(resolve => {
|
|
499
|
+
resolveSubscribed = resolve
|
|
500
|
+
})
|
|
501
|
+
mockRestoreConnection.mockReturnValue(new Promise<void>(() => undefined))
|
|
502
|
+
mockOnStatusChange.mockImplementation(() => {
|
|
503
|
+
resolveSubscribed()
|
|
504
|
+
return vi.fn()
|
|
505
|
+
})
|
|
506
|
+
|
|
507
|
+
const connect1 = service.connect('tonkeeper')
|
|
508
|
+
const settled1 = connect1.catch((e: Error) => e)
|
|
509
|
+
await subscribed
|
|
510
|
+
|
|
511
|
+
// A second connect must abort the first BEFORE tearing down its SDK.
|
|
512
|
+
const connect2 = service.connect('tonkeeper')
|
|
513
|
+
connect2.catch(() => undefined)
|
|
514
|
+
|
|
515
|
+
const result1 = await settled1
|
|
516
|
+
expect(result1).toBeInstanceOf(Error)
|
|
517
|
+
expect((result1 as Error).message).toContain('cancelled')
|
|
518
|
+
})
|
|
519
|
+
|
|
520
|
+
it('cancels an in-flight connect when disconnect() lands during the restore storage read', async () => {
|
|
521
|
+
// Seed a restorable session so, absent cancellation, the restore SUCCEEDS
|
|
522
|
+
// — a clean, fast contrast to the cancelled rejection.
|
|
523
|
+
localStorage.setItem(
|
|
524
|
+
'uwc-ton-injected:ton-connect-storage_bridge-connection',
|
|
525
|
+
JSON.stringify({
|
|
526
|
+
type: 'injected',
|
|
527
|
+
jsBridgeKey: 'tonkeeper',
|
|
528
|
+
nextRpcRequestId: 0
|
|
529
|
+
})
|
|
530
|
+
)
|
|
531
|
+
// Restore parks on restoreConnection; the wallet emits via onStatusChange.
|
|
532
|
+
mockRestoreConnection.mockReturnValue(new Promise<void>(() => undefined))
|
|
533
|
+
mockOnStatusChange.mockImplementation(cb => {
|
|
534
|
+
setTimeout(() => cb({ account: { address: 'UQBrestored' } }), 0)
|
|
535
|
+
return vi.fn()
|
|
536
|
+
})
|
|
537
|
+
mockDisconnect.mockResolvedValue(undefined)
|
|
538
|
+
|
|
539
|
+
// Park the first storage read (the bridge-connection getItem) so
|
|
540
|
+
// disconnect() runs in the window BEFORE awaitRestoredAccount registers
|
|
541
|
+
// the abort hook — the pre-registration gap from Copilot's #151 review.
|
|
542
|
+
// disconnect() must advance the generation to cancel here.
|
|
543
|
+
let releaseRead: (value: string | null) => void = () => undefined
|
|
544
|
+
let signalEntered: () => void = () => undefined
|
|
545
|
+
const readEntered = new Promise<void>(resolve => {
|
|
546
|
+
signalEntered = resolve
|
|
547
|
+
})
|
|
548
|
+
const getItemSpy = vi
|
|
549
|
+
.spyOn(NamespacedStorage.prototype, 'getItem')
|
|
550
|
+
.mockImplementationOnce(
|
|
551
|
+
() =>
|
|
552
|
+
new Promise<string | null>(resolve => {
|
|
553
|
+
signalEntered()
|
|
554
|
+
releaseRead = resolve
|
|
555
|
+
})
|
|
556
|
+
)
|
|
557
|
+
|
|
558
|
+
const connectP = service.connect('tonkeeper').catch((e: Error) => e)
|
|
559
|
+
await readEntered
|
|
560
|
+
|
|
561
|
+
await service.disconnect()
|
|
562
|
+
releaseRead(
|
|
563
|
+
JSON.stringify({
|
|
564
|
+
type: 'injected',
|
|
565
|
+
jsBridgeKey: 'tonkeeper',
|
|
566
|
+
nextRpcRequestId: 0
|
|
567
|
+
})
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
const result = await connectP
|
|
571
|
+
expect(result).toBeInstanceOf(Error)
|
|
572
|
+
expect((result as Error).message).toContain('cancelled')
|
|
573
|
+
|
|
574
|
+
getItemSpy.mockRestore()
|
|
575
|
+
})
|
|
366
576
|
})
|
|
367
577
|
|
|
368
578
|
describe('sendTransaction', () => {
|
|
@@ -389,6 +599,32 @@ describe('TonWalletService', () => {
|
|
|
389
599
|
expect(mockSendTransaction).toHaveBeenCalled()
|
|
390
600
|
expect(result).toBe('hash_of_te6cckEBAQEA...')
|
|
391
601
|
})
|
|
602
|
+
|
|
603
|
+
it('throws expired and clears the session when the wallet never responds', async () => {
|
|
604
|
+
await connectService(service)
|
|
605
|
+
const storageKey =
|
|
606
|
+
'uwc-ton-injected:ton-connect-storage_bridge-connection'
|
|
607
|
+
localStorage.setItem(storageKey, '{"type":"injected"}')
|
|
608
|
+
|
|
609
|
+
// Session evicted mid-flight — the bridge request never resolves.
|
|
610
|
+
mockSendTransaction.mockReturnValue(new Promise<never>(() => undefined))
|
|
611
|
+
|
|
612
|
+
vi.useFakeTimers()
|
|
613
|
+
const captured = service
|
|
614
|
+
.sendTransaction({
|
|
615
|
+
to: 'UQBxyz',
|
|
616
|
+
amount: '1000000000',
|
|
617
|
+
from: 'UQBabc'
|
|
618
|
+
})
|
|
619
|
+
.catch((e: unknown) => e)
|
|
620
|
+
await vi.advanceTimersByTimeAsync(WALLET_RESPONSE_TIMEOUT_MS)
|
|
621
|
+
const error = (await captured) as { name?: string; type?: string }
|
|
622
|
+
vi.useRealTimers()
|
|
623
|
+
|
|
624
|
+
expect(error.name).toBe('WalletConnectorError')
|
|
625
|
+
expect(error.type).toBe('expired')
|
|
626
|
+
expect(localStorage.getItem(storageKey)).toBeNull()
|
|
627
|
+
})
|
|
392
628
|
})
|
|
393
629
|
|
|
394
630
|
describe('signMessage', () => {
|
|
@@ -10,7 +10,9 @@ import type {
|
|
|
10
10
|
} from '@meshconnect/uwc-types'
|
|
11
11
|
import {
|
|
12
12
|
NamespacedStorage,
|
|
13
|
-
|
|
13
|
+
TON_CONNECT_INJECTED_STORAGE_PREFIX,
|
|
14
|
+
toFriendlyAddress,
|
|
15
|
+
tryRestoreInjectedSession
|
|
14
16
|
} from '@meshconnect/uwc-ton-connector'
|
|
15
17
|
import { getTonWallets, type DetectedTonWallet } from '../../ton-discovery'
|
|
16
18
|
import { extractTonSdkErrorMessage } from '../../utils/error-utils'
|
|
@@ -29,14 +31,22 @@ export class TonWalletService {
|
|
|
29
31
|
private connectedJsBridgeKey: string | null = null
|
|
30
32
|
private sdkInstance: TonConnect | null = null
|
|
31
33
|
private manifestUrl: string | (() => string) | undefined
|
|
34
|
+
private onSessionRestored: (() => void) | undefined
|
|
32
35
|
private toUserFriendlyAddress:
|
|
33
36
|
| ((hex: string, testOnly?: boolean) => string)
|
|
34
37
|
| null = null
|
|
35
38
|
private UserRejectsError: (new (...args: never[]) => Error) | null = null
|
|
36
39
|
private transactionService: TonTransactionService
|
|
40
|
+
// Restore preflight bookkeeping — mirrors TonConnectConnector.
|
|
41
|
+
private abortPendingConnect: (() => void) | null = null
|
|
42
|
+
private connectGeneration = 0
|
|
37
43
|
|
|
38
|
-
constructor(
|
|
44
|
+
constructor(
|
|
45
|
+
manifestUrl?: string | (() => string),
|
|
46
|
+
onSessionRestored?: () => void
|
|
47
|
+
) {
|
|
39
48
|
this.manifestUrl = manifestUrl
|
|
49
|
+
this.onSessionRestored = onSessionRestored
|
|
40
50
|
this.transactionService = new TonTransactionService()
|
|
41
51
|
}
|
|
42
52
|
|
|
@@ -75,32 +85,49 @@ export class TonWalletService {
|
|
|
75
85
|
'TON Connect manifestUrl is required. Pass tonConnectConfig to the connector.'
|
|
76
86
|
)
|
|
77
87
|
}
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
await this.cleanupSdk(this.sdkInstance)
|
|
81
|
-
}
|
|
88
|
+
// Tear down any prior SDK and abort an in-flight restore before reconnecting.
|
|
89
|
+
await this.disconnect()
|
|
82
90
|
|
|
83
91
|
const { TonConnect, toUserFriendlyAddress, UserRejectsError } =
|
|
84
92
|
await import('@tonconnect/sdk')
|
|
85
93
|
this.toUserFriendlyAddress = toUserFriendlyAddress
|
|
86
94
|
this.UserRejectsError = UserRejectsError
|
|
87
95
|
|
|
88
|
-
this.
|
|
89
|
-
|
|
96
|
+
this.connectGeneration++
|
|
97
|
+
const generation = this.connectGeneration
|
|
98
|
+
|
|
99
|
+
const sdkRef = new TonConnect({
|
|
100
|
+
storage: new NamespacedStorage(TON_CONNECT_INJECTED_STORAGE_PREFIX),
|
|
90
101
|
manifestUrl: resolvedManifestUrl,
|
|
91
102
|
analytics: { mode: 'off' }
|
|
92
103
|
})
|
|
104
|
+
this.sdkInstance = sdkRef
|
|
93
105
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
// Resume an existing injected session before a fresh handshake.
|
|
107
|
+
const restored = await tryRestoreInjectedSession(
|
|
108
|
+
{ requestedJsBridgeKey: jsBridgeKey, sdk: sdkRef, generation },
|
|
109
|
+
{
|
|
110
|
+
getCurrentGeneration: () => this.connectGeneration,
|
|
111
|
+
setAbortHook: fn => {
|
|
112
|
+
this.abortPendingConnect = fn
|
|
113
|
+
},
|
|
114
|
+
toUserFriendlyAddressFn: this.toUserFriendlyAddress,
|
|
115
|
+
...(this.onSessionRestored
|
|
116
|
+
? { onSessionRestored: this.onSessionRestored }
|
|
117
|
+
: {})
|
|
99
118
|
}
|
|
119
|
+
).catch(async error => {
|
|
120
|
+
await this.cleanupSdk(sdkRef)
|
|
121
|
+
throw error
|
|
122
|
+
})
|
|
123
|
+
if (restored) {
|
|
124
|
+
this.connectedAddress = restored.address
|
|
125
|
+
this.connectedJsBridgeKey = jsBridgeKey
|
|
126
|
+
return restored
|
|
100
127
|
}
|
|
101
128
|
|
|
129
|
+
// No prior session — fresh handshake (preflight cleaned any stale state).
|
|
102
130
|
// Listen BEFORE connect — sdk.connect() is fire-and-forget
|
|
103
|
-
const sdkRef = this.sdkInstance
|
|
104
131
|
const walletPromise = new Promise<{ address: string; publicKey?: string }>(
|
|
105
132
|
(resolve, reject) => {
|
|
106
133
|
let settled = false
|
|
@@ -237,6 +264,11 @@ export class TonWalletService {
|
|
|
237
264
|
}
|
|
238
265
|
|
|
239
266
|
async disconnect(): Promise<void> {
|
|
267
|
+
// Advancing the generation cancels an in-flight restore still parked in its
|
|
268
|
+
// pre-hook storage read, where the abort hook isn't registered yet.
|
|
269
|
+
this.connectGeneration++
|
|
270
|
+
this.abortPendingConnect?.()
|
|
271
|
+
this.abortPendingConnect = null
|
|
240
272
|
if (this.sdkInstance) {
|
|
241
273
|
try {
|
|
242
274
|
await this.sdkInstance.disconnect()
|
package/src/utils/error-utils.ts
CHANGED
|
@@ -31,6 +31,12 @@ export function extractTonSdkErrorMessage(error: unknown): string {
|
|
|
31
31
|
* Detects if the error is a user rejection or an unknown error
|
|
32
32
|
*/
|
|
33
33
|
export function parseError(error: unknown): never {
|
|
34
|
+
// Already-typed connector errors (e.g. the `expired` timeout) must pass
|
|
35
|
+
// through — re-deriving the type here would downgrade them to 'unknown'.
|
|
36
|
+
if (error instanceof WalletConnectorError) {
|
|
37
|
+
throw error
|
|
38
|
+
}
|
|
39
|
+
|
|
34
40
|
let message: string
|
|
35
41
|
let isRejected = false
|
|
36
42
|
|