Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 74 additions & 43 deletions packages/walletkit-ios-bridge/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,42 @@
/* eslint-disable no-console */
/* eslint-disable @typescript-eslint/no-explicit-any */

import type { WalletSigner, BridgeEventMessageInfo, InjectedToExtensionBridgeRequestPayload } from '@ton/walletkit';
import type {
WalletSigner,
BridgeEventMessageInfo,
InjectedToExtensionBridgeRequestPayload,
NetworkAdapters,
Wallet,
TransactionRequest,
SignDataRequestEvent,
TransactionRequestEvent,
ConnectionRequestEvent,
Network,
StorageAdapter,
} from '@ton/walletkit';
import { MemoryStorageAdapter, Signer, WalletV4R2Adapter, WalletV5R1Adapter, TonWalletKit } from '@ton/walletkit';
import type { WalletAdapter } from '@ton/walletkit';

import { SwiftStorageAdapter } from './SwiftStorageAdapter';
import { SwiftWalletAdapter } from './SwiftWalletAdapter';
import { SwiftAPIClientAdapter } from './SwiftAPIClientAdapter';
import type {
SwiftApiClient,
SwiftBridgeTransport,
SwiftWalletKit,
SwiftWalletKitConfiguration,
SwiftWalletSigner,
} from './types';

declare global {
interface Window {
walletKit?: any;
initWalletKit: (configuration, storage, bridgeTransport: (response) => void, apiClients) => Promise<void>;
walletKit?: SwiftWalletKit;
initWalletKit: (
configuration: SwiftWalletKitConfiguration,
storage?: StorageAdapter,
bridgeTransport?: SwiftBridgeTransport,
apiClients?: SwiftApiClient[],
) => Promise<void>;
}
}

Expand All @@ -31,11 +55,13 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
console.log('Storage', storage);
console.log('API Clients', apiClients);

configuration.bridge.jsBridgeTransport = (sessionID, message) => {
bridgeTransport({ sessionID, messageID: message.messageId, message });
};
if (configuration.bridge && bridgeTransport) {
configuration.bridge.jsBridgeTransport = (sessionID: string, message: any) => {
bridgeTransport({ sessionID, messageID: message.messageId, message });
};
}

const networks = {};
const networks: NetworkAdapters = {};
if (configuration.networkConfigurations) {
for (const netConfig of configuration.networkConfigurations) {
networks[netConfig.network.chainId] = {
Expand All @@ -44,15 +70,17 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
}
}

for (const apiClient of apiClients) {
const network = apiClient.getNetwork();
const client = new SwiftAPIClientAdapter(apiClient);
if (apiClients) {
for (const apiClient of apiClients) {
const network = apiClient.getNetwork();
const client = new SwiftAPIClientAdapter(apiClient);

console.log('API Client Network', network);
console.log('API Client Network', network);

networks[network.chainId] = {
apiClient: client,
};
networks[network.chainId] = {
apiClient: client,
};
}
}

const walletKit = new TonWalletKit({
Expand Down Expand Up @@ -92,14 +120,14 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
window.walletKit = {
// Check if initialized
isReady() {
return initialized && walletKit;
return initialized && !!walletKit;
},

jettonsManager() {
return walletKit.jettons;
},

setEventsListeners(callback) {
setEventsListeners(callback: (type: string, event: unknown) => Promise<void>) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('🔔 Bridge: Adding event listeners');

Expand Down Expand Up @@ -136,7 +164,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
console.log('🗑️ All event listeners removed');
},

async createSignerFromMnemonic(mnemonic) {
async createSignerFromMnemonic(mnemonic: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');

console.log('➕ Bridge: Creating signer from mnemonic');
Expand All @@ -148,7 +176,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
return await Signer.fromMnemonic(mnemonic, { type: 'ton' });
},

async createSignerFromPrivateKey(privateKey) {
async createSignerFromPrivateKey(privateKey: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');

console.log('➕ Bridge: Creating signer from private key');
Expand All @@ -160,7 +188,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
return await Signer.fromPrivateKey(privateKey);
},

async createV4R2WalletAdapter(signer, parameters) {
async createV4R2WalletAdapter(signer: WalletSigner | SwiftWalletSigner, parameters: { network: Network }) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');

console.log('➕ Bridge: Creating V4R2 wallet using mnemonic');
Expand All @@ -178,7 +206,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
});
},

async createV5R1WalletAdapter(signer, parameters) {
async createV5R1WalletAdapter(signer: WalletSigner | SwiftWalletSigner, parameters: { network: Network }) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');

console.log('➕ Bridge: Creating V5R1 wallet using mnemonic');
Expand All @@ -196,16 +224,19 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
});
},

jsSigner(signer): WalletSigner {
jsSigner(signer: WalletSigner | SwiftWalletSigner): WalletSigner {
if (isSwiftObject(signer)) {
const swiftSigner = signer as SwiftWalletSigner;

return {
sign: async (bytes: Iterable<number>) => {
return await signer.sign(bytes);
return await swiftSigner.sign(bytes);
},
publicKey: signer.publicKey(),
publicKey: swiftSigner.publicKey(),
};
}
return signer;

return signer as WalletSigner;
},

async processInjectedBridgeRequest(
Expand All @@ -218,7 +249,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
},

// Wallet management
async addWallet(walletAdapter) {
async addWallet(walletAdapter: WalletAdapter) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('➕ Bridge: Adding wallet:');

Expand All @@ -232,21 +263,21 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
return wallet;
},

jsWalletAdapter(walletAdapter): WalletAdapter {
jsWalletAdapter(walletAdapter: WalletAdapter): WalletAdapter {
if (isSwiftObject(walletAdapter)) {
return new SwiftWalletAdapter(walletAdapter, walletKit.getApiClient(walletAdapter.getNetwork()));
}
return walletAdapter;
},

getWallet(address) {
getWallet(address: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');

console.log('🔍 Bridge: Getting wallet for address:', address);
return walletKit.getWallet(address);
},

async removeWallet(address) {
async removeWallet(address: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('➖ Bridge: Removing wallet:', address);

Expand All @@ -264,9 +295,8 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
console.log('🗑️ Bridge: Clearing all wallets');

try {
const result = await walletKit.clearWallets();
console.log('✅ All wallets cleared:', result);
return result;
await walletKit.clearWallets();
console.log('✅ All wallets cleared');
} catch (error) {
console.error('❌ Failed to clear wallets:', error);
throw error;
Expand Down Expand Up @@ -295,7 +325,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
},

// Connection handling
async handleTonConnectUrl(url) {
async handleTonConnectUrl(url: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('🔗 Bridge: Handling TON Connect URL:', url);

Expand All @@ -309,7 +339,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
}
},

async approveConnectRequest(request) {
async approveConnectRequest(request: ConnectionRequestEvent) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('✅ Bridge: Approving connect request:', request, request.walletAddress);

Expand All @@ -323,7 +353,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
}
},

async rejectConnectRequest(request, reason) {
async rejectConnectRequest(request: ConnectionRequestEvent, reason?: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('❌ Bridge: Rejecting connect request:', request.id, reason || 'User rejected');

Expand All @@ -338,7 +368,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
},

// Transaction handling
async approveTransactionRequest(request) {
async approveTransactionRequest(request: TransactionRequestEvent) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('✅ Bridge: Approving transaction request:', request);

Expand All @@ -352,7 +382,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
}
},

async rejectTransactionRequest(request, reason) {
async rejectTransactionRequest(request: TransactionRequestEvent, reason?: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('❌ Bridge: Rejecting transaction request:', request, reason);

Expand All @@ -367,7 +397,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
},

// Sign data handling
async approveSignDataRequest(request) {
async approveSignDataRequest(request: SignDataRequestEvent) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('✅ Bridge: Approving sign data request:', request);

Expand All @@ -381,7 +411,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
}
},

async rejectSignDataRequest(request, reason) {
async rejectSignDataRequest(request: SignDataRequestEvent, reason?: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('❌ Bridge: Rejecting sign data request:', request, reason);

Expand All @@ -396,7 +426,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
},

// Session management
async disconnect(sessionId) {
async disconnect(sessionId: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('🔌 Bridge: Disconnecting session:', sessionId);

Expand All @@ -411,7 +441,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
},

// Jettons
async getJettons(walletAddress) {
async getJettons(walletAddress: string) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('🪙 Bridge: Getting jettons for:', walletAddress);

Expand All @@ -425,7 +455,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
}
},

async sendTransaction(wallet, transaction) {
async sendTransaction(wallet: Wallet, transaction: TransactionRequest) {
if (!initialized) throw new Error('WalletKit Bridge not initialized');
console.log('🪙 Bridge: Sending transaction:', transaction);

Expand All @@ -434,7 +464,7 @@ window.initWalletKit = async (configuration, storage, bridgeTransport, apiClient
};
};

function parseSwiftConstructorPattern(str) {
function parseSwiftConstructorPattern(str: string) {
const match = str.match(/^\[object ([A-Za-z_$][A-Za-z0-9_$]*)\.([A-Za-z_$][A-Za-z0-9_$]*)Constructor\]$/);

if (match) {
Expand All @@ -448,10 +478,11 @@ function parseSwiftConstructorPattern(str) {
return null;
}

function isSwiftObject(obj) {
function isSwiftObject(obj: any) {
if (obj && obj.constructor) {
const pattern = parseSwiftConstructorPattern(obj.constructor.toString());
return pattern !== null;
}

return false;
}
Loading
Loading