@dynamic-labs-sdk/ton 0.26.9 → 0.27.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/{addTonConnectExtension-O0G9EvLK.esm.js → addTonConnectExtension-Bl1oy0Oa.esm.js} +47 -26
- package/dist/addTonConnectExtension-Bl1oy0Oa.esm.js.map +1 -0
- package/dist/{addTonConnectExtension-By4etyyP.cjs → addTonConnectExtension-DPNVRgqZ.cjs} +47 -26
- package/dist/addTonConnectExtension-DPNVRgqZ.cjs.map +1 -0
- package/dist/addTonExtension/addTonExtension.d.ts +6 -1
- package/dist/addTonExtension/addTonExtension.d.ts.map +1 -1
- package/dist/addTonExtension/index.d.ts +1 -0
- package/dist/addTonExtension/index.d.ts.map +1 -1
- package/dist/{addWaasTonExtension-BS5OSqI6.esm.js → addWaasTonExtension-CZ7OhPpB.esm.js} +2 -2
- package/dist/{addWaasTonExtension-BS5OSqI6.esm.js.map → addWaasTonExtension-CZ7OhPpB.esm.js.map} +1 -1
- package/dist/{addWaasTonExtension-CiTJqYKd.cjs → addWaasTonExtension-DrxH_tf-.cjs} +2 -2
- package/dist/{addWaasTonExtension-CiTJqYKd.cjs.map → addWaasTonExtension-DrxH_tf-.cjs.map} +1 -1
- package/dist/exports/index.d.ts +1 -1
- package/dist/exports/index.d.ts.map +1 -1
- package/dist/exports/tonConnect.d.ts +1 -1
- package/dist/exports/tonConnect.d.ts.map +1 -1
- package/dist/index.cjs +7 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +7 -5
- package/dist/index.esm.js.map +1 -1
- package/dist/tonConnect/addTonConnectExtension/addTonConnectExtension.d.ts +14 -1
- package/dist/tonConnect/addTonConnectExtension/addTonConnectExtension.d.ts.map +1 -1
- package/dist/tonConnect/addTonConnectExtension/index.d.ts +1 -0
- package/dist/tonConnect/addTonConnectExtension/index.d.ts.map +1 -1
- package/dist/tonConnect/tonConnectDisplayNameOverrides.d.ts +18 -0
- package/dist/tonConnect/tonConnectDisplayNameOverrides.d.ts.map +1 -0
- package/dist/tonConnect/utils/createDefaultTonConnectUI/createDefaultTonConnectUI.d.ts +15 -0
- package/dist/tonConnect/utils/createDefaultTonConnectUI/createDefaultTonConnectUI.d.ts.map +1 -0
- package/dist/tonConnect/utils/createDefaultTonConnectUI/index.d.ts +2 -0
- package/dist/tonConnect/utils/createDefaultTonConnectUI/index.d.ts.map +1 -0
- package/dist/tonConnect/utils/discoverAndRegisterWallets/discoverAndRegisterWallets.d.ts +5 -3
- package/dist/tonConnect/utils/discoverAndRegisterWallets/discoverAndRegisterWallets.d.ts.map +1 -1
- package/dist/tonConnect.cjs +2 -2
- package/dist/tonConnect.cjs.map +1 -1
- package/dist/tonConnect.esm.js +2 -2
- package/dist/tonConnect.esm.js.map +1 -1
- package/dist/{tonTransferAmount-CWcLBDeH.esm.js → tonTransferAmount-CgREtm2F.esm.js} +2 -2
- package/dist/{tonTransferAmount-CWcLBDeH.esm.js.map → tonTransferAmount-CgREtm2F.esm.js.map} +1 -1
- package/dist/{tonTransferAmount-D9do2RQe.cjs → tonTransferAmount-qzpLt6Z2.cjs} +2 -2
- package/dist/{tonTransferAmount-D9do2RQe.cjs.map → tonTransferAmount-qzpLt6Z2.cjs.map} +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/waas.cjs +2 -2
- package/dist/waas.esm.js +2 -2
- package/package.json +4 -4
- package/dist/addTonConnectExtension-By4etyyP.cjs.map +0 -1
- package/dist/addTonConnectExtension-O0G9EvLK.esm.js.map +0 -1
- package/dist/tonConnect/supportedTonConnectWallets.d.ts +0 -14
- package/dist/tonConnect/supportedTonConnectWallets.d.ts.map +0 -1
package/dist/{addTonConnectExtension-O0G9EvLK.esm.js → addTonConnectExtension-Bl1oy0Oa.esm.js}
RENAMED
|
@@ -1,30 +1,49 @@
|
|
|
1
|
-
import { a as prepareJettonTransfer, d as registerTonNetworkProviderBuilder, f as createTonClient, i as prepareTonNativeTransfer, o as DEFAULT_JETTON_GAS, s as DEFAULT_TIMEOUT, t as tonTransferAmount } from "./tonTransferAmount-
|
|
1
|
+
import { a as prepareJettonTransfer, d as registerTonNetworkProviderBuilder, f as createTonClient, i as prepareTonNativeTransfer, o as DEFAULT_JETTON_GAS, s as DEFAULT_TIMEOUT, t as tonTransferAmount } from "./tonTransferAmount-CgREtm2F.esm.js";
|
|
2
2
|
import { WalletProviderPriority, assertDefined, createWalletProviderEventEmitter, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getCore, getDefaultClient, getNetworkProviderFromNetworkId, getNonce, getWalletProviderRegistry, hasExtension, registerExtension, switchActiveNetworkInLastKnownRegistry } from "@dynamic-labs-sdk/client/core";
|
|
3
|
-
import { TonConnectUI } from "@tonconnect/ui";
|
|
4
3
|
import { Cell } from "@ton/ton";
|
|
4
|
+
import { TonConnectUI } from "@tonconnect/ui";
|
|
5
5
|
import { WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
|
|
6
6
|
import { Address as Address$1, loadStateInit } from "@ton/core";
|
|
7
7
|
import { BaseError } from "@dynamic-labs-sdk/client";
|
|
8
8
|
|
|
9
|
-
//#region src/tonConnect/
|
|
9
|
+
//#region src/tonConnect/utils/createDefaultTonConnectUI/createDefaultTonConnectUI.ts
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Creates a default TonConnectUI instance using the Dynamic environment's
|
|
12
|
+
* universal link as the source for the TonConnect manifest URL.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* where wallets self-announce, TonConnect provides a catalog, so we maintain
|
|
16
|
-
* an allowlist to control which wallets appear in the UI.
|
|
14
|
+
* Used as a fallback when the consumer does not pass an external
|
|
15
|
+
* TonConnectUI into `addTonConnectExtension`.
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* @param client - The Dynamic client instance.
|
|
18
|
+
* @throws When the environment's universal link is not configured.
|
|
19
|
+
* @not-instrumented
|
|
21
20
|
*/
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
const createDefaultTonConnectUI = (client) => {
|
|
22
|
+
const universalLink = getCore(client).metadata?.universalLink;
|
|
23
|
+
assertDefined(universalLink, "Universal link is not set");
|
|
24
|
+
return new TonConnectUI({ manifestUrl: `${universalLink}/tonconnect-manifest.json` });
|
|
26
25
|
};
|
|
27
26
|
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/tonConnect/tonConnectDisplayNameOverrides.ts
|
|
29
|
+
/**
|
|
30
|
+
* Display-name overrides for wallets returned by TonConnect's registry.
|
|
31
|
+
*
|
|
32
|
+
* TonConnect's `getWallets()` returns the full ecosystem catalog. Each wallet
|
|
33
|
+
* comes with its own `name`, which we use as-is by default. A small number of
|
|
34
|
+
* wallets ship a name that is too generic to render (e.g. Telegram Wallet's
|
|
35
|
+
* registry name is just `'Wallet'`); we override those here.
|
|
36
|
+
*
|
|
37
|
+
* IMPORTANT: the wallet's normalized display name is what `formatWalletProviderKey`
|
|
38
|
+
* uses to derive the persisted `walletProviderKey`. Changing an override breaks
|
|
39
|
+
* re-login for any user who linked under the previous name. Treat this map as
|
|
40
|
+
* append-only: never edit existing values, only add new ones.
|
|
41
|
+
*
|
|
42
|
+
* Keys are TonConnect `appName` identifiers; values are the display names we
|
|
43
|
+
* want to render and persist.
|
|
44
|
+
*/
|
|
45
|
+
const TON_CONNECT_DISPLAY_NAME_OVERRIDES = { "telegram-wallet": "Telegram Wallet" };
|
|
46
|
+
|
|
28
47
|
//#endregion
|
|
29
48
|
//#region src/errors/TonConnectProofNotAvailableError.ts
|
|
30
49
|
var TonConnectProofNotAvailableError = class extends BaseError {
|
|
@@ -435,17 +454,19 @@ const createWalletProviderFromTonConnect = ({ dynamicClient, tonConnectUI, walle
|
|
|
435
454
|
//#endregion
|
|
436
455
|
//#region src/tonConnect/utils/discoverAndRegisterWallets/discoverAndRegisterWallets.ts
|
|
437
456
|
/**
|
|
438
|
-
* Discovers
|
|
457
|
+
* Discovers TonConnect wallets and registers each as a wallet provider.
|
|
439
458
|
*
|
|
440
|
-
* Queries the TonConnect registry for
|
|
441
|
-
*
|
|
459
|
+
* Queries the TonConnect registry for the full wallet catalog and registers
|
|
460
|
+
* every entry as a wallet provider with the Dynamic client. Display names are
|
|
461
|
+
* taken from the registry by default; a small override map handles wallets
|
|
462
|
+
* whose registry name would otherwise be too generic (e.g. Telegram Wallet).
|
|
442
463
|
*
|
|
443
464
|
* @not-instrumented
|
|
444
465
|
*/
|
|
445
466
|
const discoverAndRegisterWallets = async ({ client, tonConnectUI }) => {
|
|
446
467
|
const walletProviderRegistry = getWalletProviderRegistry(client);
|
|
447
|
-
const
|
|
448
|
-
for (const wallet of
|
|
468
|
+
const wallets = await tonConnectUI.connector.getWallets();
|
|
469
|
+
for (const wallet of wallets) {
|
|
449
470
|
const isInjected = "jsBridgeKey" in wallet && "injected" in wallet && wallet.injected === true;
|
|
450
471
|
const walletProvider = createWalletProviderFromTonConnect({
|
|
451
472
|
dynamicClient: client,
|
|
@@ -454,7 +475,7 @@ const discoverAndRegisterWallets = async ({ client, tonConnectUI }) => {
|
|
|
454
475
|
appName: wallet.appName,
|
|
455
476
|
icon: wallet.imageUrl,
|
|
456
477
|
jsBridgeKey: isInjected ? wallet.jsBridgeKey : void 0,
|
|
457
|
-
name:
|
|
478
|
+
name: TON_CONNECT_DISPLAY_NAME_OVERRIDES[wallet.appName] ?? wallet.name
|
|
458
479
|
}
|
|
459
480
|
});
|
|
460
481
|
walletProviderRegistry.register({
|
|
@@ -474,21 +495,21 @@ const TON_CONNECT_EXTENSION_KEY = "tonConnect";
|
|
|
474
495
|
* discovering and registering supported wallets (Tonkeeper, MyTonWallet, etc.)
|
|
475
496
|
* as wallet providers.
|
|
476
497
|
*
|
|
498
|
+
* @param [params] - Optional configuration for the TonConnect extension.
|
|
499
|
+
* @param [params.tonConnectUI] - An external TonConnectUI instance to reuse.
|
|
477
500
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
478
501
|
* @not-instrumented
|
|
479
502
|
*/
|
|
480
|
-
const addTonConnectExtension = (client = getDefaultClient()) => {
|
|
503
|
+
const addTonConnectExtension = ({ tonConnectUI } = {}, client = getDefaultClient()) => {
|
|
481
504
|
if (hasExtension({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client)) return;
|
|
482
505
|
registerExtension({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client);
|
|
483
506
|
registerTonNetworkProviderBuilder(client);
|
|
484
|
-
const universalLink = getCore(client).metadata?.universalLink;
|
|
485
|
-
assertDefined(universalLink, "Universal link is not set");
|
|
486
507
|
discoverAndRegisterWallets({
|
|
487
508
|
client,
|
|
488
|
-
tonConnectUI:
|
|
509
|
+
tonConnectUI: tonConnectUI ?? createDefaultTonConnectUI(client)
|
|
489
510
|
});
|
|
490
511
|
};
|
|
491
512
|
|
|
492
513
|
//#endregion
|
|
493
514
|
export { addTonConnectExtension as t };
|
|
494
|
-
//# sourceMappingURL=addTonConnectExtension-
|
|
515
|
+
//# sourceMappingURL=addTonConnectExtension-Bl1oy0Oa.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addTonConnectExtension-Bl1oy0Oa.esm.js","names":["TON_CONNECT_DISPLAY_NAME_OVERRIDES: Record<string, string>","connectedWallet: ConnectedWallet | null","cachedProofNonce: string | undefined","getActiveNetworkId: TonWalletProvider['getActiveNetworkId']","switchActiveNetwork: TonWalletProvider['switchActiveNetwork']","Address","getConnectedAddresses: TonWalletProvider['getConnectedAddresses']","connectionTimeoutRef: {\n id: ReturnType<typeof setTimeout> | undefined;\n }","statusUnsubRef: { fn?: () => void }","modalUnsub: (() => void) | undefined","connect: TonWalletProvider['connect']","publicKey","account","proofNonce: string | undefined","disconnect: TonWalletProvider['disconnect']","signMessage: TonWalletProvider['signMessage']","sendTransaction: TonWalletProvider['sendTransaction']","sendTon: TonWalletProvider['sendTon']","sendJetton: TonWalletProvider['sendJetton']","generateTonConnectProof: TonWalletProvider['generateTonConnectProof']","terminate: TonWalletProvider['terminate']"],"sources":["../src/tonConnect/utils/createDefaultTonConnectUI/createDefaultTonConnectUI.ts","../src/tonConnect/tonConnectDisplayNameOverrides.ts","../src/errors/TonConnectProofNotAvailableError.ts","../src/errors/TonConnectReconnectedError.ts","../src/errors/TonConnectRejectedError.ts","../src/errors/TonConnectTimeoutError.ts","../src/errors/StateInitMissingError.ts","../src/tonConnect/utils/extractPublicKeyFromStateInit/extractPublicKeyFromStateInit.ts","../src/tonConnect/utils/createWalletProviderFromTonConnect/createWalletProviderFromTonConnect.ts","../src/tonConnect/utils/discoverAndRegisterWallets/discoverAndRegisterWallets.ts","../src/tonConnect/addTonConnectExtension/addTonConnectExtension.ts"],"sourcesContent":["import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport { TonConnectUI } from '@tonconnect/ui';\n\n/**\n * Creates a default TonConnectUI instance using the Dynamic environment's\n * universal link as the source for the TonConnect manifest URL.\n *\n * Used as a fallback when the consumer does not pass an external\n * TonConnectUI into `addTonConnectExtension`.\n *\n * @param client - The Dynamic client instance.\n * @throws When the environment's universal link is not configured.\n * @not-instrumented\n */\nexport const createDefaultTonConnectUI = (\n client: DynamicClient,\n): TonConnectUI => {\n const universalLink = getCore(client).metadata?.universalLink;\n assertDefined(universalLink, 'Universal link is not set');\n\n return new TonConnectUI({\n manifestUrl: `${universalLink}/tonconnect-manifest.json`,\n });\n};\n","/**\n * Display-name overrides for wallets returned by TonConnect's registry.\n *\n * TonConnect's `getWallets()` returns the full ecosystem catalog. Each wallet\n * comes with its own `name`, which we use as-is by default. A small number of\n * wallets ship a name that is too generic to render (e.g. Telegram Wallet's\n * registry name is just `'Wallet'`); we override those here.\n *\n * IMPORTANT: the wallet's normalized display name is what `formatWalletProviderKey`\n * uses to derive the persisted `walletProviderKey`. Changing an override breaks\n * re-login for any user who linked under the previous name. Treat this map as\n * append-only: never edit existing values, only add new ones.\n *\n * Keys are TonConnect `appName` identifiers; values are the display names we\n * want to render and persist.\n */\nexport const TON_CONNECT_DISPLAY_NAME_OVERRIDES: Record<string, string> = {\n 'telegram-wallet': 'Telegram Wallet',\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectProofNotAvailableError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'ton_connect_proof_not_available_error',\n docsUrl: null,\n name: 'TonConnectProofNotAvailableError',\n shortMessage: 'TonConnect proof not available',\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectReconnectedError extends BaseError {\n constructor(params: { walletName: string }) {\n super({\n cause: null,\n code: 'ton_connect_reconnected_error',\n docsUrl: null,\n name: 'TonConnectReconnectedError',\n shortMessage: `Reconnected to ${params.walletName}. Please try the action again.`,\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectRejectedError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'ton_connect_rejected_error',\n docsUrl: null,\n name: 'TonConnectRejectedError',\n shortMessage: 'User rejected connection',\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectTimeoutError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'ton_connect_timeout_error',\n docsUrl: null,\n name: 'TonConnectTimeoutError',\n shortMessage: 'Connection timed out — wallet did not respond',\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class StateInitMissingError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'state_init_missing_error',\n docsUrl: null,\n name: 'StateInitMissingError',\n shortMessage: 'StateInit missing code or data cell',\n });\n }\n}\n","import { loadStateInit } from '@ton/core';\nimport { Cell } from '@ton/ton';\n\nimport { StateInitMissingError } from '../../../errors/StateInitMissingError';\n\nconst V5R1_CODE_HASHES = new Set([\n '2e39545f25bdc993f3bc2c1f5a3db09c1f30b70e3dd35c7ef3c25a12764fe4d0',\n '20cbb8a4c59a2521eb6e890a04b27d4f72827646a0b4bc9e20d04d8ff49e2a00',\n]);\n\nconst V5R1_SKIP_BITS = 65;\nconst DEFAULT_SKIP_BITS = 64;\nconst PUBLIC_KEY_BYTES = 32;\n\ntype ExtractPublicKeyFromStateInitParams = {\n stateInitBase64: string;\n};\n\n/**\n * Extracts the public key from a TON wallet's StateInit.\n *\n * Parses the base64-encoded StateInit cell to retrieve the 32-byte public key\n * from the data cell, handling both V5R1 and standard wallet contract layouts.\n *\n * @not-instrumented\n */\nexport const extractPublicKeyFromStateInit = ({\n stateInitBase64,\n}: ExtractPublicKeyFromStateInitParams): string => {\n const stateInitCell = Cell.fromBase64(stateInitBase64);\n const slice = stateInitCell.beginParse();\n\n const stateInit = loadStateInit(slice);\n\n const codeCell = stateInit.code;\n const dataCell = stateInit.data;\n\n if (!codeCell || !dataCell) {\n throw new StateInitMissingError();\n }\n\n const codeHash = codeCell.hash().toString('hex');\n const isV5R1 = V5R1_CODE_HASHES.has(codeHash);\n\n const dataSlice = dataCell.beginParse();\n const bitsToSkip = isV5R1 ? V5R1_SKIP_BITS : DEFAULT_SKIP_BITS;\n dataSlice.skip(bitsToSkip);\n\n const publicKeyBuffer = dataSlice.loadBuffer(PUBLIC_KEY_BYTES);\n\n return publicKeyBuffer.toString('hex');\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getNetworkProviderFromNetworkId,\n getNonce,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Address } from '@ton/core';\nimport type { TonClient } from '@ton/ton';\nimport type {\n ConnectedWallet,\n TonConnectUI,\n WalletsModalState,\n} from '@tonconnect/ui';\n\nimport { TonConnectProofNotAvailableError } from '../../../errors/TonConnectProofNotAvailableError';\nimport { TonConnectReconnectedError } from '../../../errors/TonConnectReconnectedError';\nimport { TonConnectRejectedError } from '../../../errors/TonConnectRejectedError';\nimport { TonConnectTimeoutError } from '../../../errors/TonConnectTimeoutError';\nimport type { TonWalletProvider } from '../../../TonWalletProvider.types';\nimport { DEFAULT_JETTON_GAS, DEFAULT_TIMEOUT } from '../../../utils/constants';\nimport { createTonClient } from '../../../utils/createTonClient';\nimport { prepareJettonTransfer } from '../../../utils/prepareJettonTransfer';\nimport { prepareTonNativeTransfer } from '../../../utils/prepareTonNativeTransfer';\nimport { tonTransferAmount } from '../../../utils/tonTransferAmount';\nimport { extractPublicKeyFromStateInit } from '../extractPublicKeyFromStateInit';\n\nconst CONNECTION_TIMEOUT_MS = 30_000;\n\ntype CreateWalletProviderFromTonConnectParams = {\n dynamicClient: DynamicClient;\n tonConnectUI: TonConnectUI;\n walletInfo: {\n appName: string;\n icon: string;\n jsBridgeKey?: string;\n name: string;\n };\n};\n\n/**\n * Creates a TonWalletProvider from a TonConnect wallet.\n *\n * Wraps the TonConnect UI instance to provide connect, disconnect, sign, and\n * send operations for an external TON wallet (Tonkeeper, MyTonWallet, etc.).\n *\n * @not-instrumented\n */\nexport const createWalletProviderFromTonConnect = ({\n dynamicClient,\n tonConnectUI,\n walletInfo,\n}: CreateWalletProviderFromTonConnectParams): TonWalletProvider => {\n const chain = 'TON' as const;\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n let connectedWallet: ConnectedWallet | null = null;\n let suppressStatusEvents = false;\n let cachedProofNonce: string | undefined;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: walletInfo.name,\n walletProviderType,\n });\n\n const getTonClientForActiveNetwork = async (): Promise<TonClient> => {\n const { networkId } = await getActiveNetworkId();\n const networkProvider = getNetworkProviderFromNetworkId(\n { chain: 'TON', networkId },\n dynamicClient\n );\n\n return createTonClient({ rpcUrl: networkProvider.rpcUrls.http[0] });\n };\n\n const getActiveNetworkId: TonWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: dynamicClient,\n walletProviderKey: key,\n });\n\n const switchActiveNetwork: TonWalletProvider['switchActiveNetwork'] = async ({\n networkId,\n }: {\n networkId: string;\n }) =>\n switchActiveNetworkInLastKnownRegistry({\n client: dynamicClient,\n networkId,\n walletProviderKey: key,\n });\n\n const isConnectedWalletType = (\n wallet: typeof tonConnectUI.wallet\n ): wallet is ConnectedWallet => wallet !== null && 'appName' in wallet;\n\n // eslint-disable-next-line custom-rules/require-single-object-param\n const convertAddressToUserFriendly = (address: string): string => {\n try {\n if (address.startsWith('EQ') || address.startsWith('UQ')) {\n return address;\n }\n\n const isTestnet = tonConnectUI.account?.chain === '-3';\n\n return Address.parse(address).toString({\n bounceable: false,\n testOnly: isTestnet,\n urlSafe: true,\n });\n } catch {\n return address;\n }\n };\n\n const getConnectedAddresses: TonWalletProvider['getConnectedAddresses'] =\n async () => {\n await tonConnectUI.connectionRestored;\n\n const wallet = tonConnectUI.wallet;\n\n if (\n !isConnectedWalletType(wallet) ||\n wallet.appName !== walletInfo.appName\n ) {\n return { addresses: [] };\n }\n\n return {\n addresses: [convertAddressToUserFriendly(wallet.account.address)],\n };\n };\n\n // TonConnect supports only one active connection. If another TON wallet\n // took over the session, reconnect to this wallet first, then throw so\n // the actual operation happens on a separate user action.\n //\n // In Telegram Mini Apps (TMA), programmatic deep links fail on the second\n // consecutive deep link, only user triggered deep links work reliably.\n // By splitting reconnect and the actual operation into two\n // separate user actions, each gets its own deep link and both succeed.\n const ensureCorrectWalletConnected = async (): Promise<void> => {\n await tonConnectUI.connectionRestored;\n\n const current = tonConnectUI.wallet;\n\n if (\n isConnectedWalletType(current) &&\n current.appName === walletInfo.appName\n )\n return;\n\n if (tonConnectUI.connected) {\n await tonConnectUI.disconnect();\n connectedWallet = null;\n }\n\n await connectWithModal();\n\n throw new TonConnectReconnectedError({ walletName: walletInfo.name });\n };\n\n // Connect via the TonConnect UI modal.\n const connectWithModal = (tonProofPayload?: string): Promise<void> =>\n new Promise((resolve, reject) => {\n if (tonProofPayload) {\n tonConnectUI.setConnectRequestParameters({\n state: 'ready',\n value: { tonProof: tonProofPayload },\n });\n }\n\n // Mutable handle. onStatusChange may fire synchronously on subscribe,\n // so the timeout id must live in an object assigned before registration\n // to avoid the temporal dead zone when clearing.\n const connectionTimeoutRef: {\n id: ReturnType<typeof setTimeout> | undefined;\n } = { id: undefined };\n\n // Holds the onStatusChange unsubscribe. When the callback fires\n // synchronously, `fn` isn't assigned yet; handledMatchingWalletInThisConnect\n // detaches the listener right after registration.\n const statusUnsubRef: { fn?: () => void } = {};\n let handledMatchingWalletInThisConnect = false;\n\n const handleModalClose = (state: {\n closeReason?: string | null;\n status: string;\n }) => {\n if (state.status !== 'closed') return;\n // 'wallet-selected' means a deep link was initiated — don't reject yet\n if (state.closeReason === 'wallet-selected') return;\n\n clearTimeout(connectionTimeoutRef.id);\n cleanup();\n\n const error: Error = new TonConnectRejectedError();\n reject(error);\n };\n\n let modalUnsub: (() => void) | undefined;\n\n if (walletInfo.appName) {\n modalUnsub =\n tonConnectUI.onSingleWalletModalStateChange(handleModalClose);\n } else {\n modalUnsub = tonConnectUI.onModalStateChange(\n handleModalClose as (state: WalletsModalState) => void\n );\n }\n\n const cleanup = () => {\n statusUnsubRef.fn?.();\n modalUnsub?.();\n tonConnectUI.setConnectRequestParameters(null);\n };\n\n statusUnsubRef.fn = tonConnectUI.onStatusChange(\n (wallet: ConnectedWallet | null) => {\n if (wallet?.appName !== walletInfo.appName) return;\n\n connectedWallet = wallet;\n statusUnsubRef.fn?.();\n clearTimeout(connectionTimeoutRef.id);\n handledMatchingWalletInThisConnect = true;\n resolve();\n try {\n cleanup();\n } catch {\n // setConnectRequestParameters may throw WalletAlreadyConnectedError\n // in TMA context. Safe to ignore since the wallet is connected.\n }\n }\n );\n\n if (handledMatchingWalletInThisConnect) {\n statusUnsubRef.fn?.();\n }\n\n connectionTimeoutRef.id = setTimeout(() => {\n cleanup();\n\n const error: Error = new TonConnectTimeoutError();\n reject(error);\n }, CONNECTION_TIMEOUT_MS);\n\n const handleOpenError = (error: unknown) => {\n cleanup();\n reject(error);\n };\n\n if (walletInfo.appName) {\n tonConnectUI\n .openSingleWalletModal(walletInfo.appName)\n .catch(handleOpenError);\n } else {\n tonConnectUI.openModal().catch(handleOpenError);\n }\n });\n\n const connect: TonWalletProvider['connect'] = async () => {\n await tonConnectUI.connectionRestored;\n\n const currentWallet = tonConnectUI.wallet;\n const isOurWallet =\n isConnectedWalletType(currentWallet) &&\n currentWallet.appName === walletInfo.appName;\n\n // Already connected to the correct wallet — return early\n if (tonConnectUI.connected && isOurWallet) {\n connectedWallet = currentWallet;\n const { account } = currentWallet!;\n const publicKey =\n account.publicKey ??\n extractPublicKeyFromStateInit({\n stateInitBase64: account.walletStateInit,\n });\n\n return {\n addresses: [\n { address: convertAddressToUserFriendly(account.address), publicKey },\n ],\n };\n }\n\n // Disconnect stale session before reconnecting\n if (tonConnectUI.connected && !isOurWallet) {\n await tonConnectUI.disconnect();\n connectedWallet = null;\n }\n\n // Fetch a nonce and bundle it as tonProof in the connection request.\n // This lets the wallet return both address and proof in a single\n // handshake, avoiding a second deep link during verification (critical\n // for TMA where sequential deep links fail).\n let proofNonce: string | undefined;\n try {\n proofNonce = await getNonce(dynamicClient);\n } catch {\n // Nonce fetch may fail if settings aren't loaded yet, connect\n // without proof and fall back to the disconnect/reconnect flow\n // during verification.\n }\n\n await connectWithModal(proofNonce);\n\n // Store the nonce so verification can reuse it in the SIWE message,\n // matching the cached tonProof payload.\n cachedProofNonce = proofNonce;\n\n const wallet = tonConnectUI.wallet;\n assertDefined(wallet, 'Wallet not connected after successful connection');\n\n const { account } = wallet;\n const publicKey =\n account.publicKey ??\n extractPublicKeyFromStateInit({\n stateInitBase64: account.walletStateInit,\n });\n\n return {\n addresses: [\n { address: convertAddressToUserFriendly(account.address), publicKey },\n ],\n };\n };\n\n const disconnect: TonWalletProvider['disconnect'] = async () => {\n const currentWallet = tonConnectUI.wallet;\n\n if (\n tonConnectUI.connected &&\n (!isConnectedWalletType(currentWallet) ||\n currentWallet.appName === walletInfo.appName)\n ) {\n await tonConnectUI.disconnect();\n }\n\n connectedWallet = null;\n };\n\n const signMessage: TonWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n // Verification messages (SIWE-style) contain a nonce. For TON external\n // wallets, we use tonProof instead of raw signing, it includes state_init\n // and public_key which the backend needs to verify ownership of a TON\n // smart contract wallet.\n const nonceMatch = message.match(/Nonce:\\s*([^\\n\\r]+)/i);\n if (nonceMatch?.[1]) {\n const nonce = nonceMatch[1].trim().slice(0, 128);\n const proof = await generateTonConnectProof!({\n payload: nonce,\n walletAccount,\n });\n\n const stateInit = connectedWallet?.account.walletStateInit;\n const publicKey =\n connectedWallet?.account.publicKey ??\n (stateInit\n ? extractPublicKeyFromStateInit({ stateInitBase64: stateInit })\n : undefined);\n\n return {\n signature: JSON.stringify({\n address: connectedWallet?.account.address ?? walletAccount.address,\n proof: {\n domain: proof.domain,\n payload: proof.payload,\n signature: proof.signature,\n state_init: stateInit,\n timestamp: proof.timestamp,\n },\n public_key: publicKey,\n }),\n };\n }\n\n await ensureCorrectWalletConnected();\n\n const result = await tonConnectUI.signData({\n text: message,\n type: 'text',\n });\n\n return { signature: result.signature };\n };\n\n const sendTransaction: TonWalletProvider['sendTransaction'] = async ({\n request,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n await ensureCorrectWalletConnected();\n\n const result = await tonConnectUI.sendTransaction({\n messages: request.messages.map((msg) => ({\n address: msg.address,\n amount: msg.amount,\n payload: msg.payload,\n stateInit: msg.stateInit,\n })),\n validUntil: request.validUntil,\n });\n\n return { transactionHash: result.boc };\n };\n\n const sendTon: TonWalletProvider['sendTon'] = async ({\n transaction,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const request = prepareTonNativeTransfer({\n amountInNanoton: transaction.amount.toString(),\n recipient: transaction.recipientAddress,\n timeout: DEFAULT_TIMEOUT,\n walletAddress: walletAccount.address,\n });\n\n return sendTransaction({ request, walletAccount });\n };\n\n const sendJetton: TonWalletProvider['sendJetton'] = async ({\n transaction,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const client = await getTonClientForActiveNetwork();\n\n const request = await prepareJettonTransfer({\n client,\n forwardTonAmount: transaction.forwardTonAmount ?? BigInt(0),\n gasAmount: transaction.gasAmount ?? DEFAULT_JETTON_GAS,\n jettonAmount: transaction.amount,\n jettonMasterAddress: transaction.jettonMasterAddress,\n recipientAddress: transaction.recipientAddress,\n timeout: DEFAULT_TIMEOUT,\n walletAddress: walletAccount.address,\n });\n\n return sendTransaction({ request, walletAccount });\n };\n\n // Disconnects the current TonConnect session and reconnects with a\n // proof payload via the modal.\n // eslint-disable-next-line custom-rules/require-single-object-param\n const reconnectWithProof = async (payload: string) => {\n if (tonConnectUI.connected) {\n connectedWallet = null;\n await tonConnectUI.disconnect();\n }\n\n await connectWithModal(payload);\n };\n\n // Returns a cached proof from the initial connection handshake when\n // available. Falls back to a disconnect/reconnect cycle with the\n // requested payload when the cached proof is missing or stale.\n const generateTonConnectProof: TonWalletProvider['generateTonConnectProof'] =\n async ({ payload, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n // Return cached proof if already connected with matching payload\n if (connectedWallet?.connectItems?.tonProof) {\n const { tonProof } = connectedWallet.connectItems;\n\n if ('proof' in tonProof && tonProof.proof.payload === payload) {\n // Clear after use, nonces are one-time-use on the backend\n cachedProofNonce = undefined;\n\n return {\n address: walletAccount.address,\n domain: tonProof.proof.domain,\n payload: tonProof.proof.payload,\n signature: tonProof.proof.signature,\n timestamp: tonProof.proof.timestamp,\n };\n }\n }\n\n // Suppress SDK events during the disconnect/reconnect cycle so the\n // wallet management layer doesn't see a sudden disconnect + accounts\n // change during verification.\n suppressStatusEvents = true;\n\n try {\n await reconnectWithProof(payload);\n } finally {\n suppressStatusEvents = false;\n }\n\n const wallet = tonConnectUI.wallet;\n const proof = isConnectedWalletType(wallet)\n ? wallet.connectItems?.tonProof\n : undefined;\n\n if (!proof || !('proof' in proof)) {\n throw new TonConnectProofNotAvailableError();\n }\n\n return {\n address: walletAccount.address,\n domain: proof.proof.domain,\n payload: proof.proof.payload,\n signature: proof.proof.signature,\n timestamp: proof.proof.timestamp,\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter<VoidFunction>({\n removeEventListeners: ({\n setupReturnValue,\n }: {\n setupReturnValue: VoidFunction | undefined;\n }) => {\n assertDefined(setupReturnValue, 'Setup return value not defined');\n setupReturnValue();\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleDisconnected,\n }: {\n handleAccountsChanged: (args: { addresses: string[] }) => void;\n handleDisconnected: () => void;\n }) =>\n tonConnectUI.onStatusChange((wallet: ConnectedWallet | null) => {\n if (suppressStatusEvents) return;\n\n if (wallet?.appName !== walletInfo.appName) {\n if (connectedWallet) {\n connectedWallet = null;\n handleDisconnected();\n }\n return;\n }\n\n connectedWallet = wallet;\n handleAccountsChanged({\n addresses: [convertAddressToUserFriendly(wallet.account.address)],\n });\n }),\n\n supportedEvents: ['accountsChanged', 'disconnected'],\n });\n\n const terminate: TonWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n connect,\n disconnect,\n get events() {\n return getEventEmitter();\n },\n generateTonConnectProof,\n getActiveNetworkId,\n getConnectedAddresses,\n getConnectProofNonce: () => cachedProofNonce,\n groupKey: formatWalletProviderGroupKey(walletInfo.name),\n key,\n metadata: {\n displayName: walletInfo.name,\n icon: walletInfo.icon,\n },\n sendJetton,\n sendTon,\n sendTransaction,\n signMessage,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => tonTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport type { TonConnectUI } from '@tonconnect/ui';\n\nimport { TON_CONNECT_DISPLAY_NAME_OVERRIDES } from '../../tonConnectDisplayNameOverrides';\nimport { createWalletProviderFromTonConnect } from '../createWalletProviderFromTonConnect';\n\ntype DiscoverAndRegisterWalletsParams = {\n client: DynamicClient;\n tonConnectUI: TonConnectUI;\n};\n\n/**\n * Discovers TonConnect wallets and registers each as a wallet provider.\n *\n * Queries the TonConnect registry for the full wallet catalog and registers\n * every entry as a wallet provider with the Dynamic client. Display names are\n * taken from the registry by default; a small override map handles wallets\n * whose registry name would otherwise be too generic (e.g. Telegram Wallet).\n *\n * @not-instrumented\n */\nexport const discoverAndRegisterWallets = async ({\n client,\n tonConnectUI,\n}: DiscoverAndRegisterWalletsParams): Promise<void> => {\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const wallets = await tonConnectUI.connector.getWallets();\n\n for (const wallet of wallets) {\n const isInjected =\n 'jsBridgeKey' in wallet &&\n 'injected' in wallet &&\n (wallet as unknown as { injected: boolean }).injected === true;\n\n const walletProvider = createWalletProviderFromTonConnect({\n dynamicClient: client,\n tonConnectUI,\n walletInfo: {\n appName: wallet.appName,\n icon: wallet.imageUrl,\n jsBridgeKey: isInjected\n ? (wallet as unknown as { jsBridgeKey: string }).jsBridgeKey\n : undefined,\n name:\n TON_CONNECT_DISPLAY_NAME_OVERRIDES[wallet.appName] ?? wallet.name,\n },\n });\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SELF_ANNOUNCEMENT_STANDARD,\n walletProvider,\n });\n }\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n getDefaultClient,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\nimport type { TonConnectUI } from '@tonconnect/ui';\n\nimport { registerTonNetworkProviderBuilder } from '../../registerTonNetworkProviderBuilder';\nimport { createDefaultTonConnectUI } from '../utils/createDefaultTonConnectUI';\nimport { discoverAndRegisterWallets } from '../utils/discoverAndRegisterWallets';\n\nexport const TON_CONNECT_EXTENSION_KEY = 'tonConnect';\n\nexport type AddTonConnectExtensionParams = {\n /**\n * An external TonConnectUI instance to reuse. When omitted, a new instance\n * is created internally using the Dynamic environment's universal link as\n * the manifest URL. Provide this when your app already manages a\n * TonConnectUI singleton.\n */\n tonConnectUI?: TonConnectUI;\n};\n\n/**\n * Adds the TonConnect extension to the Dynamic client.\n *\n * This extension enables external TON wallet support via the TonConnect protocol,\n * discovering and registering supported wallets (Tonkeeper, MyTonWallet, etc.)\n * as wallet providers.\n *\n * @param [params] - Optional configuration for the TonConnect extension.\n * @param [params.tonConnectUI] - An external TonConnectUI instance to reuse.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addTonConnectExtension = (\n { tonConnectUI }: AddTonConnectExtensionParams = {},\n client: DynamicClient = getDefaultClient()\n): void => {\n if (hasExtension({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerExtension({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client);\n registerTonNetworkProviderBuilder(client);\n\n const resolvedTonConnectUI =\n tonConnectUI ?? createDefaultTonConnectUI(client);\n\n void discoverAndRegisterWallets({\n client,\n tonConnectUI: resolvedTonConnectUI,\n });\n};\n"],"mappings":"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"}
|
|
@@ -1,30 +1,49 @@
|
|
|
1
|
-
const require_tonTransferAmount = require('./tonTransferAmount-
|
|
1
|
+
const require_tonTransferAmount = require('./tonTransferAmount-qzpLt6Z2.cjs');
|
|
2
2
|
let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
|
|
3
|
-
let _tonconnect_ui = require("@tonconnect/ui");
|
|
4
3
|
let _ton_ton = require("@ton/ton");
|
|
4
|
+
let _tonconnect_ui = require("@tonconnect/ui");
|
|
5
5
|
let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
|
|
6
6
|
let _ton_core = require("@ton/core");
|
|
7
7
|
let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
|
|
8
8
|
|
|
9
|
-
//#region src/tonConnect/
|
|
9
|
+
//#region src/tonConnect/utils/createDefaultTonConnectUI/createDefaultTonConnectUI.ts
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Creates a default TonConnectUI instance using the Dynamic environment's
|
|
12
|
+
* universal link as the source for the TonConnect manifest URL.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* where wallets self-announce, TonConnect provides a catalog, so we maintain
|
|
16
|
-
* an allowlist to control which wallets appear in the UI.
|
|
14
|
+
* Used as a fallback when the consumer does not pass an external
|
|
15
|
+
* TonConnectUI into `addTonConnectExtension`.
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* @param client - The Dynamic client instance.
|
|
18
|
+
* @throws When the environment's universal link is not configured.
|
|
19
|
+
* @not-instrumented
|
|
21
20
|
*/
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
const createDefaultTonConnectUI = (client) => {
|
|
22
|
+
const universalLink = (0, _dynamic_labs_sdk_client_core.getCore)(client).metadata?.universalLink;
|
|
23
|
+
(0, _dynamic_labs_sdk_client_core.assertDefined)(universalLink, "Universal link is not set");
|
|
24
|
+
return new _tonconnect_ui.TonConnectUI({ manifestUrl: `${universalLink}/tonconnect-manifest.json` });
|
|
26
25
|
};
|
|
27
26
|
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/tonConnect/tonConnectDisplayNameOverrides.ts
|
|
29
|
+
/**
|
|
30
|
+
* Display-name overrides for wallets returned by TonConnect's registry.
|
|
31
|
+
*
|
|
32
|
+
* TonConnect's `getWallets()` returns the full ecosystem catalog. Each wallet
|
|
33
|
+
* comes with its own `name`, which we use as-is by default. A small number of
|
|
34
|
+
* wallets ship a name that is too generic to render (e.g. Telegram Wallet's
|
|
35
|
+
* registry name is just `'Wallet'`); we override those here.
|
|
36
|
+
*
|
|
37
|
+
* IMPORTANT: the wallet's normalized display name is what `formatWalletProviderKey`
|
|
38
|
+
* uses to derive the persisted `walletProviderKey`. Changing an override breaks
|
|
39
|
+
* re-login for any user who linked under the previous name. Treat this map as
|
|
40
|
+
* append-only: never edit existing values, only add new ones.
|
|
41
|
+
*
|
|
42
|
+
* Keys are TonConnect `appName` identifiers; values are the display names we
|
|
43
|
+
* want to render and persist.
|
|
44
|
+
*/
|
|
45
|
+
const TON_CONNECT_DISPLAY_NAME_OVERRIDES = { "telegram-wallet": "Telegram Wallet" };
|
|
46
|
+
|
|
28
47
|
//#endregion
|
|
29
48
|
//#region src/errors/TonConnectProofNotAvailableError.ts
|
|
30
49
|
var TonConnectProofNotAvailableError = class extends _dynamic_labs_sdk_client.BaseError {
|
|
@@ -435,17 +454,19 @@ const createWalletProviderFromTonConnect = ({ dynamicClient, tonConnectUI, walle
|
|
|
435
454
|
//#endregion
|
|
436
455
|
//#region src/tonConnect/utils/discoverAndRegisterWallets/discoverAndRegisterWallets.ts
|
|
437
456
|
/**
|
|
438
|
-
* Discovers
|
|
457
|
+
* Discovers TonConnect wallets and registers each as a wallet provider.
|
|
439
458
|
*
|
|
440
|
-
* Queries the TonConnect registry for
|
|
441
|
-
*
|
|
459
|
+
* Queries the TonConnect registry for the full wallet catalog and registers
|
|
460
|
+
* every entry as a wallet provider with the Dynamic client. Display names are
|
|
461
|
+
* taken from the registry by default; a small override map handles wallets
|
|
462
|
+
* whose registry name would otherwise be too generic (e.g. Telegram Wallet).
|
|
442
463
|
*
|
|
443
464
|
* @not-instrumented
|
|
444
465
|
*/
|
|
445
466
|
const discoverAndRegisterWallets = async ({ client, tonConnectUI }) => {
|
|
446
467
|
const walletProviderRegistry = (0, _dynamic_labs_sdk_client_core.getWalletProviderRegistry)(client);
|
|
447
|
-
const
|
|
448
|
-
for (const wallet of
|
|
468
|
+
const wallets = await tonConnectUI.connector.getWallets();
|
|
469
|
+
for (const wallet of wallets) {
|
|
449
470
|
const isInjected = "jsBridgeKey" in wallet && "injected" in wallet && wallet.injected === true;
|
|
450
471
|
const walletProvider = createWalletProviderFromTonConnect({
|
|
451
472
|
dynamicClient: client,
|
|
@@ -454,7 +475,7 @@ const discoverAndRegisterWallets = async ({ client, tonConnectUI }) => {
|
|
|
454
475
|
appName: wallet.appName,
|
|
455
476
|
icon: wallet.imageUrl,
|
|
456
477
|
jsBridgeKey: isInjected ? wallet.jsBridgeKey : void 0,
|
|
457
|
-
name:
|
|
478
|
+
name: TON_CONNECT_DISPLAY_NAME_OVERRIDES[wallet.appName] ?? wallet.name
|
|
458
479
|
}
|
|
459
480
|
});
|
|
460
481
|
walletProviderRegistry.register({
|
|
@@ -474,18 +495,18 @@ const TON_CONNECT_EXTENSION_KEY = "tonConnect";
|
|
|
474
495
|
* discovering and registering supported wallets (Tonkeeper, MyTonWallet, etc.)
|
|
475
496
|
* as wallet providers.
|
|
476
497
|
*
|
|
498
|
+
* @param [params] - Optional configuration for the TonConnect extension.
|
|
499
|
+
* @param [params.tonConnectUI] - An external TonConnectUI instance to reuse.
|
|
477
500
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
478
501
|
* @not-instrumented
|
|
479
502
|
*/
|
|
480
|
-
const addTonConnectExtension = (client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
|
|
503
|
+
const addTonConnectExtension = ({ tonConnectUI } = {}, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
|
|
481
504
|
if ((0, _dynamic_labs_sdk_client_core.hasExtension)({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client)) return;
|
|
482
505
|
(0, _dynamic_labs_sdk_client_core.registerExtension)({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client);
|
|
483
506
|
require_tonTransferAmount.registerTonNetworkProviderBuilder(client);
|
|
484
|
-
const universalLink = (0, _dynamic_labs_sdk_client_core.getCore)(client).metadata?.universalLink;
|
|
485
|
-
(0, _dynamic_labs_sdk_client_core.assertDefined)(universalLink, "Universal link is not set");
|
|
486
507
|
discoverAndRegisterWallets({
|
|
487
508
|
client,
|
|
488
|
-
tonConnectUI:
|
|
509
|
+
tonConnectUI: tonConnectUI ?? createDefaultTonConnectUI(client)
|
|
489
510
|
});
|
|
490
511
|
};
|
|
491
512
|
|
|
@@ -496,4 +517,4 @@ Object.defineProperty(exports, 'addTonConnectExtension', {
|
|
|
496
517
|
return addTonConnectExtension;
|
|
497
518
|
}
|
|
498
519
|
});
|
|
499
|
-
//# sourceMappingURL=addTonConnectExtension-
|
|
520
|
+
//# sourceMappingURL=addTonConnectExtension-DPNVRgqZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addTonConnectExtension-DPNVRgqZ.cjs","names":["TonConnectUI","TON_CONNECT_DISPLAY_NAME_OVERRIDES: Record<string, string>","BaseError","BaseError","BaseError","BaseError","BaseError","Cell","WalletProviderEnum","connectedWallet: ConnectedWallet | null","cachedProofNonce: string | undefined","createTonClient","getActiveNetworkId: TonWalletProvider['getActiveNetworkId']","switchActiveNetwork: TonWalletProvider['switchActiveNetwork']","Address","getConnectedAddresses: TonWalletProvider['getConnectedAddresses']","connectionTimeoutRef: {\n id: ReturnType<typeof setTimeout> | undefined;\n }","statusUnsubRef: { fn?: () => void }","modalUnsub: (() => void) | undefined","connect: TonWalletProvider['connect']","publicKey","account","proofNonce: string | undefined","disconnect: TonWalletProvider['disconnect']","signMessage: TonWalletProvider['signMessage']","sendTransaction: TonWalletProvider['sendTransaction']","sendTon: TonWalletProvider['sendTon']","prepareTonNativeTransfer","DEFAULT_TIMEOUT","sendJetton: TonWalletProvider['sendJetton']","prepareJettonTransfer","DEFAULT_JETTON_GAS","generateTonConnectProof: TonWalletProvider['generateTonConnectProof']","terminate: TonWalletProvider['terminate']","tonTransferAmount","WalletProviderPriority"],"sources":["../src/tonConnect/utils/createDefaultTonConnectUI/createDefaultTonConnectUI.ts","../src/tonConnect/tonConnectDisplayNameOverrides.ts","../src/errors/TonConnectProofNotAvailableError.ts","../src/errors/TonConnectReconnectedError.ts","../src/errors/TonConnectRejectedError.ts","../src/errors/TonConnectTimeoutError.ts","../src/errors/StateInitMissingError.ts","../src/tonConnect/utils/extractPublicKeyFromStateInit/extractPublicKeyFromStateInit.ts","../src/tonConnect/utils/createWalletProviderFromTonConnect/createWalletProviderFromTonConnect.ts","../src/tonConnect/utils/discoverAndRegisterWallets/discoverAndRegisterWallets.ts","../src/tonConnect/addTonConnectExtension/addTonConnectExtension.ts"],"sourcesContent":["import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport { TonConnectUI } from '@tonconnect/ui';\n\n/**\n * Creates a default TonConnectUI instance using the Dynamic environment's\n * universal link as the source for the TonConnect manifest URL.\n *\n * Used as a fallback when the consumer does not pass an external\n * TonConnectUI into `addTonConnectExtension`.\n *\n * @param client - The Dynamic client instance.\n * @throws When the environment's universal link is not configured.\n * @not-instrumented\n */\nexport const createDefaultTonConnectUI = (\n client: DynamicClient,\n): TonConnectUI => {\n const universalLink = getCore(client).metadata?.universalLink;\n assertDefined(universalLink, 'Universal link is not set');\n\n return new TonConnectUI({\n manifestUrl: `${universalLink}/tonconnect-manifest.json`,\n });\n};\n","/**\n * Display-name overrides for wallets returned by TonConnect's registry.\n *\n * TonConnect's `getWallets()` returns the full ecosystem catalog. Each wallet\n * comes with its own `name`, which we use as-is by default. A small number of\n * wallets ship a name that is too generic to render (e.g. Telegram Wallet's\n * registry name is just `'Wallet'`); we override those here.\n *\n * IMPORTANT: the wallet's normalized display name is what `formatWalletProviderKey`\n * uses to derive the persisted `walletProviderKey`. Changing an override breaks\n * re-login for any user who linked under the previous name. Treat this map as\n * append-only: never edit existing values, only add new ones.\n *\n * Keys are TonConnect `appName` identifiers; values are the display names we\n * want to render and persist.\n */\nexport const TON_CONNECT_DISPLAY_NAME_OVERRIDES: Record<string, string> = {\n 'telegram-wallet': 'Telegram Wallet',\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectProofNotAvailableError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'ton_connect_proof_not_available_error',\n docsUrl: null,\n name: 'TonConnectProofNotAvailableError',\n shortMessage: 'TonConnect proof not available',\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectReconnectedError extends BaseError {\n constructor(params: { walletName: string }) {\n super({\n cause: null,\n code: 'ton_connect_reconnected_error',\n docsUrl: null,\n name: 'TonConnectReconnectedError',\n shortMessage: `Reconnected to ${params.walletName}. Please try the action again.`,\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectRejectedError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'ton_connect_rejected_error',\n docsUrl: null,\n name: 'TonConnectRejectedError',\n shortMessage: 'User rejected connection',\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TonConnectTimeoutError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'ton_connect_timeout_error',\n docsUrl: null,\n name: 'TonConnectTimeoutError',\n shortMessage: 'Connection timed out — wallet did not respond',\n });\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class StateInitMissingError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'state_init_missing_error',\n docsUrl: null,\n name: 'StateInitMissingError',\n shortMessage: 'StateInit missing code or data cell',\n });\n }\n}\n","import { loadStateInit } from '@ton/core';\nimport { Cell } from '@ton/ton';\n\nimport { StateInitMissingError } from '../../../errors/StateInitMissingError';\n\nconst V5R1_CODE_HASHES = new Set([\n '2e39545f25bdc993f3bc2c1f5a3db09c1f30b70e3dd35c7ef3c25a12764fe4d0',\n '20cbb8a4c59a2521eb6e890a04b27d4f72827646a0b4bc9e20d04d8ff49e2a00',\n]);\n\nconst V5R1_SKIP_BITS = 65;\nconst DEFAULT_SKIP_BITS = 64;\nconst PUBLIC_KEY_BYTES = 32;\n\ntype ExtractPublicKeyFromStateInitParams = {\n stateInitBase64: string;\n};\n\n/**\n * Extracts the public key from a TON wallet's StateInit.\n *\n * Parses the base64-encoded StateInit cell to retrieve the 32-byte public key\n * from the data cell, handling both V5R1 and standard wallet contract layouts.\n *\n * @not-instrumented\n */\nexport const extractPublicKeyFromStateInit = ({\n stateInitBase64,\n}: ExtractPublicKeyFromStateInitParams): string => {\n const stateInitCell = Cell.fromBase64(stateInitBase64);\n const slice = stateInitCell.beginParse();\n\n const stateInit = loadStateInit(slice);\n\n const codeCell = stateInit.code;\n const dataCell = stateInit.data;\n\n if (!codeCell || !dataCell) {\n throw new StateInitMissingError();\n }\n\n const codeHash = codeCell.hash().toString('hex');\n const isV5R1 = V5R1_CODE_HASHES.has(codeHash);\n\n const dataSlice = dataCell.beginParse();\n const bitsToSkip = isV5R1 ? V5R1_SKIP_BITS : DEFAULT_SKIP_BITS;\n dataSlice.skip(bitsToSkip);\n\n const publicKeyBuffer = dataSlice.loadBuffer(PUBLIC_KEY_BYTES);\n\n return publicKeyBuffer.toString('hex');\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getNetworkProviderFromNetworkId,\n getNonce,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Address } from '@ton/core';\nimport type { TonClient } from '@ton/ton';\nimport type {\n ConnectedWallet,\n TonConnectUI,\n WalletsModalState,\n} from '@tonconnect/ui';\n\nimport { TonConnectProofNotAvailableError } from '../../../errors/TonConnectProofNotAvailableError';\nimport { TonConnectReconnectedError } from '../../../errors/TonConnectReconnectedError';\nimport { TonConnectRejectedError } from '../../../errors/TonConnectRejectedError';\nimport { TonConnectTimeoutError } from '../../../errors/TonConnectTimeoutError';\nimport type { TonWalletProvider } from '../../../TonWalletProvider.types';\nimport { DEFAULT_JETTON_GAS, DEFAULT_TIMEOUT } from '../../../utils/constants';\nimport { createTonClient } from '../../../utils/createTonClient';\nimport { prepareJettonTransfer } from '../../../utils/prepareJettonTransfer';\nimport { prepareTonNativeTransfer } from '../../../utils/prepareTonNativeTransfer';\nimport { tonTransferAmount } from '../../../utils/tonTransferAmount';\nimport { extractPublicKeyFromStateInit } from '../extractPublicKeyFromStateInit';\n\nconst CONNECTION_TIMEOUT_MS = 30_000;\n\ntype CreateWalletProviderFromTonConnectParams = {\n dynamicClient: DynamicClient;\n tonConnectUI: TonConnectUI;\n walletInfo: {\n appName: string;\n icon: string;\n jsBridgeKey?: string;\n name: string;\n };\n};\n\n/**\n * Creates a TonWalletProvider from a TonConnect wallet.\n *\n * Wraps the TonConnect UI instance to provide connect, disconnect, sign, and\n * send operations for an external TON wallet (Tonkeeper, MyTonWallet, etc.).\n *\n * @not-instrumented\n */\nexport const createWalletProviderFromTonConnect = ({\n dynamicClient,\n tonConnectUI,\n walletInfo,\n}: CreateWalletProviderFromTonConnectParams): TonWalletProvider => {\n const chain = 'TON' as const;\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n let connectedWallet: ConnectedWallet | null = null;\n let suppressStatusEvents = false;\n let cachedProofNonce: string | undefined;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: walletInfo.name,\n walletProviderType,\n });\n\n const getTonClientForActiveNetwork = async (): Promise<TonClient> => {\n const { networkId } = await getActiveNetworkId();\n const networkProvider = getNetworkProviderFromNetworkId(\n { chain: 'TON', networkId },\n dynamicClient\n );\n\n return createTonClient({ rpcUrl: networkProvider.rpcUrls.http[0] });\n };\n\n const getActiveNetworkId: TonWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: dynamicClient,\n walletProviderKey: key,\n });\n\n const switchActiveNetwork: TonWalletProvider['switchActiveNetwork'] = async ({\n networkId,\n }: {\n networkId: string;\n }) =>\n switchActiveNetworkInLastKnownRegistry({\n client: dynamicClient,\n networkId,\n walletProviderKey: key,\n });\n\n const isConnectedWalletType = (\n wallet: typeof tonConnectUI.wallet\n ): wallet is ConnectedWallet => wallet !== null && 'appName' in wallet;\n\n // eslint-disable-next-line custom-rules/require-single-object-param\n const convertAddressToUserFriendly = (address: string): string => {\n try {\n if (address.startsWith('EQ') || address.startsWith('UQ')) {\n return address;\n }\n\n const isTestnet = tonConnectUI.account?.chain === '-3';\n\n return Address.parse(address).toString({\n bounceable: false,\n testOnly: isTestnet,\n urlSafe: true,\n });\n } catch {\n return address;\n }\n };\n\n const getConnectedAddresses: TonWalletProvider['getConnectedAddresses'] =\n async () => {\n await tonConnectUI.connectionRestored;\n\n const wallet = tonConnectUI.wallet;\n\n if (\n !isConnectedWalletType(wallet) ||\n wallet.appName !== walletInfo.appName\n ) {\n return { addresses: [] };\n }\n\n return {\n addresses: [convertAddressToUserFriendly(wallet.account.address)],\n };\n };\n\n // TonConnect supports only one active connection. If another TON wallet\n // took over the session, reconnect to this wallet first, then throw so\n // the actual operation happens on a separate user action.\n //\n // In Telegram Mini Apps (TMA), programmatic deep links fail on the second\n // consecutive deep link, only user triggered deep links work reliably.\n // By splitting reconnect and the actual operation into two\n // separate user actions, each gets its own deep link and both succeed.\n const ensureCorrectWalletConnected = async (): Promise<void> => {\n await tonConnectUI.connectionRestored;\n\n const current = tonConnectUI.wallet;\n\n if (\n isConnectedWalletType(current) &&\n current.appName === walletInfo.appName\n )\n return;\n\n if (tonConnectUI.connected) {\n await tonConnectUI.disconnect();\n connectedWallet = null;\n }\n\n await connectWithModal();\n\n throw new TonConnectReconnectedError({ walletName: walletInfo.name });\n };\n\n // Connect via the TonConnect UI modal.\n const connectWithModal = (tonProofPayload?: string): Promise<void> =>\n new Promise((resolve, reject) => {\n if (tonProofPayload) {\n tonConnectUI.setConnectRequestParameters({\n state: 'ready',\n value: { tonProof: tonProofPayload },\n });\n }\n\n // Mutable handle. onStatusChange may fire synchronously on subscribe,\n // so the timeout id must live in an object assigned before registration\n // to avoid the temporal dead zone when clearing.\n const connectionTimeoutRef: {\n id: ReturnType<typeof setTimeout> | undefined;\n } = { id: undefined };\n\n // Holds the onStatusChange unsubscribe. When the callback fires\n // synchronously, `fn` isn't assigned yet; handledMatchingWalletInThisConnect\n // detaches the listener right after registration.\n const statusUnsubRef: { fn?: () => void } = {};\n let handledMatchingWalletInThisConnect = false;\n\n const handleModalClose = (state: {\n closeReason?: string | null;\n status: string;\n }) => {\n if (state.status !== 'closed') return;\n // 'wallet-selected' means a deep link was initiated — don't reject yet\n if (state.closeReason === 'wallet-selected') return;\n\n clearTimeout(connectionTimeoutRef.id);\n cleanup();\n\n const error: Error = new TonConnectRejectedError();\n reject(error);\n };\n\n let modalUnsub: (() => void) | undefined;\n\n if (walletInfo.appName) {\n modalUnsub =\n tonConnectUI.onSingleWalletModalStateChange(handleModalClose);\n } else {\n modalUnsub = tonConnectUI.onModalStateChange(\n handleModalClose as (state: WalletsModalState) => void\n );\n }\n\n const cleanup = () => {\n statusUnsubRef.fn?.();\n modalUnsub?.();\n tonConnectUI.setConnectRequestParameters(null);\n };\n\n statusUnsubRef.fn = tonConnectUI.onStatusChange(\n (wallet: ConnectedWallet | null) => {\n if (wallet?.appName !== walletInfo.appName) return;\n\n connectedWallet = wallet;\n statusUnsubRef.fn?.();\n clearTimeout(connectionTimeoutRef.id);\n handledMatchingWalletInThisConnect = true;\n resolve();\n try {\n cleanup();\n } catch {\n // setConnectRequestParameters may throw WalletAlreadyConnectedError\n // in TMA context. Safe to ignore since the wallet is connected.\n }\n }\n );\n\n if (handledMatchingWalletInThisConnect) {\n statusUnsubRef.fn?.();\n }\n\n connectionTimeoutRef.id = setTimeout(() => {\n cleanup();\n\n const error: Error = new TonConnectTimeoutError();\n reject(error);\n }, CONNECTION_TIMEOUT_MS);\n\n const handleOpenError = (error: unknown) => {\n cleanup();\n reject(error);\n };\n\n if (walletInfo.appName) {\n tonConnectUI\n .openSingleWalletModal(walletInfo.appName)\n .catch(handleOpenError);\n } else {\n tonConnectUI.openModal().catch(handleOpenError);\n }\n });\n\n const connect: TonWalletProvider['connect'] = async () => {\n await tonConnectUI.connectionRestored;\n\n const currentWallet = tonConnectUI.wallet;\n const isOurWallet =\n isConnectedWalletType(currentWallet) &&\n currentWallet.appName === walletInfo.appName;\n\n // Already connected to the correct wallet — return early\n if (tonConnectUI.connected && isOurWallet) {\n connectedWallet = currentWallet;\n const { account } = currentWallet!;\n const publicKey =\n account.publicKey ??\n extractPublicKeyFromStateInit({\n stateInitBase64: account.walletStateInit,\n });\n\n return {\n addresses: [\n { address: convertAddressToUserFriendly(account.address), publicKey },\n ],\n };\n }\n\n // Disconnect stale session before reconnecting\n if (tonConnectUI.connected && !isOurWallet) {\n await tonConnectUI.disconnect();\n connectedWallet = null;\n }\n\n // Fetch a nonce and bundle it as tonProof in the connection request.\n // This lets the wallet return both address and proof in a single\n // handshake, avoiding a second deep link during verification (critical\n // for TMA where sequential deep links fail).\n let proofNonce: string | undefined;\n try {\n proofNonce = await getNonce(dynamicClient);\n } catch {\n // Nonce fetch may fail if settings aren't loaded yet, connect\n // without proof and fall back to the disconnect/reconnect flow\n // during verification.\n }\n\n await connectWithModal(proofNonce);\n\n // Store the nonce so verification can reuse it in the SIWE message,\n // matching the cached tonProof payload.\n cachedProofNonce = proofNonce;\n\n const wallet = tonConnectUI.wallet;\n assertDefined(wallet, 'Wallet not connected after successful connection');\n\n const { account } = wallet;\n const publicKey =\n account.publicKey ??\n extractPublicKeyFromStateInit({\n stateInitBase64: account.walletStateInit,\n });\n\n return {\n addresses: [\n { address: convertAddressToUserFriendly(account.address), publicKey },\n ],\n };\n };\n\n const disconnect: TonWalletProvider['disconnect'] = async () => {\n const currentWallet = tonConnectUI.wallet;\n\n if (\n tonConnectUI.connected &&\n (!isConnectedWalletType(currentWallet) ||\n currentWallet.appName === walletInfo.appName)\n ) {\n await tonConnectUI.disconnect();\n }\n\n connectedWallet = null;\n };\n\n const signMessage: TonWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n // Verification messages (SIWE-style) contain a nonce. For TON external\n // wallets, we use tonProof instead of raw signing, it includes state_init\n // and public_key which the backend needs to verify ownership of a TON\n // smart contract wallet.\n const nonceMatch = message.match(/Nonce:\\s*([^\\n\\r]+)/i);\n if (nonceMatch?.[1]) {\n const nonce = nonceMatch[1].trim().slice(0, 128);\n const proof = await generateTonConnectProof!({\n payload: nonce,\n walletAccount,\n });\n\n const stateInit = connectedWallet?.account.walletStateInit;\n const publicKey =\n connectedWallet?.account.publicKey ??\n (stateInit\n ? extractPublicKeyFromStateInit({ stateInitBase64: stateInit })\n : undefined);\n\n return {\n signature: JSON.stringify({\n address: connectedWallet?.account.address ?? walletAccount.address,\n proof: {\n domain: proof.domain,\n payload: proof.payload,\n signature: proof.signature,\n state_init: stateInit,\n timestamp: proof.timestamp,\n },\n public_key: publicKey,\n }),\n };\n }\n\n await ensureCorrectWalletConnected();\n\n const result = await tonConnectUI.signData({\n text: message,\n type: 'text',\n });\n\n return { signature: result.signature };\n };\n\n const sendTransaction: TonWalletProvider['sendTransaction'] = async ({\n request,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n await ensureCorrectWalletConnected();\n\n const result = await tonConnectUI.sendTransaction({\n messages: request.messages.map((msg) => ({\n address: msg.address,\n amount: msg.amount,\n payload: msg.payload,\n stateInit: msg.stateInit,\n })),\n validUntil: request.validUntil,\n });\n\n return { transactionHash: result.boc };\n };\n\n const sendTon: TonWalletProvider['sendTon'] = async ({\n transaction,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const request = prepareTonNativeTransfer({\n amountInNanoton: transaction.amount.toString(),\n recipient: transaction.recipientAddress,\n timeout: DEFAULT_TIMEOUT,\n walletAddress: walletAccount.address,\n });\n\n return sendTransaction({ request, walletAccount });\n };\n\n const sendJetton: TonWalletProvider['sendJetton'] = async ({\n transaction,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const client = await getTonClientForActiveNetwork();\n\n const request = await prepareJettonTransfer({\n client,\n forwardTonAmount: transaction.forwardTonAmount ?? BigInt(0),\n gasAmount: transaction.gasAmount ?? DEFAULT_JETTON_GAS,\n jettonAmount: transaction.amount,\n jettonMasterAddress: transaction.jettonMasterAddress,\n recipientAddress: transaction.recipientAddress,\n timeout: DEFAULT_TIMEOUT,\n walletAddress: walletAccount.address,\n });\n\n return sendTransaction({ request, walletAccount });\n };\n\n // Disconnects the current TonConnect session and reconnects with a\n // proof payload via the modal.\n // eslint-disable-next-line custom-rules/require-single-object-param\n const reconnectWithProof = async (payload: string) => {\n if (tonConnectUI.connected) {\n connectedWallet = null;\n await tonConnectUI.disconnect();\n }\n\n await connectWithModal(payload);\n };\n\n // Returns a cached proof from the initial connection handshake when\n // available. Falls back to a disconnect/reconnect cycle with the\n // requested payload when the cached proof is missing or stale.\n const generateTonConnectProof: TonWalletProvider['generateTonConnectProof'] =\n async ({ payload, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n // Return cached proof if already connected with matching payload\n if (connectedWallet?.connectItems?.tonProof) {\n const { tonProof } = connectedWallet.connectItems;\n\n if ('proof' in tonProof && tonProof.proof.payload === payload) {\n // Clear after use, nonces are one-time-use on the backend\n cachedProofNonce = undefined;\n\n return {\n address: walletAccount.address,\n domain: tonProof.proof.domain,\n payload: tonProof.proof.payload,\n signature: tonProof.proof.signature,\n timestamp: tonProof.proof.timestamp,\n };\n }\n }\n\n // Suppress SDK events during the disconnect/reconnect cycle so the\n // wallet management layer doesn't see a sudden disconnect + accounts\n // change during verification.\n suppressStatusEvents = true;\n\n try {\n await reconnectWithProof(payload);\n } finally {\n suppressStatusEvents = false;\n }\n\n const wallet = tonConnectUI.wallet;\n const proof = isConnectedWalletType(wallet)\n ? wallet.connectItems?.tonProof\n : undefined;\n\n if (!proof || !('proof' in proof)) {\n throw new TonConnectProofNotAvailableError();\n }\n\n return {\n address: walletAccount.address,\n domain: proof.proof.domain,\n payload: proof.proof.payload,\n signature: proof.proof.signature,\n timestamp: proof.proof.timestamp,\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter<VoidFunction>({\n removeEventListeners: ({\n setupReturnValue,\n }: {\n setupReturnValue: VoidFunction | undefined;\n }) => {\n assertDefined(setupReturnValue, 'Setup return value not defined');\n setupReturnValue();\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleDisconnected,\n }: {\n handleAccountsChanged: (args: { addresses: string[] }) => void;\n handleDisconnected: () => void;\n }) =>\n tonConnectUI.onStatusChange((wallet: ConnectedWallet | null) => {\n if (suppressStatusEvents) return;\n\n if (wallet?.appName !== walletInfo.appName) {\n if (connectedWallet) {\n connectedWallet = null;\n handleDisconnected();\n }\n return;\n }\n\n connectedWallet = wallet;\n handleAccountsChanged({\n addresses: [convertAddressToUserFriendly(wallet.account.address)],\n });\n }),\n\n supportedEvents: ['accountsChanged', 'disconnected'],\n });\n\n const terminate: TonWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n connect,\n disconnect,\n get events() {\n return getEventEmitter();\n },\n generateTonConnectProof,\n getActiveNetworkId,\n getConnectedAddresses,\n getConnectProofNonce: () => cachedProofNonce,\n groupKey: formatWalletProviderGroupKey(walletInfo.name),\n key,\n metadata: {\n displayName: walletInfo.name,\n icon: walletInfo.icon,\n },\n sendJetton,\n sendTon,\n sendTransaction,\n signMessage,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => tonTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport type { TonConnectUI } from '@tonconnect/ui';\n\nimport { TON_CONNECT_DISPLAY_NAME_OVERRIDES } from '../../tonConnectDisplayNameOverrides';\nimport { createWalletProviderFromTonConnect } from '../createWalletProviderFromTonConnect';\n\ntype DiscoverAndRegisterWalletsParams = {\n client: DynamicClient;\n tonConnectUI: TonConnectUI;\n};\n\n/**\n * Discovers TonConnect wallets and registers each as a wallet provider.\n *\n * Queries the TonConnect registry for the full wallet catalog and registers\n * every entry as a wallet provider with the Dynamic client. Display names are\n * taken from the registry by default; a small override map handles wallets\n * whose registry name would otherwise be too generic (e.g. Telegram Wallet).\n *\n * @not-instrumented\n */\nexport const discoverAndRegisterWallets = async ({\n client,\n tonConnectUI,\n}: DiscoverAndRegisterWalletsParams): Promise<void> => {\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const wallets = await tonConnectUI.connector.getWallets();\n\n for (const wallet of wallets) {\n const isInjected =\n 'jsBridgeKey' in wallet &&\n 'injected' in wallet &&\n (wallet as unknown as { injected: boolean }).injected === true;\n\n const walletProvider = createWalletProviderFromTonConnect({\n dynamicClient: client,\n tonConnectUI,\n walletInfo: {\n appName: wallet.appName,\n icon: wallet.imageUrl,\n jsBridgeKey: isInjected\n ? (wallet as unknown as { jsBridgeKey: string }).jsBridgeKey\n : undefined,\n name:\n TON_CONNECT_DISPLAY_NAME_OVERRIDES[wallet.appName] ?? wallet.name,\n },\n });\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SELF_ANNOUNCEMENT_STANDARD,\n walletProvider,\n });\n }\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n getDefaultClient,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\nimport type { TonConnectUI } from '@tonconnect/ui';\n\nimport { registerTonNetworkProviderBuilder } from '../../registerTonNetworkProviderBuilder';\nimport { createDefaultTonConnectUI } from '../utils/createDefaultTonConnectUI';\nimport { discoverAndRegisterWallets } from '../utils/discoverAndRegisterWallets';\n\nexport const TON_CONNECT_EXTENSION_KEY = 'tonConnect';\n\nexport type AddTonConnectExtensionParams = {\n /**\n * An external TonConnectUI instance to reuse. When omitted, a new instance\n * is created internally using the Dynamic environment's universal link as\n * the manifest URL. Provide this when your app already manages a\n * TonConnectUI singleton.\n */\n tonConnectUI?: TonConnectUI;\n};\n\n/**\n * Adds the TonConnect extension to the Dynamic client.\n *\n * This extension enables external TON wallet support via the TonConnect protocol,\n * discovering and registering supported wallets (Tonkeeper, MyTonWallet, etc.)\n * as wallet providers.\n *\n * @param [params] - Optional configuration for the TonConnect extension.\n * @param [params.tonConnectUI] - An external TonConnectUI instance to reuse.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addTonConnectExtension = (\n { tonConnectUI }: AddTonConnectExtensionParams = {},\n client: DynamicClient = getDefaultClient()\n): void => {\n if (hasExtension({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerExtension({ extensionKey: TON_CONNECT_EXTENSION_KEY }, client);\n registerTonNetworkProviderBuilder(client);\n\n const resolvedTonConnectUI =\n tonConnectUI ?? createDefaultTonConnectUI(client);\n\n void discoverAndRegisterWallets({\n client,\n tonConnectUI: resolvedTonConnectUI,\n });\n};\n"],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { DynamicClient } from '@dynamic-labs-sdk/client';
|
|
2
|
+
import { type AddTonConnectExtensionParams } from '../tonConnect/addTonConnectExtension';
|
|
3
|
+
export type AddTonExtensionParams = AddTonConnectExtensionParams;
|
|
1
4
|
/**
|
|
2
5
|
* Adds the TON extension to the Dynamic client.
|
|
3
6
|
*
|
|
@@ -6,8 +9,10 @@
|
|
|
6
9
|
* including external wallets (Tonkeeper, MyTonWallet, etc.) and embedded wallets
|
|
7
10
|
* managed by Dynamic's infrastructure.
|
|
8
11
|
*
|
|
12
|
+
* @param [params] - Optional configuration forwarded to the TonConnect extension.
|
|
13
|
+
* @param [params.tonConnectUI] - An external TonConnectUI instance to reuse.
|
|
9
14
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
10
15
|
* @not-instrumented
|
|
11
16
|
*/
|
|
12
|
-
export declare const addTonExtension: (client?:
|
|
17
|
+
export declare const addTonExtension: (params?: AddTonExtensionParams, client?: DynamicClient) => void;
|
|
13
18
|
//# sourceMappingURL=addTonExtension.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addTonExtension.d.ts","sourceRoot":"","sources":["../../src/addTonExtension/addTonExtension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addTonExtension.d.ts","sourceRoot":"","sources":["../../src/addTonExtension/addTonExtension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EACL,KAAK,4BAA4B,EAElC,MAAM,sCAAsC,CAAC;AAG9C,MAAM,MAAM,qBAAqB,GAAG,4BAA4B,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,YAClB,qBAAqB,WACrB,aAAa,KACpB,IAGF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/addTonExtension/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/addTonExtension/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as prepareJettonTransfer, d as registerTonNetworkProviderBuilder, f as createTonClient, i as prepareTonNativeTransfer, l as TON_CONNECT_PREFIX, o as DEFAULT_JETTON_GAS, s as DEFAULT_TIMEOUT, t as tonTransferAmount, u as TON_PROOF_PREFIX } from "./tonTransferAmount-
|
|
1
|
+
import { a as prepareJettonTransfer, d as registerTonNetworkProviderBuilder, f as createTonClient, i as prepareTonNativeTransfer, l as TON_CONNECT_PREFIX, o as DEFAULT_JETTON_GAS, s as DEFAULT_TIMEOUT, t as tonTransferAmount, u as TON_PROOF_PREFIX } from "./tonTransferAmount-CgREtm2F.esm.js";
|
|
2
2
|
import { WalletProviderPriority, assertDefined, consumeMfaTokenIfRequiredForAction, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getBuffer, getCore, getDefaultClient, getNetworkProviderFromNetworkId, getSignedSessionId, getWalletProviderRegistry, hasExtension, registerExtension, switchActiveNetworkInLastKnownRegistry } from "@dynamic-labs-sdk/client/core";
|
|
3
3
|
import { Address, Cell, WalletContractV5R1, beginCell } from "@ton/ton";
|
|
4
4
|
import { MFAAction, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
|
|
@@ -467,4 +467,4 @@ const addWaasTonExtension = (client = getDefaultClient()) => {
|
|
|
467
467
|
|
|
468
468
|
//#endregion
|
|
469
469
|
export { TransactionExecutionFailedError as n, addWaasTonExtension as t };
|
|
470
|
-
//# sourceMappingURL=addWaasTonExtension-
|
|
470
|
+
//# sourceMappingURL=addWaasTonExtension-CZ7OhPpB.esm.js.map
|