From be45d90d72fe16e1a3f928330c046cbf090012e8 Mon Sep 17 00:00:00 2001 From: Dmitrii Nikulin Date: Tue, 17 Mar 2026 12:29:50 +0530 Subject: [PATCH] feat: add support for signature domains in signer creation and network configuration --- .../src/api/wallets.ts | 13 +++++--- .../src/core/initialization.ts | 32 +++++++++++++++---- .../src/core/moduleLoader.ts | 6 ++-- .../walletkit-android-bridge/src/types/api.ts | 4 +++ .../src/types/walletkit.ts | 1 + 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/packages/walletkit-android-bridge/src/api/wallets.ts b/packages/walletkit-android-bridge/src/api/wallets.ts index b0f7ad7a1..5304ef3dd 100644 --- a/packages/walletkit-android-bridge/src/api/wallets.ts +++ b/packages/walletkit-android-bridge/src/api/wallets.ts @@ -14,6 +14,7 @@ import type { Base64String, UserFriendlyAddress, Feature, + SignatureDomain, } from '@ton/walletkit'; import type { WalletId } from '@ton/walletkit'; import type { TransactionRequest } from '@ton/walletkit'; @@ -131,16 +132,20 @@ export async function getBalance(args: { walletId: string }) { return wallet(args.walletId, 'getBalance'); } -export async function createSignerFromMnemonic(args: { mnemonic: string[]; mnemonicType?: string }) { +export async function createSignerFromMnemonic(args: { + mnemonic: string[]; + mnemonicType?: string; + domain?: SignatureDomain; +}) { if (!Signer) throw new Error('Signer module not loaded'); - const signer = await Signer.fromMnemonic(args.mnemonic, { type: args.mnemonicType ?? 'ton' }); + const signer = await Signer.fromMnemonic(args.mnemonic, { type: args.mnemonicType ?? 'ton' }, args.domain); const signerId = retain('signer', signer); return { signerId, publicKey: signer.publicKey }; } -export async function createSignerFromPrivateKey(args: { secretKey: string }) { +export async function createSignerFromPrivateKey(args: { secretKey: string; domain?: SignatureDomain }) { if (!Signer) throw new Error('Signer module not loaded'); - const signer = await Signer.fromPrivateKey(args.secretKey); + const signer = await Signer.fromPrivateKey(args.secretKey, args.domain); const signerId = retain('signer', signer); return { signerId, publicKey: signer.publicKey }; } diff --git a/packages/walletkit-android-bridge/src/core/initialization.ts b/packages/walletkit-android-bridge/src/core/initialization.ts index 3c9e14665..40a1e283f 100644 --- a/packages/walletkit-android-bridge/src/core/initialization.ts +++ b/packages/walletkit-android-bridge/src/core/initialization.ts @@ -10,7 +10,7 @@ * WalletKit initialization helpers used by the bridge entry point. */ import type { BridgeResponse, BridgeEvent } from '@ton/walletkit'; -import { TONCONNECT_BRIDGE_EVENT } from '@ton/walletkit'; +import { TONCONNECT_BRIDGE_EVENT, ApiClientTonApi, ApiClientToncenter } from '@ton/walletkit'; import { TONCONNECT_BRIDGE_RESPONSE } from '@ton/walletkit/bridge'; import type { @@ -52,14 +52,34 @@ export async function initTonWalletKit( await ensureWalletKitLoaded(); - // Build networks config from networkConfigurations (like iOS bridge does) - const networksConfig: Record = {}; + type NetworkApiClient = + | ApiClientTonApi + | ApiClientToncenter + | AndroidAPIClientAdapter + | { url?: string; key?: string }; + const networksConfig: Record = {}; if (config?.networkConfigurations && Array.isArray(config.networkConfigurations)) { for (const netConfig of config.networkConfigurations) { - networksConfig[netConfig.network.chainId] = { - apiClient: netConfig.apiClientConfiguration, - }; + const type = netConfig.apiClientType; + let apiClient: NetworkApiClient | undefined; + + if (type === 'tonapi') { + apiClient = new ApiClientTonApi({ + endpoint: netConfig.apiClientConfiguration?.url, + apiKey: netConfig.apiClientConfiguration?.key, + network: netConfig.network, + }); + } else if (type === 'toncenter') { + apiClient = new ApiClientToncenter({ + endpoint: netConfig.apiClientConfiguration?.url, + apiKey: netConfig.apiClientConfiguration?.key, + }); + } else { + apiClient = netConfig.apiClientConfiguration; + } + + networksConfig[netConfig.network.chainId] = { apiClient }; } } diff --git a/packages/walletkit-android-bridge/src/core/moduleLoader.ts b/packages/walletkit-android-bridge/src/core/moduleLoader.ts index fea8b8e42..2ae060202 100644 --- a/packages/walletkit-android-bridge/src/core/moduleLoader.ts +++ b/packages/walletkit-android-bridge/src/core/moduleLoader.ts @@ -15,9 +15,11 @@ const walletKitModulePromise = import('@ton/walletkit'); type TonWalletKitConstructor = new (options: Record) => WalletKitInstance; +type SignerDomain = { type: string; globalId?: number }; + type SignerFactory = { - fromMnemonic: (mnemonic: string[], options: { type: string }) => Promise; - fromPrivateKey: (secretKey: string) => Promise; + fromMnemonic: (mnemonic: string[], options: { type: string }, domain?: SignerDomain) => Promise; + fromPrivateKey: (secretKey: string, domain?: SignerDomain) => Promise; }; type AdapterFactory = { diff --git a/packages/walletkit-android-bridge/src/types/api.ts b/packages/walletkit-android-bridge/src/types/api.ts index a76086ccc..1fee80612 100644 --- a/packages/walletkit-android-bridge/src/types/api.ts +++ b/packages/walletkit-android-bridge/src/types/api.ts @@ -55,10 +55,14 @@ export interface CreateTonMnemonicArgs { export interface CreateSignerFromMnemonicArgs { mnemonic: string[]; mnemonicType?: string; + /** Optional signature domain for L2 chains (e.g. Tetra). */ + domain?: { type: 'l2'; globalId: number } | { type: 'empty' }; } export interface CreateSignerFromPrivateKeyArgs { secretKey: string; + /** Optional signature domain for L2 chains (e.g. Tetra). */ + domain?: { type: 'l2'; globalId: number } | { type: 'empty' }; } export interface CreateSignerFromCustomArgs { diff --git a/packages/walletkit-android-bridge/src/types/walletkit.ts b/packages/walletkit-android-bridge/src/types/walletkit.ts index 9266e24aa..d471adaf9 100644 --- a/packages/walletkit-android-bridge/src/types/walletkit.ts +++ b/packages/walletkit-android-bridge/src/types/walletkit.ts @@ -50,6 +50,7 @@ export interface WalletKitBridgeInitConfig { url?: string; key?: string; }; + apiClientType?: 'default' | 'toncenter' | 'tonapi' | 'custom'; }>; }