@naculus/connector-evm-injected 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Naculus
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var w=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var b=(l,t)=>{for(var e in t)w(l,e,{get:t[e],enumerable:!0})},W=(l,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of C(t))!x.call(l,n)&&n!==e&&w(l,n,{get:()=>t[n],enumerable:!(i=P(t,n))||i.enumerable});return l};var N=l=>W(w({},"__esModule",{value:!0}),l);var T={};b(T,{EIP6963Connector:()=>h,createEIP6963Connector:()=>D,eip6963Connector:()=>g,getEIP6963Provider:()=>U,isCoinbaseWalletInstalled:()=>_,isMetaMaskInstalled:()=>y,isWalletInstalled:()=>k});module.exports=N(T);var s=require("@naculus/connect-core");var E={"0xaa36a7":{chainId:"0xaa36a7",chainName:"Sepolia Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://sepolia.llamarpc.com"],blockExplorerUrls:["https://sepolia.etherscan.io"]},"0x89":{chainId:"0x89",chainName:"Polygon Mainnet",nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:["https://polygon-rpc.com"],blockExplorerUrls:["https://polygonscan.com"]},"0xa4b1":{chainId:"0xa4b1",chainName:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://arb1.arbitrum.io/rpc"],blockExplorerUrls:["https://arbiscan.io"]},"0xa":{chainId:"0xa",chainName:"Optimism",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://mainnet.optimism.io"],blockExplorerUrls:["https://optimistic.etherscan.io"]},"0x2105":{chainId:"0x2105",chainName:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://base.llamarpc.com"],blockExplorerUrls:["https://basescan.org"]}};var f="eip6963:announceProvider",S="eip6963:requestProvider";function y(){return typeof window>"u"?!1:window.ethereum?.isMetaMask??!1}function _(){return typeof window>"u"?!1:window.ethereum?.isCoinbaseWallet??!1}function I(l){return l.startsWith("0x")?l:`0x${BigInt(l).toString(16)}`}var A={desktop:!0,mobile:!0,deepLink:!0,qr:!1,trustedReconnect:!0},h=class{id="eip6963";name="EIP-6963 Injected Wallets";kind="eip6963";namespaces=["eip155"];supports=A;discoveredWallets=new Map;listeners=new Set;announceHandler=null;activeSessions=new Map;storedEventHandlers=new Map;startDiscovery(){if(typeof window>"u")return;let t=e=>{if(!e||typeof e!="object")return;let n=e.detail;n?.info&&n?.provider&&this.handleAnnouncement(n.info,n.provider)};this.announceHandler=t,window.addEventListener(f,t),window.dispatchEvent(new Event(S))}stopDiscovery(){typeof window>"u"||!this.announceHandler||(window.removeEventListener(f,this.announceHandler),this.announceHandler=null)}handleAnnouncement(t,e){if(this.discoveredWallets.has(t.uuid))return;let i={id:t.uuid,name:t.name,icon:t.icon,rdns:t.rdns,provider:e};this.discoveredWallets.set(t.uuid,i),this.notifyListeners()}getDiscoveredWallets(){return Array.from(this.discoveredWallets.values())}async connect(t){let e;if(t)if(typeof t=="string"){if(e=this.getWalletByRDNS(t),!e)throw new s.WalletError("wallet_unavailable",`Wallet "${t}" not found. Please check the wallet RDNS.`)}else typeof t=="object"&&"provider"in t?e=t:typeof t=="object"&&(e=this.getDiscoveredWallets()[0]);else{let m=this.getDiscoveredWallets();if(m.length===0)throw new s.WalletError("wallet_unavailable","No wallets discovered. Please call startDiscovery() to find available wallets.");e=m[0]}if(!e)throw new s.WalletError("wallet_unavailable","No wallet available.");let i=typeof t=="object"&&t!==null?t:void 0,n=i&&typeof i.chainId=="string"?i.chainId:void 0,a,r=await(0,s.getPermissions)(e.provider);if((0,s.hasPermission)(r??[],"eth_accounts"))a=(0,s.extractAccountsFromPermissions)(r??[]),a.length===0&&(a=await e.provider.request({method:"eth_requestAccounts",params:n?[{chainId:n}]:[]}));else try{await(0,s.requestPermissions)(e.provider),a=await e.provider.request({method:"eth_requestAccounts",params:n?[{chainId:n}]:[]})}catch{a=await e.provider.request({method:"eth_requestAccounts",params:n?[{chainId:n}]:[]})}let o=a.map(m=>`eip155:${m}`),c=n?[`eip155:${n}`]:["eip155:1"],d=["eth_requestAccounts","eth_sendTransaction","personal_sign","eth_signTypedData_v4"],u=["accountsChanged","chainChanged"],p=(0,s.createEmptySession)({id:`eip6963-${e.id}-${Date.now()}`,walletId:e.id,walletType:"eip6963",namespaces:{eip155:{chains:c,accounts:o,methods:d,events:u,capabilities:{atomicBatch:{supported:!1},permissions:!0,serverSigning:!1}}},platform:(0,s.detectPlatform)()}),v={wallet:e,accounts:o,chains:c,methods:d,events:u};return this.activeSessions.set(e.id,v),this.setupEventListeners(e,p),this.setupPermissionsListener(e),p}async reconnect(t){let e=Array.from(this.discoveredWallets.values()).find(o=>o.id===t.walletId);if(!e)throw new s.WalletError("session_expired","EIP-6963 wallet not found. Please reconnect.");let i=await e.provider.request({method:"eth_accounts"});if(!i||i.length===0)throw new s.WalletError("session_expired","No accounts found. Please reconnect.");this.removeEventListeners(e);let n=i.map(o=>`eip155:${o}`),a=t.namespaces.eip155;a&&(a.accounts=n),this.setupEventListeners(e,t);let r={wallet:e,accounts:n,chains:a?.chains??[],methods:a?.methods??[],events:a?.events??[]};return this.activeSessions.set(e.id,r),t}setupEventListeners(t,e){let i=(...a)=>{a[0].length===0&&this.handleDisconnect(e)},n=(...a)=>{let r=a[0],o=e.namespaces.eip155;o&&(o.chains=[r])};t.provider.on("accountsChanged",i),t.provider.on("chainChanged",n),this.storedEventHandlers.set(t.id,{wallet:t,accountsHandler:i,chainHandler:n})}setupPermissionsListener(t){let e=async()=>{let i=await(0,s.getPermissions)(t.provider);(0,s.hasPermission)(i??[],"eth_accounts")||this.activeSessions.delete(t.id)};t.provider.on("permissionsChanged",e)}handleDisconnect(t){let e=Array.from(this.activeSessions.values()).find(i=>t.namespaces.eip155?.accounts.some(n=>i.accounts.includes(n)));e&&(this.removeEventListeners(e.wallet),this.activeSessions.delete(e.wallet.id))}removeEventListeners(t){let e=this.storedEventHandlers.get(t.id);e&&(t.provider.removeListener("accountsChanged",e.accountsHandler),t.provider.removeListener("chainChanged",e.chainHandler),this.storedEventHandlers.delete(t.id))}async disconnect(t){let e=Array.from(this.activeSessions.values()).find(i=>t.namespaces.eip155?.accounts.some(n=>i.accounts.includes(n)));if(e&&(this.removeEventListeners(e.wallet),this.activeSessions.delete(e.wallet.id)),t.id&&t.id.startsWith("eip6963-")){let i=t.id.replace("eip6963-","");this.activeSessions.delete(i),this.storedEventHandlers.delete(i)}}async getAccounts(t){return t.namespaces.eip155?.accounts??[]}async signMessage(t,e){if(!e||typeof e!="object")throw new s.WalletError("method_not_allowed",s.CONNECTOR_ERROR_MESSAGES.INVALID_INPUT);let i=e,n=typeof i.message=="string"?i.message:void 0,a=typeof i.address=="string"?i.address:typeof i.account=="string"?i.account:void 0;if(!n)throw new s.WalletError("method_not_allowed",s.CONNECTOR_ERROR_MESSAGES.MISSING_MESSAGE);let r=t.namespaces.eip155?.accounts??[],o=a?.includes(":")?a.split(":").pop():a??r[0]?.split(":").pop();if(!o)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_SIGNING);let c=Array.from(this.activeSessions.values()).find(p=>p.accounts.some(v=>r.includes(v)));if(!c)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);let d=n.startsWith("0x")&&/^0x[0-9a-fA-F]*$/.test(n)?n:"0x"+Array.from(new TextEncoder().encode(n)).map(p=>p.toString(16).padStart(2,"0")).join("");return await c.wallet.provider.request({method:"personal_sign",params:[d,o]})}async signTransaction(t,e){if(!e||typeof e!="object"||!("transaction"in e))throw new s.WalletError("method_not_allowed",s.CONNECTOR_ERROR_MESSAGES.MISSING_TX);let n=e.transaction;if(!n?.serialized||!Array.isArray(n.serialized))throw new s.WalletError("method_not_allowed",s.CONNECTOR_ERROR_MESSAGES.INVALID_INPUT);let a=t.namespaces.eip155?.accounts??[],r=a[0]?.split(":").pop();if(!r)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_SIGNING);let o=Array.from(this.activeSessions.values()).find(u=>u.accounts.some(p=>a.includes(p)));if(!o)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);let c=new Uint8Array(n.serialized).reduce((u,p)=>u+p.toString(16).padStart(2,"0"),"");return await o.wallet.provider.request({method:"eth_sendTransaction",params:[{from:r,data:`0x${c}`}]})}async sendTransaction(t,e){if(e==null)throw new s.WalletError("invalid_input","Invalid input");if(!e||typeof e!="object"||!("transaction"in e))throw new s.WalletError("method_not_allowed",s.CONNECTOR_ERROR_MESSAGES.MISSING_TX);let n=e.transaction,a=n&&typeof n=="object"?n:{},r=t.namespaces.eip155?.accounts??[],o=typeof a.from=="string"?a.from:r[0]?.split(":").pop();if(!o)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_TX);let c=Array.from(this.activeSessions.values()).find(u=>u.accounts.some(p=>r.includes(p)));if(!c)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);return await c.wallet.provider.request({method:"eth_sendTransaction",params:[{from:o,to:typeof a.to=="string"?a.to:void 0,value:typeof a.value=="string"?I(a.value):void 0,data:typeof a.data=="string"?a.data:void 0}]})}async switchChain(t,e){let i=t.namespaces.eip155?.accounts??[];if(i.length===0)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.NO_ACCOUNTS);let n=Array.from(this.activeSessions.values()).find(o=>o.accounts.some(c=>i.includes(c)));if(!n)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);let a=e.startsWith("eip155:")?`0x${parseInt(e.split(":")[1],10).toString(16)}`:e;try{await n.wallet.provider.request({method:"wallet_switchEthereumChain",params:[{chainId:a}]})}catch(o){let c=o;if(c?.code===4902){let d=E[a];if(!d)throw new s.WalletError("chain_unsupported",`Chain ${a} is not recognized. No metadata available to add it.`);await n.wallet.provider.request({method:"wallet_addEthereumChain",params:[d]}),await n.wallet.provider.request({method:"wallet_switchEthereumChain",params:[{chainId:a}]})}else throw new s.WalletError("chain_unsupported",`Failed to switch chain: ${c?.message??String(o)}`)}let r=t.namespaces.eip155?.chains??[];if(!r.includes(e)){let o=[...r.filter(c=>c.startsWith("eip155:")),e];t.namespaces.eip155.chains=o}}async sendCalls(t,e,i){if(e==null)throw new s.WalletError("invalid_input","Invalid input");let n=t.namespaces.eip155?.accounts??[],a=n[0]?.split(":").pop();if(!a)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_TX);let r=Array.from(this.activeSessions.values()).find(o=>o.accounts.some(c=>n.includes(c)));if(!r)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);try{let o=i?{chainId:`0x${parseInt(i.split(":")[1],10).toString(16)}`}:{};return await r.wallet.provider.request({method:"wallet_sendCalls",params:[{from:a,calls:e.map(d=>({to:d.to,value:d.value,data:d.data})),...o}]})}catch{let o=[];for(let c of e){let d=await r.wallet.provider.request({method:"eth_sendTransaction",params:[{from:a,to:c.to,value:c.value,data:c.data}]});o.push(d)}return o.length===1?o[0]:o.join(",")}}async getCapabilities(t){let e=Array.from(this.activeSessions.values()).find(a=>t.namespaces.eip155?.accounts.some(r=>a.accounts.includes(r)));if(!e)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);let i=t.namespaces.eip155?.chains??["eip155:1"],n={};try{let a=await e.wallet.provider.request({method:"wallet_getCapabilities",params:[]});for(let r of i){let o=a[r]??{};n[r]={atomicBatch:o.atomicBatch?{supported:!0,maxBatchSize:5}:{supported:!1},paymasterService:o.paymasterService?{supported:!0}:void 0}}}catch{for(let a of i)n[a]={atomicBatch:{supported:!0,maxBatchSize:5}}}return n}async getCallsStatus(t,e){try{let i=this.activeSessions.get(t.id);if(!i?.wallet.provider?.request)throw new Error("no provider");return await i.wallet.provider.request({method:"wallet_getCallsStatus",params:[e]})}catch{return{status:"PENDING"}}}async request(t){let e=this.activeSessions.values().next().value;if(!e)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);return e.wallet.provider.request({method:t.method,params:t.params})}async getBalance(t){let e=this.activeSessions.values().next().value;if(!e)throw new s.WalletError("session_expired",s.CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED);let i=e.accounts;if(i.length===0)throw new s.WalletError("method_not_allowed",s.CONNECTOR_ERROR_MESSAGES.NO_ACCOUNTS);let n=i[0].split(":").pop();return await e.wallet.provider.request({method:"eth_getBalance",params:[n,"latest"]})}onUpdate(t){return this.listeners.add(t),()=>this.listeners.delete(t)}notifyListeners(){let t=this.getDiscoveredWallets();this.listeners.forEach(e=>e(t))}getWalletByRDNS(t){return this.getDiscoveredWallets().find(e=>e.rdns===t)}clear(){for(let t of this.storedEventHandlers.values())t.wallet.provider.removeListener("accountsChanged",t.accountsHandler),t.wallet.provider.removeListener("chainChanged",t.chainHandler);this.storedEventHandlers.clear(),this.discoveredWallets.clear(),this.activeSessions.clear(),this.notifyListeners()}},g=new h;function D(){return new h}function U(l){return g.getWalletByRDNS(l)?.provider??null}function k(l){return typeof window>"u"?!1:g.getWalletByRDNS(l)!==void 0}0&&(module.exports={EIP6963Connector,createEIP6963Connector,eip6963Connector,getEIP6963Provider,isCoinbaseWalletInstalled,isMetaMaskInstalled,isWalletInstalled});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/chain.ts","../src/discovery.ts","../src/utils.ts"],"sourcesContent":["import type {\n BatchCall,\n ConnectorSupport,\n UniversalConnector,\n UniversalWalletSession,\n WalletCapabilities,\n} from \"@naculus/connect-core\";\nimport {\n CONNECTOR_ERROR_MESSAGES,\n createEmptySession,\n detectPlatform,\n extractAccountsFromPermissions,\n getPermissions,\n hasPermission,\n requestPermissions,\n WalletError,\n} from \"@naculus/connect-core\";\nimport { CHAIN_METADATA } from \"./chain\";\nimport {\n EIP6963_ANNOUNCE_EVENT,\n EIP6963_REQUEST_EVENT,\n isCoinbaseWalletInstalled,\n isMetaMaskInstalled,\n} from \"./discovery\";\nimport type {\n DiscoveredWallet,\n EIP6963ProviderInfo,\n EIP6963Session,\n Eip6963EthereumProvider,\n} from \"./types\";\nimport { toHexValue } from \"./utils\";\n\nexport { isCoinbaseWalletInstalled, isMetaMaskInstalled } from \"./discovery\";\nexport {\n DiscoveredWallet,\n EIP6963Provider,\n EIP6963ProviderInfo,\n EIP6963Session,\n Eip6963EthereumProvider,\n} from \"./types\";\n\ninterface StoredEventHandler {\n wallet: DiscoveredWallet;\n accountsHandler: (...args: unknown[]) => void;\n chainHandler: (...args: unknown[]) => void;\n}\n\nconst SUPPORT: ConnectorSupport = {\n desktop: true,\n mobile: true,\n deepLink: true,\n qr: false,\n trustedReconnect: true,\n};\n\nclass EIP6963ConnectorImpl implements UniversalConnector {\n readonly id = \"eip6963\";\n readonly name = \"EIP-6963 Injected Wallets\";\n readonly kind = \"eip6963\" as const;\n readonly namespaces = [\"eip155\"];\n readonly supports = SUPPORT;\n\n private discoveredWallets: Map<string, DiscoveredWallet> = new Map();\n private listeners: Set<(wallets: DiscoveredWallet[]) => void> = new Set();\n private announceHandler: ((...args: unknown[]) => void) | null = null;\n private activeSessions: Map<string, EIP6963Session> = new Map();\n private storedEventHandlers: Map<string, StoredEventHandler> = new Map();\n\n startDiscovery(): void {\n if (typeof window === \"undefined\") return;\n\n const handler: (...args: unknown[]) => void = (event: unknown) => {\n if (!event || typeof event !== \"object\") return;\n const e = event as Record<string, unknown>;\n const detail = e.detail as\n | { info?: EIP6963ProviderInfo; provider?: Eip6963EthereumProvider }\n | undefined;\n if (detail?.info && detail?.provider) {\n this.handleAnnouncement(detail.info, detail.provider);\n }\n };\n\n this.announceHandler = handler;\n window.addEventListener(EIP6963_ANNOUNCE_EVENT, handler);\n\n window.dispatchEvent(new Event(EIP6963_REQUEST_EVENT));\n }\n\n stopDiscovery(): void {\n if (typeof window === \"undefined\" || !this.announceHandler) return;\n\n window.removeEventListener(EIP6963_ANNOUNCE_EVENT, this.announceHandler);\n this.announceHandler = null;\n }\n\n private handleAnnouncement(\n info: EIP6963ProviderInfo,\n provider: Eip6963EthereumProvider,\n ): void {\n if (this.discoveredWallets.has(info.uuid)) return;\n\n const wallet: DiscoveredWallet = {\n id: info.uuid,\n name: info.name,\n icon: info.icon,\n rdns: info.rdns,\n provider,\n };\n\n this.discoveredWallets.set(info.uuid, wallet);\n this.notifyListeners();\n }\n\n getDiscoveredWallets(): DiscoveredWallet[] {\n return Array.from(this.discoveredWallets.values());\n }\n\n async connect(input?: unknown): Promise<UniversalWalletSession> {\n let wallet: DiscoveredWallet | undefined;\n\n if (!input) {\n const wallets = this.getDiscoveredWallets();\n if (wallets.length === 0) {\n throw new WalletError(\n \"wallet_unavailable\",\n \"No wallets discovered. Please call startDiscovery() to find available wallets.\",\n );\n }\n wallet = wallets[0];\n } else if (typeof input === \"string\") {\n wallet = this.getWalletByRDNS(input);\n if (!wallet) {\n throw new WalletError(\n \"wallet_unavailable\",\n `Wallet \"${input}\" not found. Please check the wallet RDNS.`,\n );\n }\n } else if (typeof input === \"object\" && \"provider\" in input) {\n wallet = input as DiscoveredWallet;\n } else if (typeof input === \"object\") {\n wallet = this.getDiscoveredWallets()[0];\n }\n\n if (!wallet) {\n throw new WalletError(\"wallet_unavailable\", \"No wallet available.\");\n }\n\n const chainIdInput =\n typeof input === \"object\" && input !== null\n ? (input as Record<string, unknown>)\n : undefined;\n const chainId =\n chainIdInput && typeof chainIdInput.chainId === \"string\"\n ? chainIdInput.chainId\n : undefined;\n\n let accounts: string[];\n\n const existingPermissions = await getPermissions(wallet.provider);\n if (hasPermission(existingPermissions ?? [], \"eth_accounts\")) {\n accounts = extractAccountsFromPermissions(existingPermissions ?? []);\n if (accounts.length === 0) {\n accounts = (await wallet.provider.request({\n method: \"eth_requestAccounts\",\n params: chainId ? [{ chainId }] : [],\n })) as string[];\n }\n } else {\n try {\n await requestPermissions(wallet.provider);\n accounts = (await wallet.provider.request({\n method: \"eth_requestAccounts\",\n params: chainId ? [{ chainId }] : [],\n })) as string[];\n } catch {\n accounts = (await wallet.provider.request({\n method: \"eth_requestAccounts\",\n params: chainId ? [{ chainId }] : [],\n })) as string[];\n }\n }\n\n const eip155Accounts = accounts.map((acc) => `eip155:${acc}`);\n const chains = chainId ? [`eip155:${chainId}`] : [\"eip155:1\"];\n const methods = [\n \"eth_requestAccounts\",\n \"eth_sendTransaction\",\n \"personal_sign\",\n \"eth_signTypedData_v4\",\n ];\n const events = [\"accountsChanged\", \"chainChanged\"];\n\n const session = createEmptySession({\n id: `eip6963-${wallet.id}-${Date.now()}`,\n walletId: wallet.id,\n walletType: \"eip6963\",\n namespaces: {\n eip155: {\n chains,\n accounts: eip155Accounts,\n methods,\n events,\n capabilities: {\n atomicBatch: { supported: false },\n permissions: true,\n serverSigning: false,\n },\n },\n },\n platform: detectPlatform(),\n });\n\n const eip6963Session: EIP6963Session = {\n wallet,\n accounts: eip155Accounts,\n chains,\n methods,\n events,\n };\n\n this.activeSessions.set(wallet.id, eip6963Session);\n\n this.setupEventListeners(wallet, session);\n this.setupPermissionsListener(wallet);\n\n return session;\n }\n\n async reconnect(\n session: UniversalWalletSession,\n ): Promise<UniversalWalletSession> {\n const wallet = Array.from(this.discoveredWallets.values()).find(\n (w) => w.id === session.walletId,\n );\n\n if (!wallet) {\n throw new WalletError(\n \"session_expired\",\n \"EIP-6963 wallet not found. Please reconnect.\",\n );\n }\n\n // Verify wallet is still accessible\n const accounts = (await wallet.provider.request({\n method: \"eth_accounts\",\n })) as string[];\n\n if (!accounts || accounts.length === 0) {\n throw new WalletError(\n \"session_expired\",\n \"No accounts found. Please reconnect.\",\n );\n }\n\n // Remove old event listeners if any, then setup fresh ones\n this.removeEventListeners(wallet);\n\n // Update session accounts from live provider\n const eip155Accounts = accounts.map((acc: string) => `eip155:${acc}`);\n const ns = session.namespaces.eip155;\n if (ns) {\n ns.accounts = eip155Accounts;\n }\n\n this.setupEventListeners(wallet, session);\n\n const eip6963Session: EIP6963Session = {\n wallet,\n accounts: eip155Accounts,\n chains: ns?.chains ?? [],\n methods: ns?.methods ?? [],\n events: ns?.events ?? [],\n };\n this.activeSessions.set(wallet.id, eip6963Session);\n\n return session;\n }\n\n private setupEventListeners(\n wallet: DiscoveredWallet,\n session: UniversalWalletSession,\n ): void {\n const accountsHandler = (...args: unknown[]) => {\n const accounts = args[0] as string[];\n if (accounts.length === 0) {\n this.handleDisconnect(session);\n }\n };\n\n const chainHandler = (...args: unknown[]) => {\n const chainId = args[0] as string;\n const ns = session.namespaces[\"eip155\"];\n if (ns) {\n ns.chains = [chainId];\n }\n };\n\n wallet.provider.on(\"accountsChanged\", accountsHandler);\n wallet.provider.on(\"chainChanged\", chainHandler);\n\n this.storedEventHandlers.set(wallet.id, {\n wallet,\n accountsHandler,\n chainHandler,\n });\n }\n\n private setupPermissionsListener(wallet: DiscoveredWallet): void {\n const permissionsHandler = async () => {\n const permissions = await getPermissions(wallet.provider);\n if (!hasPermission(permissions ?? [], \"eth_accounts\")) {\n this.activeSessions.delete(wallet.id);\n }\n };\n wallet.provider.on(\"permissionsChanged\", permissionsHandler);\n }\n\n private handleDisconnect(session: UniversalWalletSession): void {\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n session.namespaces.eip155?.accounts.some((acc) =>\n s.accounts.includes(acc),\n ),\n );\n\n if (eip6963Session) {\n this.removeEventListeners(eip6963Session.wallet);\n this.activeSessions.delete(eip6963Session.wallet.id);\n }\n }\n\n private removeEventListeners(wallet: DiscoveredWallet): void {\n const handlers = this.storedEventHandlers.get(wallet.id);\n if (handlers) {\n wallet.provider.removeListener(\n \"accountsChanged\",\n handlers.accountsHandler,\n );\n wallet.provider.removeListener(\"chainChanged\", handlers.chainHandler);\n this.storedEventHandlers.delete(wallet.id);\n }\n }\n\n async disconnect(session: UniversalWalletSession): Promise<void> {\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n session.namespaces.eip155?.accounts.some((acc) =>\n s.accounts.includes(acc),\n ),\n );\n\n if (eip6963Session) {\n this.removeEventListeners(eip6963Session.wallet);\n this.activeSessions.delete(eip6963Session.wallet.id);\n }\n\n if (session.id && session.id.startsWith(\"eip6963-\")) {\n const walletId = session.id.replace(\"eip6963-\", \"\");\n this.activeSessions.delete(walletId);\n this.storedEventHandlers.delete(walletId);\n }\n }\n\n async getAccounts(session: UniversalWalletSession): Promise<string[]> {\n const accounts = session.namespaces.eip155?.accounts ?? [];\n return accounts;\n }\n\n async signMessage(\n session: UniversalWalletSession,\n input: unknown,\n ): Promise<unknown> {\n if (!input || typeof input !== \"object\")\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.INVALID_INPUT,\n );\n const inputObj = input as Record<string, unknown>;\n const rawMessage =\n typeof inputObj.message === \"string\" ? inputObj.message : undefined;\n const rawAddress =\n typeof inputObj.address === \"string\"\n ? inputObj.address\n : typeof inputObj.account === \"string\"\n ? inputObj.account\n : undefined;\n if (!rawMessage)\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.MISSING_MESSAGE,\n );\n const accounts = session.namespaces.eip155?.accounts ?? [];\n\n // Strip CAIP-10 prefix if present, fall back to session's first account\n const targetAccount = rawAddress?.includes(\":\")\n ? rawAddress.split(\":\").pop()!\n : (rawAddress ?? accounts[0]?.split(\":\").pop());\n if (!targetAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_SIGNING,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n // Hex-encode the message for personal_sign\n const hexMessage =\n rawMessage.startsWith(\"0x\") && /^0x[0-9a-fA-F]*$/.test(rawMessage)\n ? rawMessage\n : \"0x\" +\n Array.from(new TextEncoder().encode(rawMessage))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n const result = await eip6963Session.wallet.provider.request({\n method: \"personal_sign\",\n params: [hexMessage, targetAccount],\n });\n\n return result;\n }\n\n async signTransaction(\n session: UniversalWalletSession,\n input: unknown,\n ): Promise<unknown> {\n if (!input || typeof input !== \"object\" || !(\"transaction\" in input))\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.MISSING_TX,\n );\n const inputObj = input as Record<string, unknown>;\n const transaction = inputObj.transaction as\n | { serialized?: number[] }\n | undefined;\n if (!transaction?.serialized || !Array.isArray(transaction.serialized))\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.INVALID_INPUT,\n );\n const accounts = session.namespaces.eip155?.accounts ?? [];\n\n const fromAccount = accounts[0]?.split(\":\").pop();\n if (!fromAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_SIGNING,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n const txData = new Uint8Array(transaction.serialized).reduce(\n (str, byte) => str + byte.toString(16).padStart(2, \"0\"),\n \"\",\n );\n\n const result = await eip6963Session.wallet.provider.request({\n method: \"eth_sendTransaction\",\n params: [\n {\n from: fromAccount,\n data: `0x${txData}`,\n },\n ],\n });\n\n return result;\n }\n\n async sendTransaction(\n session: UniversalWalletSession,\n input: unknown,\n ): Promise<unknown> {\n if (input == null) throw new WalletError(\"invalid_input\", \"Invalid input\");\n if (!input || typeof input !== \"object\" || !(\"transaction\" in input))\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.MISSING_TX,\n );\n const inputObj = input as Record<string, unknown>;\n const transactionRaw = inputObj.transaction;\n const transaction =\n transactionRaw && typeof transactionRaw === \"object\"\n ? (transactionRaw as Record<string, unknown>)\n : {};\n const accounts = session.namespaces.eip155?.accounts ?? [];\n\n const fromAccount =\n typeof transaction.from === \"string\"\n ? transaction.from\n : accounts[0]?.split(\":\").pop();\n if (!fromAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_TX,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n const result = await eip6963Session.wallet.provider.request({\n method: \"eth_sendTransaction\",\n params: [\n {\n from: fromAccount,\n to: typeof transaction.to === \"string\" ? transaction.to : undefined,\n value:\n typeof transaction.value === \"string\"\n ? toHexValue(transaction.value)\n : undefined,\n data:\n typeof transaction.data === \"string\" ? transaction.data : undefined,\n },\n ],\n });\n\n return result;\n }\n\n async switchChain(\n session: UniversalWalletSession,\n chainId: string,\n ): Promise<void> {\n const accounts = session.namespaces.eip155?.accounts ?? [];\n if (accounts.length === 0) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNTS,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n // Convert CAIP-10 chainId (e.g. \"eip155:137\") to hex format (e.g. \"0x89\")\n // as required by wallet_switchEthereumChain\n const hexChainId = chainId.startsWith(\"eip155:\")\n ? `0x${parseInt(chainId.split(\":\")[1], 10).toString(16)}`\n : chainId;\n\n try {\n await eip6963Session.wallet.provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: hexChainId }],\n });\n } catch (error: unknown) {\n // Error code 4902 = chain not recognized by wallet, add it first\n const rpcError = error as { code?: number; message?: string } | undefined;\n if (rpcError?.code === 4902) {\n const chainParams = CHAIN_METADATA[hexChainId];\n if (!chainParams) {\n throw new WalletError(\n \"chain_unsupported\",\n `Chain ${hexChainId} is not recognized. No metadata available to add it.`,\n );\n }\n await eip6963Session.wallet.provider.request({\n method: \"wallet_addEthereumChain\",\n params: [chainParams],\n });\n // Retry switch after adding the chain\n await eip6963Session.wallet.provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: hexChainId }],\n });\n } else {\n throw new WalletError(\n \"chain_unsupported\",\n `Failed to switch chain: ${rpcError?.message ?? String(error)}`,\n );\n }\n }\n\n const currentChains = session.namespaces.eip155?.chains ?? [];\n if (!currentChains.includes(chainId)) {\n const newChains = [\n ...currentChains.filter((c) => c.startsWith(\"eip155:\")),\n chainId,\n ];\n session.namespaces.eip155!.chains = newChains;\n }\n }\n\n async sendCalls(\n session: UniversalWalletSession,\n calls: BatchCall[],\n chainId?: string,\n ): Promise<string> {\n if (calls == null) throw new WalletError(\"invalid_input\", \"Invalid input\");\n const accounts = session.namespaces.eip155?.accounts ?? [];\n const fromAccount = accounts[0]?.split(\":\").pop();\n if (!fromAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_TX,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n try {\n const chainIdParam = chainId\n ? { chainId: `0x${parseInt(chainId.split(\":\")[1], 10).toString(16)}` }\n : {};\n const result = await eip6963Session.wallet.provider.request({\n method: \"wallet_sendCalls\",\n params: [\n {\n from: fromAccount,\n calls: calls.map((c) => ({\n to: c.to,\n value: c.value,\n data: c.data,\n })),\n ...chainIdParam,\n },\n ],\n });\n return result as string;\n } catch {\n const txHashes: string[] = [];\n for (const call of calls) {\n const hash = await eip6963Session.wallet.provider.request({\n method: \"eth_sendTransaction\",\n params: [\n {\n from: fromAccount,\n to: call.to,\n value: call.value,\n data: call.data,\n },\n ],\n });\n txHashes.push(hash as string);\n }\n return txHashes.length === 1 ? txHashes[0] : txHashes.join(\",\");\n }\n }\n\n async getCapabilities(\n session: UniversalWalletSession,\n ): Promise<Record<string, WalletCapabilities>> {\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n session.namespaces.eip155?.accounts.some((acc) =>\n s.accounts.includes(acc),\n ),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n const chains = session.namespaces.eip155?.chains ?? [\"eip155:1\"];\n const capabilities: Record<string, WalletCapabilities> = {};\n\n try {\n const result = (await eip6963Session.wallet.provider.request({\n method: \"wallet_getCapabilities\",\n params: [],\n })) as Record<string, Record<string, unknown>>;\n\n for (const chain of chains) {\n const caps = result[chain] ?? {};\n capabilities[chain] = {\n atomicBatch: caps.atomicBatch\n ? { supported: true, maxBatchSize: 5 }\n : { supported: false },\n paymasterService: caps.paymasterService\n ? { supported: true }\n : undefined,\n };\n }\n } catch {\n for (const chain of chains) {\n capabilities[chain] = {\n atomicBatch: { supported: true, maxBatchSize: 5 },\n };\n }\n }\n\n return capabilities;\n }\n\n async getCallsStatus(\n session: UniversalWalletSession,\n bundleHash: string,\n ): Promise<import(\"@naculus/connect-core\").CallsStatus> {\n try {\n const wallet = this.activeSessions.get(session.id);\n if (!wallet?.wallet.provider?.request) throw new Error(\"no provider\");\n return (await wallet.wallet.provider.request({\n method: \"wallet_getCallsStatus\",\n params: [bundleHash],\n })) as import(\"@naculus/connect-core\").CallsStatus;\n } catch {\n return { status: \"PENDING\" };\n }\n }\n\n async request(request: {\n method: string;\n params: unknown[];\n }): Promise<unknown> {\n const session = this.activeSessions.values().next().value;\n if (!session)\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n return session.wallet.provider.request({\n method: request.method,\n params: request.params,\n });\n }\n\n async getBalance(chainId?: string): Promise<string> {\n const session = this.activeSessions.values().next().value;\n if (!session)\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n const accounts = session.accounts;\n if (accounts.length === 0)\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNTS,\n );\n const address = accounts[0].split(\":\").pop()!;\n const provider = session.wallet.provider;\n const balance = (await provider.request({\n method: \"eth_getBalance\",\n params: [address, \"latest\"],\n })) as string;\n return balance;\n }\n\n onUpdate(callback: (wallets: DiscoveredWallet[]) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private notifyListeners(): void {\n const wallets = this.getDiscoveredWallets();\n this.listeners.forEach((cb) => cb(wallets));\n }\n\n getWalletByRDNS(rdns: string): DiscoveredWallet | undefined {\n return this.getDiscoveredWallets().find((w) => w.rdns === rdns);\n }\n\n clear(): void {\n for (const handlers of this.storedEventHandlers.values()) {\n handlers.wallet.provider.removeListener(\n \"accountsChanged\",\n handlers.accountsHandler,\n );\n handlers.wallet.provider.removeListener(\n \"chainChanged\",\n handlers.chainHandler,\n );\n }\n this.storedEventHandlers.clear();\n this.discoveredWallets.clear();\n this.activeSessions.clear();\n this.notifyListeners();\n }\n}\n\nexport const eip6963Connector = new EIP6963ConnectorImpl();\n\nexport type { EIP6963ConnectorImpl as EIP6963ConnectorClass };\nexport { EIP6963ConnectorImpl as EIP6963Connector };\n\nexport function createEIP6963Connector(): EIP6963ConnectorImpl {\n return new EIP6963ConnectorImpl();\n}\n\nexport function getEIP6963Provider(\n rdns: string,\n): Eip6963EthereumProvider | null {\n const wallet = eip6963Connector.getWalletByRDNS(rdns);\n return wallet?.provider ?? null;\n}\n\nexport function isWalletInstalled(rdns: string): boolean {\n if (typeof window === \"undefined\") return false;\n return eip6963Connector.getWalletByRDNS(rdns) !== undefined;\n}\n","/**\n * Chain metadata for wallet_addEthereumChain fallback.\n * Maps hex chain IDs to EIP-3085 AddEthereumChainParameter.\n */\nexport const CHAIN_METADATA: Record<\n string,\n {\n chainId: string;\n chainName: string;\n nativeCurrency: { name: string; symbol: string; decimals: number };\n rpcUrls: string[];\n blockExplorerUrls?: string[];\n }\n> = {\n \"0xaa36a7\": {\n chainId: \"0xaa36a7\",\n chainName: \"Sepolia Testnet\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://sepolia.llamarpc.com\"],\n blockExplorerUrls: [\"https://sepolia.etherscan.io\"],\n },\n \"0x89\": {\n chainId: \"0x89\",\n chainName: \"Polygon Mainnet\",\n nativeCurrency: { name: \"POL\", symbol: \"POL\", decimals: 18 },\n rpcUrls: [\"https://polygon-rpc.com\"],\n blockExplorerUrls: [\"https://polygonscan.com\"],\n },\n \"0xa4b1\": {\n chainId: \"0xa4b1\",\n chainName: \"Arbitrum One\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://arb1.arbitrum.io/rpc\"],\n blockExplorerUrls: [\"https://arbiscan.io\"],\n },\n \"0xa\": {\n chainId: \"0xa\",\n chainName: \"Optimism\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://mainnet.optimism.io\"],\n blockExplorerUrls: [\"https://optimistic.etherscan.io\"],\n },\n \"0x2105\": {\n chainId: \"0x2105\",\n chainName: \"Base\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://base.llamarpc.com\"],\n blockExplorerUrls: [\"https://basescan.org\"],\n },\n};\n","import type { Eip6963EthereumProvider } from \"./types\";\n\nexport const EIP6963_ANNOUNCE_EVENT = \"eip6963:announceProvider\";\nexport const EIP6963_REQUEST_EVENT = \"eip6963:requestProvider\";\n\nexport function isMetaMaskInstalled(): boolean {\n if (typeof window === \"undefined\") return false;\n return (\n (window as unknown as { ethereum?: { isMetaMask?: boolean } }).ethereum\n ?.isMetaMask ?? false\n );\n}\n\nexport function isCoinbaseWalletInstalled(): boolean {\n if (typeof window === \"undefined\") return false;\n return (\n (window as unknown as { ethereum?: { isCoinbaseWallet?: boolean } })\n .ethereum?.isCoinbaseWallet ?? false\n );\n}\n\ndeclare global {\n interface Window {\n ethereum?: Eip6963EthereumProvider & {\n isMetaMask?: boolean;\n isCoinbaseWallet?: boolean;\n removeListener?: (\n event: string,\n handler: (...args: unknown[]) => void,\n ) => void;\n };\n }\n}\n","export function toHexValue(value: string): string {\n if (value.startsWith(\"0x\")) return value;\n return `0x${BigInt(value).toString(16)}`;\n}\n"],"mappings":"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","names":["index_exports","__export","EIP6963ConnectorImpl","createEIP6963Connector","eip6963Connector","getEIP6963Provider","isCoinbaseWalletInstalled","isMetaMaskInstalled","isWalletInstalled","__toCommonJS","import_connect_core","CHAIN_METADATA","EIP6963_ANNOUNCE_EVENT","EIP6963_REQUEST_EVENT","isMetaMaskInstalled","isCoinbaseWalletInstalled","toHexValue","value","SUPPORT","EIP6963ConnectorImpl","handler","event","detail","EIP6963_ANNOUNCE_EVENT","EIP6963_REQUEST_EVENT","info","provider","wallet","input","wallets","chainIdInput","chainId","accounts","existingPermissions","eip155Accounts","acc","chains","methods","events","session","eip6963Session","w","ns","accountsHandler","args","chainHandler","permissionsHandler","permissions","s","handlers","walletId","inputObj","rawMessage","rawAddress","targetAccount","hexMessage","b","transaction","fromAccount","txData","str","byte","transactionRaw","toHexValue","hexChainId","error","rpcError","chainParams","CHAIN_METADATA","currentChains","newChains","calls","chainIdParam","c","txHashes","call","hash","capabilities","result","chain","caps","bundleHash","request","address","callback","cb","rdns","eip6963Connector","createEIP6963Connector","EIP6963ConnectorImpl","getEIP6963Provider","rdns","eip6963Connector","isWalletInstalled"]}
@@ -0,0 +1,97 @@
1
+ import * as _naculus_connect_core from '@naculus/connect-core';
2
+ import { UniversalConnector, ConnectorSupport, UniversalWalletSession, BatchCall, WalletCapabilities } from '@naculus/connect-core';
3
+
4
+ interface EIP6963ProviderInfo {
5
+ uuid: string;
6
+ name: string;
7
+ icon: string;
8
+ rdns: string;
9
+ }
10
+ interface EIP6963Provider {
11
+ info: EIP6963ProviderInfo;
12
+ provider: Eip6963EthereumProvider;
13
+ }
14
+ type Eip6963EthereumProvider = {
15
+ request: (args: {
16
+ method: string;
17
+ params?: unknown[];
18
+ }) => Promise<unknown>;
19
+ on: (event: string, handler: (...args: unknown[]) => void) => void;
20
+ removeListener: (event: string, handler: (...args: unknown[]) => void) => void;
21
+ isMetaMask?: boolean;
22
+ isCoinbaseWallet?: boolean;
23
+ };
24
+ interface DiscoveredWallet {
25
+ id: string;
26
+ name: string;
27
+ icon: string;
28
+ rdns: string;
29
+ provider: Eip6963EthereumProvider;
30
+ }
31
+ interface EIP6963Session {
32
+ wallet: DiscoveredWallet;
33
+ accounts: string[];
34
+ chains: string[];
35
+ methods: string[];
36
+ events: string[];
37
+ }
38
+
39
+ declare function isMetaMaskInstalled(): boolean;
40
+ declare function isCoinbaseWalletInstalled(): boolean;
41
+ declare global {
42
+ interface Window {
43
+ ethereum?: Eip6963EthereumProvider & {
44
+ isMetaMask?: boolean;
45
+ isCoinbaseWallet?: boolean;
46
+ removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;
47
+ };
48
+ }
49
+ }
50
+
51
+ declare class EIP6963ConnectorImpl implements UniversalConnector {
52
+ readonly id = "eip6963";
53
+ readonly name = "EIP-6963 Injected Wallets";
54
+ readonly kind: "eip6963";
55
+ readonly namespaces: string[];
56
+ readonly supports: ConnectorSupport;
57
+ private discoveredWallets;
58
+ private listeners;
59
+ private announceHandler;
60
+ private activeSessions;
61
+ private storedEventHandlers;
62
+ startDiscovery(): void;
63
+ stopDiscovery(): void;
64
+ private handleAnnouncement;
65
+ getDiscoveredWallets(): DiscoveredWallet[];
66
+ connect(input?: unknown): Promise<UniversalWalletSession>;
67
+ reconnect(session: UniversalWalletSession): Promise<UniversalWalletSession>;
68
+ private setupEventListeners;
69
+ private setupPermissionsListener;
70
+ private handleDisconnect;
71
+ private removeEventListeners;
72
+ disconnect(session: UniversalWalletSession): Promise<void>;
73
+ getAccounts(session: UniversalWalletSession): Promise<string[]>;
74
+ signMessage(session: UniversalWalletSession, input: unknown): Promise<unknown>;
75
+ signTransaction(session: UniversalWalletSession, input: unknown): Promise<unknown>;
76
+ sendTransaction(session: UniversalWalletSession, input: unknown): Promise<unknown>;
77
+ switchChain(session: UniversalWalletSession, chainId: string): Promise<void>;
78
+ sendCalls(session: UniversalWalletSession, calls: BatchCall[], chainId?: string): Promise<string>;
79
+ getCapabilities(session: UniversalWalletSession): Promise<Record<string, WalletCapabilities>>;
80
+ getCallsStatus(session: UniversalWalletSession, bundleHash: string): Promise<_naculus_connect_core.CallsStatus>;
81
+ request(request: {
82
+ method: string;
83
+ params: unknown[];
84
+ }): Promise<unknown>;
85
+ getBalance(chainId?: string): Promise<string>;
86
+ onUpdate(callback: (wallets: DiscoveredWallet[]) => void): () => void;
87
+ private notifyListeners;
88
+ getWalletByRDNS(rdns: string): DiscoveredWallet | undefined;
89
+ clear(): void;
90
+ }
91
+ declare const eip6963Connector: EIP6963ConnectorImpl;
92
+
93
+ declare function createEIP6963Connector(): EIP6963ConnectorImpl;
94
+ declare function getEIP6963Provider(rdns: string): Eip6963EthereumProvider | null;
95
+ declare function isWalletInstalled(rdns: string): boolean;
96
+
97
+ export { type DiscoveredWallet, EIP6963ConnectorImpl as EIP6963Connector, EIP6963ConnectorImpl as EIP6963ConnectorClass, type EIP6963Provider, type EIP6963ProviderInfo, type EIP6963Session, type Eip6963EthereumProvider, createEIP6963Connector, eip6963Connector, getEIP6963Provider, isCoinbaseWalletInstalled, isMetaMaskInstalled, isWalletInstalled };
@@ -0,0 +1,97 @@
1
+ import * as _naculus_connect_core from '@naculus/connect-core';
2
+ import { UniversalConnector, ConnectorSupport, UniversalWalletSession, BatchCall, WalletCapabilities } from '@naculus/connect-core';
3
+
4
+ interface EIP6963ProviderInfo {
5
+ uuid: string;
6
+ name: string;
7
+ icon: string;
8
+ rdns: string;
9
+ }
10
+ interface EIP6963Provider {
11
+ info: EIP6963ProviderInfo;
12
+ provider: Eip6963EthereumProvider;
13
+ }
14
+ type Eip6963EthereumProvider = {
15
+ request: (args: {
16
+ method: string;
17
+ params?: unknown[];
18
+ }) => Promise<unknown>;
19
+ on: (event: string, handler: (...args: unknown[]) => void) => void;
20
+ removeListener: (event: string, handler: (...args: unknown[]) => void) => void;
21
+ isMetaMask?: boolean;
22
+ isCoinbaseWallet?: boolean;
23
+ };
24
+ interface DiscoveredWallet {
25
+ id: string;
26
+ name: string;
27
+ icon: string;
28
+ rdns: string;
29
+ provider: Eip6963EthereumProvider;
30
+ }
31
+ interface EIP6963Session {
32
+ wallet: DiscoveredWallet;
33
+ accounts: string[];
34
+ chains: string[];
35
+ methods: string[];
36
+ events: string[];
37
+ }
38
+
39
+ declare function isMetaMaskInstalled(): boolean;
40
+ declare function isCoinbaseWalletInstalled(): boolean;
41
+ declare global {
42
+ interface Window {
43
+ ethereum?: Eip6963EthereumProvider & {
44
+ isMetaMask?: boolean;
45
+ isCoinbaseWallet?: boolean;
46
+ removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;
47
+ };
48
+ }
49
+ }
50
+
51
+ declare class EIP6963ConnectorImpl implements UniversalConnector {
52
+ readonly id = "eip6963";
53
+ readonly name = "EIP-6963 Injected Wallets";
54
+ readonly kind: "eip6963";
55
+ readonly namespaces: string[];
56
+ readonly supports: ConnectorSupport;
57
+ private discoveredWallets;
58
+ private listeners;
59
+ private announceHandler;
60
+ private activeSessions;
61
+ private storedEventHandlers;
62
+ startDiscovery(): void;
63
+ stopDiscovery(): void;
64
+ private handleAnnouncement;
65
+ getDiscoveredWallets(): DiscoveredWallet[];
66
+ connect(input?: unknown): Promise<UniversalWalletSession>;
67
+ reconnect(session: UniversalWalletSession): Promise<UniversalWalletSession>;
68
+ private setupEventListeners;
69
+ private setupPermissionsListener;
70
+ private handleDisconnect;
71
+ private removeEventListeners;
72
+ disconnect(session: UniversalWalletSession): Promise<void>;
73
+ getAccounts(session: UniversalWalletSession): Promise<string[]>;
74
+ signMessage(session: UniversalWalletSession, input: unknown): Promise<unknown>;
75
+ signTransaction(session: UniversalWalletSession, input: unknown): Promise<unknown>;
76
+ sendTransaction(session: UniversalWalletSession, input: unknown): Promise<unknown>;
77
+ switchChain(session: UniversalWalletSession, chainId: string): Promise<void>;
78
+ sendCalls(session: UniversalWalletSession, calls: BatchCall[], chainId?: string): Promise<string>;
79
+ getCapabilities(session: UniversalWalletSession): Promise<Record<string, WalletCapabilities>>;
80
+ getCallsStatus(session: UniversalWalletSession, bundleHash: string): Promise<_naculus_connect_core.CallsStatus>;
81
+ request(request: {
82
+ method: string;
83
+ params: unknown[];
84
+ }): Promise<unknown>;
85
+ getBalance(chainId?: string): Promise<string>;
86
+ onUpdate(callback: (wallets: DiscoveredWallet[]) => void): () => void;
87
+ private notifyListeners;
88
+ getWalletByRDNS(rdns: string): DiscoveredWallet | undefined;
89
+ clear(): void;
90
+ }
91
+ declare const eip6963Connector: EIP6963ConnectorImpl;
92
+
93
+ declare function createEIP6963Connector(): EIP6963ConnectorImpl;
94
+ declare function getEIP6963Provider(rdns: string): Eip6963EthereumProvider | null;
95
+ declare function isWalletInstalled(rdns: string): boolean;
96
+
97
+ export { type DiscoveredWallet, EIP6963ConnectorImpl as EIP6963Connector, EIP6963ConnectorImpl as EIP6963ConnectorClass, type EIP6963Provider, type EIP6963ProviderInfo, type EIP6963Session, type Eip6963EthereumProvider, createEIP6963Connector, eip6963Connector, getEIP6963Provider, isCoinbaseWalletInstalled, isMetaMaskInstalled, isWalletInstalled };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{CONNECTOR_ERROR_MESSAGES as l,createEmptySession as x,detectPlatform as b,extractAccountsFromPermissions as W,getPermissions as y,hasPermission as _,requestPermissions as N,WalletError as r}from"@naculus/connect-core";var g={"0xaa36a7":{chainId:"0xaa36a7",chainName:"Sepolia Testnet",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://sepolia.llamarpc.com"],blockExplorerUrls:["https://sepolia.etherscan.io"]},"0x89":{chainId:"0x89",chainName:"Polygon Mainnet",nativeCurrency:{name:"POL",symbol:"POL",decimals:18},rpcUrls:["https://polygon-rpc.com"],blockExplorerUrls:["https://polygonscan.com"]},"0xa4b1":{chainId:"0xa4b1",chainName:"Arbitrum One",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://arb1.arbitrum.io/rpc"],blockExplorerUrls:["https://arbiscan.io"]},"0xa":{chainId:"0xa",chainName:"Optimism",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://mainnet.optimism.io"],blockExplorerUrls:["https://optimistic.etherscan.io"]},"0x2105":{chainId:"0x2105",chainName:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:["https://base.llamarpc.com"],blockExplorerUrls:["https://basescan.org"]}};var f="eip6963:announceProvider",E="eip6963:requestProvider";function P(){return typeof window>"u"?!1:window.ethereum?.isMetaMask??!1}function C(){return typeof window>"u"?!1:window.ethereum?.isCoinbaseWallet??!1}function S(h){return h.startsWith("0x")?h:`0x${BigInt(h).toString(16)}`}var A={desktop:!0,mobile:!0,deepLink:!0,qr:!1,trustedReconnect:!0},v=class{id="eip6963";name="EIP-6963 Injected Wallets";kind="eip6963";namespaces=["eip155"];supports=A;discoveredWallets=new Map;listeners=new Set;announceHandler=null;activeSessions=new Map;storedEventHandlers=new Map;startDiscovery(){if(typeof window>"u")return;let t=e=>{if(!e||typeof e!="object")return;let s=e.detail;s?.info&&s?.provider&&this.handleAnnouncement(s.info,s.provider)};this.announceHandler=t,window.addEventListener(f,t),window.dispatchEvent(new Event(E))}stopDiscovery(){typeof window>"u"||!this.announceHandler||(window.removeEventListener(f,this.announceHandler),this.announceHandler=null)}handleAnnouncement(t,e){if(this.discoveredWallets.has(t.uuid))return;let i={id:t.uuid,name:t.name,icon:t.icon,rdns:t.rdns,provider:e};this.discoveredWallets.set(t.uuid,i),this.notifyListeners()}getDiscoveredWallets(){return Array.from(this.discoveredWallets.values())}async connect(t){let e;if(t)if(typeof t=="string"){if(e=this.getWalletByRDNS(t),!e)throw new r("wallet_unavailable",`Wallet "${t}" not found. Please check the wallet RDNS.`)}else typeof t=="object"&&"provider"in t?e=t:typeof t=="object"&&(e=this.getDiscoveredWallets()[0]);else{let m=this.getDiscoveredWallets();if(m.length===0)throw new r("wallet_unavailable","No wallets discovered. Please call startDiscovery() to find available wallets.");e=m[0]}if(!e)throw new r("wallet_unavailable","No wallet available.");let i=typeof t=="object"&&t!==null?t:void 0,s=i&&typeof i.chainId=="string"?i.chainId:void 0,n,o=await y(e.provider);if(_(o??[],"eth_accounts"))n=W(o??[]),n.length===0&&(n=await e.provider.request({method:"eth_requestAccounts",params:s?[{chainId:s}]:[]}));else try{await N(e.provider),n=await e.provider.request({method:"eth_requestAccounts",params:s?[{chainId:s}]:[]})}catch{n=await e.provider.request({method:"eth_requestAccounts",params:s?[{chainId:s}]:[]})}let a=n.map(m=>`eip155:${m}`),c=s?[`eip155:${s}`]:["eip155:1"],d=["eth_requestAccounts","eth_sendTransaction","personal_sign","eth_signTypedData_v4"],u=["accountsChanged","chainChanged"],p=x({id:`eip6963-${e.id}-${Date.now()}`,walletId:e.id,walletType:"eip6963",namespaces:{eip155:{chains:c,accounts:a,methods:d,events:u,capabilities:{atomicBatch:{supported:!1},permissions:!0,serverSigning:!1}}},platform:b()}),w={wallet:e,accounts:a,chains:c,methods:d,events:u};return this.activeSessions.set(e.id,w),this.setupEventListeners(e,p),this.setupPermissionsListener(e),p}async reconnect(t){let e=Array.from(this.discoveredWallets.values()).find(a=>a.id===t.walletId);if(!e)throw new r("session_expired","EIP-6963 wallet not found. Please reconnect.");let i=await e.provider.request({method:"eth_accounts"});if(!i||i.length===0)throw new r("session_expired","No accounts found. Please reconnect.");this.removeEventListeners(e);let s=i.map(a=>`eip155:${a}`),n=t.namespaces.eip155;n&&(n.accounts=s),this.setupEventListeners(e,t);let o={wallet:e,accounts:s,chains:n?.chains??[],methods:n?.methods??[],events:n?.events??[]};return this.activeSessions.set(e.id,o),t}setupEventListeners(t,e){let i=(...n)=>{n[0].length===0&&this.handleDisconnect(e)},s=(...n)=>{let o=n[0],a=e.namespaces.eip155;a&&(a.chains=[o])};t.provider.on("accountsChanged",i),t.provider.on("chainChanged",s),this.storedEventHandlers.set(t.id,{wallet:t,accountsHandler:i,chainHandler:s})}setupPermissionsListener(t){let e=async()=>{let i=await y(t.provider);_(i??[],"eth_accounts")||this.activeSessions.delete(t.id)};t.provider.on("permissionsChanged",e)}handleDisconnect(t){let e=Array.from(this.activeSessions.values()).find(i=>t.namespaces.eip155?.accounts.some(s=>i.accounts.includes(s)));e&&(this.removeEventListeners(e.wallet),this.activeSessions.delete(e.wallet.id))}removeEventListeners(t){let e=this.storedEventHandlers.get(t.id);e&&(t.provider.removeListener("accountsChanged",e.accountsHandler),t.provider.removeListener("chainChanged",e.chainHandler),this.storedEventHandlers.delete(t.id))}async disconnect(t){let e=Array.from(this.activeSessions.values()).find(i=>t.namespaces.eip155?.accounts.some(s=>i.accounts.includes(s)));if(e&&(this.removeEventListeners(e.wallet),this.activeSessions.delete(e.wallet.id)),t.id&&t.id.startsWith("eip6963-")){let i=t.id.replace("eip6963-","");this.activeSessions.delete(i),this.storedEventHandlers.delete(i)}}async getAccounts(t){return t.namespaces.eip155?.accounts??[]}async signMessage(t,e){if(!e||typeof e!="object")throw new r("method_not_allowed",l.INVALID_INPUT);let i=e,s=typeof i.message=="string"?i.message:void 0,n=typeof i.address=="string"?i.address:typeof i.account=="string"?i.account:void 0;if(!s)throw new r("method_not_allowed",l.MISSING_MESSAGE);let o=t.namespaces.eip155?.accounts??[],a=n?.includes(":")?n.split(":").pop():n??o[0]?.split(":").pop();if(!a)throw new r("session_expired",l.NO_ACCOUNT_SIGNING);let c=Array.from(this.activeSessions.values()).find(p=>p.accounts.some(w=>o.includes(w)));if(!c)throw new r("session_expired",l.SESSION_EXPIRED);let d=s.startsWith("0x")&&/^0x[0-9a-fA-F]*$/.test(s)?s:"0x"+Array.from(new TextEncoder().encode(s)).map(p=>p.toString(16).padStart(2,"0")).join("");return await c.wallet.provider.request({method:"personal_sign",params:[d,a]})}async signTransaction(t,e){if(!e||typeof e!="object"||!("transaction"in e))throw new r("method_not_allowed",l.MISSING_TX);let s=e.transaction;if(!s?.serialized||!Array.isArray(s.serialized))throw new r("method_not_allowed",l.INVALID_INPUT);let n=t.namespaces.eip155?.accounts??[],o=n[0]?.split(":").pop();if(!o)throw new r("session_expired",l.NO_ACCOUNT_SIGNING);let a=Array.from(this.activeSessions.values()).find(u=>u.accounts.some(p=>n.includes(p)));if(!a)throw new r("session_expired",l.SESSION_EXPIRED);let c=new Uint8Array(s.serialized).reduce((u,p)=>u+p.toString(16).padStart(2,"0"),"");return await a.wallet.provider.request({method:"eth_sendTransaction",params:[{from:o,data:`0x${c}`}]})}async sendTransaction(t,e){if(e==null)throw new r("invalid_input","Invalid input");if(!e||typeof e!="object"||!("transaction"in e))throw new r("method_not_allowed",l.MISSING_TX);let s=e.transaction,n=s&&typeof s=="object"?s:{},o=t.namespaces.eip155?.accounts??[],a=typeof n.from=="string"?n.from:o[0]?.split(":").pop();if(!a)throw new r("session_expired",l.NO_ACCOUNT_TX);let c=Array.from(this.activeSessions.values()).find(u=>u.accounts.some(p=>o.includes(p)));if(!c)throw new r("session_expired",l.SESSION_EXPIRED);return await c.wallet.provider.request({method:"eth_sendTransaction",params:[{from:a,to:typeof n.to=="string"?n.to:void 0,value:typeof n.value=="string"?S(n.value):void 0,data:typeof n.data=="string"?n.data:void 0}]})}async switchChain(t,e){let i=t.namespaces.eip155?.accounts??[];if(i.length===0)throw new r("session_expired",l.NO_ACCOUNTS);let s=Array.from(this.activeSessions.values()).find(a=>a.accounts.some(c=>i.includes(c)));if(!s)throw new r("session_expired",l.SESSION_EXPIRED);let n=e.startsWith("eip155:")?`0x${parseInt(e.split(":")[1],10).toString(16)}`:e;try{await s.wallet.provider.request({method:"wallet_switchEthereumChain",params:[{chainId:n}]})}catch(a){let c=a;if(c?.code===4902){let d=g[n];if(!d)throw new r("chain_unsupported",`Chain ${n} is not recognized. No metadata available to add it.`);await s.wallet.provider.request({method:"wallet_addEthereumChain",params:[d]}),await s.wallet.provider.request({method:"wallet_switchEthereumChain",params:[{chainId:n}]})}else throw new r("chain_unsupported",`Failed to switch chain: ${c?.message??String(a)}`)}let o=t.namespaces.eip155?.chains??[];if(!o.includes(e)){let a=[...o.filter(c=>c.startsWith("eip155:")),e];t.namespaces.eip155.chains=a}}async sendCalls(t,e,i){if(e==null)throw new r("invalid_input","Invalid input");let s=t.namespaces.eip155?.accounts??[],n=s[0]?.split(":").pop();if(!n)throw new r("session_expired",l.NO_ACCOUNT_TX);let o=Array.from(this.activeSessions.values()).find(a=>a.accounts.some(c=>s.includes(c)));if(!o)throw new r("session_expired",l.SESSION_EXPIRED);try{let a=i?{chainId:`0x${parseInt(i.split(":")[1],10).toString(16)}`}:{};return await o.wallet.provider.request({method:"wallet_sendCalls",params:[{from:n,calls:e.map(d=>({to:d.to,value:d.value,data:d.data})),...a}]})}catch{let a=[];for(let c of e){let d=await o.wallet.provider.request({method:"eth_sendTransaction",params:[{from:n,to:c.to,value:c.value,data:c.data}]});a.push(d)}return a.length===1?a[0]:a.join(",")}}async getCapabilities(t){let e=Array.from(this.activeSessions.values()).find(n=>t.namespaces.eip155?.accounts.some(o=>n.accounts.includes(o)));if(!e)throw new r("session_expired",l.SESSION_EXPIRED);let i=t.namespaces.eip155?.chains??["eip155:1"],s={};try{let n=await e.wallet.provider.request({method:"wallet_getCapabilities",params:[]});for(let o of i){let a=n[o]??{};s[o]={atomicBatch:a.atomicBatch?{supported:!0,maxBatchSize:5}:{supported:!1},paymasterService:a.paymasterService?{supported:!0}:void 0}}}catch{for(let n of i)s[n]={atomicBatch:{supported:!0,maxBatchSize:5}}}return s}async getCallsStatus(t,e){try{let i=this.activeSessions.get(t.id);if(!i?.wallet.provider?.request)throw new Error("no provider");return await i.wallet.provider.request({method:"wallet_getCallsStatus",params:[e]})}catch{return{status:"PENDING"}}}async request(t){let e=this.activeSessions.values().next().value;if(!e)throw new r("session_expired",l.SESSION_EXPIRED);return e.wallet.provider.request({method:t.method,params:t.params})}async getBalance(t){let e=this.activeSessions.values().next().value;if(!e)throw new r("session_expired",l.SESSION_EXPIRED);let i=e.accounts;if(i.length===0)throw new r("method_not_allowed",l.NO_ACCOUNTS);let s=i[0].split(":").pop();return await e.wallet.provider.request({method:"eth_getBalance",params:[s,"latest"]})}onUpdate(t){return this.listeners.add(t),()=>this.listeners.delete(t)}notifyListeners(){let t=this.getDiscoveredWallets();this.listeners.forEach(e=>e(t))}getWalletByRDNS(t){return this.getDiscoveredWallets().find(e=>e.rdns===t)}clear(){for(let t of this.storedEventHandlers.values())t.wallet.provider.removeListener("accountsChanged",t.accountsHandler),t.wallet.provider.removeListener("chainChanged",t.chainHandler);this.storedEventHandlers.clear(),this.discoveredWallets.clear(),this.activeSessions.clear(),this.notifyListeners()}},I=new v;function L(){return new v}function j(h){return I.getWalletByRDNS(h)?.provider??null}function B(h){return typeof window>"u"?!1:I.getWalletByRDNS(h)!==void 0}export{v as EIP6963Connector,L as createEIP6963Connector,I as eip6963Connector,j as getEIP6963Provider,C as isCoinbaseWalletInstalled,P as isMetaMaskInstalled,B as isWalletInstalled};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/chain.ts","../src/discovery.ts","../src/utils.ts"],"sourcesContent":["import type {\n BatchCall,\n ConnectorSupport,\n UniversalConnector,\n UniversalWalletSession,\n WalletCapabilities,\n} from \"@naculus/connect-core\";\nimport {\n CONNECTOR_ERROR_MESSAGES,\n createEmptySession,\n detectPlatform,\n extractAccountsFromPermissions,\n getPermissions,\n hasPermission,\n requestPermissions,\n WalletError,\n} from \"@naculus/connect-core\";\nimport { CHAIN_METADATA } from \"./chain\";\nimport {\n EIP6963_ANNOUNCE_EVENT,\n EIP6963_REQUEST_EVENT,\n isCoinbaseWalletInstalled,\n isMetaMaskInstalled,\n} from \"./discovery\";\nimport type {\n DiscoveredWallet,\n EIP6963ProviderInfo,\n EIP6963Session,\n Eip6963EthereumProvider,\n} from \"./types\";\nimport { toHexValue } from \"./utils\";\n\nexport { isCoinbaseWalletInstalled, isMetaMaskInstalled } from \"./discovery\";\nexport {\n DiscoveredWallet,\n EIP6963Provider,\n EIP6963ProviderInfo,\n EIP6963Session,\n Eip6963EthereumProvider,\n} from \"./types\";\n\ninterface StoredEventHandler {\n wallet: DiscoveredWallet;\n accountsHandler: (...args: unknown[]) => void;\n chainHandler: (...args: unknown[]) => void;\n}\n\nconst SUPPORT: ConnectorSupport = {\n desktop: true,\n mobile: true,\n deepLink: true,\n qr: false,\n trustedReconnect: true,\n};\n\nclass EIP6963ConnectorImpl implements UniversalConnector {\n readonly id = \"eip6963\";\n readonly name = \"EIP-6963 Injected Wallets\";\n readonly kind = \"eip6963\" as const;\n readonly namespaces = [\"eip155\"];\n readonly supports = SUPPORT;\n\n private discoveredWallets: Map<string, DiscoveredWallet> = new Map();\n private listeners: Set<(wallets: DiscoveredWallet[]) => void> = new Set();\n private announceHandler: ((...args: unknown[]) => void) | null = null;\n private activeSessions: Map<string, EIP6963Session> = new Map();\n private storedEventHandlers: Map<string, StoredEventHandler> = new Map();\n\n startDiscovery(): void {\n if (typeof window === \"undefined\") return;\n\n const handler: (...args: unknown[]) => void = (event: unknown) => {\n if (!event || typeof event !== \"object\") return;\n const e = event as Record<string, unknown>;\n const detail = e.detail as\n | { info?: EIP6963ProviderInfo; provider?: Eip6963EthereumProvider }\n | undefined;\n if (detail?.info && detail?.provider) {\n this.handleAnnouncement(detail.info, detail.provider);\n }\n };\n\n this.announceHandler = handler;\n window.addEventListener(EIP6963_ANNOUNCE_EVENT, handler);\n\n window.dispatchEvent(new Event(EIP6963_REQUEST_EVENT));\n }\n\n stopDiscovery(): void {\n if (typeof window === \"undefined\" || !this.announceHandler) return;\n\n window.removeEventListener(EIP6963_ANNOUNCE_EVENT, this.announceHandler);\n this.announceHandler = null;\n }\n\n private handleAnnouncement(\n info: EIP6963ProviderInfo,\n provider: Eip6963EthereumProvider,\n ): void {\n if (this.discoveredWallets.has(info.uuid)) return;\n\n const wallet: DiscoveredWallet = {\n id: info.uuid,\n name: info.name,\n icon: info.icon,\n rdns: info.rdns,\n provider,\n };\n\n this.discoveredWallets.set(info.uuid, wallet);\n this.notifyListeners();\n }\n\n getDiscoveredWallets(): DiscoveredWallet[] {\n return Array.from(this.discoveredWallets.values());\n }\n\n async connect(input?: unknown): Promise<UniversalWalletSession> {\n let wallet: DiscoveredWallet | undefined;\n\n if (!input) {\n const wallets = this.getDiscoveredWallets();\n if (wallets.length === 0) {\n throw new WalletError(\n \"wallet_unavailable\",\n \"No wallets discovered. Please call startDiscovery() to find available wallets.\",\n );\n }\n wallet = wallets[0];\n } else if (typeof input === \"string\") {\n wallet = this.getWalletByRDNS(input);\n if (!wallet) {\n throw new WalletError(\n \"wallet_unavailable\",\n `Wallet \"${input}\" not found. Please check the wallet RDNS.`,\n );\n }\n } else if (typeof input === \"object\" && \"provider\" in input) {\n wallet = input as DiscoveredWallet;\n } else if (typeof input === \"object\") {\n wallet = this.getDiscoveredWallets()[0];\n }\n\n if (!wallet) {\n throw new WalletError(\"wallet_unavailable\", \"No wallet available.\");\n }\n\n const chainIdInput =\n typeof input === \"object\" && input !== null\n ? (input as Record<string, unknown>)\n : undefined;\n const chainId =\n chainIdInput && typeof chainIdInput.chainId === \"string\"\n ? chainIdInput.chainId\n : undefined;\n\n let accounts: string[];\n\n const existingPermissions = await getPermissions(wallet.provider);\n if (hasPermission(existingPermissions ?? [], \"eth_accounts\")) {\n accounts = extractAccountsFromPermissions(existingPermissions ?? []);\n if (accounts.length === 0) {\n accounts = (await wallet.provider.request({\n method: \"eth_requestAccounts\",\n params: chainId ? [{ chainId }] : [],\n })) as string[];\n }\n } else {\n try {\n await requestPermissions(wallet.provider);\n accounts = (await wallet.provider.request({\n method: \"eth_requestAccounts\",\n params: chainId ? [{ chainId }] : [],\n })) as string[];\n } catch {\n accounts = (await wallet.provider.request({\n method: \"eth_requestAccounts\",\n params: chainId ? [{ chainId }] : [],\n })) as string[];\n }\n }\n\n const eip155Accounts = accounts.map((acc) => `eip155:${acc}`);\n const chains = chainId ? [`eip155:${chainId}`] : [\"eip155:1\"];\n const methods = [\n \"eth_requestAccounts\",\n \"eth_sendTransaction\",\n \"personal_sign\",\n \"eth_signTypedData_v4\",\n ];\n const events = [\"accountsChanged\", \"chainChanged\"];\n\n const session = createEmptySession({\n id: `eip6963-${wallet.id}-${Date.now()}`,\n walletId: wallet.id,\n walletType: \"eip6963\",\n namespaces: {\n eip155: {\n chains,\n accounts: eip155Accounts,\n methods,\n events,\n capabilities: {\n atomicBatch: { supported: false },\n permissions: true,\n serverSigning: false,\n },\n },\n },\n platform: detectPlatform(),\n });\n\n const eip6963Session: EIP6963Session = {\n wallet,\n accounts: eip155Accounts,\n chains,\n methods,\n events,\n };\n\n this.activeSessions.set(wallet.id, eip6963Session);\n\n this.setupEventListeners(wallet, session);\n this.setupPermissionsListener(wallet);\n\n return session;\n }\n\n async reconnect(\n session: UniversalWalletSession,\n ): Promise<UniversalWalletSession> {\n const wallet = Array.from(this.discoveredWallets.values()).find(\n (w) => w.id === session.walletId,\n );\n\n if (!wallet) {\n throw new WalletError(\n \"session_expired\",\n \"EIP-6963 wallet not found. Please reconnect.\",\n );\n }\n\n // Verify wallet is still accessible\n const accounts = (await wallet.provider.request({\n method: \"eth_accounts\",\n })) as string[];\n\n if (!accounts || accounts.length === 0) {\n throw new WalletError(\n \"session_expired\",\n \"No accounts found. Please reconnect.\",\n );\n }\n\n // Remove old event listeners if any, then setup fresh ones\n this.removeEventListeners(wallet);\n\n // Update session accounts from live provider\n const eip155Accounts = accounts.map((acc: string) => `eip155:${acc}`);\n const ns = session.namespaces.eip155;\n if (ns) {\n ns.accounts = eip155Accounts;\n }\n\n this.setupEventListeners(wallet, session);\n\n const eip6963Session: EIP6963Session = {\n wallet,\n accounts: eip155Accounts,\n chains: ns?.chains ?? [],\n methods: ns?.methods ?? [],\n events: ns?.events ?? [],\n };\n this.activeSessions.set(wallet.id, eip6963Session);\n\n return session;\n }\n\n private setupEventListeners(\n wallet: DiscoveredWallet,\n session: UniversalWalletSession,\n ): void {\n const accountsHandler = (...args: unknown[]) => {\n const accounts = args[0] as string[];\n if (accounts.length === 0) {\n this.handleDisconnect(session);\n }\n };\n\n const chainHandler = (...args: unknown[]) => {\n const chainId = args[0] as string;\n const ns = session.namespaces[\"eip155\"];\n if (ns) {\n ns.chains = [chainId];\n }\n };\n\n wallet.provider.on(\"accountsChanged\", accountsHandler);\n wallet.provider.on(\"chainChanged\", chainHandler);\n\n this.storedEventHandlers.set(wallet.id, {\n wallet,\n accountsHandler,\n chainHandler,\n });\n }\n\n private setupPermissionsListener(wallet: DiscoveredWallet): void {\n const permissionsHandler = async () => {\n const permissions = await getPermissions(wallet.provider);\n if (!hasPermission(permissions ?? [], \"eth_accounts\")) {\n this.activeSessions.delete(wallet.id);\n }\n };\n wallet.provider.on(\"permissionsChanged\", permissionsHandler);\n }\n\n private handleDisconnect(session: UniversalWalletSession): void {\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n session.namespaces.eip155?.accounts.some((acc) =>\n s.accounts.includes(acc),\n ),\n );\n\n if (eip6963Session) {\n this.removeEventListeners(eip6963Session.wallet);\n this.activeSessions.delete(eip6963Session.wallet.id);\n }\n }\n\n private removeEventListeners(wallet: DiscoveredWallet): void {\n const handlers = this.storedEventHandlers.get(wallet.id);\n if (handlers) {\n wallet.provider.removeListener(\n \"accountsChanged\",\n handlers.accountsHandler,\n );\n wallet.provider.removeListener(\"chainChanged\", handlers.chainHandler);\n this.storedEventHandlers.delete(wallet.id);\n }\n }\n\n async disconnect(session: UniversalWalletSession): Promise<void> {\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n session.namespaces.eip155?.accounts.some((acc) =>\n s.accounts.includes(acc),\n ),\n );\n\n if (eip6963Session) {\n this.removeEventListeners(eip6963Session.wallet);\n this.activeSessions.delete(eip6963Session.wallet.id);\n }\n\n if (session.id && session.id.startsWith(\"eip6963-\")) {\n const walletId = session.id.replace(\"eip6963-\", \"\");\n this.activeSessions.delete(walletId);\n this.storedEventHandlers.delete(walletId);\n }\n }\n\n async getAccounts(session: UniversalWalletSession): Promise<string[]> {\n const accounts = session.namespaces.eip155?.accounts ?? [];\n return accounts;\n }\n\n async signMessage(\n session: UniversalWalletSession,\n input: unknown,\n ): Promise<unknown> {\n if (!input || typeof input !== \"object\")\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.INVALID_INPUT,\n );\n const inputObj = input as Record<string, unknown>;\n const rawMessage =\n typeof inputObj.message === \"string\" ? inputObj.message : undefined;\n const rawAddress =\n typeof inputObj.address === \"string\"\n ? inputObj.address\n : typeof inputObj.account === \"string\"\n ? inputObj.account\n : undefined;\n if (!rawMessage)\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.MISSING_MESSAGE,\n );\n const accounts = session.namespaces.eip155?.accounts ?? [];\n\n // Strip CAIP-10 prefix if present, fall back to session's first account\n const targetAccount = rawAddress?.includes(\":\")\n ? rawAddress.split(\":\").pop()!\n : (rawAddress ?? accounts[0]?.split(\":\").pop());\n if (!targetAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_SIGNING,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n // Hex-encode the message for personal_sign\n const hexMessage =\n rawMessage.startsWith(\"0x\") && /^0x[0-9a-fA-F]*$/.test(rawMessage)\n ? rawMessage\n : \"0x\" +\n Array.from(new TextEncoder().encode(rawMessage))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n const result = await eip6963Session.wallet.provider.request({\n method: \"personal_sign\",\n params: [hexMessage, targetAccount],\n });\n\n return result;\n }\n\n async signTransaction(\n session: UniversalWalletSession,\n input: unknown,\n ): Promise<unknown> {\n if (!input || typeof input !== \"object\" || !(\"transaction\" in input))\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.MISSING_TX,\n );\n const inputObj = input as Record<string, unknown>;\n const transaction = inputObj.transaction as\n | { serialized?: number[] }\n | undefined;\n if (!transaction?.serialized || !Array.isArray(transaction.serialized))\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.INVALID_INPUT,\n );\n const accounts = session.namespaces.eip155?.accounts ?? [];\n\n const fromAccount = accounts[0]?.split(\":\").pop();\n if (!fromAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_SIGNING,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n const txData = new Uint8Array(transaction.serialized).reduce(\n (str, byte) => str + byte.toString(16).padStart(2, \"0\"),\n \"\",\n );\n\n const result = await eip6963Session.wallet.provider.request({\n method: \"eth_sendTransaction\",\n params: [\n {\n from: fromAccount,\n data: `0x${txData}`,\n },\n ],\n });\n\n return result;\n }\n\n async sendTransaction(\n session: UniversalWalletSession,\n input: unknown,\n ): Promise<unknown> {\n if (input == null) throw new WalletError(\"invalid_input\", \"Invalid input\");\n if (!input || typeof input !== \"object\" || !(\"transaction\" in input))\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.MISSING_TX,\n );\n const inputObj = input as Record<string, unknown>;\n const transactionRaw = inputObj.transaction;\n const transaction =\n transactionRaw && typeof transactionRaw === \"object\"\n ? (transactionRaw as Record<string, unknown>)\n : {};\n const accounts = session.namespaces.eip155?.accounts ?? [];\n\n const fromAccount =\n typeof transaction.from === \"string\"\n ? transaction.from\n : accounts[0]?.split(\":\").pop();\n if (!fromAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_TX,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n const result = await eip6963Session.wallet.provider.request({\n method: \"eth_sendTransaction\",\n params: [\n {\n from: fromAccount,\n to: typeof transaction.to === \"string\" ? transaction.to : undefined,\n value:\n typeof transaction.value === \"string\"\n ? toHexValue(transaction.value)\n : undefined,\n data:\n typeof transaction.data === \"string\" ? transaction.data : undefined,\n },\n ],\n });\n\n return result;\n }\n\n async switchChain(\n session: UniversalWalletSession,\n chainId: string,\n ): Promise<void> {\n const accounts = session.namespaces.eip155?.accounts ?? [];\n if (accounts.length === 0) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNTS,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n // Convert CAIP-10 chainId (e.g. \"eip155:137\") to hex format (e.g. \"0x89\")\n // as required by wallet_switchEthereumChain\n const hexChainId = chainId.startsWith(\"eip155:\")\n ? `0x${parseInt(chainId.split(\":\")[1], 10).toString(16)}`\n : chainId;\n\n try {\n await eip6963Session.wallet.provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: hexChainId }],\n });\n } catch (error: unknown) {\n // Error code 4902 = chain not recognized by wallet, add it first\n const rpcError = error as { code?: number; message?: string } | undefined;\n if (rpcError?.code === 4902) {\n const chainParams = CHAIN_METADATA[hexChainId];\n if (!chainParams) {\n throw new WalletError(\n \"chain_unsupported\",\n `Chain ${hexChainId} is not recognized. No metadata available to add it.`,\n );\n }\n await eip6963Session.wallet.provider.request({\n method: \"wallet_addEthereumChain\",\n params: [chainParams],\n });\n // Retry switch after adding the chain\n await eip6963Session.wallet.provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: hexChainId }],\n });\n } else {\n throw new WalletError(\n \"chain_unsupported\",\n `Failed to switch chain: ${rpcError?.message ?? String(error)}`,\n );\n }\n }\n\n const currentChains = session.namespaces.eip155?.chains ?? [];\n if (!currentChains.includes(chainId)) {\n const newChains = [\n ...currentChains.filter((c) => c.startsWith(\"eip155:\")),\n chainId,\n ];\n session.namespaces.eip155!.chains = newChains;\n }\n }\n\n async sendCalls(\n session: UniversalWalletSession,\n calls: BatchCall[],\n chainId?: string,\n ): Promise<string> {\n if (calls == null) throw new WalletError(\"invalid_input\", \"Invalid input\");\n const accounts = session.namespaces.eip155?.accounts ?? [];\n const fromAccount = accounts[0]?.split(\":\").pop();\n if (!fromAccount) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNT_TX,\n );\n }\n\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n s.accounts.some((acc) => accounts.includes(acc)),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n try {\n const chainIdParam = chainId\n ? { chainId: `0x${parseInt(chainId.split(\":\")[1], 10).toString(16)}` }\n : {};\n const result = await eip6963Session.wallet.provider.request({\n method: \"wallet_sendCalls\",\n params: [\n {\n from: fromAccount,\n calls: calls.map((c) => ({\n to: c.to,\n value: c.value,\n data: c.data,\n })),\n ...chainIdParam,\n },\n ],\n });\n return result as string;\n } catch {\n const txHashes: string[] = [];\n for (const call of calls) {\n const hash = await eip6963Session.wallet.provider.request({\n method: \"eth_sendTransaction\",\n params: [\n {\n from: fromAccount,\n to: call.to,\n value: call.value,\n data: call.data,\n },\n ],\n });\n txHashes.push(hash as string);\n }\n return txHashes.length === 1 ? txHashes[0] : txHashes.join(\",\");\n }\n }\n\n async getCapabilities(\n session: UniversalWalletSession,\n ): Promise<Record<string, WalletCapabilities>> {\n const eip6963Session = Array.from(this.activeSessions.values()).find((s) =>\n session.namespaces.eip155?.accounts.some((acc) =>\n s.accounts.includes(acc),\n ),\n );\n\n if (!eip6963Session) {\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n }\n\n const chains = session.namespaces.eip155?.chains ?? [\"eip155:1\"];\n const capabilities: Record<string, WalletCapabilities> = {};\n\n try {\n const result = (await eip6963Session.wallet.provider.request({\n method: \"wallet_getCapabilities\",\n params: [],\n })) as Record<string, Record<string, unknown>>;\n\n for (const chain of chains) {\n const caps = result[chain] ?? {};\n capabilities[chain] = {\n atomicBatch: caps.atomicBatch\n ? { supported: true, maxBatchSize: 5 }\n : { supported: false },\n paymasterService: caps.paymasterService\n ? { supported: true }\n : undefined,\n };\n }\n } catch {\n for (const chain of chains) {\n capabilities[chain] = {\n atomicBatch: { supported: true, maxBatchSize: 5 },\n };\n }\n }\n\n return capabilities;\n }\n\n async getCallsStatus(\n session: UniversalWalletSession,\n bundleHash: string,\n ): Promise<import(\"@naculus/connect-core\").CallsStatus> {\n try {\n const wallet = this.activeSessions.get(session.id);\n if (!wallet?.wallet.provider?.request) throw new Error(\"no provider\");\n return (await wallet.wallet.provider.request({\n method: \"wallet_getCallsStatus\",\n params: [bundleHash],\n })) as import(\"@naculus/connect-core\").CallsStatus;\n } catch {\n return { status: \"PENDING\" };\n }\n }\n\n async request(request: {\n method: string;\n params: unknown[];\n }): Promise<unknown> {\n const session = this.activeSessions.values().next().value;\n if (!session)\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n return session.wallet.provider.request({\n method: request.method,\n params: request.params,\n });\n }\n\n async getBalance(chainId?: string): Promise<string> {\n const session = this.activeSessions.values().next().value;\n if (!session)\n throw new WalletError(\n \"session_expired\",\n CONNECTOR_ERROR_MESSAGES.SESSION_EXPIRED,\n );\n const accounts = session.accounts;\n if (accounts.length === 0)\n throw new WalletError(\n \"method_not_allowed\",\n CONNECTOR_ERROR_MESSAGES.NO_ACCOUNTS,\n );\n const address = accounts[0].split(\":\").pop()!;\n const provider = session.wallet.provider;\n const balance = (await provider.request({\n method: \"eth_getBalance\",\n params: [address, \"latest\"],\n })) as string;\n return balance;\n }\n\n onUpdate(callback: (wallets: DiscoveredWallet[]) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n private notifyListeners(): void {\n const wallets = this.getDiscoveredWallets();\n this.listeners.forEach((cb) => cb(wallets));\n }\n\n getWalletByRDNS(rdns: string): DiscoveredWallet | undefined {\n return this.getDiscoveredWallets().find((w) => w.rdns === rdns);\n }\n\n clear(): void {\n for (const handlers of this.storedEventHandlers.values()) {\n handlers.wallet.provider.removeListener(\n \"accountsChanged\",\n handlers.accountsHandler,\n );\n handlers.wallet.provider.removeListener(\n \"chainChanged\",\n handlers.chainHandler,\n );\n }\n this.storedEventHandlers.clear();\n this.discoveredWallets.clear();\n this.activeSessions.clear();\n this.notifyListeners();\n }\n}\n\nexport const eip6963Connector = new EIP6963ConnectorImpl();\n\nexport type { EIP6963ConnectorImpl as EIP6963ConnectorClass };\nexport { EIP6963ConnectorImpl as EIP6963Connector };\n\nexport function createEIP6963Connector(): EIP6963ConnectorImpl {\n return new EIP6963ConnectorImpl();\n}\n\nexport function getEIP6963Provider(\n rdns: string,\n): Eip6963EthereumProvider | null {\n const wallet = eip6963Connector.getWalletByRDNS(rdns);\n return wallet?.provider ?? null;\n}\n\nexport function isWalletInstalled(rdns: string): boolean {\n if (typeof window === \"undefined\") return false;\n return eip6963Connector.getWalletByRDNS(rdns) !== undefined;\n}\n","/**\n * Chain metadata for wallet_addEthereumChain fallback.\n * Maps hex chain IDs to EIP-3085 AddEthereumChainParameter.\n */\nexport const CHAIN_METADATA: Record<\n string,\n {\n chainId: string;\n chainName: string;\n nativeCurrency: { name: string; symbol: string; decimals: number };\n rpcUrls: string[];\n blockExplorerUrls?: string[];\n }\n> = {\n \"0xaa36a7\": {\n chainId: \"0xaa36a7\",\n chainName: \"Sepolia Testnet\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://sepolia.llamarpc.com\"],\n blockExplorerUrls: [\"https://sepolia.etherscan.io\"],\n },\n \"0x89\": {\n chainId: \"0x89\",\n chainName: \"Polygon Mainnet\",\n nativeCurrency: { name: \"POL\", symbol: \"POL\", decimals: 18 },\n rpcUrls: [\"https://polygon-rpc.com\"],\n blockExplorerUrls: [\"https://polygonscan.com\"],\n },\n \"0xa4b1\": {\n chainId: \"0xa4b1\",\n chainName: \"Arbitrum One\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://arb1.arbitrum.io/rpc\"],\n blockExplorerUrls: [\"https://arbiscan.io\"],\n },\n \"0xa\": {\n chainId: \"0xa\",\n chainName: \"Optimism\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://mainnet.optimism.io\"],\n blockExplorerUrls: [\"https://optimistic.etherscan.io\"],\n },\n \"0x2105\": {\n chainId: \"0x2105\",\n chainName: \"Base\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: [\"https://base.llamarpc.com\"],\n blockExplorerUrls: [\"https://basescan.org\"],\n },\n};\n","import type { Eip6963EthereumProvider } from \"./types\";\n\nexport const EIP6963_ANNOUNCE_EVENT = \"eip6963:announceProvider\";\nexport const EIP6963_REQUEST_EVENT = \"eip6963:requestProvider\";\n\nexport function isMetaMaskInstalled(): boolean {\n if (typeof window === \"undefined\") return false;\n return (\n (window as unknown as { ethereum?: { isMetaMask?: boolean } }).ethereum\n ?.isMetaMask ?? false\n );\n}\n\nexport function isCoinbaseWalletInstalled(): boolean {\n if (typeof window === \"undefined\") return false;\n return (\n (window as unknown as { ethereum?: { isCoinbaseWallet?: boolean } })\n .ethereum?.isCoinbaseWallet ?? false\n );\n}\n\ndeclare global {\n interface Window {\n ethereum?: Eip6963EthereumProvider & {\n isMetaMask?: boolean;\n isCoinbaseWallet?: boolean;\n removeListener?: (\n event: string,\n handler: (...args: unknown[]) => void,\n ) => void;\n };\n }\n}\n","export function toHexValue(value: string): string {\n if (value.startsWith(\"0x\")) return value;\n return `0x${BigInt(value).toString(16)}`;\n}\n"],"mappings":"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","names":["CONNECTOR_ERROR_MESSAGES","createEmptySession","detectPlatform","extractAccountsFromPermissions","getPermissions","hasPermission","requestPermissions","WalletError","CHAIN_METADATA","EIP6963_ANNOUNCE_EVENT","EIP6963_REQUEST_EVENT","isMetaMaskInstalled","isCoinbaseWalletInstalled","toHexValue","value","SUPPORT","EIP6963ConnectorImpl","handler","event","detail","EIP6963_ANNOUNCE_EVENT","EIP6963_REQUEST_EVENT","info","provider","wallet","input","WalletError","wallets","chainIdInput","chainId","accounts","existingPermissions","getPermissions","hasPermission","extractAccountsFromPermissions","requestPermissions","eip155Accounts","acc","chains","methods","events","session","createEmptySession","detectPlatform","eip6963Session","w","ns","accountsHandler","args","chainHandler","permissionsHandler","permissions","s","handlers","walletId","CONNECTOR_ERROR_MESSAGES","inputObj","rawMessage","rawAddress","targetAccount","hexMessage","b","transaction","fromAccount","txData","str","byte","transactionRaw","toHexValue","hexChainId","error","rpcError","chainParams","CHAIN_METADATA","currentChains","newChains","calls","chainIdParam","c","txHashes","call","hash","capabilities","result","chain","caps","bundleHash","request","address","callback","cb","rdns","eip6963Connector","createEIP6963Connector","EIP6963ConnectorImpl","getEIP6963Provider","rdns","eip6963Connector","isWalletInstalled"]}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@naculus/connector-evm-injected",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "dependencies": {
17
+ "@naculus/connect-core": "0.1.0"
18
+ },
19
+ "devDependencies": {
20
+ "tsup": "^8.3.6",
21
+ "typescript": "^5.9.3"
22
+ },
23
+ "sideEffects": false,
24
+ "scripts": {
25
+ "build": "tsup",
26
+ "clean": "rm -rf dist"
27
+ }
28
+ }