|
183 | 183 | var global = window; |
184 | 184 | } |
185 | 185 |
|
186 | | - // Add defensive handling for wallet extension conflicts |
| 186 | + // Enhanced defensive handling for wallet extension conflicts |
187 | 187 | (function() { |
188 | 188 | try { |
189 | 189 | // Store reference to any existing ethereum provider |
|
193 | 193 | if (!window.ethereumHandlersInitialized) { |
194 | 194 | window.ethereumHandlersInitialized = true; |
195 | 195 |
|
196 | | - // Create a non-conflicting ethereum property wrapper |
197 | | - Object.defineProperty(window, '_svmseekEthereumSafe', { |
198 | | - value: existingEthereum, |
199 | | - writable: false, |
200 | | - configurable: false |
| 196 | + // Create a multiple provider management system |
| 197 | + const providerRegistry = new Map(); |
| 198 | + let primaryProvider = existingEthereum; |
| 199 | + |
| 200 | + // Register existing provider if any |
| 201 | + if (existingEthereum) { |
| 202 | + if (existingEthereum.isMetaMask) { |
| 203 | + providerRegistry.set('metamask', existingEthereum); |
| 204 | + } else if (existingEthereum.isPhantom) { |
| 205 | + providerRegistry.set('phantom', existingEthereum); |
| 206 | + } else { |
| 207 | + providerRegistry.set('unknown', existingEthereum); |
| 208 | + } |
| 209 | + } |
| 210 | + |
| 211 | + // Create a proxy ethereum object that can handle multiple providers |
| 212 | + const ethereumProxy = new Proxy(primaryProvider || {}, { |
| 213 | + get: function(target, prop) { |
| 214 | + // Handle provider-specific access |
| 215 | + if (prop === 'providers' && providerRegistry.size > 0) { |
| 216 | + return Array.from(providerRegistry.values()); |
| 217 | + } |
| 218 | + if (prop === 'getProvider') { |
| 219 | + return function(name) { |
| 220 | + return providerRegistry.get(name) || primaryProvider; |
| 221 | + }; |
| 222 | + } |
| 223 | + if (prop === 'isMultiProvider') { |
| 224 | + return providerRegistry.size > 1; |
| 225 | + } |
| 226 | + |
| 227 | + // Delegate to primary provider or target |
| 228 | + const provider = primaryProvider || target; |
| 229 | + if (provider && typeof provider[prop] !== 'undefined') { |
| 230 | + const value = provider[prop]; |
| 231 | + return typeof value === 'function' ? value.bind(provider) : value; |
| 232 | + } |
| 233 | + |
| 234 | + return target[prop]; |
| 235 | + }, |
| 236 | + set: function(target, prop, value) { |
| 237 | + if (primaryProvider) { |
| 238 | + primaryProvider[prop] = value; |
| 239 | + } else { |
| 240 | + target[prop] = value; |
| 241 | + } |
| 242 | + return true; |
| 243 | + } |
201 | 244 | }); |
202 | 245 |
|
203 | | - // Override Object.defineProperty to handle ethereum property conflicts |
| 246 | + // Override Object.defineProperty to handle ethereum property conflicts gracefully |
204 | 247 | const originalDefineProperty = Object.defineProperty; |
205 | 248 | Object.defineProperty = function(obj, prop, descriptor) { |
206 | 249 | if (obj === window && prop === 'ethereum') { |
207 | 250 | try { |
208 | | - // If ethereum already exists and is non-configurable, skip redefinition |
209 | | - const existingDescriptor = Object.getOwnPropertyDescriptor(window, 'ethereum'); |
210 | | - if (existingDescriptor && !existingDescriptor.configurable) { |
211 | | - console.warn('SVMSeek: Skipping ethereum property redefinition to prevent conflicts'); |
212 | | - return obj; |
| 251 | + // Check if we're dealing with a new provider |
| 252 | + const newProvider = descriptor.value; |
| 253 | + if (newProvider && typeof newProvider === 'object') { |
| 254 | + // Register the new provider |
| 255 | + let providerName = 'unknown'; |
| 256 | + if (newProvider.isMetaMask) providerName = 'metamask'; |
| 257 | + else if (newProvider.isPhantom) providerName = 'phantom'; |
| 258 | + else if (newProvider.isSVMSeek) providerName = 'svmseek'; |
| 259 | + else if (newProvider.isWalletConnect) providerName = 'walletconnect'; |
| 260 | + |
| 261 | + providerRegistry.set(providerName, newProvider); |
| 262 | + |
| 263 | + // Update primary provider if this is the first or a preferred provider |
| 264 | + if (!primaryProvider || newProvider.isMetaMask) { |
| 265 | + primaryProvider = newProvider; |
| 266 | + } |
| 267 | + |
| 268 | + console.log('SVMSeek: Registered ethereum provider:', providerName); |
| 269 | + |
| 270 | + // Return the proxy instead of setting directly |
| 271 | + return originalDefineProperty.call(this, obj, prop, { |
| 272 | + value: ethereumProxy, |
| 273 | + writable: descriptor.writable, |
| 274 | + configurable: descriptor.configurable, |
| 275 | + enumerable: descriptor.enumerable |
| 276 | + }); |
213 | 277 | } |
214 | 278 |
|
215 | | - // Allow the definition but catch any errors |
| 279 | + // Allow the definition for non-provider values |
216 | 280 | return originalDefineProperty.call(this, obj, prop, descriptor); |
217 | 281 | } catch (error) { |
218 | | - console.warn('SVMSeek: Prevented ethereum property conflict:', error.message); |
| 282 | + console.warn('SVMSeek: Handled ethereum property conflict gracefully:', error.message); |
| 283 | + // Don't throw, just log and continue |
219 | 284 | return obj; |
220 | 285 | } |
221 | 286 | } |
222 | 287 | return originalDefineProperty.call(this, obj, prop, descriptor); |
223 | 288 | }; |
224 | 289 |
|
225 | | - console.log('SVMSeek: Ethereum property conflict protection enabled'); |
| 290 | + // Set initial ethereum proxy if we have providers |
| 291 | + if (providerRegistry.size > 0 || primaryProvider) { |
| 292 | + try { |
| 293 | + originalDefineProperty.call(Object, window, 'ethereum', { |
| 294 | + value: ethereumProxy, |
| 295 | + writable: true, |
| 296 | + configurable: true, |
| 297 | + enumerable: true |
| 298 | + }); |
| 299 | + } catch (error) { |
| 300 | + console.warn('SVMSeek: Could not set initial ethereum proxy:', error.message); |
| 301 | + } |
| 302 | + } |
| 303 | + |
| 304 | + console.log('SVMSeek: Enhanced ethereum provider management enabled'); |
226 | 305 | } |
227 | 306 | } catch (error) { |
228 | | - console.warn('SVMSeek: Failed to setup ethereum conflict protection:', error); |
| 307 | + console.warn('SVMSeek: Failed to setup enhanced ethereum conflict protection:', error); |
229 | 308 | } |
230 | 309 | })(); |
231 | 310 |
|
|
0 commit comments