@meshconnect/uwc-bridge-parent 1.0.2 → 1.1.1-snapshot.28ab063

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.
@@ -35,9 +35,6 @@ export interface EIP6963AnnounceProviderEvent extends CustomEvent {
35
35
  type: 'eip6963:announceProvider';
36
36
  detail: EIP6963ProviderDetail;
37
37
  }
38
- export interface EIP6963RequestProviderEvent extends Event {
39
- type: 'eip6963:requestProvider';
40
- }
41
38
  export interface DetectedWallet {
42
39
  uuid: string;
43
40
  name: string;
@@ -45,24 +42,36 @@ export interface DetectedWallet {
45
42
  rdns: string;
46
43
  provider: EthereumProvider;
47
44
  }
45
+ export interface TronWalletInfo {
46
+ uuid: string;
47
+ name: string;
48
+ injectedId: string;
49
+ provider: any;
50
+ }
48
51
  export interface ParentAPI {
49
52
  eip6963Wallets: DetectedWallet[];
50
53
  eip6963WalletsReady: boolean;
51
54
  walletStandardWallets: WalletStandardInfo[];
52
55
  walletStandardWalletsReady: boolean;
56
+ tronWallets: TronWalletInfo[];
57
+ tronWalletsReady: boolean;
58
+ discoverTronWallets: (injectedIds: string[]) => void;
53
59
  }
54
60
  export declare class BridgeParent {
55
61
  private iframe;
56
- private handshakeComplete;
57
62
  private parentAPI;
58
63
  private endpoint;
59
64
  constructor(iframe: HTMLIFrameElement);
60
65
  private initializeConnection;
61
- isConnected(): boolean;
62
- private discoverWallets;
66
+ private discovereip6963Wallets;
63
67
  private getSolanaWallets;
64
68
  private isSolanaWallet;
65
69
  private generateWalletId;
70
+ /**
71
+ * Checks if a value looks like a Tron provider (has request and tronWeb)
72
+ */
73
+ private isTronProvider;
74
+ private getTronWallets;
66
75
  destroy(): void;
67
76
  }
68
77
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"BridgeParent.d.ts","sourceRoot":"","sources":["../src/BridgeParent.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,WAAW,EAAwB,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAA;AAEnF,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAEvE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;IAE/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;CAC5E;AAED,UAAU,6BAA8B,SAAQ,qBAAqB;IACnE,eAAe,EAAE,CACb,2BAA2B,GAC3B,2BAA2B,GAC3B,+BAA+B,CAClC,EAAE,CAAA;IACH,yBAAyB,EAAE,CACzB,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,MAAM,CAAC,CAAA;IACpB,yBAAyB,EAAE,CACzB,WAAW,EAAE,eAAe,KACzB,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,CAAA;IACjC,6BAA6B,EAAE,CAC7B,YAAY,EAAE,eAAe,EAAE,KAC5B,OAAO,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,OAAO,EAAE,6BAA6B,GAAG,SAAS,CAAA;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED,MAAM,WAAW,4BAA6B,SAAQ,WAAW;IAC/D,IAAI,EAAE,0BAA0B,CAAA;IAChC,MAAM,EAAE,qBAAqB,CAAA;CAC9B;AAED,MAAM,WAAW,2BAA4B,SAAQ,KAAK;IACxD,IAAI,EAAE,yBAAyB,CAAA;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,cAAc,EAAE,CAAA;IAChC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,qBAAqB,EAAE,kBAAkB,EAAE,CAAA;IAC3C,0BAA0B,EAAE,OAAO,CAAA;CACpC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAgC;gBAEpC,MAAM,EAAE,iBAAiB;YASvB,oBAAoB;IA2BlC,WAAW,IAAI,OAAO;YAIR,eAAe;IA2C7B,OAAO,CAAC,gBAAgB;IAoMxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,gBAAgB;IAKjB,OAAO,IAAI,IAAI;CAYvB"}
1
+ {"version":3,"file":"BridgeParent.d.ts","sourceRoot":"","sources":["../src/BridgeParent.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,6 @@ import { Connection, Transaction, VersionedTransaction } from '@solana/web3.js';
5
5
  import { StandardWalletAdapter } from '@solana/wallet-standard-wallet-adapter-base';
6
6
  export class BridgeParent {
7
7
  iframe;
8
- handshakeComplete = false;
9
8
  parentAPI = null;
10
9
  endpoint = null;
11
10
  constructor(iframe) {
@@ -20,27 +19,34 @@ export class BridgeParent {
20
19
  if (!this.iframe || !this.iframe.contentWindow) {
21
20
  return;
22
21
  }
23
- const eip6963Wallets = await this.discoverWallets();
22
+ // For eip6963 and solana wallets we can start discovery as soon as the iframe loads, but for tron we need to look for specific IDs that we get from the child iframe
23
+ const eip6963Wallets = await this.discovereip6963Wallets();
24
24
  const walletStandardWallets = this.getSolanaWallets();
25
25
  this.parentAPI = {
26
26
  eip6963Wallets: eip6963Wallets,
27
27
  eip6963WalletsReady: true,
28
28
  walletStandardWallets: walletStandardWallets,
29
- walletStandardWalletsReady: true
29
+ walletStandardWalletsReady: true,
30
+ tronWallets: [],
31
+ tronWalletsReady: false,
32
+ // Called by BridgeChild to trigger Tron wallet discovery with injectedIds
33
+ discoverTronWallets: (injectedIds) => {
34
+ if (this.parentAPI) {
35
+ this.parentAPI.tronWallets = this.getTronWallets(injectedIds);
36
+ this.parentAPI.tronWalletsReady = true;
37
+ }
38
+ }
30
39
  };
31
40
  // Use Comlink's windowEndpoint with proper cross-origin support
32
41
  // For cross-origin, we need to listen on the parent window, not access the iframe's window
33
- this.endpoint = Comlink.windowEndpoint(this.iframe.contentWindow, window, '*');
42
+ const iframeOrigin = new URL(this.iframe.src, window.location.href).origin;
43
+ this.endpoint = Comlink.windowEndpoint(this.iframe.contentWindow, window, iframeOrigin);
34
44
  Comlink.expose(this.parentAPI, this.endpoint);
35
- this.handshakeComplete = true;
36
- }
37
- isConnected() {
38
- return this.handshakeComplete;
39
45
  }
40
- async discoverWallets() {
46
+ async discovereip6963Wallets() {
41
47
  return new Promise(resolve => {
42
48
  const detectedWallets = [];
43
- const timeout = 1000; // Wait up to 1 second for wallets to announce
49
+ const timeout = 100; // Wait 100ms for wallets to announce
44
50
  // Set up listener for wallet announcements
45
51
  const handleAnnouncement = (event) => {
46
52
  const announcementEvent = event;
@@ -53,7 +59,7 @@ export class BridgeParent {
53
59
  name: info.name,
54
60
  icon: info.icon,
55
61
  rdns: info.rdns,
56
- provider
62
+ provider: provider
57
63
  });
58
64
  }
59
65
  };
@@ -235,11 +241,74 @@ export class BridgeParent {
235
241
  const chain = wallet.chains?.[0] || 'unknown';
236
242
  return `${wallet.name}-${chain}`.toLowerCase().replace(/\s+/g, '-');
237
243
  }
244
+ /**
245
+ * Checks if a value looks like a Tron provider (has request and tronWeb)
246
+ */
247
+ isTronProvider(value) {
248
+ if (!value || typeof value !== 'object')
249
+ return false;
250
+ const provider = value;
251
+ return provider['tronWeb'] != null && 'request' in provider;
252
+ }
253
+ getTronWallets(injectedIds) {
254
+ if (typeof window === 'undefined' || injectedIds.length === 0) {
255
+ return [];
256
+ }
257
+ const wallets = [];
258
+ const seen = new Set();
259
+ for (const injectedId of injectedIds) {
260
+ // Resolve nested window path (e.g. 'tokenpocket.tron' -> window.tokenpocket.tron)
261
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
262
+ const provider = injectedId.split('.').reduce((acc, part) => acc?.[part],
263
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
264
+ window);
265
+ // Check if it looks like a TronProvider (has tronWeb.trx)
266
+ if (this.isTronProvider(provider) && !seen.has(injectedId)) {
267
+ seen.add(injectedId);
268
+ const name = injectedId.split('.')[0] || injectedId;
269
+ const uuid = `tron-${injectedId}`.toLowerCase().replace(/\./g, '-');
270
+ // Create proxied provider with all TronWeb methods
271
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
272
+ const actualProvider = provider;
273
+ const proxiedProvider = Comlink.proxy({
274
+ ready: actualProvider.ready ?? false,
275
+ request: actualProvider.request
276
+ ? async (params) => await actualProvider.request(params)
277
+ : undefined,
278
+ tronWeb: Comlink.proxy({
279
+ getDefaultAddress: async () => ({
280
+ base58: actualProvider.tronWeb.defaultAddress?.base58 || false,
281
+ hex: actualProvider.tronWeb.defaultAddress?.hex || false
282
+ }),
283
+ trx: Comlink.proxy({
284
+ sign: async (transaction) => await actualProvider.tronWeb.trx.sign(transaction),
285
+ signMessageV2: async (message) => await actualProvider.tronWeb.trx.signMessageV2(message),
286
+ sendRawTransaction: async (signedTransaction) => await actualProvider.tronWeb.trx.sendRawTransaction(signedTransaction)
287
+ }),
288
+ transactionBuilder: Comlink.proxy({
289
+ sendTrx: async (to, amount, from) => await actualProvider.tronWeb.transactionBuilder.sendTrx(to, amount, from),
290
+ triggerSmartContract: async (contractAddress, functionSelector, options,
291
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
292
+ parameter, issuerAddress) => await actualProvider.tronWeb.transactionBuilder.triggerSmartContract(contractAddress, functionSelector, options, parameter, issuerAddress)
293
+ }),
294
+ toHex: (message) => actualProvider.tronWeb.toHex(message)
295
+ })
296
+ });
297
+ wallets.push({
298
+ uuid,
299
+ name,
300
+ injectedId,
301
+ provider: proxiedProvider
302
+ });
303
+ }
304
+ }
305
+ return wallets;
306
+ }
238
307
  destroy() {
239
- this.handshakeComplete = false;
240
308
  if (this.parentAPI) {
241
309
  this.parentAPI.eip6963Wallets = [];
242
310
  this.parentAPI.walletStandardWallets = [];
311
+ this.parentAPI.tronWallets = [];
243
312
  this.parentAPI = null;
244
313
  }
245
314
  this.endpoint = null;
@@ -1 +1 @@
1
- {"version":3,"file":"BridgeParent.js","sourceRoot":"","sources":["../src/BridgeParent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BridgeParent.js","sourceRoot":"","sources":["../src/BridgeParent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BridgeParent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BridgeParent.test.d.ts","sourceRoot":"","sources":["../src/BridgeParent.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,316 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ // Mock Comlink
3
+ vi.mock('comlink', () => ({
4
+ expose: vi.fn(),
5
+ windowEndpoint: vi.fn().mockReturnValue({}),
6
+ proxy: vi.fn((obj) => obj)
7
+ }));
8
+ // Mock @wallet-standard/app
9
+ vi.mock('@wallet-standard/app', () => ({
10
+ getWallets: vi.fn().mockReturnValue({ get: () => [] })
11
+ }));
12
+ // Mock @solana/wallet-adapter-base
13
+ vi.mock('@solana/wallet-adapter-base', () => ({
14
+ isWalletAdapterCompatibleStandardWallet: vi.fn().mockReturnValue(false)
15
+ }));
16
+ // Mock @solana/wallet-standard-wallet-adapter-base
17
+ vi.mock('@solana/wallet-standard-wallet-adapter-base', () => ({
18
+ StandardWalletAdapter: vi.fn()
19
+ }));
20
+ // Mock @solana/web3.js
21
+ vi.mock('@solana/web3.js', () => ({
22
+ Connection: vi.fn(),
23
+ Transaction: { from: vi.fn() },
24
+ VersionedTransaction: { deserialize: vi.fn() }
25
+ }));
26
+ describe('BridgeParent', () => {
27
+ let mockIframe;
28
+ beforeEach(() => {
29
+ vi.clearAllMocks();
30
+ vi.useFakeTimers();
31
+ mockIframe = {
32
+ contentWindow: {},
33
+ src: 'https://child.example.com/page'
34
+ };
35
+ });
36
+ afterEach(() => {
37
+ vi.useRealTimers();
38
+ vi.restoreAllMocks();
39
+ });
40
+ describe('constructor', () => {
41
+ it('should throw if no iframe provided', async () => {
42
+ const { BridgeParent } = await import('./BridgeParent');
43
+ expect(() => new BridgeParent(null)).toThrow('BridgeParent requires an iframe element');
44
+ });
45
+ it('should accept a valid iframe', async () => {
46
+ const { BridgeParent } = await import('./BridgeParent');
47
+ const bridge = new BridgeParent(mockIframe);
48
+ expect(bridge).toBeDefined();
49
+ });
50
+ it('should call Comlink.expose after initialization', async () => {
51
+ const Comlink = await import('comlink');
52
+ const { BridgeParent } = await import('./BridgeParent');
53
+ new BridgeParent(mockIframe);
54
+ // Allow the async initializeConnection to run
55
+ await vi.advanceTimersByTimeAsync(200);
56
+ expect(Comlink.expose).toHaveBeenCalled();
57
+ });
58
+ it('should call Comlink.windowEndpoint with iframe contentWindow', async () => {
59
+ const Comlink = await import('comlink');
60
+ const { BridgeParent } = await import('./BridgeParent');
61
+ new BridgeParent(mockIframe);
62
+ await vi.advanceTimersByTimeAsync(200);
63
+ expect(Comlink.windowEndpoint).toHaveBeenCalledWith(mockIframe.contentWindow, window, 'https://child.example.com');
64
+ });
65
+ it('should not initialize if iframe has no contentWindow', async () => {
66
+ const Comlink = await import('comlink');
67
+ const { BridgeParent } = await import('./BridgeParent');
68
+ const iframeNoContent = { src: 'https://example.com' };
69
+ new BridgeParent(iframeNoContent);
70
+ await vi.advanceTimersByTimeAsync(200);
71
+ expect(Comlink.expose).not.toHaveBeenCalled();
72
+ });
73
+ });
74
+ describe('EIP6963 wallet discovery', () => {
75
+ it('should dispatch eip6963:requestProvider event', async () => {
76
+ const dispatchSpy = vi.spyOn(window, 'dispatchEvent');
77
+ const { BridgeParent } = await import('./BridgeParent');
78
+ new BridgeParent(mockIframe);
79
+ await vi.advanceTimersByTimeAsync(200);
80
+ expect(dispatchSpy).toHaveBeenCalledWith(expect.objectContaining({ type: 'eip6963:requestProvider' }));
81
+ });
82
+ it('should collect announced wallets', async () => {
83
+ const Comlink = await import('comlink');
84
+ const { BridgeParent } = await import('./BridgeParent');
85
+ // Set up a listener that announces a wallet when requestProvider fires
86
+ const mockProvider = { request: vi.fn() };
87
+ window.addEventListener('eip6963:requestProvider', () => {
88
+ window.dispatchEvent(new CustomEvent('eip6963:announceProvider', {
89
+ detail: {
90
+ info: {
91
+ uuid: 'wallet-1',
92
+ name: 'TestWallet',
93
+ icon: 'test-icon',
94
+ rdns: 'com.test.wallet'
95
+ },
96
+ provider: mockProvider
97
+ }
98
+ }));
99
+ });
100
+ new BridgeParent(mockIframe);
101
+ await vi.advanceTimersByTimeAsync(200);
102
+ // The exposed parentAPI should contain the discovered wallet
103
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
104
+ expect(exposedAPI).toBeDefined();
105
+ expect(exposedAPI.eip6963Wallets).toHaveLength(1);
106
+ expect(exposedAPI.eip6963Wallets[0].uuid).toBe('wallet-1');
107
+ expect(exposedAPI.eip6963Wallets[0].name).toBe('TestWallet');
108
+ expect(exposedAPI.eip6963WalletsReady).toBe(true);
109
+ });
110
+ it('should deduplicate wallets by uuid', async () => {
111
+ const Comlink = await import('comlink');
112
+ const { BridgeParent } = await import('./BridgeParent');
113
+ const mockProvider = { request: vi.fn() };
114
+ window.addEventListener('eip6963:requestProvider', () => {
115
+ // Announce same wallet twice
116
+ const event = new CustomEvent('eip6963:announceProvider', {
117
+ detail: {
118
+ info: {
119
+ uuid: 'wallet-1',
120
+ name: 'TestWallet',
121
+ icon: 'icon',
122
+ rdns: 'com.test'
123
+ },
124
+ provider: mockProvider
125
+ }
126
+ });
127
+ window.dispatchEvent(event);
128
+ window.dispatchEvent(event);
129
+ });
130
+ new BridgeParent(mockIframe);
131
+ await vi.advanceTimersByTimeAsync(200);
132
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
133
+ expect(exposedAPI.eip6963Wallets).toHaveLength(1);
134
+ });
135
+ });
136
+ describe('Solana wallet discovery', () => {
137
+ it('should call getWallets and filter Solana wallets', async () => {
138
+ const { getWallets } = await import('@wallet-standard/app');
139
+ const Comlink = await import('comlink');
140
+ const { BridgeParent } = await import('./BridgeParent');
141
+ const mockSolanaWallet = {
142
+ name: 'Phantom',
143
+ chains: ['solana:mainnet'],
144
+ features: { 'standard:connect': {} },
145
+ accounts: []
146
+ };
147
+ const mockNonSolanaWallet = {
148
+ name: 'SomeWallet',
149
+ chains: ['ethereum:1'],
150
+ features: {},
151
+ accounts: []
152
+ };
153
+ vi.mocked(getWallets).mockReturnValue({
154
+ get: () => [mockSolanaWallet, mockNonSolanaWallet],
155
+ on: vi.fn(),
156
+ register: vi.fn()
157
+ });
158
+ new BridgeParent(mockIframe);
159
+ await vi.advanceTimersByTimeAsync(200);
160
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
161
+ expect(exposedAPI.walletStandardWallets).toHaveLength(1);
162
+ expect(exposedAPI.walletStandardWallets[0].name).toBe('Phantom');
163
+ expect(exposedAPI.walletStandardWalletsReady).toBe(true);
164
+ });
165
+ it('should return empty array when no Solana wallets found', async () => {
166
+ const { getWallets } = await import('@wallet-standard/app');
167
+ const Comlink = await import('comlink');
168
+ const { BridgeParent } = await import('./BridgeParent');
169
+ vi.mocked(getWallets).mockReturnValue({
170
+ get: () => [],
171
+ on: vi.fn(),
172
+ register: vi.fn()
173
+ });
174
+ new BridgeParent(mockIframe);
175
+ await vi.advanceTimersByTimeAsync(200);
176
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
177
+ expect(exposedAPI.walletStandardWallets).toEqual([]);
178
+ });
179
+ });
180
+ describe('Tron wallet discovery', () => {
181
+ it('should start with empty tron wallets and not ready', async () => {
182
+ const Comlink = await import('comlink');
183
+ const { BridgeParent } = await import('./BridgeParent');
184
+ new BridgeParent(mockIframe);
185
+ await vi.advanceTimersByTimeAsync(200);
186
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
187
+ expect(exposedAPI.tronWallets).toEqual([]);
188
+ expect(exposedAPI.tronWalletsReady).toBe(false);
189
+ });
190
+ it('should discover tron wallets when discoverTronWallets is called', async () => {
191
+ const Comlink = await import('comlink');
192
+ const { BridgeParent } = await import('./BridgeParent');
193
+ window.tronLink = {
194
+ ready: true,
195
+ request: vi.fn(),
196
+ tronWeb: {
197
+ defaultAddress: { base58: 'TAddr1', hex: '0x1' },
198
+ trx: {
199
+ sign: vi.fn(),
200
+ signMessageV2: vi.fn(),
201
+ sendRawTransaction: vi.fn()
202
+ },
203
+ transactionBuilder: {
204
+ sendTrx: vi.fn(),
205
+ triggerSmartContract: vi.fn()
206
+ },
207
+ toHex: vi.fn()
208
+ }
209
+ };
210
+ new BridgeParent(mockIframe);
211
+ await vi.advanceTimersByTimeAsync(200);
212
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
213
+ // Simulate child calling discoverTronWallets
214
+ exposedAPI.discoverTronWallets(['tronLink']);
215
+ expect(exposedAPI.tronWalletsReady).toBe(true);
216
+ expect(exposedAPI.tronWallets).toHaveLength(1);
217
+ expect(exposedAPI.tronWallets[0].uuid).toBe('tron-tronlink');
218
+ expect(exposedAPI.tronWallets[0].name).toBe('tronLink');
219
+ expect(exposedAPI.tronWallets[0].injectedId).toBe('tronLink');
220
+ // Cleanup
221
+ delete window.tronLink;
222
+ });
223
+ it('should handle nested tron provider paths', async () => {
224
+ const Comlink = await import('comlink');
225
+ const { BridgeParent } = await import('./BridgeParent');
226
+ window.tokenpocket = {
227
+ tron: {
228
+ ready: true,
229
+ request: vi.fn(),
230
+ tronWeb: {
231
+ defaultAddress: { base58: 'TAddr2' },
232
+ trx: {
233
+ sign: vi.fn(),
234
+ signMessageV2: vi.fn(),
235
+ sendRawTransaction: vi.fn()
236
+ },
237
+ transactionBuilder: {
238
+ sendTrx: vi.fn(),
239
+ triggerSmartContract: vi.fn()
240
+ },
241
+ toHex: vi.fn()
242
+ }
243
+ }
244
+ };
245
+ new BridgeParent(mockIframe);
246
+ await vi.advanceTimersByTimeAsync(200);
247
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
248
+ exposedAPI.discoverTronWallets(['tokenpocket.tron']);
249
+ expect(exposedAPI.tronWallets).toHaveLength(1);
250
+ expect(exposedAPI.tronWallets[0].uuid).toBe('tron-tokenpocket-tron');
251
+ delete window.tokenpocket;
252
+ });
253
+ it('should return empty when injectedIds is empty', async () => {
254
+ const Comlink = await import('comlink');
255
+ const { BridgeParent } = await import('./BridgeParent');
256
+ new BridgeParent(mockIframe);
257
+ await vi.advanceTimersByTimeAsync(200);
258
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
259
+ exposedAPI.discoverTronWallets([]);
260
+ expect(exposedAPI.tronWallets).toEqual([]);
261
+ expect(exposedAPI.tronWalletsReady).toBe(true);
262
+ });
263
+ it('should skip providers without valid tronWeb.trx', async () => {
264
+ const Comlink = await import('comlink');
265
+ const { BridgeParent } = await import('./BridgeParent');
266
+ window.badWallet = {
267
+ ready: true,
268
+ tronWeb: { notTrx: true }
269
+ };
270
+ new BridgeParent(mockIframe);
271
+ await vi.advanceTimersByTimeAsync(200);
272
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
273
+ exposedAPI.discoverTronWallets(['badWallet']);
274
+ expect(exposedAPI.tronWallets).toEqual([]);
275
+ delete window.badWallet;
276
+ });
277
+ it('should deduplicate tron wallets by injectedId', async () => {
278
+ const Comlink = await import('comlink');
279
+ const { BridgeParent } = await import('./BridgeParent');
280
+ window.tronLink = {
281
+ ready: true,
282
+ request: vi.fn(),
283
+ tronWeb: {
284
+ defaultAddress: { base58: 'TAddr1' },
285
+ trx: {
286
+ sign: vi.fn(),
287
+ signMessageV2: vi.fn(),
288
+ sendRawTransaction: vi.fn()
289
+ },
290
+ transactionBuilder: {
291
+ sendTrx: vi.fn(),
292
+ triggerSmartContract: vi.fn()
293
+ },
294
+ toHex: vi.fn()
295
+ }
296
+ };
297
+ new BridgeParent(mockIframe);
298
+ await vi.advanceTimersByTimeAsync(200);
299
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0];
300
+ exposedAPI.discoverTronWallets(['tronLink', 'tronLink']);
301
+ expect(exposedAPI.tronWallets).toHaveLength(1);
302
+ delete window.tronLink;
303
+ });
304
+ });
305
+ describe('destroy', () => {
306
+ it('should clear all state', async () => {
307
+ const { BridgeParent } = await import('./BridgeParent');
308
+ const bridge = new BridgeParent(mockIframe);
309
+ await vi.advanceTimersByTimeAsync(200);
310
+ bridge.destroy();
311
+ // After destroy, creating another should work without errors
312
+ expect(() => bridge.destroy()).not.toThrow();
313
+ });
314
+ });
315
+ });
316
+ //# sourceMappingURL=BridgeParent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BridgeParent.test.js","sourceRoot":"","sources":["../src/BridgeParent.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshconnect/uwc-bridge-parent",
3
- "version": "1.0.2",
3
+ "version": "1.1.1-snapshot.28ab063",
4
4
  "description": "Parent window bridge for Universal Wallet Connector",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -0,0 +1,410 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
2
+
3
+ // Mock Comlink
4
+ vi.mock('comlink', () => ({
5
+ expose: vi.fn(),
6
+ windowEndpoint: vi.fn().mockReturnValue({}),
7
+ proxy: vi.fn((obj: unknown) => obj)
8
+ }))
9
+
10
+ // Mock @wallet-standard/app
11
+ vi.mock('@wallet-standard/app', () => ({
12
+ getWallets: vi.fn().mockReturnValue({ get: () => [] })
13
+ }))
14
+
15
+ // Mock @solana/wallet-adapter-base
16
+ vi.mock('@solana/wallet-adapter-base', () => ({
17
+ isWalletAdapterCompatibleStandardWallet: vi.fn().mockReturnValue(false)
18
+ }))
19
+
20
+ // Mock @solana/wallet-standard-wallet-adapter-base
21
+ vi.mock('@solana/wallet-standard-wallet-adapter-base', () => ({
22
+ StandardWalletAdapter: vi.fn()
23
+ }))
24
+
25
+ // Mock @solana/web3.js
26
+ vi.mock('@solana/web3.js', () => ({
27
+ Connection: vi.fn(),
28
+ Transaction: { from: vi.fn() },
29
+ VersionedTransaction: { deserialize: vi.fn() }
30
+ }))
31
+
32
+ describe('BridgeParent', () => {
33
+ let mockIframe: HTMLIFrameElement
34
+
35
+ beforeEach(() => {
36
+ vi.clearAllMocks()
37
+ vi.useFakeTimers()
38
+
39
+ mockIframe = {
40
+ contentWindow: {},
41
+ src: 'https://child.example.com/page'
42
+ } as any
43
+ })
44
+
45
+ afterEach(() => {
46
+ vi.useRealTimers()
47
+ vi.restoreAllMocks()
48
+ })
49
+
50
+ describe('constructor', () => {
51
+ it('should throw if no iframe provided', async () => {
52
+ const { BridgeParent } = await import('./BridgeParent')
53
+
54
+ expect(() => new BridgeParent(null as any)).toThrow(
55
+ 'BridgeParent requires an iframe element'
56
+ )
57
+ })
58
+
59
+ it('should accept a valid iframe', async () => {
60
+ const { BridgeParent } = await import('./BridgeParent')
61
+
62
+ const bridge = new BridgeParent(mockIframe)
63
+
64
+ expect(bridge).toBeDefined()
65
+ })
66
+
67
+ it('should call Comlink.expose after initialization', async () => {
68
+ const Comlink = await import('comlink')
69
+ const { BridgeParent } = await import('./BridgeParent')
70
+
71
+ new BridgeParent(mockIframe)
72
+
73
+ // Allow the async initializeConnection to run
74
+ await vi.advanceTimersByTimeAsync(200)
75
+
76
+ expect(Comlink.expose).toHaveBeenCalled()
77
+ })
78
+
79
+ it('should call Comlink.windowEndpoint with iframe contentWindow', async () => {
80
+ const Comlink = await import('comlink')
81
+ const { BridgeParent } = await import('./BridgeParent')
82
+
83
+ new BridgeParent(mockIframe)
84
+
85
+ await vi.advanceTimersByTimeAsync(200)
86
+
87
+ expect(Comlink.windowEndpoint).toHaveBeenCalledWith(
88
+ mockIframe.contentWindow,
89
+ window,
90
+ 'https://child.example.com'
91
+ )
92
+ })
93
+
94
+ it('should not initialize if iframe has no contentWindow', async () => {
95
+ const Comlink = await import('comlink')
96
+ const { BridgeParent } = await import('./BridgeParent')
97
+
98
+ const iframeNoContent = { src: 'https://example.com' } as any
99
+ new BridgeParent(iframeNoContent)
100
+
101
+ await vi.advanceTimersByTimeAsync(200)
102
+
103
+ expect(Comlink.expose).not.toHaveBeenCalled()
104
+ })
105
+ })
106
+
107
+ describe('EIP6963 wallet discovery', () => {
108
+ it('should dispatch eip6963:requestProvider event', async () => {
109
+ const dispatchSpy = vi.spyOn(window, 'dispatchEvent')
110
+ const { BridgeParent } = await import('./BridgeParent')
111
+
112
+ new BridgeParent(mockIframe)
113
+
114
+ await vi.advanceTimersByTimeAsync(200)
115
+
116
+ expect(dispatchSpy).toHaveBeenCalledWith(
117
+ expect.objectContaining({ type: 'eip6963:requestProvider' })
118
+ )
119
+ })
120
+
121
+ it('should collect announced wallets', async () => {
122
+ const Comlink = await import('comlink')
123
+ const { BridgeParent } = await import('./BridgeParent')
124
+
125
+ // Set up a listener that announces a wallet when requestProvider fires
126
+ const mockProvider = { request: vi.fn() }
127
+ window.addEventListener('eip6963:requestProvider', () => {
128
+ window.dispatchEvent(
129
+ new CustomEvent('eip6963:announceProvider', {
130
+ detail: {
131
+ info: {
132
+ uuid: 'wallet-1',
133
+ name: 'TestWallet',
134
+ icon: 'test-icon',
135
+ rdns: 'com.test.wallet'
136
+ },
137
+ provider: mockProvider
138
+ }
139
+ })
140
+ )
141
+ })
142
+
143
+ new BridgeParent(mockIframe)
144
+
145
+ await vi.advanceTimersByTimeAsync(200)
146
+
147
+ // The exposed parentAPI should contain the discovered wallet
148
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
149
+ expect(exposedAPI).toBeDefined()
150
+ expect(exposedAPI.eip6963Wallets).toHaveLength(1)
151
+ expect(exposedAPI.eip6963Wallets[0].uuid).toBe('wallet-1')
152
+ expect(exposedAPI.eip6963Wallets[0].name).toBe('TestWallet')
153
+ expect(exposedAPI.eip6963WalletsReady).toBe(true)
154
+ })
155
+
156
+ it('should deduplicate wallets by uuid', async () => {
157
+ const Comlink = await import('comlink')
158
+ const { BridgeParent } = await import('./BridgeParent')
159
+
160
+ const mockProvider = { request: vi.fn() }
161
+ window.addEventListener('eip6963:requestProvider', () => {
162
+ // Announce same wallet twice
163
+ const event = new CustomEvent('eip6963:announceProvider', {
164
+ detail: {
165
+ info: {
166
+ uuid: 'wallet-1',
167
+ name: 'TestWallet',
168
+ icon: 'icon',
169
+ rdns: 'com.test'
170
+ },
171
+ provider: mockProvider
172
+ }
173
+ })
174
+ window.dispatchEvent(event)
175
+ window.dispatchEvent(event)
176
+ })
177
+
178
+ new BridgeParent(mockIframe)
179
+ await vi.advanceTimersByTimeAsync(200)
180
+
181
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
182
+ expect(exposedAPI.eip6963Wallets).toHaveLength(1)
183
+ })
184
+ })
185
+
186
+ describe('Solana wallet discovery', () => {
187
+ it('should call getWallets and filter Solana wallets', async () => {
188
+ const { getWallets } = await import('@wallet-standard/app')
189
+ const Comlink = await import('comlink')
190
+ const { BridgeParent } = await import('./BridgeParent')
191
+
192
+ const mockSolanaWallet = {
193
+ name: 'Phantom',
194
+ chains: ['solana:mainnet'],
195
+ features: { 'standard:connect': {} },
196
+ accounts: []
197
+ }
198
+ const mockNonSolanaWallet = {
199
+ name: 'SomeWallet',
200
+ chains: ['ethereum:1'],
201
+ features: {},
202
+ accounts: []
203
+ }
204
+
205
+ vi.mocked(getWallets).mockReturnValue({
206
+ get: () => [mockSolanaWallet, mockNonSolanaWallet] as any,
207
+ on: vi.fn(),
208
+ register: vi.fn()
209
+ } as any)
210
+
211
+ new BridgeParent(mockIframe)
212
+ await vi.advanceTimersByTimeAsync(200)
213
+
214
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
215
+ expect(exposedAPI.walletStandardWallets).toHaveLength(1)
216
+ expect(exposedAPI.walletStandardWallets[0].name).toBe('Phantom')
217
+ expect(exposedAPI.walletStandardWalletsReady).toBe(true)
218
+ })
219
+
220
+ it('should return empty array when no Solana wallets found', async () => {
221
+ const { getWallets } = await import('@wallet-standard/app')
222
+ const Comlink = await import('comlink')
223
+ const { BridgeParent } = await import('./BridgeParent')
224
+
225
+ vi.mocked(getWallets).mockReturnValue({
226
+ get: () => [],
227
+ on: vi.fn(),
228
+ register: vi.fn()
229
+ } as any)
230
+
231
+ new BridgeParent(mockIframe)
232
+ await vi.advanceTimersByTimeAsync(200)
233
+
234
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
235
+ expect(exposedAPI.walletStandardWallets).toEqual([])
236
+ })
237
+ })
238
+
239
+ describe('Tron wallet discovery', () => {
240
+ it('should start with empty tron wallets and not ready', async () => {
241
+ const Comlink = await import('comlink')
242
+ const { BridgeParent } = await import('./BridgeParent')
243
+
244
+ new BridgeParent(mockIframe)
245
+ await vi.advanceTimersByTimeAsync(200)
246
+
247
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
248
+ expect(exposedAPI.tronWallets).toEqual([])
249
+ expect(exposedAPI.tronWalletsReady).toBe(false)
250
+ })
251
+
252
+ it('should discover tron wallets when discoverTronWallets is called', async () => {
253
+ const Comlink = await import('comlink')
254
+ const { BridgeParent } = await import('./BridgeParent')
255
+
256
+ // Set up a tron provider on window
257
+ ;(window as any).tronLink = {
258
+ ready: true,
259
+ request: vi.fn(),
260
+ tronWeb: {
261
+ defaultAddress: { base58: 'TAddr1', hex: '0x1' },
262
+ trx: {
263
+ sign: vi.fn(),
264
+ signMessageV2: vi.fn(),
265
+ sendRawTransaction: vi.fn()
266
+ },
267
+ transactionBuilder: {
268
+ sendTrx: vi.fn(),
269
+ triggerSmartContract: vi.fn()
270
+ },
271
+ toHex: vi.fn()
272
+ }
273
+ }
274
+
275
+ new BridgeParent(mockIframe)
276
+ await vi.advanceTimersByTimeAsync(200)
277
+
278
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
279
+
280
+ // Simulate child calling discoverTronWallets
281
+ exposedAPI.discoverTronWallets(['tronLink'])
282
+
283
+ expect(exposedAPI.tronWalletsReady).toBe(true)
284
+ expect(exposedAPI.tronWallets).toHaveLength(1)
285
+ expect(exposedAPI.tronWallets[0].uuid).toBe('tron-tronlink')
286
+ expect(exposedAPI.tronWallets[0].name).toBe('tronLink')
287
+ expect(exposedAPI.tronWallets[0].injectedId).toBe('tronLink')
288
+
289
+ // Cleanup
290
+ delete (window as any).tronLink
291
+ })
292
+
293
+ it('should handle nested tron provider paths', async () => {
294
+ const Comlink = await import('comlink')
295
+ const { BridgeParent } = await import('./BridgeParent')
296
+
297
+ ;(window as any).tokenpocket = {
298
+ tron: {
299
+ ready: true,
300
+ request: vi.fn(),
301
+ tronWeb: {
302
+ defaultAddress: { base58: 'TAddr2' },
303
+ trx: {
304
+ sign: vi.fn(),
305
+ signMessageV2: vi.fn(),
306
+ sendRawTransaction: vi.fn()
307
+ },
308
+ transactionBuilder: {
309
+ sendTrx: vi.fn(),
310
+ triggerSmartContract: vi.fn()
311
+ },
312
+ toHex: vi.fn()
313
+ }
314
+ }
315
+ }
316
+
317
+ new BridgeParent(mockIframe)
318
+ await vi.advanceTimersByTimeAsync(200)
319
+
320
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
321
+ exposedAPI.discoverTronWallets(['tokenpocket.tron'])
322
+
323
+ expect(exposedAPI.tronWallets).toHaveLength(1)
324
+ expect(exposedAPI.tronWallets[0].uuid).toBe('tron-tokenpocket-tron')
325
+
326
+ delete (window as any).tokenpocket
327
+ })
328
+
329
+ it('should return empty when injectedIds is empty', async () => {
330
+ const Comlink = await import('comlink')
331
+ const { BridgeParent } = await import('./BridgeParent')
332
+
333
+ new BridgeParent(mockIframe)
334
+ await vi.advanceTimersByTimeAsync(200)
335
+
336
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
337
+ exposedAPI.discoverTronWallets([])
338
+
339
+ expect(exposedAPI.tronWallets).toEqual([])
340
+ expect(exposedAPI.tronWalletsReady).toBe(true)
341
+ })
342
+
343
+ it('should skip providers without valid tronWeb.trx', async () => {
344
+ const Comlink = await import('comlink')
345
+ const { BridgeParent } = await import('./BridgeParent')
346
+
347
+ ;(window as any).badWallet = {
348
+ ready: true,
349
+ tronWeb: { notTrx: true }
350
+ }
351
+
352
+ new BridgeParent(mockIframe)
353
+ await vi.advanceTimersByTimeAsync(200)
354
+
355
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
356
+ exposedAPI.discoverTronWallets(['badWallet'])
357
+
358
+ expect(exposedAPI.tronWallets).toEqual([])
359
+
360
+ delete (window as any).badWallet
361
+ })
362
+
363
+ it('should deduplicate tron wallets by injectedId', async () => {
364
+ const Comlink = await import('comlink')
365
+ const { BridgeParent } = await import('./BridgeParent')
366
+
367
+ ;(window as any).tronLink = {
368
+ ready: true,
369
+ request: vi.fn(),
370
+ tronWeb: {
371
+ defaultAddress: { base58: 'TAddr1' },
372
+ trx: {
373
+ sign: vi.fn(),
374
+ signMessageV2: vi.fn(),
375
+ sendRawTransaction: vi.fn()
376
+ },
377
+ transactionBuilder: {
378
+ sendTrx: vi.fn(),
379
+ triggerSmartContract: vi.fn()
380
+ },
381
+ toHex: vi.fn()
382
+ }
383
+ }
384
+
385
+ new BridgeParent(mockIframe)
386
+ await vi.advanceTimersByTimeAsync(200)
387
+
388
+ const exposedAPI = vi.mocked(Comlink.expose).mock.calls[0]?.[0] as any
389
+ exposedAPI.discoverTronWallets(['tronLink', 'tronLink'])
390
+
391
+ expect(exposedAPI.tronWallets).toHaveLength(1)
392
+
393
+ delete (window as any).tronLink
394
+ })
395
+ })
396
+
397
+ describe('destroy', () => {
398
+ it('should clear all state', async () => {
399
+ const { BridgeParent } = await import('./BridgeParent')
400
+
401
+ const bridge = new BridgeParent(mockIframe)
402
+ await vi.advanceTimersByTimeAsync(200)
403
+
404
+ bridge.destroy()
405
+
406
+ // After destroy, creating another should work without errors
407
+ expect(() => bridge.destroy()).not.toThrow()
408
+ })
409
+ })
410
+ })
@@ -57,10 +57,6 @@ export interface EIP6963AnnounceProviderEvent extends CustomEvent {
57
57
  detail: EIP6963ProviderDetail
58
58
  }
59
59
 
60
- export interface EIP6963RequestProviderEvent extends Event {
61
- type: 'eip6963:requestProvider'
62
- }
63
-
64
60
  export interface DetectedWallet {
65
61
  uuid: string
66
62
  name: string
@@ -69,16 +65,29 @@ export interface DetectedWallet {
69
65
  provider: EthereumProvider
70
66
  }
71
67
 
68
+ export interface TronWalletInfo {
69
+ uuid: string
70
+ name: string
71
+ injectedId: string
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ provider: any
74
+ }
75
+
72
76
  export interface ParentAPI {
73
77
  eip6963Wallets: DetectedWallet[]
74
78
  eip6963WalletsReady: boolean
79
+
75
80
  walletStandardWallets: WalletStandardInfo[]
76
81
  walletStandardWalletsReady: boolean
82
+
83
+ tronWallets: TronWalletInfo[]
84
+ tronWalletsReady: boolean
85
+
86
+ discoverTronWallets: (injectedIds: string[]) => void
77
87
  }
78
88
 
79
89
  export class BridgeParent {
80
90
  private iframe: HTMLIFrameElement | null
81
- private handshakeComplete = false
82
91
  private parentAPI: ParentAPI | null = null
83
92
  private endpoint: Comlink.Endpoint | null = null
84
93
 
@@ -97,35 +106,43 @@ export class BridgeParent {
97
106
  return
98
107
  }
99
108
 
100
- const eip6963Wallets = await this.discoverWallets()
109
+ // For eip6963 and solana wallets we can start discovery as soon as the iframe loads, but for tron we need to look for specific IDs that we get from the child iframe
110
+ const eip6963Wallets = await this.discovereip6963Wallets()
101
111
  const walletStandardWallets = this.getSolanaWallets()
112
+
102
113
  this.parentAPI = {
103
114
  eip6963Wallets: eip6963Wallets,
104
115
  eip6963WalletsReady: true,
105
116
  walletStandardWallets: walletStandardWallets,
106
- walletStandardWalletsReady: true
117
+ walletStandardWalletsReady: true,
118
+ tronWallets: [],
119
+ tronWalletsReady: false,
120
+
121
+ // Called by BridgeChild to trigger Tron wallet discovery with injectedIds
122
+ discoverTronWallets: (injectedIds: string[]) => {
123
+ if (this.parentAPI) {
124
+ this.parentAPI.tronWallets = this.getTronWallets(injectedIds)
125
+ this.parentAPI.tronWalletsReady = true
126
+ }
127
+ }
107
128
  }
108
129
 
109
130
  // Use Comlink's windowEndpoint with proper cross-origin support
110
131
  // For cross-origin, we need to listen on the parent window, not access the iframe's window
132
+ const iframeOrigin = new URL(this.iframe.src, window.location.href).origin
111
133
  this.endpoint = Comlink.windowEndpoint(
112
134
  this.iframe.contentWindow,
113
135
  window,
114
- '*'
136
+ iframeOrigin
115
137
  )
116
- Comlink.expose(this.parentAPI, this.endpoint)
117
-
118
- this.handshakeComplete = true
119
- }
120
138
 
121
- isConnected(): boolean {
122
- return this.handshakeComplete
139
+ Comlink.expose(this.parentAPI, this.endpoint)
123
140
  }
124
141
 
125
- private async discoverWallets(): Promise<DetectedWallet[]> {
142
+ private async discovereip6963Wallets(): Promise<DetectedWallet[]> {
126
143
  return new Promise(resolve => {
127
144
  const detectedWallets: DetectedWallet[] = []
128
- const timeout = 1000 // Wait up to 1 second for wallets to announce
145
+ const timeout = 100 // Wait 100ms for wallets to announce
129
146
 
130
147
  // Set up listener for wallet announcements
131
148
  const handleAnnouncement = (event: Event) => {
@@ -143,7 +160,7 @@ export class BridgeParent {
143
160
  name: info.name,
144
161
  icon: info.icon,
145
162
  rdns: info.rdns,
146
- provider
163
+ provider: provider
147
164
  })
148
165
  }
149
166
  }
@@ -373,12 +390,106 @@ export class BridgeParent {
373
390
  return `${wallet.name}-${chain}`.toLowerCase().replace(/\s+/g, '-')
374
391
  }
375
392
 
376
- public destroy(): void {
377
- this.handshakeComplete = false
393
+ /**
394
+ * Checks if a value looks like a Tron provider (has request and tronWeb)
395
+ */
396
+ private isTronProvider(value: unknown): boolean {
397
+ if (!value || typeof value !== 'object') return false
398
+ const provider = value as Record<string, unknown>
399
+ return provider['tronWeb'] != null && 'request' in provider
400
+ }
378
401
 
402
+ private getTronWallets(injectedIds: string[]): TronWalletInfo[] {
403
+ if (typeof window === 'undefined' || injectedIds.length === 0) {
404
+ return []
405
+ }
406
+
407
+ const wallets: TronWalletInfo[] = []
408
+ const seen = new Set<string>()
409
+
410
+ for (const injectedId of injectedIds) {
411
+ // Resolve nested window path (e.g. 'tokenpocket.tron' -> window.tokenpocket.tron)
412
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
413
+ const provider = injectedId.split('.').reduce<any>(
414
+ (acc, part) => acc?.[part],
415
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
416
+ window as any
417
+ )
418
+
419
+ // Check if it looks like a TronProvider (has tronWeb.trx)
420
+ if (this.isTronProvider(provider) && !seen.has(injectedId)) {
421
+ seen.add(injectedId)
422
+
423
+ const name = injectedId.split('.')[0] || injectedId
424
+ const uuid = `tron-${injectedId}`.toLowerCase().replace(/\./g, '-')
425
+
426
+ // Create proxied provider with all TronWeb methods
427
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
428
+ const actualProvider = provider as any
429
+ const proxiedProvider = Comlink.proxy({
430
+ ready: actualProvider.ready ?? false,
431
+ request: actualProvider.request
432
+ ? async (params: { method: string; params?: unknown }) =>
433
+ await actualProvider.request(params)
434
+ : undefined,
435
+ tronWeb: Comlink.proxy({
436
+ getDefaultAddress: async () => ({
437
+ base58: actualProvider.tronWeb.defaultAddress?.base58 || false,
438
+ hex: actualProvider.tronWeb.defaultAddress?.hex || false
439
+ }),
440
+ trx: Comlink.proxy({
441
+ sign: async (transaction: unknown) =>
442
+ await actualProvider.tronWeb.trx.sign(transaction),
443
+ signMessageV2: async (message: string) =>
444
+ await actualProvider.tronWeb.trx.signMessageV2(message),
445
+ sendRawTransaction: async (signedTransaction: unknown) =>
446
+ await actualProvider.tronWeb.trx.sendRawTransaction(
447
+ signedTransaction
448
+ )
449
+ }),
450
+ transactionBuilder: Comlink.proxy({
451
+ sendTrx: async (to: string, amount: number, from: string) =>
452
+ await actualProvider.tronWeb.transactionBuilder.sendTrx(
453
+ to,
454
+ amount,
455
+ from
456
+ ),
457
+ triggerSmartContract: async (
458
+ contractAddress: string,
459
+ functionSelector: string,
460
+ options: Record<string, unknown>,
461
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
462
+ parameter: Array<{ type: string; value: any }>,
463
+ issuerAddress: string
464
+ ) =>
465
+ await actualProvider.tronWeb.transactionBuilder.triggerSmartContract(
466
+ contractAddress,
467
+ functionSelector,
468
+ options,
469
+ parameter,
470
+ issuerAddress
471
+ )
472
+ }),
473
+ toHex: (message: string) => actualProvider.tronWeb.toHex(message)
474
+ })
475
+ })
476
+
477
+ wallets.push({
478
+ uuid,
479
+ name,
480
+ injectedId,
481
+ provider: proxiedProvider
482
+ })
483
+ }
484
+ }
485
+ return wallets
486
+ }
487
+
488
+ public destroy(): void {
379
489
  if (this.parentAPI) {
380
490
  this.parentAPI.eip6963Wallets = []
381
491
  this.parentAPI.walletStandardWallets = []
492
+ this.parentAPI.tronWallets = []
382
493
  this.parentAPI = null
383
494
  }
384
495
  this.endpoint = null