@antigane/wallet-adapters 0.0.2 → 0.0.4

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/dist/App.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ declare function App(): import("react/jsx-runtime").JSX.Element;
2
+ export default App;
@@ -0,0 +1,7 @@
1
+ import { SignState } from './types/sign';
2
+ type Props = {
3
+ onSigned?: (state: SignState) => void;
4
+ onChange?: (state: SignState | null) => void;
5
+ };
6
+ export declare function ConnectButton({ onSigned, onChange }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,8 @@
1
+ import { SignState } from '../types/sign';
2
+ type Props = {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ onSigned: (state: SignState) => Promise<void> | void;
6
+ };
7
+ export declare const ConnectModal: ({ open, onClose, onSigned }: Props) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,6 @@
1
+ import { default as React } from 'react';
2
+ interface WalletButtonContainerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
3
+ children: React.ReactNode;
4
+ }
5
+ export declare const WalletButtonContainer: ({ children, className, ...props }: WalletButtonContainerProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
package/dist/index.cjs CHANGED
@@ -561,5 +561,5 @@ Missing signature for public key${s.missing.length===1?"":"(s)"} [\`${s.missing.
561
561
  Transaction keys: [${r}].
562
562
  Transaction: ${i}
563
563
  Please ensure the transaction object includes required fields (to, value, chainId, gasLimit or gasPrice, etc.)`)}throw new Error("Unsupported EVM transaction format. Expected hex string, bytes, or transaction object with 'to', 'data', or 'from' fields.")}async function jj(t){if(t?.serialize&&typeof t.serialize=="function"){const e=t.serialize();return{parsed:Fn(e),originalFormat:"sui-sdk"}}if(t instanceof Uint8Array)return{parsed:Fn(t),originalFormat:"bytes"};if(t?.build&&typeof t.build=="function"){const e=await t.build();if(e?.serialize&&typeof e.serialize=="function"){const n=e.serialize();return{parsed:Fn(n),originalFormat:"transaction-block"}}}throw new Error("Unsupported Sui transaction format")}function Hj(t){if(t?.toBuffer&&typeof t.toBuffer=="function"){const e=t.toBuffer();return{parsed:Fn(new Uint8Array(e)),originalFormat:"bitcoinjs-lib"}}if(t instanceof Uint8Array)return{parsed:Fn(t),originalFormat:"bytes"};if(typeof t=="string"){const e=new Uint8Array(Et.Buffer.from(t,"hex"));return{parsed:Fn(e),originalFormat:"hex"}}throw new Error("Unsupported Bitcoin transaction format")}var r_=10080*60*1e3,Af=["google","apple","phantom"],zj=class{constructor(t){this.provider=t,this.currentNetworkId=Sn.SOLANA_MAINNET,this._connected=!1,this._publicKey=null,this.eventEmitter=new _c,this.setupEventListeners(),this.syncInitialState()}get connected(){return this._connected}get publicKey(){return this._publicKey}ensureConnected(){if(!this.provider.isConnected())throw new Error("Solana chain not available. Ensure SDK is connected.")}async signMessage(t){this.ensureConnected();const e=typeof t=="string"?t:new TextDecoder().decode(t),n=await this.provider.signMessage({message:e,networkId:this.currentNetworkId});return{signature:typeof n.signature=="string"?new Uint8Array(Yo.decode(n.signature)):n.signature,publicKey:this._publicKey||""}}async signTransaction(t){this.ensureConnected();const e=await this.provider.signTransaction({transaction:t,networkId:this.currentNetworkId}),n=Fj(e.rawTransaction);if(!n)throw new Error("Failed to parse signed transaction");return n}async signAndSendTransaction(t){this.ensureConnected();const e=await this.provider.signAndSendTransaction({transaction:t,networkId:this.currentNetworkId});if(!e.hash)throw new Error("Transaction not submitted");return{signature:e.hash}}async signAllTransactions(t){return this.ensureConnected(),await Promise.all(t.map(n=>this.signTransaction(n)))}async signAndSendAllTransactions(t){return{signatures:(await Promise.all(t.map(n=>this.signAndSendTransaction(n)))).map(n=>n.signature)}}connect(t){if(!this.provider.isConnected())throw new Error("Provider not connected. Call provider connect first.");const n=this.provider.getAddresses().find(r=>r.addressType==="Solana");if(!n)throw new Error("No Solana address found");return this.updateConnectionState(!0,n.address),Promise.resolve({publicKey:n.address})}async disconnect(){return this.provider.disconnect()}switchNetwork(t){return this.currentNetworkId=t==="mainnet"?Sn.SOLANA_MAINNET:Sn.SOLANA_DEVNET,Promise.resolve()}getPublicKey(){if(!this.provider.isConnected())return Promise.resolve(null);const e=this.provider.getAddresses().find(n=>n.addressType==="Solana");return Promise.resolve(e?.address||null)}isConnected(){return this._connected&&this.provider.isConnected()}setupEventListeners(){this.provider.on("connect",t=>{const e=t.addresses?.find(n=>n.addressType==="Solana");e&&(this.updateConnectionState(!0,e.address),this.eventEmitter.emit("connect",e.address))}),this.provider.on("disconnect",()=>{this.updateConnectionState(!1,null),this.eventEmitter.emit("disconnect")})}syncInitialState(){if(this.provider.isConnected()){const e=this.provider.getAddresses().find(n=>n.addressType==="Solana");e&&this.updateConnectionState(!0,e.address)}}updateConnectionState(t,e){this._connected=t,this._publicKey=e}on(t,e){this.eventEmitter.on(t,e)}off(t,e){this.eventEmitter.off(t,e)}},qj=class{constructor(t){this.provider=t,this.currentNetworkId=Sn.ETHEREUM_MAINNET,this._connected=!1,this._accounts=[],this.eventEmitter=new _c,this.setupEventListeners(),this.syncInitialState()}get connected(){return this._connected}get chainId(){return`0x${(Tp(this.currentNetworkId)||1).toString(16)}`}get accounts(){return this._accounts}ensureConnected(){if(!this.provider.isConnected())throw new Error("Ethereum chain not available. Ensure SDK is connected.")}async request(t){return this.ensureConnected(),this.handleEmbeddedRequest(t)}connect(){if(!this.provider.isConnected())throw new Error("Provider not connected. Call provider connect first.");const e=this.provider.getAddresses().filter(n=>n.addressType==="Ethereum").map(n=>n.address);return this.updateConnectionState(!0,e),Promise.resolve(e)}async disconnect(){await this.provider.disconnect()}async signPersonalMessage(t,e){return await this.request({method:"personal_sign",params:[t,e]})}async signTypedData(t,e){return await this.request({method:"eth_signTypedData_v4",params:[e,JSON.stringify(t)]})}async signTransaction(t){let e=this.currentNetworkId;if(t.chainId){const r=typeof t.chainId=="number"?t.chainId:parseInt(t.chainId,16),i=Fu(r);i&&(e=i)}return(await this.provider.signTransaction({transaction:t,networkId:e})).rawTransaction}async sendTransaction(t){if(t.chainId){const n=typeof t.chainId=="number"?t.chainId:parseInt(t.chainId,16);await this.switchChain(n)}const e=await this.provider.signAndSendTransaction({transaction:t,networkId:this.currentNetworkId});if(!e.hash)throw new Error("Transaction not submitted");return e.hash}switchChain(t){const e=typeof t=="string"?t.toLowerCase().startsWith("0x")?parseInt(t,16):parseInt(t,10):t,n=Fu(e);if(!n)throw new Error(`Unsupported chainId: ${t}`);return this.currentNetworkId=n,this.eventEmitter.emit("chainChanged",`0x${e.toString(16)}`),Promise.resolve()}getChainId(){const t=Tp(this.currentNetworkId);return Promise.resolve(t||1)}async getAccounts(){return this.request({method:"eth_accounts"})}isConnected(){return this._connected&&this.provider.isConnected()}setupEventListeners(){this.provider.on("connect",t=>{const e=t.addresses?.filter(n=>n.addressType==="Ethereum")?.map(n=>n.address)||[];e.length>0&&(this.updateConnectionState(!0,e),this.eventEmitter.emit("connect",{chainId:this.chainId}),this.eventEmitter.emit("accountsChanged",e))}),this.provider.on("disconnect",()=>{this.updateConnectionState(!1,[]),this.eventEmitter.emit("disconnect",{code:4900,message:"Provider disconnected"}),this.eventEmitter.emit("accountsChanged",[])})}syncInitialState(){if(this.provider.isConnected()){const e=this.provider.getAddresses().filter(n=>n.addressType==="Ethereum").map(n=>n.address);e.length>0&&this.updateConnectionState(!0,e)}}updateConnectionState(t,e){this._connected=t,this._accounts=e}async handleEmbeddedRequest(t){switch(t.method){case"personal_sign":{const[e,n]=t.params;return(await this.provider.signEthereumMessage({message:e,networkId:this.currentNetworkId})).signature}case"eth_signTypedData_v4":{const[e,n]=t.params,r=JSON.parse(n);return(await this.provider.signTypedDataV4({typedData:r,networkId:this.currentNetworkId})).signature}case"eth_signTransaction":{const[e]=t.params,n=e.chainId?Fu(typeof e.chainId=="number"?e.chainId:parseInt(e.chainId,16)):null;return(await this.provider.signTransaction({transaction:e,networkId:n||this.currentNetworkId})).rawTransaction}case"eth_sendTransaction":{const[e]=t.params,n=e.chainId?Fu(typeof e.chainId=="number"?e.chainId:parseInt(e.chainId,16)):null;return(await this.provider.signAndSendTransaction({transaction:e,networkId:n||this.currentNetworkId})).hash}case"eth_accounts":{const n=this.provider.getAddresses().find(r=>r.addressType==="Ethereum");return n?[n.address]:[]}case"eth_chainId":return`0x${(Tp(this.currentNetworkId)||1).toString(16)}`;case"wallet_switchEthereumChain":{const[{chainId:e}]=t.params,n=parseInt(e,16);await this.switchChain(n);return}default:throw new Error(`Embedded provider doesn't support method: ${t.method}`)}}on(t,e){this.eventEmitter.on(t,e)}off(t,e){this.eventEmitter.off(t,e)}};async function Wj(t,e,n,r=3,i=1e3){let s;for(let o=1;o<=r;o++)try{return n.log("EMBEDDED_PROVIDER",`Attempting ${e}`,{attempt:o,maxRetries:r}),await t()}catch(a){if(s=a,n.warn("EMBEDDED_PROVIDER",`${e} failed`,{attempt:o,maxRetries:r,error:a instanceof Error?a.message:String(a)}),o===r){n.error("EMBEDDED_PROVIDER",`${e} failed after ${r} attempts`,{finalError:a instanceof Error?a.message:String(a)});break}const c=i*Math.pow(2,o-1);n.log("EMBEDDED_PROVIDER",`Retrying ${e} in ${c}ms`,{attempt:o+1,delay:c}),await new Promise(l=>setTimeout(l,c))}throw s}function t0(){return"session_"+Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)+"_"+Date.now()}var Gj=class{constructor(e,n,r){if(this.client=null,this.walletId=null,this.addresses=[],this.eventListeners=new Map,this.logger=r,this.logger.log("EMBEDDED_PROVIDER","Initializing EmbeddedProvider",{config:e}),e.embeddedWalletType==="app-wallet")throw new Error("app-wallet type is not currently supported. Please use 'user-wallet' instead.");this.config=e,this.platform=n,this.storage=n.storage,this.authProvider=n.authProvider,this.phantomAppProvider=n.phantomAppProvider,this.urlParamsAccessor=n.urlParamsAccessor,this.stamper=n.stamper,this.solana=new zj(this),this.ethereum=new qj(this),this.logger.info("EMBEDDED_PROVIDER","EmbeddedProvider initialized")}on(e,n){this.eventListeners.has(e)||this.eventListeners.set(e,new Set),this.eventListeners.get(e).add(n),this.logger.log("EMBEDDED_PROVIDER","Event listener added",{event:e})}off(e,n){const r=this.eventListeners.get(e);r&&(r.delete(n),this.logger.log("EMBEDDED_PROVIDER","Event listener removed",{event:e}))}emit(e,n){const r=this.eventListeners.get(e);r&&r.size>0&&(this.logger.log("EMBEDDED_PROVIDER","Emitting event",{event:e,listenerCount:r.size,data:n}),r.forEach(i=>{try{i(n)}catch(s){this.logger.error("EMBEDDED_PROVIDER","Event callback error",{event:e,error:s})}}))}getAddressForNetwork(e){const n=e.split(":")[0].toLowerCase();let r;switch(n){case"solana":r=yt.solana;break;case"eip155":r=yt.ethereum;break;case"bitcoin":case"btc":r=yt.bitcoinSegwit;break;case"sui":r=yt.sui;break;default:r=yt.ethereum;break}return this.addresses.find(s=>s.addressType.toLowerCase()===r.toLowerCase())?.address}async getAndFilterWalletAddresses(e){const r=(await this.storage.getSession())?.accountDerivationIndex??0;return(await Wj(()=>this.client.getWalletAddresses(e,void 0,r),"getWalletAddresses",this.logger).catch(async s=>{throw this.logger.error("EMBEDDED_PROVIDER","getWalletAddresses failed after retries, disconnecting",{walletId:e,error:s.message,derivationIndex:r}),await this.storage.clearSession(),this.client=null,this.walletId=null,this.addresses=[],s})).filter(s=>this.config.addressTypes.some(o=>o===s.addressType))}async validateAndCleanSession(e){if(!e)return null;if(this.logger.log("EMBEDDED_PROVIDER","Found existing session, validating",{sessionId:e.sessionId,status:e.status,walletId:e.walletId}),e.status!=="completed"){const n=this.urlParamsAccessor.getParam("session_id");if(e.status==="pending"&&!n)return this.logger.warn("EMBEDDED_PROVIDER","Session mismatch detected - pending session without redirect context",{sessionId:e.sessionId,status:e.status}),await this.storage.clearSession(),null;if(n&&n!==e.sessionId)return this.logger.warn("EMBEDDED_PROVIDER","Session ID mismatch detected",{storedSessionId:e.sessionId,urlSessionId:n}),await this.storage.clearSession(),null}return e.status==="completed"&&!this.isSessionValid(e)?(this.logger.warn("EMBEDDED_PROVIDER","Session invalid due to authenticator expiration, will regenerate keypair",{sessionId:e.sessionId,authenticatorExpiresAt:e.authenticatorExpiresAt,currentTime:Date.now(),expired:e.authenticatorExpiresAt<Date.now()}),await this.storage.clearSession(),null):e}async tryExistingConnection(e){this.logger.log("EMBEDDED_PROVIDER","Getting existing session");let n=await this.storage.getSession();if(n=await this.validateAndCleanSession(n),!n)return this.logger.log("EMBEDDED_PROVIDER","No existing session found"),null;if(n.status==="completed"){this.logger.info("EMBEDDED_PROVIDER","Using existing completed session",{sessionId:n.sessionId,walletId:n.walletId}),await this.initializeClientFromSession(n),n.lastUsed=Date.now(),await this.storage.saveSession(n),this.logger.info("EMBEDDED_PROVIDER","Connection from existing session successful",{walletId:this.walletId,addressCount:this.addresses.length}),await this.ensureValidAuthenticator();const r={walletId:this.walletId,addresses:this.addresses,status:"completed",authUserId:n.authUserId,authProvider:n.authProvider};return this.emit("connect",{...r,source:"existing-session"}),r}if(this.logger.log("EMBEDDED_PROVIDER","No completed session found, checking for redirect resume"),this.authProvider.resumeAuthFromRedirect){const r=this.authProvider.resumeAuthFromRedirect(n.authProvider);if(r){this.logger.info("EMBEDDED_PROVIDER","Resuming from redirect",{walletId:r.walletId,provider:r.provider});try{return await this.completeAuthConnection(r)}catch(i){if(i instanceof Error&&i.message.includes("No session found after redirect")&&!e)return this.logger.warn("EMBEDDED_PROVIDER","Session missing during redirect resume - will start fresh auth flow",{error:i.message,walletId:r.walletId}),await this.storage.clearSession(),null;throw i}}}return null}validateAuthOptions(e){if(!Af.includes(e.provider))throw new Error(`Invalid auth provider: ${e.provider}. Must be ${Af.join(", ")}`)}isSessionValid(e){return e?!e.walletId||!e.organizationId||!e.stamperInfo?(this.logger.log("EMBEDDED_PROVIDER","Session missing required fields",{hasWalletId:!!e.walletId,hasOrganizationId:!!e.organizationId,hasStamperInfo:!!e.stamperInfo}),!1):e.status!=="completed"?(this.logger.log("EMBEDDED_PROVIDER","Session not completed",{status:e.status}),!1):e.authenticatorExpiresAt?Date.now()>=e.authenticatorExpiresAt?(this.logger.log("EMBEDDED_PROVIDER","Authenticator expired, session invalid",{authenticatorExpiresAt:new Date(e.authenticatorExpiresAt).toISOString(),now:new Date().toISOString()}),!1):(this.logger.log("EMBEDDED_PROVIDER","Session is valid",{sessionId:e.sessionId,walletId:e.walletId,authenticatorExpires:new Date(e.authenticatorExpiresAt).toISOString()}),!0):(this.logger.log("EMBEDDED_PROVIDER","Session invalid - missing authenticator timing",{sessionId:e.sessionId}),!1):!1}async autoConnect(){try{this.logger.log("EMBEDDED_PROVIDER","Starting auto-connect attempt"),this.emit("connect_start",{source:"auto-connect"});const e=await this.tryExistingConnection(!0);if(e){this.logger.info("EMBEDDED_PROVIDER","Auto-connect successful",{walletId:e.walletId,addressCount:e.addresses.length}),this.emit("connect",{...e,source:"auto-connect"});return}this.logger.log("EMBEDDED_PROVIDER","Auto-connect failed: no valid session found"),this.emit("connect_error",{error:"No valid session found",source:"auto-connect"})}catch(e){this.logger.error("EMBEDDED_PROVIDER","Auto-connect failed",{error:e instanceof Error?e.message:String(e)}),this.emit("connect_error",{error:e instanceof Error?e.message:"Auto-connect failed",source:"auto-connect"}),await this.storage.setShouldClearPreviousSession(!0)}}async initializeStamper(){this.logger.log("EMBEDDED_PROVIDER","Initializing stamper"),await this.stamper.init(),this.logger.log("EMBEDDED_PROVIDER","Resetting keypair to avoid conflicts with existing keypairs");const e=await this.stamper.resetKeyPair();this.logger.log("EMBEDDED_PROVIDER","Stamper initialized with fresh keypair",{publicKey:e.publicKey,keyId:e.keyId,algorithm:this.stamper.algorithm});const n=r_;return this.logger.info("EMBEDDED_PROVIDER","Stamper ready for auth flow with fresh keypair",{publicKey:e.publicKey,keyId:e.keyId}),{stamperInfo:e,expiresInMs:n}}async createOrganizationForAppWallet(e,n){const r=new Pp({apiBaseUrl:this.config.apiBaseUrl,headers:{...this.platform.analyticsHeaders||{}}}),i=this.platform.name||"unknown",s=e.publicKey.slice(0,8),o=`${this.config.appId.substring(0,8)}-${i}-${s}`;this.logger.log("EMBEDDED_PROVIDER","Creating organization for app-wallet",{organizationName:o,publicKey:e.publicKey,platform:i});const a=Fn(Yo.decode(e.publicKey)),c=`user-${OR()}`,{organizationId:l}=await r.createOrganization(o,[{username:c,role:"ADMIN",authenticators:[{authenticatorName:`auth-${s}`,authenticatorKind:"keypair",publicKey:a,algorithm:"Ed25519",expiresInMs:n}]}]);return this.logger.info("EMBEDDED_PROVIDER","Organization created for app-wallet",{organizationId:l}),l}async connect(e){try{this.logger.info("EMBEDDED_PROVIDER","Starting embedded provider connect",{authOptions:{provider:e.provider}}),this.emit("connect_start",{source:"manual-connect",authOptions:{provider:e.provider}});const n=await this.tryExistingConnection(!1);if(n)return this.logger.info("EMBEDDED_PROVIDER","Manual connect using existing connection",{walletId:n.walletId,addressCount:n.addresses.length}),this.emit("connect",{...n,source:"manual-existing"}),n;this.validateAuthOptions(e),this.logger.info("EMBEDDED_PROVIDER","No existing connection available, creating new auth flow with fresh keypair");const{stamperInfo:r,expiresInMs:i}=await this.initializeStamper(),s=await this.handleAuthFlow(r.publicKey,r,e,i);if(!s)return{addresses:[],status:"pending",authProvider:e.provider};this.config.embeddedWalletType==="app-wallet"&&(s.lastUsed=Date.now(),await this.storage.saveSession(s)),await this.initializeClientFromSession(s),await this.ensureValidAuthenticator();const o={walletId:this.walletId,addresses:this.addresses,status:"completed",authUserId:s?.authUserId,authProvider:s?.authProvider};return this.emit("connect",{...o,source:"manual"}),o}catch(n){throw this.logger.error("EMBEDDED_PROVIDER","Connect failed with error",{error:n instanceof Error?{name:n.name,message:n.message,stack:n.stack}:n}),this.emit("connect_error",{error:n instanceof Error?n.message:String(n),source:"manual-connect"}),n instanceof Error?n.message.includes("IndexedDB")||n.message.includes("storage")?new Error("Storage error: Unable to access browser storage. Please ensure storage is available and try again."):n.message.includes("network")||n.message.includes("fetch")?new Error("Network error: Unable to connect to authentication server. Please check your internet connection and try again."):n.message.includes("JWT")||n.message.includes("jwt")?new Error(`JWT Authentication error: ${n.message}`):n.message.includes("Authentication")||n.message.includes("auth")?new Error(`Authentication error: ${n.message}`):n.message.includes("organization")||n.message.includes("wallet")?new Error(`Wallet creation error: ${n.message}`):n:new Error(`Embedded wallet connection failed: ${String(n)}`)}}async disconnect(e=!0){const n=this.client!==null;await this.storage.setShouldClearPreviousSession(e),this.logger.log("EMBEDDED_PROVIDER","Set flag to clear previous session on next login"),await this.storage.clearSession(),this.client=null,this.walletId=null,this.addresses=[],this.logger.info("EMBEDDED_PROVIDER","Disconnected from embedded wallet"),n&&this.emit("disconnect",{source:"manual"})}async signMessage(e){if(!this.client||!this.walletId)throw new Error("Not connected");await this.ensureValidAuthenticator(),this.logger.info("EMBEDDED_PROVIDER","Signing message",{walletId:this.walletId,message:e.message});const r=(await this.storage.getSession())?.accountDerivationIndex??0,i=await this.client.signUtf8Message({walletId:this.walletId,message:e.message,networkId:e.networkId,derivationIndex:r});return this.logger.info("EMBEDDED_PROVIDER","Message signed successfully",{walletId:this.walletId,message:e.message}),e0(i,e.networkId)}async signEthereumMessage(e){if(!this.client||!this.walletId)throw new Error("Not connected");await this.ensureValidAuthenticator(),this.logger.info("EMBEDDED_PROVIDER","Signing message",{walletId:this.walletId,message:e.message});const n=c=>/^0x[0-9a-fA-F]+$/.test(c),r=(()=>{if(n(e.message)){const c=e.message.slice(2),l=c.length%2===0?c:`0${c}`;return Et.Buffer.from(l,"hex").toString("utf8")}return e.message})(),i=qL(r),o=(await this.storage.getSession())?.accountDerivationIndex??0,a=await this.client.ethereumSignMessage({walletId:this.walletId,message:i,networkId:e.networkId,derivationIndex:o});return this.logger.info("EMBEDDED_PROVIDER","Message signed successfully",{walletId:this.walletId,message:e.message}),e0(a,e.networkId)}async signTypedDataV4(e){if(!this.client||!this.walletId)throw new Error("Not connected");await this.ensureValidAuthenticator(),this.logger.info("EMBEDDED_PROVIDER","Signing typed data",{walletId:this.walletId,typedData:e.typedData});const r=(await this.storage.getSession())?.accountDerivationIndex??0,i=await this.client.ethereumSignTypedData({walletId:this.walletId,typedData:e.typedData,networkId:e.networkId,derivationIndex:r});return this.logger.info("EMBEDDED_PROVIDER","Typed data signed successfully",{walletId:this.walletId}),e0(i,e.networkId)}async signTransaction(e){if(!this.client||!this.walletId)throw new Error("Not connected");await this.ensureValidAuthenticator(),this.logger.info("EMBEDDED_PROVIDER","Signing transaction",{walletId:this.walletId,networkId:e.networkId});const n=await n_(e.transaction,e.networkId),i=(await this.storage.getSession())?.accountDerivationIndex??0;this.logger.log("EMBEDDED_PROVIDER","Parsed transaction for signing",{walletId:this.walletId,transaction:n,derivationIndex:i});const s=n.parsed;if(!s)throw new Error("Failed to parse transaction: no valid encoding found");const o=this.getAddressForNetwork(e.networkId);if(!o)throw new Error(`No address found for network ${e.networkId}`);const a=await this.client.signTransaction({walletId:this.walletId,transaction:s,networkId:e.networkId,derivationIndex:i,account:o});return this.logger.info("EMBEDDED_PROVIDER","Transaction signed successfully",{walletId:this.walletId,networkId:e.networkId,rawTransaction:a.rawTransaction}),await t_(a.rawTransaction,e.networkId)}async signAndSendTransaction(e){if(!this.client||!this.walletId)throw new Error("Not connected");await this.ensureValidAuthenticator(),this.logger.info("EMBEDDED_PROVIDER","Signing and sending transaction",{walletId:this.walletId,networkId:e.networkId});const n=await n_(e.transaction,e.networkId),i=(await this.storage.getSession())?.accountDerivationIndex??0;this.logger.log("EMBEDDED_PROVIDER","Parsed transaction for signing",{walletId:this.walletId,transaction:n,derivationIndex:i});const s=n.parsed;if(!s)throw new Error("Failed to parse transaction: no valid encoding found");const o=this.getAddressForNetwork(e.networkId);if(!o)throw new Error(`No address found for network ${e.networkId}`);let a;try{a=await this.client.signAndSendTransaction({walletId:this.walletId,transaction:s,networkId:e.networkId,derivationIndex:i,account:o})}catch(c){throw c instanceof DR&&this.emit("spending_limit_reached",{error:c}),c}return this.logger.info("EMBEDDED_PROVIDER","Transaction signed and sent successfully",{walletId:this.walletId,networkId:e.networkId,hash:a.hash,rawTransaction:a.rawTransaction}),await t_(a.rawTransaction,e.networkId,a.hash)}getAddresses(){return this.addresses}isConnected(){return this.client!==null&&this.walletId!==null}async handleAuthFlow(e,n,r,i){if(this.config.embeddedWalletType==="user-wallet")return this.logger.info("EMBEDDED_PROVIDER","Creating user-wallet, routing authentication",{authProvider:r.provider}),r.provider==="phantom"?await this.handlePhantomAuth(e,n,i):(this.logger.info("EMBEDDED_PROVIDER","Starting redirect-based authentication flow",{publicKey:e,provider:r?.provider}),await this.handleRedirectAuth(e,n,r));{this.logger.info("EMBEDDED_PROVIDER","Creating app-wallet",{publicKey:e});const s=await this.createOrganizationForAppWallet(n,i),c=(await new Pp({apiBaseUrl:this.config.apiBaseUrl,organizationId:s,headers:{...this.platform.analyticsHeaders||{}}},this.stamper).createWallet(`Wallet ${Date.now()}`)).walletId,l=Date.now(),u={sessionId:t0(),walletId:c,organizationId:s,appId:this.config.appId,stamperInfo:n,authProvider:"device",accountDerivationIndex:0,status:"completed",createdAt:l,lastUsed:l,authenticatorCreatedAt:l,authenticatorExpiresAt:Date.now()+i,lastRenewalAttempt:void 0};return await this.storage.saveSession(u),this.logger.info("EMBEDDED_PROVIDER","App-wallet created successfully",{walletId:c,organizationId:s}),u}}async handlePhantomAuth(e,n,r){if(this.logger.info("EMBEDDED_PROVIDER","Starting Phantom authentication flow"),!this.phantomAppProvider.isAvailable())throw this.logger.error("EMBEDDED_PROVIDER","Phantom app not available"),new Error("Phantom app is not available. Please install the Phantom browser extension or mobile app to use this authentication method.");this.logger.info("EMBEDDED_PROVIDER","Phantom app detected, proceeding with authentication");const s=t0(),o=await this.phantomAppProvider.authenticate({publicKey:e,appId:this.config.appId,sessionId:s});this.logger.info("EMBEDDED_PROVIDER","Phantom authentication completed",{walletId:o.walletId,organizationId:o.organizationId});const a=o.expiresInMs>0?o.expiresInMs:r,c=Date.now(),l={sessionId:s,walletId:o.walletId,organizationId:o.organizationId,appId:this.config.appId,stamperInfo:n,authProvider:"phantom",accountDerivationIndex:o.accountDerivationIndex,status:"completed",createdAt:c,lastUsed:c,authenticatorCreatedAt:c,authenticatorExpiresAt:c+a,lastRenewalAttempt:void 0,authUserId:o.authUserId};return this.logger.log("EMBEDDED_PROVIDER","Saving Phantom session"),await this.storage.saveSession(l),l}async handleRedirectAuth(e,n,r){this.logger.info("EMBEDDED_PROVIDER","Using Phantom Connect authentication flow (redirect-based)",{provider:r.provider,hasRedirectUrl:!!this.config.authOptions.redirectUrl,authUrl:this.config.authOptions.authUrl});const i=Date.now(),s=t0(),o={sessionId:s,walletId:`temp-wallet-${i}`,organizationId:`temp-org-${i}`,appId:this.config.appId,stamperInfo:n,authProvider:r.provider,accountDerivationIndex:void 0,status:"pending",createdAt:i,lastUsed:i,authenticatorCreatedAt:i,authenticatorExpiresAt:i+r_,lastRenewalAttempt:void 0};this.logger.log("EMBEDDED_PROVIDER","Saving temporary session before redirect",{sessionId:o.sessionId,tempWalletId:o.walletId}),o.lastUsed=Date.now(),await this.storage.saveSession(o);const a=await this.storage.getShouldClearPreviousSession();this.logger.info("EMBEDDED_PROVIDER","Starting Phantom Connect redirect",{publicKey:e,appId:this.config.appId,provider:r?.provider,authUrl:this.config.authOptions.authUrl,clearPreviousSession:a,allowRefresh:!a});const c=await this.authProvider.authenticate({publicKey:e,appId:this.config.appId,provider:r?.provider,redirectUrl:this.config.authOptions.redirectUrl,authUrl:this.config.authOptions.authUrl,sessionId:s,clearPreviousSession:a,allowRefresh:!a});if(c&&"walletId"in c){if(this.logger.info("EMBEDDED_PROVIDER","Authentication completed after redirect",{walletId:c.walletId,organizationId:c.organizationId,provider:c.provider}),o.walletId=c.walletId,o.organizationId=c.organizationId,o.authProvider=c.provider||o.authProvider,o.accountDerivationIndex=c.accountDerivationIndex,o.authUserId=c.authUserId,o.status="completed",o.lastUsed=Date.now(),c.expiresInMs>0){const l=Date.now();o.authenticatorCreatedAt=l,o.authenticatorExpiresAt=l+c.expiresInMs,this.logger.log("EMBEDDED_PROVIDER","Updated authenticator expiration from immediate auth response",{expiresInMs:c.expiresInMs,expiresAt:new Date(o.authenticatorExpiresAt).toISOString()})}return await this.storage.saveSession(o),await this.storage.setShouldClearPreviousSession(!1),this.logger.log("EMBEDDED_PROVIDER","Cleared logout flag after successful authentication"),o}return this.logger.info("EMBEDDED_PROVIDER","Redirect authentication initiated, waiting for redirect completion"),null}async completeAuthConnection(e){const n=await this.storage.getSession();if(!n)throw new Error("No session found after redirect - session may have expired");if(n.walletId=e.walletId,n.authProvider=e.provider||n.authProvider,n.organizationId=e.organizationId,n.accountDerivationIndex=e.accountDerivationIndex,n.authUserId=e.authUserId,n.status="completed",n.lastUsed=Date.now(),e.expiresInMs>0){const r=Date.now();n.authenticatorCreatedAt=r,n.authenticatorExpiresAt=r+e.expiresInMs,this.logger.log("EMBEDDED_PROVIDER","Updated authenticator expiration from auth response",{expiresInMs:e.expiresInMs,expiresAt:new Date(n.authenticatorExpiresAt).toISOString()})}return await this.storage.saveSession(n),await this.storage.setShouldClearPreviousSession(!1),this.logger.log("EMBEDDED_PROVIDER","Cleared logout flag after successful authentication"),await this.initializeClientFromSession(n),await this.ensureValidAuthenticator(),{walletId:this.walletId,addresses:this.addresses,status:"completed",authUserId:n.authUserId,authProvider:n.authProvider}}async ensureValidAuthenticator(){const e=await this.storage.getSession();if(!e)throw new Error("No active session found");const n=Date.now();if(!e.authenticatorExpiresAt)throw this.logger.warn("EMBEDDED_PROVIDER","Session missing authenticator timing - treating as invalid session"),await this.disconnect(!1),new Error("Invalid session - missing authenticator timing");const r=e.authenticatorExpiresAt-n;if(this.logger.log("EMBEDDED_PROVIDER","Checking authenticator expiration",{expiresAt:new Date(e.authenticatorExpiresAt).toISOString(),timeUntilExpiry:r}),r<=0)throw this.logger.error("EMBEDDED_PROVIDER","Authenticator has expired, disconnecting"),await this.disconnect(!1),new Error("Authenticator expired")}async initializeClientFromSession(e){this.logger.log("EMBEDDED_PROVIDER","Initializing PhantomClient from session",{organizationId:e.organizationId,walletId:e.walletId,appId:e.appId}),this.stamper.getKeyInfo()||await this.stamper.init(),this.client=new Pp({apiBaseUrl:this.config.apiBaseUrl,organizationId:e.organizationId,headers:{...this.platform.analyticsHeaders||{}}},this.stamper),this.walletId=e.walletId,this.addresses=await this.getAndFilterWalletAddresses(e.walletId)}},Yj=class{constructor(t={}){if(this.db=null,this.activeKeyPairRecord=null,this.pendingKeyPairRecord=null,this.algorithm=Bo.ed25519,this.type="PKI",typeof window>"u"||!window.indexedDB)throw new Error("IndexedDbStamper requires a browser environment with IndexedDB support");this.dbName=t.dbName||"phantom-indexed-db-stamper",this.storeName=t.storeName||"crypto-keys",this.keyName=t.keyName||"signing-key",this.type=t.type||"PKI",this.idToken=t.idToken,this.salt=t.salt}async init(){return await this.openDB(),this.activeKeyPairRecord=await this.loadActiveKeyPairRecord(),this.activeKeyPairRecord||(this.activeKeyPairRecord=await this.generateAndStoreNewKeyPair("active")),this.pendingKeyPairRecord=await this.loadPendingKeyPairRecord(),this.activeKeyPairRecord.keyInfo}getKeyInfo(){return this.activeKeyPairRecord?.keyInfo||null}async resetKeyPair(){return await this.clearStoredKeys(),this.activeKeyPairRecord=await this.generateAndStoreNewKeyPair("active"),this.pendingKeyPairRecord=null,this.activeKeyPairRecord.keyInfo}async stamp(t){const{data:e}=t;if(!this.activeKeyPairRecord)throw new Error("Stamper not initialized. Call init() first.");const n=new Uint8Array(e),r=await crypto.subtle.sign({name:this.algorithm,hash:"SHA-256"},this.activeKeyPairRecord.keyPair.privateKey,n),i=Fn(new Uint8Array(r)),s=t.type||this.type,o=t.type==="OIDC"?t.idToken:this.idToken,a=t.type==="OIDC"?t.salt:this.salt,c=s==="PKI"?{publicKey:Fn(Yo.decode(this.activeKeyPairRecord.keyInfo.publicKey)),signature:i,kind:"PKI",algorithm:this.algorithm}:{kind:"OIDC",idToken:o,publicKey:Fn(Yo.decode(this.activeKeyPairRecord.keyInfo.publicKey)),salt:a,algorithm:this.algorithm,signature:i},l=JSON.stringify(c);return Fn(l)}async clear(){await this.clearStoredKeys(),this.activeKeyPairRecord=null,this.pendingKeyPairRecord=null}async clearStoredKeys(){return this.db||await this.openDB(),new Promise((t,e)=>{const r=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName),i=r.delete(`${this.keyName}-active`),s=r.delete(`${this.keyName}-pending`);let o=0;const a=2,c=()=>{o++,o===a&&t()};i.onsuccess=c,s.onsuccess=c,i.onerror=()=>e(i.error),s.onerror=()=>e(s.error)})}async openDB(){return new Promise((t,e)=>{const n=indexedDB.open(this.dbName,1);n.onerror=()=>e(n.error),n.onsuccess=()=>{this.db=n.result,t()},n.onupgradeneeded=r=>{const i=r.target.result;i.objectStoreNames.contains(this.storeName)||i.createObjectStore(this.storeName)}})}async rotateKeyPair(){return this.db||await this.openDB(),this.pendingKeyPairRecord=await this.generateAndStoreNewKeyPair("pending"),this.pendingKeyPairRecord.keyInfo}async commitRotation(t){if(!this.pendingKeyPairRecord)throw new Error("No pending keypair to commit");this.activeKeyPairRecord&&await this.removeKeyPairRecord("active"),this.pendingKeyPairRecord.status="active",this.pendingKeyPairRecord.authenticatorId=t,this.pendingKeyPairRecord.keyInfo.authenticatorId=t,this.activeKeyPairRecord=this.pendingKeyPairRecord,this.pendingKeyPairRecord=null,await this.storeKeyPairRecord(this.activeKeyPairRecord,"active"),await this.removeKeyPairRecord("pending")}async rollbackRotation(){this.pendingKeyPairRecord&&(await this.removeKeyPairRecord("pending"),this.pendingKeyPairRecord=null)}async generateAndStoreNewKeyPair(t){const e=await crypto.subtle.generateKey({name:"Ed25519"},!1,["sign","verify"]),n=await crypto.subtle.exportKey("raw",e.publicKey),r=Yo.encode(new Uint8Array(n)),i=await crypto.subtle.digest("SHA-256",n),s=Fn(new Uint8Array(i)).substring(0,16),o=Date.now(),c={keyPair:e,keyInfo:{keyId:s,publicKey:r,createdAt:o},createdAt:o,expiresAt:0,status:t};return await this.storeKeyPairRecord(c,t),c}async storeKeyPairRecord(t,e){if(!this.db)throw new Error("Database not initialized");return new Promise((n,r)=>{const o=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName).put(t,`${this.keyName}-${e}`);o.onsuccess=()=>n(),o.onerror=()=>r(o.error)})}async loadActiveKeyPairRecord(){return this.db?new Promise((t,e)=>{const i=this.db.transaction([this.storeName],"readonly").objectStore(this.storeName).get(`${this.keyName}-active`);i.onsuccess=()=>t(i.result||null),i.onerror=()=>e(i.error)}):null}async loadPendingKeyPairRecord(){return this.db?new Promise((t,e)=>{const i=this.db.transaction([this.storeName],"readonly").objectStore(this.storeName).get(`${this.keyName}-pending`);i.onsuccess=()=>t(i.result||null),i.onerror=()=>e(i.error)}):null}async removeKeyPairRecord(t){if(this.db)return new Promise((e,n)=>{const s=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName).delete(`${this.keyName}-${t}`);s.onsuccess=()=>e(),s.onerror=()=>n(s.error)})}},Xc=class{constructor(){this.level=0,this.enabled=!1}static getInstance(){return Xc.instance||(Xc.instance=new Xc),Xc.instance}setCallback(t){this.callback=t}setLevel(t){this.level=t}enable(){this.enabled=!0}disable(){this.enabled=!1}writeLog(t,e,n,r){if(!this.enabled||t>this.level)return;const i={timestamp:Date.now(),level:t,category:e,message:n,data:r};this.callback&&this.callback(i)}error(t,e,n){this.writeLog(0,t,e,n)}warn(t,e,n){this.writeLog(1,t,e,n)}info(t,e,n){this.writeLog(2,t,e,n)}debug(t,e,n){this.writeLog(3,t,e,n)}log(t,e,n){this.writeLog(3,t,e,n)}},ee=Xc.getInstance(),te={BROWSER_SDK:"BrowserSDK",PROVIDER_MANAGER:"ProviderManager",EMBEDDED_PROVIDER:"EmbeddedProvider",INJECTED_PROVIDER:"InjectedProvider",PHANTOM_CONNECT_AUTH:"PhantomConnectAuth",JWT_AUTH:"JWTAuth",STORAGE:"Storage",SESSION:"Session"};function Jj(t){return t.rdns?t.rdns.split(".").reverse().join("-"):t.name.toLowerCase().replace(/\s+/g,"-")}function Zj(t){return t.toLowerCase().replace(/\s+/g,"-")}function Xj(t){const e=[];ee.log(te.BROWSER_SDK,"Processing EIP-6963 providers",{providerCount:t.size,providerNames:Array.from(t.values()).map(n=>n.info.name)});for(const[,n]of t){const{info:r,provider:i}=n;if(r.name.toLowerCase().includes("phantom")||r.rdns&&(r.rdns.toLowerCase().includes("phantom")||r.rdns.toLowerCase()==="app.phantom")){ee.log(te.BROWSER_SDK,"Skipping Phantom from EIP-6963",{name:r.name,rdns:r.rdns});continue}const o=Jj(r);ee.log(te.BROWSER_SDK,"Discovered EIP-6963 wallet",{walletId:o,walletName:r.name,rdns:r.rdns}),e.push({id:o,name:r.name,icon:r.icon,addressTypes:[yt.ethereum],providers:{ethereum:i},rdns:r.rdns,discovery:"eip6963"})}return ee.log(te.BROWSER_SDK,"EIP-6963 discovery completed",{discoveredCount:e.length,walletIds:e.map(n=>n.id)}),e}function Qj(){return new Promise(t=>{const e=new Map;if(typeof window>"u"){t([]);return}const n=i=>{const s=i.detail;s?.info&&s?.provider&&e.set(s.info.uuid,s)};window.addEventListener("eip6963:announceProvider",n),window.dispatchEvent(new Event("eip6963:requestProvider")),setTimeout(()=>{const i=Xj(e);window.removeEventListener("eip6963:announceProvider",n),t(i)},400)})}async function eH(){const t=[];if(typeof window>"u"||typeof navigator>"u")return ee.log(te.BROWSER_SDK,"Wallet Standard discovery skipped (not in browser environment)"),t;const e=new Set;let n;function r(w){n=void 0,e.add(w);const b=w.features?Object.keys(w.features):[];ee.log(te.BROWSER_SDK,"Wallet registered",{name:w.name,chains:w.chains,featureKeys:b,totalWallets:e.size})}function i(w){n=void 0,e.delete(w)}function s(){return n||(n=[...e]),n}function o(...w){return w=w.filter(b=>!e.has(b)),w.length?(w.forEach(b=>r(b)),function(){w.forEach(E=>i(E))}):()=>{}}const a=Object.freeze({register:o}),c=w=>{const b=w.detail;if(typeof b=="function")try{b(a)}catch(E){ee.warn(te.BROWSER_SDK,"Error calling wallet registration callback",{error:E})}};try{window.addEventListener("wallet-standard:register-wallet",c)}catch(w){ee.warn(te.BROWSER_SDK,"Could not add register-wallet event listener",{error:w})}class l extends Event{constructor(b){super("wallet-standard:app-ready",{bubbles:!1,cancelable:!1,composed:!1}),this.detail=b}}try{window.dispatchEvent(new l(a)),ee.log(te.BROWSER_SDK,"Dispatched wallet-standard:app-ready event")}catch(w){ee.warn(te.BROWSER_SDK,"Could not dispatch app-ready event",{error:w})}const u={getWallets:()=>({get:s,on:(w,b)=>()=>{},register:o})};navigator.wallets||(navigator.wallets=u),ee.log(te.BROWSER_SDK,"Initialized Wallet Standard registry"),await new Promise(w=>setTimeout(w,100));const d=navigator.wallets||window.wallets;if(!d||typeof d.getWallets!="function"){const w={hasNavigator:!!navigator,hasWindow:typeof window<"u",note:"Wallet Standard API not properly initialized"};return ee.log(te.BROWSER_SDK,"Wallet Standard API not available",w),t}const f=d.getWallets(),g=()=>Promise.resolve([...f.get()]);ee.log(te.BROWSER_SDK,"Wallet Standard API detected, starting discovery");try{let w=[],b=0;const E=5,M=100,S=400;for(await new Promise(D=>setTimeout(D,M));b<E;){w=await g();const D={attempt:b+1,walletCount:w.length,walletNames:w.map(z=>z.name),chains:w.flatMap(z=>z.chains)};if(ee.log(te.BROWSER_SDK,`Wallet Standard getWallets attempt ${b+1}`,D),w.length>0||b===E-1)break;await new Promise(z=>setTimeout(z,M)),b++}const F=M+b*M;if(F<S){const D=S-F;await new Promise(z=>setTimeout(z,D)),w=await g()}ee.log(te.BROWSER_SDK,"Wallet Standard getWallets final result",{walletCount:w.length,walletNames:w.map(D=>D.name),attempts:b+1});for(const D of w){if(!(D.chains.some(U=>{const B=U.toLowerCase();return B.startsWith("solana:")||B==="solana"})||D.features&&typeof D.features=="object"&&Object.keys(D.features).some(U=>{const B=U.toLowerCase();return B.includes("solana")||B.includes("standard:connect")||B.includes("standard:signTransaction")}))){const U=D.features?Object.keys(D.features):[];ee.log(te.BROWSER_SDK,"Wallet does not support Solana",{walletName:D.name,chains:D.chains,featureKeys:U});continue}if(D.name.toLowerCase().includes("phantom")){ee.log(te.BROWSER_SDK,"Skipping Phantom from Wallet Standard (handled separately)");continue}const X=Zj(D.name),Y=D.features?Object.keys(D.features):[];ee.log(te.BROWSER_SDK,"Discovered Wallet Standard Solana wallet",{walletId:X,walletName:D.name,chains:D.chains,featureKeys:Y,icon:D.icon,version:D.version,accountCount:D.accounts?.length||0}),t.push({id:X,name:D.name,icon:D.icon,addressTypes:[yt.solana],providers:{solana:D},discovery:"standard"})}}catch(w){ee.warn(te.BROWSER_SDK,"Wallet Standard API error",{error:w instanceof Error?w.message:String(w),stack:w instanceof Error?w.stack:void 0})}const v={discoveredCount:t.length,walletIds:t.map(w=>w.id),walletNames:t.map(w=>w.name)};return ee.log(te.BROWSER_SDK,"Wallet Standard Solana discovery completed",v),t}function tH(t){if(typeof window>"u"||!Zf())return null;const e=[EL()];t.includes(yt.solana)&&e.push(BL()),t.includes(yt.ethereum)&&e.push(wL()),e.push(jL());const n=bL({plugins:e});return{id:"phantom",name:"Phantom",icon:void 0,addressTypes:t,providers:{solana:t.includes(yt.solana)?n.solana:void 0,ethereum:t.includes(yt.ethereum)?n.ethereum:void 0},isPhantom:!0,phantomInstance:n,discovery:"phantom"}}async function nH(t){const e=t||[];ee.log(te.BROWSER_SDK,"Starting all wallet discovery methods",{addressTypes:e});const[n,r]=await Promise.all([eH(),Qj()]),i=tH(e);ee.log(te.BROWSER_SDK,"All wallet discovery methods completed",{phantomFound:!!i,solanaWalletsCount:n.length,ethereumWalletsCount:r.length,solanaWalletIds:n.map(o=>o.id),ethereumWalletIds:r.map(o=>o.id)});const s=new Map;i&&s.set("phantom",i);for(const o of[...n,...r]){const a=s.get(o.id);if(a){const c=Array.from(new Set([...a.addressTypes,...o.addressTypes])),l={...a.providers,...o.providers},u={...a,addressTypes:c,icon:o.icon||a.icon,providers:l};s.set(o.id,u),ee.log(te.BROWSER_SDK,"Merged wallet by ID",{walletName:o.name,walletId:o.id,existingAddressTypes:a.addressTypes,newAddressTypes:o.addressTypes,mergedAddressTypes:c,existingProviders:Object.keys(a.providers||{}),newProviders:Object.keys(o.providers||{}),mergedProviders:Object.keys(l)}),ee.log(te.BROWSER_SDK,"Merged wallet from multiple discovery methods",{walletId:o.id,walletName:o.name,existingAddressTypes:a.addressTypes,newAddressTypes:o.addressTypes,mergedAddressTypes:c})}else s.set(o.id,o)}return Array.from(s.values())}var rH=class{constructor(t,e,n){this.eventEmitter=new _c,this._connected=!1,this._publicKey=null,this.provider=t,this.walletId=e,this.walletName=n,this.setupEventListeners()}get connected(){return this._connected}get publicKey(){return this._publicKey}async connect(t){ee.log(te.INJECTED_PROVIDER,"External wallet Solana connect",{walletId:this.walletId,walletName:this.walletName,onlyIfTrusted:t?.onlyIfTrusted});try{const e=await this.provider.connect(t);if(typeof e=="string")return this._connected=!0,this._publicKey=e,ee.info(te.INJECTED_PROVIDER,"External wallet Solana connected",{walletId:this.walletId,walletName:this.walletName,publicKey:e}),{publicKey:e};if(typeof e=="object"&&e!==null&&"publicKey"in e)return this._connected=!0,this._publicKey=e.publicKey,ee.info(te.INJECTED_PROVIDER,"External wallet Solana connected",{walletId:this.walletId,walletName:this.walletName,publicKey:e.publicKey}),e;if(Array.isArray(e)&&e.length>0){const n=e[0];if(typeof n=="object"&&n!==null&&"address"in n)return this._connected=!0,this._publicKey=n.address,ee.info(te.INJECTED_PROVIDER,"External wallet Solana connected",{walletId:this.walletId,walletName:this.walletName,publicKey:n.address}),{publicKey:n.address}}throw new Error("Unexpected connect result format")}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Solana connect failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async disconnect(){ee.log(te.INJECTED_PROVIDER,"External wallet Solana disconnect",{walletId:this.walletId,walletName:this.walletName});try{await this.provider.disconnect(),this._connected=!1,this._publicKey=null,ee.info(te.INJECTED_PROVIDER,"External wallet Solana disconnected",{walletId:this.walletId,walletName:this.walletName})}catch(t){throw ee.error(te.INJECTED_PROVIDER,"External wallet Solana disconnect failed",{walletId:this.walletId,walletName:this.walletName,error:t instanceof Error?t.message:String(t)}),t}}async signMessage(t){const e=typeof t=="string"?new TextEncoder().encode(t):t,n=typeof t=="string"?t.substring(0,50):`${e.length} bytes`;ee.log(te.INJECTED_PROVIDER,"External wallet Solana signMessage",{walletId:this.walletId,walletName:this.walletName,messagePreview:n,messageLength:e.length});try{const r=await this.provider.signMessage(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Solana signMessage success",{walletId:this.walletId,walletName:this.walletName,signatureLength:r.signature.length}),{signature:r.signature instanceof Uint8Array?r.signature:new Uint8Array(Et.Buffer.from(r.signature,"base64")),publicKey:r.publicKey||this._publicKey||""}}catch(r){throw ee.error(te.INJECTED_PROVIDER,"External wallet Solana signMessage failed",{walletId:this.walletId,walletName:this.walletName,error:r instanceof Error?r.message:String(r)}),r}}async signTransaction(t){ee.log(te.INJECTED_PROVIDER,"External wallet Solana signTransaction",{walletId:this.walletId,walletName:this.walletName});try{const e=await this.provider.signTransaction(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Solana signTransaction success",{walletId:this.walletId,walletName:this.walletName}),e}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Solana signTransaction failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async signAndSendTransaction(t){ee.log(te.INJECTED_PROVIDER,"External wallet Solana signAndSendTransaction",{walletId:this.walletId,walletName:this.walletName});try{const e=await this.provider.signAndSendTransaction(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Solana signAndSendTransaction success",{walletId:this.walletId,walletName:this.walletName,signature:e.signature}),e}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Solana signAndSendTransaction failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async signAllTransactions(t){ee.log(te.INJECTED_PROVIDER,"External wallet Solana signAllTransactions",{walletId:this.walletId,walletName:this.walletName,transactionCount:t.length});try{const e=await this.provider.signAllTransactions(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Solana signAllTransactions success",{walletId:this.walletId,walletName:this.walletName,signedCount:e.length}),e}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Solana signAllTransactions failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async signAndSendAllTransactions(t){ee.log(te.INJECTED_PROVIDER,"External wallet Solana signAndSendAllTransactions",{walletId:this.walletId,walletName:this.walletName,transactionCount:t.length});try{const e=await this.provider.signAndSendAllTransactions(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Solana signAndSendAllTransactions success",{walletId:this.walletId,walletName:this.walletName,signatureCount:e.signatures.length}),e}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Solana signAndSendAllTransactions failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}switchNetwork(t){return Promise.resolve()}getPublicKey(){return Promise.resolve(this._publicKey)}isConnected(){return this._connected}setupEventListeners(){typeof this.provider.on=="function"&&(this.provider.on("connect",t=>{this._connected=!0,this._publicKey=t,this.eventEmitter.emit("connect",t)}),this.provider.on("disconnect",()=>{this._connected=!1,this._publicKey=null,this.eventEmitter.emit("disconnect")}),this.provider.on("accountChanged",t=>{this._publicKey=t,this.eventEmitter.emit("accountChanged",t)}))}on(t,e){this.eventEmitter.on(t,e)}off(t,e){this.eventEmitter.off(t,e)}},iH=class{constructor(t,e,n){this._connected=!1,this._publicKey=null,this.wallet=t,this.walletId=e,this.walletName=n}get connected(){return this._connected}get publicKey(){return this._publicKey}async connect(t){try{const e=this.wallet.features?.["standard:connect"];if(!e||typeof e.connect!="function")throw new Error("Wallet Standard connect feature not available");const n=await e.connect();let r;if(Array.isArray(n)&&n.length>0?r=n:this.wallet.accounts&&this.wallet.accounts.length>0&&(r=Array.from(this.wallet.accounts)),!r||r.length===0)throw new Error("No accounts available after connecting to wallet");const i=r[0];if(!i)throw new Error("First account is null or undefined");let s;if(typeof i=="string"?s=i:typeof i=="object"&&i!==null&&(s=i.address||i.publicKey?.toString()||(i.publicKey instanceof Uint8Array?Buffer.from(i.publicKey).toString("hex"):void 0)),!s)throw new Error(`Could not extract address from account. Account structure: ${JSON.stringify(i,null,2)}`);return this._connected=!0,this._publicKey=s,{publicKey:s}}catch(e){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana connect failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async disconnect(){try{const t=this.wallet.features?.["standard:disconnect"];t&&typeof t.disconnect=="function"&&await t.disconnect(),this._connected=!1,this._publicKey=null}catch(t){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana disconnect failed",{walletId:this.walletId,walletName:this.walletName,error:t instanceof Error?t.message:String(t)}),t}}async signMessage(t){try{const e=this.wallet.features?.["solana:signMessage"];if(!e||typeof e.signMessage!="function")throw new Error("Wallet Standard signMessage feature not available");const n=typeof t=="string"?new TextEncoder().encode(t):t,r=await e.signMessage({message:n,account:this.wallet.accounts?.[0]});if(!Array.isArray(r)||r.length===0)throw new Error(`Expected array result from signMessage, got: ${typeof r}`);const i=r[0];if(!i||!i.signature)throw new Error(`Invalid signMessage result structure: ${JSON.stringify(r)}`);const s=this.parseUint8Array(i.signature);if(s.length===0)throw new Error("Signature is empty");const o=i.account?.address||this.wallet.accounts?.[0]?.address||this._publicKey||"";return{signature:s,publicKey:o}}catch(e){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana signMessage failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async signTransaction(t){try{const e=this.wallet.features?.["solana:signTransaction"];if(!e||typeof e.signTransaction!="function")throw new Error("Wallet Standard signTransaction feature not available");if(!this.wallet.accounts||this.wallet.accounts.length===0)throw new Error("No accounts available. Please connect first.");const n=this.wallet.accounts[0],r=this.serializeTransaction(t),i=await e.signTransaction({transaction:r,account:n});let s;if(Array.isArray(i)&&i.length>0){const c=i[0];c&&typeof c=="object"&&(s=c.signedTransaction||c.transaction)}else i&&typeof i=="object"&&!Array.isArray(i)&&(s=i.transaction||i.signedTransaction);if(!s)throw new Error("No transaction data found in Wallet Standard result");const o=this.parseUint8Array(s);if(o.length===0)throw new Error("Empty signed transaction returned from Wallet Standard");return IT(o)}catch(e){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana signTransaction failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async signAndSendTransaction(t){try{const e=this.wallet.features?.["solana:signAndSendTransaction"];if(!e||typeof e.signAndSendTransaction!="function")throw new Error("Wallet Standard signAndSendTransaction feature not available");if(!this.wallet.accounts||this.wallet.accounts.length===0)throw new Error("No accounts available. Please connect first.");const n=this.wallet.accounts[0],r=n.chains?.[0]||"solana:mainnet",i=this.serializeTransaction(t),s=await e.signAndSendTransaction({transaction:i,account:n,chain:r});let o;if(Array.isArray(s)&&s.length>0)o=s[0];else if(s&&typeof s=="object"&&!Array.isArray(s))o=s;else throw new Error("Invalid signAndSendTransaction result format");if(!o.signature)throw new Error("No signature found in signAndSendTransaction result");const a=this.parseUint8Array(o.signature);return{signature:Yo.encode(a)}}catch(e){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana signAndSendTransaction failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async signAllTransactions(t){try{const e=[];for(const n of t){const r=await this.signTransaction(n);e.push(r)}return e}catch(e){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana signAllTransactions failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async signAndSendAllTransactions(t){try{const e=[];for(const n of t){const r=await this.signAndSendTransaction(n);e.push(r.signature)}return{signatures:e}}catch(e){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana signAndSendAllTransactions failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async switchNetwork(t){try{const e=this.wallet.features?.["standard:switchNetwork"];if(e&&typeof e.switchNetwork=="function"){const n=t==="mainnet"?"solana:mainnet":"solana:devnet";await e.switchNetwork({chain:n})}}catch(e){throw ee.error(te.INJECTED_PROVIDER,"Wallet Standard Solana switchNetwork failed",{walletId:this.walletId,walletName:this.walletName,network:t,error:e instanceof Error?e.message:String(e)}),e}}getPublicKey(){return Promise.resolve(this._publicKey)}isConnected(){return this._connected}on(t,e){const n=this.wallet.features?.["standard:events"];n&&typeof n.on=="function"&&n.on(t,e)}off(t,e){const n=this.wallet.features?.["standard:events"];n&&typeof n.off=="function"&&n.off(t,e)}serializeTransaction(t){return typeof t.serialize=="function"?t.serialize({requireAllSignatures:!1,verifySignatures:!1}):t instanceof Uint8Array?t:new Uint8Array(0)}parseUint8Array(t){if(t instanceof Uint8Array)return t;if(Array.isArray(t))return new Uint8Array(t);if(typeof t=="object"&&t!==null){const e=Object.keys(t).map(Number).filter(n=>!isNaN(n)&&n>=0).sort((n,r)=>n-r);if(e.length>0){const n=Math.max(...e),r=new Uint8Array(n+1);for(const i of e)r[i]=Number(t[i])||0;return r}}return new Uint8Array(0)}},sH=class{constructor(t,e,n){this.eventEmitter=new _c,this._connected=!1,this._chainId="0x1",this._accounts=[],this.provider=t,this.walletId=e,this.walletName=n,this.setupEventListeners()}get connected(){return this._connected}get chainId(){return this._chainId}get accounts(){return this._accounts}async request(t){ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum request",{walletId:this.walletId,walletName:this.walletName,method:t.method});try{["personal_sign","eth_sign","eth_signTypedData","eth_signTypedData_v4","eth_sendTransaction","eth_signTransaction"].includes(t.method)&&(!this._connected||this._accounts.length===0)&&(ee.log(te.INJECTED_PROVIDER,"Method requires authorization, ensuring connection",{walletId:this.walletId,walletName:this.walletName,method:t.method}),await this.connect());const n=await this.provider.request(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum request success",{walletId:this.walletId,walletName:this.walletName,method:t.method}),n}catch(e){if(e?.code===4100){ee.log(te.INJECTED_PROVIDER,"Got 4100 Unauthorized, attempting to re-authorize",{walletId:this.walletId,walletName:this.walletName,method:t.method});try{await this.provider.request({method:"eth_requestAccounts"});const n=await this.provider.request(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum request success (after re-auth)",{walletId:this.walletId,walletName:this.walletName,method:t.method}),n}catch(n){throw ee.error(te.INJECTED_PROVIDER,"Failed after re-authorization",{walletId:this.walletId,walletName:this.walletName,method:t.method,error:n instanceof Error?n.message:String(n)}),n}}throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum request failed",{walletId:this.walletId,walletName:this.walletName,method:t.method,error:e instanceof Error?e.message:String(e),errorCode:e?.code}),e}}async connect(){ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum connect",{walletId:this.walletId,walletName:this.walletName});try{const t=await this.provider.request({method:"eth_requestAccounts"});return this._connected=t.length>0,this._accounts=t,ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum connected (via eth_requestAccounts)",{walletId:this.walletId,walletName:this.walletName,accountCount:t.length,accounts:t}),t}catch(t){throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum connect failed",{walletId:this.walletId,walletName:this.walletName,error:t instanceof Error?t.message:String(t)}),t}}async disconnect(){ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum disconnect",{walletId:this.walletId,walletName:this.walletName});try{await this.provider.disconnect(),this._connected=!1,this._accounts=[],ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum disconnected",{walletId:this.walletId,walletName:this.walletName})}catch(t){throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum disconnect failed",{walletId:this.walletId,walletName:this.walletName,error:t instanceof Error?t.message:String(t)}),t}}async signPersonalMessage(t,e){const n=t.length>50?t.substring(0,50)+"...":t;ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum signPersonalMessage",{walletId:this.walletId,walletName:this.walletName,messagePreview:n,messageLength:t.length,address:e});try{const r=this.provider.isConnected?.()||this.provider.connected||!1;(!this._connected||this._accounts.length===0||!r)&&(ee.log(te.INJECTED_PROVIDER,"Not connected, attempting to connect before signing",{walletId:this.walletId,walletName:this.walletName,internalConnected:this._connected,accountsLength:this._accounts.length,providerConnected:r}),await this.connect());const i=e.toLowerCase();if(!this._accounts.map(a=>a.toLowerCase()).includes(i)){ee.warn(te.INJECTED_PROVIDER,"Address not in connected accounts, refreshing connection",{walletId:this.walletId,walletName:this.walletName,requestedAddress:e,connectedAccounts:this._accounts});const a=await this.getAccounts();if(!a.map(l=>l.toLowerCase()).includes(i))throw new Error(`Address ${e} is not connected. Connected accounts: ${a.join(", ")}`);this._accounts=a}if(typeof this.provider.signPersonalMessage=="function"){const a=await this.provider.signPersonalMessage(t,e);return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum signPersonalMessage success",{walletId:this.walletId,walletName:this.walletName,signatureLength:a.length}),a}const o=await this.request({method:"personal_sign",params:[t,e]});return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum signPersonalMessage success",{walletId:this.walletId,walletName:this.walletName,signatureLength:o.length}),o}catch(r){throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum signPersonalMessage failed",{walletId:this.walletId,walletName:this.walletName,error:r instanceof Error?r.message:String(r),errorCode:r?.code}),r}}async signTypedData(t,e){ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum signTypedData",{walletId:this.walletId,walletName:this.walletName,primaryType:t?.primaryType,address:e});try{if(typeof this.provider.signTypedData=="function"){const r=await this.provider.signTypedData(t,e);return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum signTypedData success",{walletId:this.walletId,walletName:this.walletName,signatureLength:r.length}),r}const n=await this.request({method:"eth_signTypedData_v4",params:[e,t]});return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum signTypedData success",{walletId:this.walletId,walletName:this.walletName,signatureLength:n.length}),n}catch(n){throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum signTypedData failed",{walletId:this.walletId,walletName:this.walletName,error:n instanceof Error?n.message:String(n)}),n}}async signTransaction(t){ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum signTransaction",{walletId:this.walletId,walletName:this.walletName,from:t.from,to:t.to});try{if(typeof this.provider.signTransaction=="function"){const n=await this.provider.signTransaction(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum signTransaction success",{walletId:this.walletId,walletName:this.walletName,signatureLength:n.length}),n}const e=await this.request({method:"eth_signTransaction",params:[t]});return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum signTransaction success",{walletId:this.walletId,walletName:this.walletName,signatureLength:e.length}),e}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum signTransaction failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async sendTransaction(t){ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum sendTransaction",{walletId:this.walletId,walletName:this.walletName,from:t.from,to:t.to,value:t.value});try{if(typeof this.provider.sendTransaction=="function"){const n=await this.provider.sendTransaction(t);return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum sendTransaction success",{walletId:this.walletId,walletName:this.walletName,txHash:n}),n}const e=await this.request({method:"eth_sendTransaction",params:[t]});return ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum sendTransaction success",{walletId:this.walletId,walletName:this.walletName,txHash:e}),e}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum sendTransaction failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async switchChain(t){ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum switchChain",{walletId:this.walletId,walletName:this.walletName,chainId:t});try{const e=typeof t=="string"?t.toLowerCase().startsWith("0x")?t:`0x${parseInt(t,10).toString(16)}`:`0x${t.toString(16)}`;typeof this.provider.switchChain=="function"?await this.provider.switchChain(e):await this.request({method:"wallet_switchEthereumChain",params:[{chainId:e}]}),this._chainId=e,this.eventEmitter.emit("chainChanged",this._chainId),ee.info(te.INJECTED_PROVIDER,"External wallet Ethereum switchChain success",{walletId:this.walletId,walletName:this.walletName,chainId:e})}catch(e){throw ee.error(te.INJECTED_PROVIDER,"External wallet Ethereum switchChain failed",{walletId:this.walletId,walletName:this.walletName,error:e instanceof Error?e.message:String(e)}),e}}async getChainId(){if(typeof this.provider.getChainId=="function"){const n=await this.provider.getChainId();return this._chainId=`0x${n.toString(16)}`,n}const t=await this.request({method:"eth_chainId"}),e=parseInt(t,16);return this._chainId=t,e}async getAccounts(){if(typeof this.provider.getAccounts=="function"){const e=await this.provider.getAccounts();return this._accounts=e,e}const t=await this.request({method:"eth_accounts"});return this._accounts=t,t}isConnected(){return this._connected}setupEventListeners(){typeof this.provider.on=="function"&&(this.provider.on("connect",t=>{this._connected=!0,this._chainId=t.chainId,this.eventEmitter.emit("connect",t)}),this.provider.on("disconnect",t=>{this._connected=!1,this._accounts=[],this.eventEmitter.emit("disconnect",t),this.eventEmitter.emit("accountsChanged",[])}),this.provider.on("accountsChanged",t=>{this._accounts=t,this.eventEmitter.emit("accountsChanged",t)}),this.provider.on("chainChanged",t=>{this._chainId=t,this.eventEmitter.emit("chainChanged",t)}))}on(t,e){this.eventEmitter.on(t,e)}off(t,e){this.eventEmitter.off(t,e)}},oH=class{constructor(t){this._publicKey=null,this.eventEmitter=new _c,this.phantom=t,this.setupEventListeners()}get connected(){return this._publicKey!==null}get publicKey(){return this._publicKey}async connect(t){const e=await this.phantom.solana.connect(t);if(!e)throw new Error("Failed to connect to Solana wallet");const n=typeof e=="string"?e:"";return this._publicKey=n,{publicKey:n}}async disconnect(){await this.phantom.solana.disconnect(),this._publicKey=null}async signMessage(t){const e=typeof t=="string"?new TextEncoder().encode(t):t,n=await this.phantom.solana.signMessage(e);return{signature:n.signature instanceof Uint8Array?n.signature:new Uint8Array(Et.Buffer.from(n.signature,"base64")),publicKey:this._publicKey||""}}async signTransaction(t){if(!this.connected)return Promise.reject(new Error("Provider not connected. Call provider connect first."));try{return await this.phantom.solana.signTransaction(t)}catch(e){return Promise.reject(e)}}async signAndSendTransaction(t){return{signature:(await this.phantom.solana.signAndSendTransaction(t)).signature}}async signAllTransactions(t){if(!this.connected)return Promise.reject(new Error("Provider not connected. Call provider connect first."));try{return await this.phantom.solana.signAllTransactions(t)}catch(e){return Promise.reject(e)}}async signAndSendAllTransactions(t){if(!this.connected)return Promise.reject(new Error("Provider not connected. Call provider connect first."));try{return{signatures:(await this.phantom.solana.signAndSendAllTransactions(t)).signatures}}catch(e){return Promise.reject(e)}}switchNetwork(t){return Promise.resolve()}getPublicKey(){return Promise.resolve(this._publicKey)}isConnected(){return this.connected}setupEventListeners(){this.phantom.solana.addEventListener("connect",t=>{this._publicKey=t,this.eventEmitter.emit("connect",t)}),this.phantom.solana.addEventListener("disconnect",()=>{this._publicKey=null,this.eventEmitter.emit("disconnect")}),this.phantom.solana.addEventListener("accountChanged",t=>{this._publicKey=t,this.eventEmitter.emit("accountChanged",t)})}on(t,e){this.eventEmitter.on(t,e)}off(t,e){this.eventEmitter.off(t,e)}},aH=class{constructor(t){this._chainId="0x1",this._accounts=[],this.eventEmitter=new _c,this.phantom=t,this.setupEventListeners()}get connected(){return this._accounts.length>0}get chainId(){return this._chainId}get accounts(){return this._accounts}async request(t){if(t.method==="eth_signTransaction"){const[n]=t.params;return await this.signTransaction(n)}return await(await this.phantom.ethereum.getProvider()).request(t)}async connect(){const t=await this.phantom.ethereum.getAccounts();return this._accounts=t,t}async disconnect(){await this.phantom.ethereum.disconnect(),this._accounts=[]}async signPersonalMessage(t,e){return await this.phantom.ethereum.signPersonalMessage(t,e)}async signTypedData(t,e){return await this.phantom.ethereum.signTypedData(t,e)}async signTransaction(t){return await this.phantom.ethereum.signTransaction(t)}async sendTransaction(t){return await this.phantom.ethereum.sendTransaction(t)}async switchChain(t){const e=typeof t=="string"?t.toLowerCase().startsWith("0x")?t:`0x${parseInt(t,10).toString(16)}`:`0x${t.toString(16)}`;await this.phantom.ethereum.switchChain(e),this._chainId=e,this.eventEmitter.emit("chainChanged",this._chainId)}async getChainId(){const t=await this.phantom.ethereum.getChainId();return parseInt(t,16)}async getAccounts(){return await this.phantom.ethereum.getAccounts()}isConnected(){return this.connected}setupEventListeners(){this.phantom.ethereum.addEventListener("connect",t=>{this._accounts=t,this.eventEmitter.emit("connect",{chainId:this._chainId}),this.eventEmitter.emit("accountsChanged",t)}),this.phantom.ethereum.addEventListener("disconnect",()=>{this._accounts=[],this.eventEmitter.emit("disconnect",{code:4900,message:"Provider disconnected"}),this.eventEmitter.emit("accountsChanged",[])}),this.phantom.ethereum.addEventListener("accountsChanged",t=>{this._accounts=t,this.eventEmitter.emit("accountsChanged",t)}),this.phantom.ethereum.addEventListener("chainChanged",t=>{this._chainId=t,this.eventEmitter.emit("chainChanged",t)})}on(t,e){this.eventEmitter.on(t,e)}off(t,e){this.eventEmitter.off(t,e)}};function yi(t){return t!==void 0&&t.id==="phantom"&&"isPhantom"in t&&t.isPhantom===!0}var cH=class{constructor(){this.wallets=new Map,this.discoveryPromise=null}register(t){const e={};t.providers?.solana&&(t.providers.solana&&typeof t.providers.solana=="object"&&"features"in t.providers.solana&&typeof t.providers.solana.features=="object"?(e.solana=new iH(t.providers.solana,t.id,t.name),ee.log(te.BROWSER_SDK,"Wrapped Wallet Standard Solana wallet with adapter",{walletId:t.id,walletName:t.name})):(e.solana=new rH(t.providers.solana,t.id,t.name),ee.log(te.BROWSER_SDK,"Wrapped Solana provider with InjectedWalletSolanaChain",{walletId:t.id,walletName:t.name}))),t.providers?.ethereum&&(e.ethereum=new sH(t.providers.ethereum,t.id,t.name),ee.log(te.BROWSER_SDK,"Wrapped Ethereum provider with InjectedWalletEthereumChain",{walletId:t.id,walletName:t.name}));const n={...t,providers:Object.keys(e).length>0?e:t.providers};this.wallets.set(t.id,n)}registerPhantom(t,e){const n={};e.includes(yt.solana)&&t.solana&&(n.solana=new oH(t),ee.log(te.BROWSER_SDK,"Created PhantomSolanaChain wrapper",{walletId:"phantom"})),e.includes(yt.ethereum)&&t.ethereum&&(n.ethereum=new aH(t),ee.log(te.BROWSER_SDK,"Created PhantomEthereumChain wrapper",{walletId:"phantom"}));const r={id:"phantom",name:"Phantom",icon:"",addressTypes:e,providers:n,isPhantom:!0,phantomInstance:t,discovery:"phantom"};this.wallets.set("phantom",r),ee.log(te.BROWSER_SDK,"Registered Phantom wallet with chain wrappers",{addressTypes:e,hasSolana:!!n.solana,hasEthereum:!!n.ethereum})}unregister(t){this.wallets.delete(t)}has(t){return this.wallets.has(t)}getById(t){return this.wallets.get(t)}getAll(){return Array.from(this.wallets.values())}getByAddressTypes(t){if(t.length===0)return this.getAll();const e=new Set(t);return this.getAll().filter(n=>n.addressTypes.some(r=>e.has(r)))}discover(t){return this.discoveryPromise?this.discoveryPromise:(ee.log(te.BROWSER_SDK,"Starting wallet discovery",{addressTypes:t}),this.discoveryPromise=nH(t).then(e=>{const n=t?e.filter(r=>r.addressTypes.some(i=>t.includes(i))):e;for(const r of n)r.id==="phantom"&&yi(r)?this.registerPhantom(r.phantomInstance,r.addressTypes):this.register(r),ee.log(te.BROWSER_SDK,"Registered discovered wallet",{id:r.id,name:r.name,addressTypes:r.addressTypes});ee.info(te.BROWSER_SDK,"Wallet discovery completed",{totalDiscovered:e.length,relevantWallets:n.length})}).catch(e=>{throw ee.warn(te.BROWSER_SDK,"Wallet discovery failed",{error:e}),this.discoveryPromise=null,e}),this.discoveryPromise)}},n0=null;function TT(){return n0||(n0=new cH),n0}var r0="phantom-injected-was-connected",i_="true",s_="phantom-injected-last-wallet-id",lH=class{constructor(t){this.selectedWalletId=null,this.walletStates=new Map,this.eventListeners=new Map,this.browserInjectedCleanupFunctions=[],this.eventsInitialized=!1,this.externalWalletEventListenersSetup=new Set,ee.log(te.INJECTED_PROVIDER,"Initializing InjectedProvider",{config:t}),this.addressTypes=t.addressTypes,this.walletRegistry=TT(),ee.log(te.INJECTED_PROVIDER,"Address types configured",{addressTypes:this.addressTypes}),this.walletRegistry.discover(this.addressTypes).catch(e=>{ee.warn(te.INJECTED_PROVIDER,"Wallet discovery failed during initialization",{error:e})}),ee.info(te.INJECTED_PROVIDER,"InjectedProvider initialized")}async waitForWalletDiscovery(t){if(!this.walletRegistry.has(t)){ee.log(te.INJECTED_PROVIDER,"Wallet not found in registry, waiting for discovery",{walletId:t});try{await this.walletRegistry.discover(this.addressTypes),ee.log(te.INJECTED_PROVIDER,"Wallet discovery completed",{walletId:t})}catch(e){ee.warn(te.INJECTED_PROVIDER,"Wallet discovery failed",{walletId:t,error:e instanceof Error?e.message:String(e)})}}}get solana(){if(!this.addressTypes.includes(yt.solana))throw new Error("Solana not enabled for this provider");const t=this.selectedWalletId||"phantom",e=this.walletRegistry.getById(t);if(!e)throw this.walletRegistry.discoveryPromise?new Error(`Wallet "${t}" not found. Wallet discovery is still in progress. Please wait for sdk.discoverWallets() to complete before accessing chain properties.`):new Error(`Wallet "${t}" not found. Please ensure wallet discovery has completed. Make sure you call sdk.discoverWallets() and await it before accessing chain properties.`);if(!e.providers?.solana)throw new Error(`Selected wallet "${e.name}" does not support Solana. This wallet only supports: ${e.addressTypes.join(", ")}. Make sure your SDK config includes Solana in addressTypes.`);return e.providers.solana}get ethereum(){if(!this.addressTypes.includes(yt.ethereum))throw new Error("Ethereum not enabled for this provider");const t=this.selectedWalletId||"phantom",e=this.walletRegistry.getById(t);if(!e)throw this.walletRegistry.discoveryPromise?new Error(`Wallet "${t}" not found. Wallet discovery is still in progress. Please wait for sdk.discoverWallets() to complete before accessing chain properties.`):new Error(`Wallet "${t}" not found. Please ensure wallet discovery has completed. Make sure you call sdk.discoverWallets() and await it before accessing chain properties.`);if(!e.providers?.ethereum)throw new Error(`Selected wallet "${e.name}" does not support Ethereum. This wallet only supports: ${e.addressTypes.join(", ")}. Make sure your SDK config includes Ethereum in addressTypes.`);return e.providers.ethereum}validateAndSelectWallet(t){if(!this.walletRegistry.has(t))throw ee.error(te.INJECTED_PROVIDER,"Unknown injected wallet id requested",{walletId:t}),new Error(`Unknown injected wallet id: ${t}`);const e=this.walletRegistry.getById(t);if(!e||!e.providers)throw ee.warn(te.INJECTED_PROVIDER,"Wallet not available for connection",{walletId:t}),new Error(`Wallet not available for connection: ${t}`);return this.selectedWalletId=t,ee.log(te.INJECTED_PROVIDER,"Selected injected wallet for connection",{walletId:t}),e}async connectToWallet(t,e){if(!t.providers){const r=new Error(`Wallet adapter not available for wallet: ${this.selectedWalletId}`);throw ee.error(te.INJECTED_PROVIDER,"Wallet adapter not available",{walletId:this.selectedWalletId}),this.emit("connect_error",{error:r.message,source:e?.skipEventListeners?"auto-connect":"manual-connect"}),r}ee.log(te.INJECTED_PROVIDER,"Connecting via wallet",{walletId:this.selectedWalletId,walletName:t.name,options:e}),e?.skipEventListeners||(this.setupExternalWalletEvents(t),this.selectedWalletId==="phantom"&&yi(t)&&(this.browserInjectedCleanupFunctions.forEach(r=>r()),this.browserInjectedCleanupFunctions=[],this.setupBrowserInjectedEvents(),this.eventsInitialized=!0));const n=[];if(this.addressTypes.includes(yt.solana)&&t.providers?.solana){ee.log(te.INJECTED_PROVIDER,"Attempting Solana connection",{walletId:this.selectedWalletId,walletName:t.name,onlyIfTrusted:e?.onlyIfTrusted});try{const i=(await t.providers.solana.connect(e?.onlyIfTrusted?{onlyIfTrusted:!0}:void 0)).publicKey;n.push({addressType:yt.solana,address:i}),ee.info(te.INJECTED_PROVIDER,"Solana connected successfully",{address:i,walletId:this.selectedWalletId,walletName:t.name})}catch(r){throw ee.warn(te.INJECTED_PROVIDER,"Failed to connect Solana, stopping",{error:r,walletId:this.selectedWalletId,walletName:t.name}),this.emit("connect_error",{error:r instanceof Error?r.message:"Failed to connect",source:e?.skipEventListeners?"auto-connect":"manual-connect"}),r}}if(this.addressTypes.includes(yt.ethereum)&&t.providers?.ethereum){ee.log(te.INJECTED_PROVIDER,"Attempting Ethereum connection",{walletId:this.selectedWalletId,walletName:t.name,silent:e?.silent});try{let r;e?.silent?r=await t.providers.ethereum.request({method:"eth_accounts"}):r=await t.providers.ethereum.connect(),r.length>0&&(n.push(...r.map(i=>({addressType:yt.ethereum,address:i}))),ee.info(te.INJECTED_PROVIDER,"Ethereum connected successfully",{addresses:r,walletId:this.selectedWalletId,walletName:t.name}))}catch(r){throw ee.warn(te.INJECTED_PROVIDER,"Failed to connect Ethereum, stopping",{error:r,walletId:this.selectedWalletId,walletName:t.name}),this.emit("connect_error",{error:r instanceof Error?r.message:"Failed to connect",source:e?.skipEventListeners?"auto-connect":"manual-connect"}),r}}return n}async finalizeConnection(t,e,n){if(t.length===0){const a=new Error("Failed to connect to any supported wallet provider");throw this.emit("connect_error",{error:a.message,source:"manual-connect"}),a}this.selectedWalletId&&this.setWalletState(this.selectedWalletId,{connected:!0,addresses:t}),ee.log(te.INJECTED_PROVIDER,"Finalized connection with addresses",{addressCount:t.length,addresses:t.map(a=>({type:a.addressType,address:a.address.substring(0,10)+"..."}))});const r=await this.getAuthUserId("manual-connect");try{localStorage.setItem(r0,i_),ee.log(te.INJECTED_PROVIDER,"Set was-connected flag - auto-reconnect enabled"),this.selectedWalletId&&(localStorage.setItem(s_,this.selectedWalletId),ee.log(te.INJECTED_PROVIDER,"Stored last injected wallet id",{walletId:this.selectedWalletId}))}catch(a){ee.warn(te.INJECTED_PROVIDER,"Failed to persist injected provider state",{error:a})}const i=n?this.walletRegistry.getById(n):void 0,s=i?{id:i.id,name:i.name,icon:i.icon,addressTypes:i.addressTypes,rdns:i.rdns,discovery:i.discovery}:void 0,o={addresses:t,status:"completed",authUserId:r,authProvider:e,walletId:n,wallet:s};return this.emit("connect",{addresses:t,source:"manual-connect",authUserId:r}),o}async connect(t){if(ee.info(te.INJECTED_PROVIDER,"Starting injected provider connect",{addressTypes:this.addressTypes,provider:t.provider}),t.provider!=="injected")throw new Error(`Invalid provider for injected connection: ${t.provider}. Must be "injected"`);this.emit("connect_start",{source:"manual-connect",providerType:"injected"});try{const e=t.walletId||"phantom",n=this.validateAndSelectWallet(e),r=await this.connectToWallet(n);return await this.finalizeConnection(r,"injected",this.selectedWalletId||void 0)}catch(e){throw this.emit("connect_error",{error:e instanceof Error?e.message:"Failed to connect",source:"manual-connect"}),e}}async disconnect(){ee.info(te.INJECTED_PROVIDER,"Starting injected provider disconnect");const t=this.walletRegistry.getById(this.selectedWalletId||"phantom");if(t?.providers){if(this.addressTypes.includes(yt.solana)&&t.providers.solana)try{await t.providers.solana.disconnect(),ee.log(te.INJECTED_PROVIDER,"Solana disconnected successfully")}catch(e){ee.warn(te.INJECTED_PROVIDER,"Failed to disconnect Solana",{error:e})}if(this.addressTypes.includes(yt.ethereum)&&t.providers.ethereum)try{await t.providers.ethereum.disconnect(),ee.log(te.INJECTED_PROVIDER,"Ethereum disconnected successfully")}catch(e){ee.warn(te.INJECTED_PROVIDER,"Failed to disconnect Ethereum",{error:e})}}this.browserInjectedCleanupFunctions.forEach(e=>e()),this.browserInjectedCleanupFunctions=[],this.selectedWalletId&&(this.externalWalletEventListenersSetup.delete(this.selectedWalletId),this.setWalletState(this.selectedWalletId,{connected:!1,addresses:[]}));try{localStorage.removeItem(r0),ee.log(te.INJECTED_PROVIDER,"Cleared was connected flag to prevent auto-reconnect")}catch(e){ee.warn(te.INJECTED_PROVIDER,"Failed to clear was-connected flag",{error:e})}this.emit("disconnect",{source:"manual-disconnect"}),ee.info(te.INJECTED_PROVIDER,"Injected provider disconnected successfully")}async autoConnect(){ee.log(te.INJECTED_PROVIDER,"Attempting auto-connect");let t=null;try{if(localStorage.getItem(r0)!==i_){ee.log(te.INJECTED_PROVIDER,"Skipping auto-connect: user was not previously connected");return}t=localStorage.getItem(s_),ee.log(te.INJECTED_PROVIDER,"User was previously connected, attempting auto-connect",{lastWalletId:t||"phantom"})}catch(e){ee.warn(te.INJECTED_PROVIDER,"Failed to check was-connected flag",{error:e});return}this.emit("connect_start",{source:"auto-connect",providerType:"injected"});try{const e=t||"phantom";await this.waitForWalletDiscovery(e);const n=this.validateAndSelectWallet(e);let r=[];try{r=await this.connectToWallet(n,{onlyIfTrusted:!0,silent:!0,skipEventListeners:!0})}catch(s){ee.log(te.INJECTED_PROVIDER,"Auto-connect failed (expected if not trusted)",{error:s,walletId:this.selectedWalletId})}if(r.length===0){ee.log(te.INJECTED_PROVIDER,"Auto-connect failed: no trusted connections available"),this.emit("connect_error",{error:"No trusted connections available",source:"auto-connect"});return}this.setupExternalWalletEvents(n),this.selectedWalletId==="phantom"&&yi(n)&&(this.browserInjectedCleanupFunctions.forEach(s=>s()),this.browserInjectedCleanupFunctions=[],this.setupBrowserInjectedEvents(),this.eventsInitialized=!0),this.selectedWalletId&&this.setWalletState(this.selectedWalletId,{connected:!0,addresses:r});const i=await this.getAuthUserId("auto-connect");this.emit("connect",{addresses:r,source:"auto-connect",authUserId:i}),ee.info(te.INJECTED_PROVIDER,"Auto-connect successful",{addressCount:r.length,addresses:r.map(s=>({type:s.addressType,address:s.address.substring(0,8)+"..."})),walletId:this.selectedWalletId,authUserId:i})}catch(e){ee.log(te.INJECTED_PROVIDER,"Auto-connect failed with error",{error:e instanceof Error?e.message:String(e)}),this.emit("connect_error",{error:e instanceof Error?e.message:"Auto-connect failed",source:"auto-connect"})}}getWalletState(t){return this.walletStates.has(t)||this.walletStates.set(t,{connected:!1,addresses:[]}),this.walletStates.get(t)}setWalletState(t,e){this.walletStates.set(t,e)}getAddresses(){const t=this.selectedWalletId||"phantom";return this.getWalletState(t).addresses}getEnabledAddressTypes(){if(!this.selectedWalletId||this.selectedWalletId==="phantom")return this.addressTypes;const t=this.walletRegistry.getById(this.selectedWalletId);return t?t.addressTypes:this.addressTypes}isConnected(){const t=this.selectedWalletId||"phantom";return this.getWalletState(t).connected}async enableAutoConfirm(t){const e=this.walletRegistry.getById(this.selectedWalletId||"phantom");if(!yi(e))throw new Error("Auto-confirm is only available for Phantom wallet");return ee.log(te.INJECTED_PROVIDER,"Enabling autoConfirm",{params:t}),await e.phantomInstance.autoConfirm.autoConfirmEnable(t)}async disableAutoConfirm(){const t=this.walletRegistry.getById(this.selectedWalletId||"phantom");if(!yi(t))throw new Error("Auto-confirm is only available for Phantom wallet");ee.log(te.INJECTED_PROVIDER,"Disabling autoConfirm"),await t.phantomInstance.autoConfirm.autoConfirmDisable()}async getAutoConfirmStatus(){const t=this.walletRegistry.getById(this.selectedWalletId||"phantom");if(!yi(t))throw new Error("Auto-confirm is only available for Phantom wallet");return ee.log(te.INJECTED_PROVIDER,"Getting autoConfirm status"),await t.phantomInstance.autoConfirm.autoConfirmStatus()}async getSupportedAutoConfirmChains(){const t=this.walletRegistry.getById(this.selectedWalletId||"phantom");if(!yi(t))throw new Error("Auto-confirm is only available for Phantom wallet");return ee.log(te.INJECTED_PROVIDER,"Getting supported autoConfirm chains"),await t.phantomInstance.autoConfirm.autoConfirmSupportedChains()}async getAuthUserId(t){const e=this.walletRegistry.getById(this.selectedWalletId||"phantom");if(yi(e))try{if(window.phantom?.app?.getUser){const r=(await window.phantom.app.getUser())?.authUserId;return r&&ee.log(te.INJECTED_PROVIDER,`Retrieved authUserId from window.phantom.app.getUser() during ${t}`,{authUserId:r}),r}}catch(n){ee.log(te.INJECTED_PROVIDER,`Failed to get user info during ${t} (method may not be supported)`,{error:n})}}on(t,e){ee.log(te.INJECTED_PROVIDER,"Adding event listener",{event:t}),this.eventsInitialized||(this.setupBrowserInjectedEvents(),this.eventsInitialized=!0),this.eventListeners.has(t)||this.eventListeners.set(t,new Set),this.eventListeners.get(t).add(e)}off(t,e){ee.log(te.INJECTED_PROVIDER,"Removing event listener",{event:t}),this.eventListeners.has(t)&&(this.eventListeners.get(t).delete(e),this.eventListeners.get(t).size===0&&this.eventListeners.delete(t))}emit(t,e){ee.log(te.INJECTED_PROVIDER,"Emitting event",{event:t,listenerCount:this.eventListeners.get(t)?.size||0,data:e});const n=this.eventListeners.get(t);n&&n.size>0&&n.forEach(r=>{try{r(e)}catch(i){ee.error(te.INJECTED_PROVIDER,"Event callback error",{event:t,error:i})}})}setupBrowserInjectedEvents(){const t=this.walletRegistry.getById(this.selectedWalletId||"phantom");if(!yi(t)){ee.log(te.INJECTED_PROVIDER,"Skipping browser-injected-sdk event setup - not Phantom wallet");return}ee.log(te.INJECTED_PROVIDER,"Setting up browser-injected-sdk event listeners"),this.selectedWalletId==="phantom"&&yi(t)&&(this.addressTypes.includes(yt.solana)&&this.setupSolanaEvents(t.phantomInstance),this.addressTypes.includes(yt.ethereum)&&this.setupEthereumEvents(t.phantomInstance))}setupSolanaEvents(t){ee.log(te.INJECTED_PROVIDER,"Setting up Solana event listeners");const e=async a=>{ee.log(te.INJECTED_PROVIDER,"Solana connect event received",{publicKey:a});const c=this.selectedWalletId||"phantom",l=this.getWalletState(c),u={addressType:yt.solana,address:a},f=l.addresses.some(v=>v.addressType===yt.solana)?l.addresses.map(v=>v.addressType===yt.solana?u:v):[...l.addresses,u];this.setWalletState(c,{connected:!0,addresses:f});const g=await this.getAuthUserId("Solana connect event");this.emit("connect",{addresses:f,source:"injected-extension",authUserId:g})},n=()=>{ee.log(te.INJECTED_PROVIDER,"Solana disconnect event received");const a=this.selectedWalletId||"phantom",l=this.getWalletState(a).addresses.filter(u=>u.addressType!==yt.solana);this.setWalletState(a,{connected:l.length>0,addresses:l}),this.emit("disconnect",{source:"injected-extension"})},r=async a=>{ee.log(te.INJECTED_PROVIDER,"Solana account changed event received",{publicKey:a});const c=this.selectedWalletId||"phantom",l=this.getWalletState(c),u=l.addresses.findIndex(g=>g.addressType===yt.solana),d=u>=0?l.addresses.map((g,v)=>v===u?{addressType:yt.solana,address:a}:g):[...l.addresses,{addressType:yt.solana,address:a}];this.setWalletState(c,{connected:!0,addresses:d});const f=await this.getAuthUserId("Solana account changed event");this.emit("connect",{addresses:d,source:"injected-extension-account-change",authUserId:f})},i=t.solana.addEventListener("connect",e),s=t.solana.addEventListener("disconnect",n),o=t.solana.addEventListener("accountChanged",r);this.browserInjectedCleanupFunctions.push(i,s,o)}setupEthereumEvents(t){ee.log(te.INJECTED_PROVIDER,"Setting up Ethereum event listeners");const e=async a=>{ee.log(te.INJECTED_PROVIDER,"Ethereum connect event received",{accounts:a});const c=this.selectedWalletId||"phantom",l=this.getWalletState(c),u=a.map(v=>({addressType:yt.ethereum,address:v})),f=[...l.addresses.filter(v=>v.addressType!==yt.ethereum),...u];this.setWalletState(c,{connected:!0,addresses:f});const g=await this.getAuthUserId("Ethereum connect event");this.emit("connect",{addresses:f,source:"injected-extension",authUserId:g})},n=()=>{ee.log(te.INJECTED_PROVIDER,"Ethereum disconnect event received");const a=this.selectedWalletId||"phantom",l=this.getWalletState(a).addresses.filter(u=>u.addressType!==yt.ethereum);this.setWalletState(a,{connected:l.length>0,addresses:l}),this.emit("disconnect",{source:"injected-extension"})},r=async a=>{ee.log(te.INJECTED_PROVIDER,"Ethereum accounts changed event received",{accounts:a});const c=this.selectedWalletId||"phantom",u=this.getWalletState(c).addresses.filter(d=>d.addressType!==yt.ethereum);if(a&&a.length>0){const d=a.map(v=>({addressType:yt.ethereum,address:v})),f=[...u,...d];this.setWalletState(c,{connected:!0,addresses:f});const g=await this.getAuthUserId("Ethereum accounts changed event");this.emit("connect",{addresses:f,source:"injected-extension-account-change",authUserId:g})}else this.setWalletState(c,{connected:u.length>0,addresses:u}),this.emit("disconnect",{source:"injected-extension-account-change"})},i=t.ethereum.addEventListener("connect",e),s=t.ethereum.addEventListener("disconnect",n),o=t.ethereum.addEventListener("accountsChanged",r);this.browserInjectedCleanupFunctions.push(i,s,o)}setupExternalWalletEvents(t){if(!yi(t)&&!(!this.selectedWalletId||this.externalWalletEventListenersSetup.has(this.selectedWalletId))){if(ee.log(te.INJECTED_PROVIDER,"Setting up external wallet event listeners",{walletId:this.selectedWalletId}),t.providers?.ethereum){const e=async n=>{ee.log(te.INJECTED_PROVIDER,"External wallet Ethereum accounts changed event received",{walletId:this.selectedWalletId,accounts:n});const r=this.selectedWalletId,s=this.getWalletState(r).addresses.filter(o=>o.addressType!==yt.ethereum);if(n&&n.length>0){const o=n.map(l=>({addressType:yt.ethereum,address:l})),a=[...s,...o];this.setWalletState(r,{connected:!0,addresses:a}),ee.log(te.INJECTED_PROVIDER,"Updated Ethereum addresses after account change",{walletId:r,oldCount:0,newCount:n.length,addresses:a.filter(l=>l.addressType===yt.ethereum)});const c=await this.getAuthUserId("External wallet Ethereum accounts changed event");this.emit("connect",{addresses:a,source:"external-wallet-account-change",authUserId:c})}else this.setWalletState(r,{connected:s.length>0,addresses:s}),this.emit("disconnect",{source:"external-wallet-account-change"})};typeof t.providers.ethereum.on=="function"&&(t.providers.ethereum.on("accountsChanged",e),this.browserInjectedCleanupFunctions.push(()=>{typeof t.providers?.ethereum?.off=="function"&&t.providers.ethereum.off("accountsChanged",e)}))}if(t.providers?.solana){const e=async n=>{ee.log(te.INJECTED_PROVIDER,"External wallet Solana account changed event received",{walletId:this.selectedWalletId,publicKey:n});const r=this.selectedWalletId,s=this.getWalletState(r).addresses.filter(o=>o.addressType!==yt.solana);if(n){const o=[...s,{addressType:yt.solana,address:n}];this.setWalletState(r,{connected:!0,addresses:o});const a=await this.getAuthUserId("External wallet Solana account changed event");this.emit("connect",{addresses:o,source:"external-wallet-account-change",authUserId:a})}else this.setWalletState(r,{connected:s.length>0,addresses:s}),this.emit("disconnect",{source:"external-wallet-account-change"})};typeof t.providers.solana.on=="function"&&(t.providers.solana.on("accountChanged",e),this.browserInjectedCleanupFunctions.push(()=>{typeof t.providers?.solana?.off=="function"&&t.providers.solana.off("accountChanged",e)}))}this.selectedWalletId&&this.externalWalletEventListenersSetup.add(this.selectedWalletId)}}},uH=class{constructor(){this.dbName="phantom-browser-sdk",this.storeName="sessions",this.version=1}async getDB(){return new Promise((t,e)=>{const n=indexedDB.open(this.dbName,this.version);n.onerror=()=>e(n.error),n.onsuccess=()=>t(n.result),n.onupgradeneeded=r=>{const i=r.target.result;i.objectStoreNames.contains(this.storeName)||i.createObjectStore(this.storeName)}})}async getSession(){ee.log(te.STORAGE,"Getting session from IndexedDB");const t=await this.getDB();return new Promise((e,n)=>{const s=t.transaction([this.storeName],"readonly").objectStore(this.storeName).get("currentSession");s.onsuccess=()=>{const o=s.result||null;ee.log(te.STORAGE,"Retrieved session from IndexedDB",{hasSession:!!o,sessionId:o?.sessionId}),e(o)},s.onerror=()=>{ee.error(te.STORAGE,"Failed to get session from IndexedDB",{error:s.error}),n(s.error)}})}async saveSession(t){ee.log(te.STORAGE,"Saving session to IndexedDB",{sessionId:t.sessionId,walletId:t.walletId,status:t.status});const e=await this.getDB();return new Promise((n,r)=>{const o=e.transaction([this.storeName],"readwrite").objectStore(this.storeName).put(t,"currentSession");o.onsuccess=()=>{ee.log(te.STORAGE,"Successfully saved session to IndexedDB"),n()},o.onerror=()=>{ee.error(te.STORAGE,"Failed to save session to IndexedDB",{error:o.error}),r(o.error)}})}async clearSession(){ee.log(te.STORAGE,"Clearing session from IndexedDB");const t=await this.getDB();return new Promise((e,n)=>{const s=t.transaction([this.storeName],"readwrite").objectStore(this.storeName).delete("currentSession");s.onsuccess=()=>{ee.log(te.STORAGE,"Successfully cleared session from IndexedDB"),e()},s.onerror=()=>{ee.error(te.STORAGE,"Failed to clear session from IndexedDB",{error:s.error}),n(s.error)}})}async getShouldClearPreviousSession(){ee.log(te.STORAGE,"Getting shouldClearPreviousSession flag from IndexedDB");const t=await this.getDB();return new Promise((e,n)=>{const s=t.transaction([this.storeName],"readonly").objectStore(this.storeName).get("shouldClearPreviousSession");s.onsuccess=()=>{const o=s.result??!1;ee.log(te.STORAGE,"Retrieved shouldClearPreviousSession flag from IndexedDB",{shouldClear:o}),e(o)},s.onerror=()=>{ee.error(te.STORAGE,"Failed to get shouldClearPreviousSession flag from IndexedDB",{error:s.error}),n(s.error)}})}async setShouldClearPreviousSession(t){ee.log(te.STORAGE,"Setting shouldClearPreviousSession flag in IndexedDB",{should:t});const e=await this.getDB();return new Promise((n,r)=>{const o=e.transaction([this.storeName],"readwrite").objectStore(this.storeName).put(t,"shouldClearPreviousSession");o.onsuccess=()=>{ee.log(te.STORAGE,"Successfully set shouldClearPreviousSession flag in IndexedDB"),n()},o.onerror=()=>{ee.error(te.STORAGE,"Failed to set shouldClearPreviousSession flag in IndexedDB",{error:o.error}),r(o.error)}})}},dH=class{getParam(t){return new URLSearchParams(window.location.search).get(t)}};function fH(t,e){let n="unknown",r="unknown";if(!t||typeof t!="string")return{name:n,version:r,userAgent:"unknown"};try{if(t.includes("Edg/")){n="edge";const i=t.match(/Edg\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("OPR/")||t.includes("Opera/")){n="opera";const i=t.match(/(?:OPR|Opera)\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("SamsungBrowser/")){n="samsung";const i=t.match(/SamsungBrowser\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("DuckDuckGo/")){n="duckduckgo";const i=t.match(/DuckDuckGo\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("Chrome/")&&e){n="brave";const i=t.match(/Chrome\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("Mobile/")||t.includes("Android"))if(t.includes("Chrome/")){n="chrome-mobile";const i=t.match(/Chrome\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("Firefox/")){n="firefox-mobile";const i=t.match(/Firefox\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("Safari/")&&t.includes("Mobile/")){n="safari-mobile";const i=t.match(/Version\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else n="mobile";else if(t.includes("Chrome/")){n="chrome";const i=t.match(/Chrome\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("Firefox/")){n="firefox";const i=t.match(/Firefox\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}else if(t.includes("Safari/")&&!t.includes("Chrome/")){n="safari";const i=t.match(/Version\/([0-9]+(?:\.[0-9]+)*)/);i&&(r=i[1].split(".")[0])}if(n==="unknown"){const i=[{regex:/Chrome\/([0-9]+)/,name:"chrome"},{regex:/Firefox\/([0-9]+)/,name:"firefox"},{regex:/Safari\/([0-9]+)/,name:"safari"},{regex:/Edge\/([0-9]+)/,name:"edge"},{regex:/Opera\/([0-9]+)/,name:"opera"}];for(const s of i){const o=t.match(s.regex);if(o){n=s.name,r=o[1];break}}}}catch{}return{name:n,version:r,userAgent:t}}function Ky(){if(typeof window>"u"||!window.navigator?.userAgent)return{name:"unknown",version:"unknown",userAgent:"unknown"};const t=window.navigator.userAgent,e=!!navigator.brave;return fH(t,e)}function hH(){const{name:t,version:e}=Ky();return e!=="unknown"?`${t}-v${e}`:t}var pH=class{constructor(t){this.urlParamsAccessor=t}getValidatedCurrentUrl(){const t=window.location.href;if(!t.startsWith("http:")&&!t.startsWith("https:"))throw new Error("Invalid URL protocol - only HTTP/HTTPS URLs are supported");return t}authenticate(t){return new Promise(e=>{if("jwtToken"in t)throw new Error("JWT authentication should be handled by the core JWTAuth class");const n=t;ee.info(te.PHANTOM_CONNECT_AUTH,"Starting Phantom Connect authentication",{publicKey:n.publicKey,appId:n.appId,provider:n.provider,authUrl:n.authUrl});const r=n.authUrl||TR;ee.log(te.PHANTOM_CONNECT_AUTH,"Using auth URL",{baseUrl:r});const i=new URLSearchParams({public_key:n.publicKey,app_id:n.appId,redirect_uri:n.redirectUrl||(typeof window<"u"?this.getValidatedCurrentUrl():""),session_id:n.sessionId,clear_previous_session:(n.clearPreviousSession??!1).toString(),allow_refresh:(n.allowRefresh??!0).toString(),sdk_version:"1.0.0",sdk_type:"browser",platform:Ky().name});n.provider?(ee.log(te.PHANTOM_CONNECT_AUTH,"Provider specified, will skip selection",{provider:n.provider}),i.append("provider",n.provider)):(ee.log(te.PHANTOM_CONNECT_AUTH,"No provider specified, defaulting to Google"),i.append("provider","google"));const s={publicKey:n.publicKey,appId:n.appId,provider:n.provider,sessionId:n.sessionId};sessionStorage.setItem("phantom-auth-context",JSON.stringify(s)),ee.log(te.PHANTOM_CONNECT_AUTH,"Stored auth context in session storage",{authContext:s});const o=`${r}?${i.toString()}`;if(ee.info(te.PHANTOM_CONNECT_AUTH,"Redirecting to Phantom Connect",{authUrl:o}),!o.startsWith("https:")&&!o.startsWith("http://localhost"))throw new Error("Invalid auth URL - only HTTPS URLs are allowed for authentication");window.location.href=o,e()})}resumeAuthFromRedirect(t){try{const e=this.urlParamsAccessor.getParam("wallet_id"),n=this.urlParamsAccessor.getParam("session_id"),r=this.urlParamsAccessor.getParam("selected_account_index"),i=this.urlParamsAccessor.getParam("error"),s=this.urlParamsAccessor.getParam("error_description");if(i){const d=s||i;switch(i){case"access_denied":throw new Error(`Authentication cancelled: ${d}`);case"invalid_request":throw new Error(`Invalid authentication request: ${d}`);case"server_error":throw new Error(`Authentication server error: ${d}`);case"temporarily_unavailable":throw new Error(`Authentication service temporarily unavailable: ${d}`);default:throw new Error(`Authentication failed: ${d}`)}}if(!e||!n)return ee.log(te.PHANTOM_CONNECT_AUTH,"Missing auth parameters in URL",{hasWalletId:!!e,hasSessionId:!!n}),null;const o=sessionStorage.getItem("phantom-auth-context");let a={};if(o)try{a=JSON.parse(o)}catch(d){ee.warn(te.PHANTOM_CONNECT_AUTH,"Failed to parse stored auth context",{error:d})}if(a.sessionId&&n!==a.sessionId)throw ee.error(te.PHANTOM_CONNECT_AUTH,"Session ID mismatch",{urlSessionId:n,storedSessionId:a.sessionId}),new Error("Session ID mismatch - possible session corruption or replay attack");sessionStorage.removeItem("phantom-auth-context"),ee.info(te.PHANTOM_CONNECT_AUTH,"Successfully resumed auth from redirect",{walletId:e,sessionId:n,accountDerivationIndex:r?parseInt(r):void 0});const c=this.urlParamsAccessor.getParam("organization_id"),l=this.urlParamsAccessor.getParam("expires_in_ms"),u=this.urlParamsAccessor.getParam("auth_user_id");if(ee.log(te.PHANTOM_CONNECT_AUTH,"Auth redirect parameters",{walletId:e,organizationId:c,sessionId:n,accountDerivationIndex:r,expiresInMs:l,authUserId:u}),!c)throw ee.error(te.PHANTOM_CONNECT_AUTH,"Missing organization_id in auth response"),new Error("Missing organization_id in auth response");return c.startsWith("temp-")&&ee.warn(te.PHANTOM_CONNECT_AUTH,"Received temporary organization_id, server may not be configured properly",{organizationId:c}),{walletId:e,organizationId:c,accountDerivationIndex:r?parseInt(r):0,expiresInMs:l?parseInt(l):0,authUserId:u||void 0,provider:t}}catch(e){throw sessionStorage.removeItem("phantom-auth-context"),e}}};async function mH(t=3e3){if(!await gH(t))return!1;try{if(!window.phantom?.app?.features||typeof window.phantom.app.features!="function")return!1;const n=await window.phantom.app.features();return Array.isArray(n.features)?n.features.includes("phantom_login"):!1}catch(n){return console.error("Error checking Phantom extension features",n),!1}}async function gH(t){return new Promise(e=>{const n=Date.now(),r=100,i=()=>{try{if(Zf()){e(!0);return}}catch{}if(Date.now()-n>=t){e(!1);return}setTimeout(i,r)};i()})}var yH=class{isAvailable(){return Zf()}async authenticate(t){if(!this.isAvailable())throw new Error("Phantom extension is not installed. Please install the Phantom browser extension to use this authentication method.");if(!await mH())throw new Error("Phantom Login is not available. Please update your Phantom extension to use this authentication method.");try{if(!window.phantom?.app?.login)throw new Error("Phantom extension login method not found");const n=await window.phantom.app.login({publicKey:t.publicKey,appId:t.appId,sessionId:t.sessionId});if(!n||!n.walletId||!n.organizationId)throw new Error("Invalid authentication response from Phantom extension");return{walletId:n.walletId,organizationId:n.organizationId,provider:"phantom",accountDerivationIndex:n.accountDerivationIndex??0,expiresInMs:n.expiresInMs??0,authUserId:n.authUserId}}catch(n){throw n instanceof Error?n:new Error(`Phantom extension authentication failed: ${String(n)}`)}}},wH=class{info(t,e,n){ee.info(t,e,n)}warn(t,e,n){ee.warn(t,e,n)}error(t,e,n){ee.error(t,e,n)}log(t,e,n){ee.log(t,e,n)}},vH=class extends Gj{constructor(t){ee.log(te.EMBEDDED_PROVIDER,"Initializing Browser EmbeddedProvider",{config:t});const e=new dH,n=new Yj({dbName:`phantom-embedded-sdk-${t.appId}`,storeName:"crypto-keys",keyName:"signing-key"}),r=hH(),{name:i,version:s}=Ky(),o={storage:new uH,authProvider:new pH(e),phantomAppProvider:new yH,urlParamsAccessor:e,stamper:n,name:r,analyticsHeaders:{[ya.SDK_TYPE]:"browser",[ya.PLATFORM]:i,[ya.PLATFORM_VERSION]:s,[ya.APP_ID]:t.appId,[ya.WALLET_TYPE]:t.embeddedWalletType,[ya.SDK_VERSION]:"1.0.0"}};ee.log(te.EMBEDDED_PROVIDER,"Detected platform",{platformName:r});const a=new wH;super(t,o,a),this.addressTypes=t.addressTypes,ee.info(te.EMBEDDED_PROVIDER,"Browser EmbeddedProvider initialized")}getEnabledAddressTypes(){return this.addressTypes}};function EH(t){if(typeof window>"u")return!1;const e=new URLSearchParams(window.location.search),n=e.get("response_type"),r=e.get("session_id");return n==="failure"&&!!r}function bH(t){if(typeof window>"u")return!1;const e=new URLSearchParams(window.location.search);return!!(e.get("session_id")&&(e.has("response_type")||e.has("wallet_id")))}function _H(t){if(!window.location.href.startsWith("http:")&&!window.location.href.startsWith("https:"))throw new Error("Invalid URL protocol - only HTTP/HTTPS URLs are supported for deeplinks");return`https://phantom.app/ul/browse/${encodeURIComponent(window.location.href)}`}var SH=class{constructor(t){this.providers=new Map,this.currentProvider=null,this.currentProviderKey=null,this.eventListeners=new Map,this.providerForwardingSetup=new WeakSet,ee.log(te.PROVIDER_MANAGER,"Initializing ProviderManager",{config:t}),this.config=t,ee.log(te.PROVIDER_MANAGER,"Setting default provider"),this.setDefaultProvider(),ee.info(te.PROVIDER_MANAGER,"ProviderManager initialized",{currentProviderKey:this.currentProviderKey})}getValidatedCurrentUrl(){if(typeof window>"u")return"";const t=window.location.href;if(!t.startsWith("http:")&&!t.startsWith("https:"))throw new Error("Invalid URL protocol - only HTTP/HTTPS URLs are supported");return t}switchProvider(t,e){if(e?.embeddedWalletType&&!["app-wallet","user-wallet"].includes(e.embeddedWalletType))throw new Error(`Invalid embeddedWalletType: ${e.embeddedWalletType}. Must be "app-wallet" or "user-wallet".`);const n=this.getProviderKey(t,e?.embeddedWalletType);return this.providers.has(n)||this.createProvider(t,e?.embeddedWalletType),this.currentProvider=this.providers.get(n),this.currentProviderKey=n,this.ensureProviderEventForwarding(),this.currentProvider}getCurrentProvider(){return this.currentProvider}getCurrentProviderInfo(){if(!this.currentProviderKey)return null;const t=this.currentProviderKey.split("-"),[e,n]=t;return{type:e,embeddedWalletType:n}}isProviderAllowed(t){return this.config.providers.includes(t)}async connect(t){if(ee.info(te.PROVIDER_MANAGER,"Starting connection",{currentProviderKey:this.currentProviderKey,authOptions:{provider:t.provider}}),!this.isProviderAllowed(t.provider)){const i=`Provider "${t.provider}" is not in the allowed providers list: ${JSON.stringify(this.config.providers)}`;throw ee.error(te.PROVIDER_MANAGER,i),new Error(i)}const e=t.provider;let n=null;if(e==="injected")n="injected";else if(e==="deeplink")try{const i=_H();return typeof window<"u"&&(window.location.href=i),{addresses:[],walletId:void 0,authUserId:void 0}}catch(i){const s=i instanceof Error?i.message:"Failed to open deeplink";throw ee.error(te.PROVIDER_MANAGER,"Deeplink error",{error:s}),new Error(`Failed to open deeplink: ${s}`)}else Af.includes(e)&&(n="embedded");if(n){const i=this.getCurrentProviderInfo();if(i?.type!==n){ee.log(te.PROVIDER_MANAGER,"Auto-switching provider based on auth options",{from:i?.type,to:n,requestedProvider:e});const s={};n==="embedded"&&(s.embeddedWalletType=i?.embeddedWalletType||this.config.embeddedWalletType),this.switchProvider(n,s)}}if(!this.currentProvider)throw ee.error(te.PROVIDER_MANAGER,"No provider selected"),new Error("No provider selected");ee.log(te.PROVIDER_MANAGER,"Delegating to provider connect method");const r=await this.currentProvider.connect(t);return ee.log(te.PROVIDER_MANAGER,"Connection successful, saving preferences",{addressCount:r.addresses?.length||0,provider:t.provider}),this.saveProviderPreference(),ee.info(te.PROVIDER_MANAGER,"Connect completed",{addresses:r.addresses,provider:t.provider}),r}async disconnect(){this.currentProvider&&await this.currentProvider.disconnect()}getAddresses(){return this.currentProvider?this.currentProvider.getAddresses():[]}isConnected(){return this.currentProvider?.isConnected()??!1}async autoConnect(){if(ee.log(te.PROVIDER_MANAGER,"Starting auto-connect with fallback strategy"),EH())return ee.warn(te.PROVIDER_MANAGER,"Auth failure detected in URL, skipping autoConnect fallback"),!1;const t=this.config.embeddedWalletType||"user-wallet",e=this.getProviderKey("embedded",t);if(this.config.providers.some(s=>s!=="injected")&&this.providers.has(e)){ee.log(te.PROVIDER_MANAGER,"Trying auto-connect with existing embedded provider");const s=this.providers.get(e);try{const o=this.currentProvider,a=this.currentProviderKey;if(this.currentProvider=s,this.currentProviderKey=e,this.ensureProviderEventForwarding(),await s.autoConnect(),s.isConnected())return ee.info(te.PROVIDER_MANAGER,"Embedded auto-connect successful"),this.saveProviderPreference(),!0;ee.log(te.PROVIDER_MANAGER,"Embedded provider did not connect, restoring previous provider"),this.currentProvider=o,this.currentProviderKey=a}catch(o){if(ee.log(te.PROVIDER_MANAGER,"Embedded auto-connect failed",{error:o.message}),bH())return ee.log(te.PROVIDER_MANAGER,"In auth callback URL, not attempting injected fallback"),!1}}const r=this.config.providers.includes("injected"),i=this.getProviderKey("injected");if(r&&this.providers.has(i)){ee.log(te.PROVIDER_MANAGER,"Trying auto-connect with existing injected provider");const s=this.providers.get(i);try{if(this.currentProvider=s,this.currentProviderKey=i,this.ensureProviderEventForwarding(),await s.autoConnect(),s.isConnected())return ee.info(te.PROVIDER_MANAGER,"Injected auto-connect successful"),this.saveProviderPreference(),!0}catch(o){ee.log(te.PROVIDER_MANAGER,"Injected auto-connect failed",{error:o.message})}}return ee.log(te.PROVIDER_MANAGER,"Auto-connect failed for all allowed providers"),!1}on(t,e){ee.log(te.PROVIDER_MANAGER,"Adding event listener",{event:t}),this.eventListeners.has(t)||this.eventListeners.set(t,new Set),this.eventListeners.get(t).add(e),this.ensureProviderEventForwarding()}off(t,e){ee.log(te.PROVIDER_MANAGER,"Removing event listener",{event:t}),this.eventListeners.has(t)&&(this.eventListeners.get(t).delete(e),this.eventListeners.get(t).size===0&&this.eventListeners.delete(t))}emit(t,e){ee.log(te.PROVIDER_MANAGER,"Emitting event to stored callbacks",{event:t,listenerCount:this.eventListeners.get(t)?.size||0,data:e});const n=this.eventListeners.get(t);n&&n.size>0?n.forEach(r=>{try{ee.log(te.PROVIDER_MANAGER,"Calling stored callback for event",{event:t}),r(e)}catch(i){ee.error(te.PROVIDER_MANAGER,"Event callback error",{event:t,error:i})}}):ee.warn(te.PROVIDER_MANAGER,"No stored callbacks for event",{event:t})}ensureProviderEventForwarding(){if(!this.currentProvider||!("on"in this.currentProvider)){ee.warn(te.PROVIDER_MANAGER,"Current provider does not support events",{providerType:this.getCurrentProviderInfo()?.type});return}if(this.providerForwardingSetup.has(this.currentProvider)){ee.log(te.PROVIDER_MANAGER,"Event forwarding already set up for current provider");return}ee.log(te.PROVIDER_MANAGER,"Setting up event forwarding from current provider");const t=["connect_start","connect","connect_error","disconnect","error","spending_limit_reached"];for(const e of t){const n=r=>{ee.log(te.PROVIDER_MANAGER,"Forwarding event from provider",{event:e,data:r}),this.emit(e,r)};ee.log(te.PROVIDER_MANAGER,"Attaching forwarding callback for event",{event:e}),this.currentProvider.on(e,n)}this.providerForwardingSetup.add(this.currentProvider)}setDefaultProvider(){const t=this.config.embeddedWalletType||"user-wallet",e=this.config.providers.includes("injected"),n=this.config.providers.some(s=>s!=="injected"&&s!=="deeplink");e&&(ee.log(te.PROVIDER_MANAGER,"Creating injected provider (allowed by providers array)"),this.createProvider("injected")),n&&(ee.log(te.PROVIDER_MANAGER,"Creating embedded provider (allowed by providers array)"),this.createProvider("embedded",t));let r;if(n&&this.providers.has(`embedded-${t}`))r="embedded";else if(e&&this.providers.has("injected"))r="injected";else throw new Error("No valid providers could be created from the providers array");const i={};r==="embedded"&&(i.embeddedWalletType=t),this.switchProvider(r,i)}createProvider(t,e){const n=this.getProviderKey(t,e);if(this.providers.has(n))return;let r;if(t==="injected")r=new lH({addressTypes:this.config.addressTypes||[yt.solana]});else if(t==="embedded"){if(!this.config.appId)throw new Error("appId is required for embedded provider");const i=this.config.apiBaseUrl||KD,s=this.config.authOptions?.authUrl||TR;r=new vH({apiBaseUrl:i,appId:this.config.appId,authOptions:{...this.config.authOptions||{},authUrl:s,redirectUrl:this.config.authOptions?.redirectUrl||this.getValidatedCurrentUrl()},embeddedWalletType:e||CR,addressTypes:this.config.addressTypes||[yt.solana]})}else throw new Error(`Unsupported provider type: ${t}`);this.providers.set(n,r)}getProviderKey(t,e){if(t==="injected")return"injected";if(t==="embedded")return`embedded-${e||"app-wallet"}`;throw new Error(`Unsupported provider type: ${t}`)}saveProviderPreference(){try{const t=this.getCurrentProviderInfo();t&&localStorage.setItem("phantom-provider-preference",JSON.stringify(t))}catch(t){console.error("Failed to save provider preference:",t)}}},i0=[...Af,"injected","deeplink"],xH=class{constructor(t){if(this.walletRegistry=TT(),this.isLoading=!0,ee.info(te.BROWSER_SDK,"Initializing BrowserSDK",{providers:t.providers,embeddedWalletType:t.embeddedWalletType,addressTypes:t.addressTypes}),!Array.isArray(t.providers)||t.providers.length===0)throw ee.error(te.BROWSER_SDK,"Invalid providers array",{providers:t.providers}),new Error("providers must be a non-empty array of AuthProviderType");const e=t.providers.filter(i=>!i0.includes(i));if(e.length>0)throw ee.error(te.BROWSER_SDK,"Invalid provider types",{invalidProviders:e,validProviders:i0}),new Error(`Invalid provider type(s): ${e.join(", ")}. Valid providers are: ${i0.join(", ")}`);if(t.providers.some(i=>i!=="injected")&&!t.appId)throw ee.error(te.BROWSER_SDK,"appId required for embedded providers",{providers:t.providers}),new Error("appId is required when using embedded providers (google, apple, phantom, etc.)");const r=t.embeddedWalletType||CR;if(!["app-wallet","user-wallet"].includes(r))throw ee.error(te.BROWSER_SDK,"Invalid embeddedWalletType",{embeddedWalletType:t.embeddedWalletType}),new Error(`Invalid embeddedWalletType: ${t.embeddedWalletType}. Must be "app-wallet" or "user-wallet".`);this.config=t,this.providerManager=new SH(t),this.discoverWallets()}discoverWallets(){return this.walletRegistry.discover(this.config.addressTypes).finally(()=>{this.isLoading=!1})}get solana(){const t=this.providerManager.getCurrentProvider();if(!t)throw new Error("No provider available. Call connect() first.");return t.solana}get ethereum(){const t=this.providerManager.getCurrentProvider();if(!t)throw new Error("No provider available. Call connect() first.");return t.ethereum}async connect(t){ee.info(te.BROWSER_SDK,"Starting connection",t);try{const e=await this.providerManager.connect(t);return ee.info(te.BROWSER_SDK,"Connection successful",{addressCount:e.addresses.length,status:e.status}),e}catch(e){throw ee.error(te.BROWSER_SDK,"Connection failed",{error:e.message}),e}}async disconnect(){ee.info(te.BROWSER_SDK,"Disconnecting");try{await this.providerManager.disconnect(),ee.info(te.BROWSER_SDK,"Disconnection successful")}catch(t){throw ee.error(te.BROWSER_SDK,"Disconnection failed",{error:t.message}),t}}isConnected(){return this.providerManager.isConnected()}getAddresses(){return this.providerManager.getAddresses()}getCurrentProviderInfo(){return this.providerManager.getCurrentProviderInfo()}getEnabledAddressTypes(){const t=this.providerManager.getCurrentProvider();return t?t.getEnabledAddressTypes():[]}on(t,e){ee.log(te.BROWSER_SDK,"Adding event listener",{event:t}),this.providerManager.on(t,e)}off(t,e){ee.log(te.BROWSER_SDK,"Removing event listener",{event:t}),this.providerManager.off(t,e)}async autoConnect(){ee.log(te.BROWSER_SDK,"Attempting auto-connect with fallback strategy"),await this.providerManager.autoConnect()?ee.info(te.BROWSER_SDK,"Auto-connect successful",{providerType:this.getCurrentProviderInfo()?.type}):ee.log(te.BROWSER_SDK,"Auto-connect failed for all providers")}enableDebug(){ee.enable(),ee.info(te.BROWSER_SDK,"Debug logging enabled")}disableDebug(){ee.disable()}setDebugLevel(t){ee.setLevel(t),ee.info(te.BROWSER_SDK,"Debug level updated",{level:t})}setDebugCallback(t){ee.setCallback(t),ee.info(te.BROWSER_SDK,"Debug callback updated")}configureDebug(t){t.enabled!==void 0&&(t.enabled?this.enableDebug():this.disableDebug()),t.level!==void 0&&this.setDebugLevel(t.level),t.callback!==void 0&&this.setDebugCallback(t.callback)}async enableAutoConfirm(t){ee.info(te.BROWSER_SDK,"Enabling auto-confirm",{params:t});const e=this.providerManager.getCurrentProvider();if(!e)throw new Error("No provider available. Call connect() first.");if(!("enableAutoConfirm"in e))throw new Error("Auto-confirm is only available for injected providers");try{const n=await e.enableAutoConfirm(t);return ee.info(te.BROWSER_SDK,"Auto-confirm enabled successfully",{result:n}),n}catch(n){throw ee.error(te.BROWSER_SDK,"Failed to enable auto-confirm",{error:n.message}),n}}async disableAutoConfirm(){ee.info(te.BROWSER_SDK,"Disabling auto-confirm");const t=this.providerManager.getCurrentProvider();if(!t)throw new Error("No provider available. Call connect() first.");if(!("disableAutoConfirm"in t))throw new Error("Auto-confirm is only available for injected providers");try{await t.disableAutoConfirm(),ee.info(te.BROWSER_SDK,"Auto-confirm disabled successfully")}catch(e){throw ee.error(te.BROWSER_SDK,"Failed to disable auto-confirm",{error:e.message}),e}}async getAutoConfirmStatus(){ee.info(te.BROWSER_SDK,"Getting auto-confirm status");const t=this.providerManager.getCurrentProvider();if(!t)throw new Error("No provider available. Call connect() first.");if(!("getAutoConfirmStatus"in t))throw new Error("Auto-confirm is only available for injected providers");try{const e=await t.getAutoConfirmStatus();return ee.info(te.BROWSER_SDK,"Got auto-confirm status",{result:e}),e}catch(e){throw ee.error(te.BROWSER_SDK,"Failed to get auto-confirm status",{error:e.message}),e}}async getSupportedAutoConfirmChains(){ee.info(te.BROWSER_SDK,"Getting supported auto-confirm chains");const t=this.providerManager.getCurrentProvider();if(!t)throw new Error("No provider available. Call connect() first.");if(!("getSupportedAutoConfirmChains"in t))throw new Error("Auto-confirm is only available for injected providers");try{const e=await t.getSupportedAutoConfirmChains();return ee.info(te.BROWSER_SDK,"Got supported auto-confirm chains",{result:e}),e}catch(e){throw ee.error(te.BROWSER_SDK,"Failed to get supported auto-confirm chains",{error:e.message}),e}}getDiscoveredWallets(){ee.log(te.BROWSER_SDK,"Getting discovered wallets");try{const t=this.walletRegistry.getByAddressTypes(this.config.addressTypes);return ee.log(te.BROWSER_SDK,"Retrieved discovered wallets",{count:t.length,walletIds:t.map(e=>e.id)}),t}catch(t){return ee.error(te.BROWSER_SDK,"Failed to get discovered wallets",{error:t.message}),[]}}};function AH(t){let e="";for(let n=0;n<t.length;n++)e+=String.fromCharCode(t[n]);return btoa(e)}const o_=new xH({providers:["injected"],addressTypes:[yt.solana]});class CT{async Login(e){if(!e||e.trim().length===0)throw new Error("Message is required.");const{addresses:n}=await o_.connect({provider:"injected"});if(console.log("Connected addresses:",n[0].address),!n?.[0])throw new Error("No account returned from MetaMask.");const i=await o_.solana.signMessage(e);return{signature:AH(i.signature),message:e,accountId:n[0].address,accountType:"SOLANA"}}isPhantomInstalled(){if(typeof window>"u")return!1;const e=window.isPhantomInstalled;return e||!1}}function a_(t){const e=new Date,n=new Date(Date.now()+300*1e3);return[t,`Issued At: ${e.toISOString()}`,`Expires At: ${n.toISOString()}`].join(`
564
- `)}function RH(t){window.open(t,"_blank","noopener,noreferrer")}const IH=({open:t,onClose:e,onSigned:n})=>{const[r,i]=Xe.useState(null),[,s]=Xe.useState(null),o=Xe.useMemo(()=>new tR,[]),a=o.isMetamaskInstalled(),c=Xe.useMemo(()=>new CT,[]),l=c.isPhantomInstalled(),u=[{name:"metamask",title:"Metamask",logoUrl:"/assets/wallets/metamask.svg",downloadUrl:"https://metamask.io/download",detected:a,onClick:async()=>{s(null),i("metamask");try{const d=a_("PeridotVault Login"),f=await o.Login(d);await n(f),e()}catch(d){const f=d instanceof Error?d.message:"Failed to connect MetaMask.";s(f)}finally{i(null)}}},{name:"phantom",title:"Phantom",logoUrl:"/assets/wallets/phantom.svg",downloadUrl:"https://phantom.com/download",detected:l,onClick:async()=>{s(null),i("phantom");try{const d=a_("PeridotVault Login"),f=await c.Login(d);await n(f),e()}catch(d){const f=d instanceof Error?d.message:"Failed to connect Phantom.";s(f)}finally{i(null)}}}];return vt.jsx(LO,{children:t&&vt.jsx(av.div,{className:"backdrop-blur-sm top-0 left-0 bg-black/50 fixed z-50 w-full h-full flex justify-center items-start",onClick:e,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},children:vt.jsxs(av.div,{className:"bg-card rounded-b-4xl p-8 max-w-130 w-full flex flex-col gap-8 items-center border-x border-b border-foreground/20",role:"dialog","aria-label":"Required Password",initial:{y:"-100%",opacity:0},animate:{y:0,opacity:1},exit:{y:"-100%",opacity:0},transition:{type:"spring",stiffness:480,damping:42,mass:.8},onClick:d=>d.stopPropagation(),children:[vt.jsxs("div",{className:"flex flex-col items-center text-center",children:[vt.jsx("h2",{className:"text-xl font-medium",children:"Connect a Wallet"}),vt.jsx("p",{children:"Connect your wallet to Login PeridotVault"})]}),vt.jsx(TH,{}),vt.jsxs("div",{className:"w-full flex justify-center text-center relative",children:[vt.jsx("hr",{className:"border-foreground/10 absolute w-full top-1/2"}),vt.jsx("span",{className:"text-sm text-muted-foreground px-4 z-10 bg-card",children:"Other wallets"})]}),vt.jsx("div",{className:"bg-background w-full rounded-xl overflow-hidden",children:u.map((d,f)=>vt.jsx(CH,{isFirst:f==0,item:d,loading:r===d.name},f))}),vt.jsx("div",{className:"w-full flex justify-center text-center",children:vt.jsx("span",{className:"text-sm text-muted-foreground",children:"By connecting a wallet, you agree to PeridotVault Terms of Service and consent to its Privacy Policy"})})]})})})},TH=()=>vt.jsxs(VS,{disabled:!0,className:"relative overflow-hidden bg-linear-to-tr from-highlight/80 from-5% to-accent/80 rounded-xl opacity-50 cursor-not-allowed",children:[vt.jsxs("div",{className:"flex items-center gap-2",children:[vt.jsx("div",{className:"h-12 w-12 overflow-hidden",children:vt.jsx("img",{src:"/assets/wallets/peridotwallet.svg",alt:"",className:"p-2"})}),vt.jsxs("div",{className:"flex flex-col items-start leading-tight",children:[vt.jsx("span",{children:"Get Peridot Wallet"}),vt.jsx("span",{className:"text-sm font-normal",children:"Comming Soon"})]})]}),vt.jsx("div",{className:""})]}),CH=({isFirst:t,item:e,loading:n})=>{const r=()=>{if(!n){if(e.detected){e.onClick();return}RH(e.downloadUrl)}};return vt.jsxs("div",{className:"",children:[!t&&vt.jsx("hr",{className:"border-foreground/10"}),vt.jsxs(VS,{onClick:r,className:"duration-300 flex items-center justify-between hover:bg-foreground/10 cursor-pointer",children:[vt.jsxs("div",{className:"flex items-center gap-4",children:[vt.jsx("div",{className:"h-12 w-12 aspect-square bg-foreground rounded-md overflow-hidden",children:vt.jsx("img",{src:e.logoUrl,alt:"Logo"+e.title})}),vt.jsx("span",{children:e.title})]}),vt.jsx("div",{className:"text-sm font-normal text-muted-foreground",children:e.detected?"Detected":""})]})]})};function OH(){const[t,e]=Xe.useState(),[n,r]=Xe.useState(!1);return t?vt.jsx("div",{children:vt.jsxs("button",{onClick:()=>r(!n),className:"flex items-center gap-2 active:scale-95 duration-200 cursor-pointer",children:[vt.jsx("div",{className:"w-8 h-8 rounded-lg bg-accent flex items-center justify-center text-highlight text-xl font-black",children:vt.jsx("span",{children:"@"})}),vt.jsx("span",{className:"font-medium",children:kT(t.accountId)})]})}):vt.jsxs("div",{children:[vt.jsx("button",{onClick:()=>r(!n),disabled:n,className:`rounded px-8 py-2 duration-300 font-bold
565
- ${n?"bg-white text-background cursor-not-allowed opacity-60":"bg-accent hover:scale-105 cursor-pointer"} `,children:n?"Connecting...":"Connect"}),vt.jsx(IH,{open:n,onClose:()=>r(!1),onSigned:i=>e(i)})]})}exports.ConnectButton=OH;exports.Metamask=tR;exports.Phantom=CT;
564
+ `)}function RH(t){window.open(t,"_blank","noopener,noreferrer")}const IH=({open:t,onClose:e,onSigned:n})=>{const[r,i]=Xe.useState(null),[,s]=Xe.useState(null),o=Xe.useMemo(()=>new tR,[]),a=o.isMetamaskInstalled(),c=Xe.useMemo(()=>new CT,[]),l=c.isPhantomInstalled(),u=[{name:"metamask",title:"Metamask",logoUrl:"/assets/wallets/metamask.svg",downloadUrl:"https://metamask.io/download",detected:a,onClick:async()=>{s(null),i("metamask");try{const d=a_("PeridotVault Login"),f=await o.Login(d);await n(f),e()}catch(d){const f=d instanceof Error?d.message:"Failed to connect MetaMask.";s(f)}finally{i(null)}}},{name:"phantom",title:"Phantom",logoUrl:"/assets/wallets/phantom.svg",downloadUrl:"https://phantom.com/download",detected:l,onClick:async()=>{s(null),i("phantom");try{const d=a_("PeridotVault Login"),f=await c.Login(d);await n(f),e()}catch(d){const f=d instanceof Error?d.message:"Failed to connect Phantom.";s(f)}finally{i(null)}}}];return vt.jsx(LO,{children:t&&vt.jsx(av.div,{className:"backdrop-blur-sm top-0 left-0 bg-black/50 fixed z-50 w-full h-full flex justify-center items-start",onClick:e,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},children:vt.jsxs(av.div,{className:"bg-card rounded-b-4xl p-8 max-w-130 w-full flex flex-col gap-8 items-center border-x border-b border-foreground/20",role:"dialog","aria-label":"Required Password",initial:{y:"-100%",opacity:0},animate:{y:0,opacity:1},exit:{y:"-100%",opacity:0},transition:{type:"spring",stiffness:480,damping:42,mass:.8},onClick:d=>d.stopPropagation(),children:[vt.jsxs("div",{className:"flex flex-col items-center text-center",children:[vt.jsx("h2",{className:"text-xl font-medium",children:"Connect a Wallet"}),vt.jsx("p",{children:"Connect your wallet to Login PeridotVault"})]}),vt.jsx(TH,{}),vt.jsxs("div",{className:"w-full flex justify-center text-center relative",children:[vt.jsx("hr",{className:"border-foreground/10 absolute w-full top-1/2"}),vt.jsx("span",{className:"text-sm text-muted-foreground px-4 z-10 bg-card",children:"Other wallets"})]}),vt.jsx("div",{className:"bg-background w-full rounded-xl overflow-hidden",children:u.map((d,f)=>vt.jsx(CH,{isFirst:f==0,item:d,loading:r===d.name},f))}),vt.jsx("div",{className:"w-full flex justify-center text-center",children:vt.jsx("span",{className:"text-sm text-muted-foreground",children:"By connecting a wallet, you agree to PeridotVault Terms of Service and consent to its Privacy Policy"})})]})})})},TH=()=>vt.jsxs(VS,{disabled:!0,className:"relative overflow-hidden bg-linear-to-tr from-highlight/80 from-5% to-accent/80 rounded-xl opacity-50 cursor-not-allowed",children:[vt.jsxs("div",{className:"flex items-center gap-2",children:[vt.jsx("div",{className:"h-12 w-12 overflow-hidden",children:vt.jsx("img",{src:"/assets/wallets/peridotwallet.svg",alt:"",className:"p-2"})}),vt.jsxs("div",{className:"flex flex-col items-start leading-tight",children:[vt.jsx("span",{children:"Get Peridot Wallet"}),vt.jsx("span",{className:"text-sm font-normal",children:"Comming Soon"})]})]}),vt.jsx("div",{className:""})]}),CH=({isFirst:t,item:e,loading:n})=>{const r=()=>{if(!n){if(e.detected){e.onClick();return}RH(e.downloadUrl)}};return vt.jsxs("div",{className:"",children:[!t&&vt.jsx("hr",{className:"border-foreground/10"}),vt.jsxs(VS,{onClick:r,className:"duration-300 flex items-center justify-between hover:bg-foreground/10 cursor-pointer",children:[vt.jsxs("div",{className:"flex items-center gap-4",children:[vt.jsx("div",{className:"h-12 w-12 aspect-square bg-foreground rounded-md overflow-hidden",children:vt.jsx("img",{src:e.logoUrl,alt:"Logo"+e.title})}),vt.jsx("span",{children:e.title})]}),vt.jsx("div",{className:"text-sm font-normal text-muted-foreground",children:e.detected?"Detected":""})]})]})};function OH({onSigned:t,onChange:e}){const[n,r]=Xe.useState(),[i,s]=Xe.useState(!1),o=a=>{r(a),e?.(a),a&&t?.(a)};return n?vt.jsx("div",{children:vt.jsxs("button",{onClick:()=>s(!i),className:"flex items-center gap-2 active:scale-95 duration-200 cursor-pointer",children:[vt.jsx("div",{className:"w-8 h-8 rounded-lg bg-accent flex items-center justify-center text-highlight text-xl font-black",children:vt.jsx("span",{children:"@"})}),vt.jsx("span",{className:"font-medium",children:kT(n.accountId)})]})}):vt.jsxs("div",{children:[vt.jsx("button",{onClick:()=>s(!i),disabled:i,className:`rounded px-8 py-2 duration-300 font-bold
565
+ ${i?"bg-white text-background cursor-not-allowed opacity-60":"bg-accent hover:scale-105 cursor-pointer"} `,children:i?"Connecting...":"Connect"}),vt.jsx(IH,{open:i,onClose:()=>s(!1),onSigned:a=>o(a)})]})}exports.ConnectButton=OH;exports.Metamask=tR;exports.Phantom=CT;
package/dist/index.d.ts CHANGED
@@ -1 +1,3 @@
1
- export {}
1
+ export { ConnectButton } from './ConnectButton';
2
+ export * from './services/index';
3
+ export * from './types/index';
package/dist/index.js CHANGED
@@ -41600,35 +41600,37 @@ const VH = ({ open: t, onClose: e, onSigned: n }) => {
41600
41600
  )
41601
41601
  ] });
41602
41602
  };
41603
- function Ez() {
41604
- const [t, e] = Xa(), [n, r] = Xa(!1);
41605
- return t ? /* @__PURE__ */ wt.jsx("div", { children: /* @__PURE__ */ wt.jsxs(
41603
+ function Ez({ onSigned: t, onChange: e }) {
41604
+ const [n, r] = Xa(), [i, s] = Xa(!1), o = (a) => {
41605
+ r(a), e?.(a), a && t?.(a);
41606
+ };
41607
+ return n ? /* @__PURE__ */ wt.jsx("div", { children: /* @__PURE__ */ wt.jsxs(
41606
41608
  "button",
41607
41609
  {
41608
- onClick: () => r(!n),
41610
+ onClick: () => s(!i),
41609
41611
  className: "flex items-center gap-2 active:scale-95 duration-200 cursor-pointer",
41610
41612
  children: [
41611
41613
  /* @__PURE__ */ wt.jsx("div", { className: "w-8 h-8 rounded-lg bg-accent flex items-center justify-center text-highlight text-xl font-black", children: /* @__PURE__ */ wt.jsx("span", { children: "@" }) }),
41612
- /* @__PURE__ */ wt.jsx("span", { className: "font-medium", children: WT(t.accountId) })
41614
+ /* @__PURE__ */ wt.jsx("span", { className: "font-medium", children: WT(n.accountId) })
41613
41615
  ]
41614
41616
  }
41615
41617
  ) }) : /* @__PURE__ */ wt.jsxs("div", { children: [
41616
41618
  /* @__PURE__ */ wt.jsx(
41617
41619
  "button",
41618
41620
  {
41619
- onClick: () => r(!n),
41620
- disabled: n,
41621
+ onClick: () => s(!i),
41622
+ disabled: i,
41621
41623
  className: `rounded px-8 py-2 duration-300 font-bold
41622
- ${n ? "bg-white text-background cursor-not-allowed opacity-60" : "bg-accent hover:scale-105 cursor-pointer"} `,
41623
- children: n ? "Connecting..." : "Connect"
41624
+ ${i ? "bg-white text-background cursor-not-allowed opacity-60" : "bg-accent hover:scale-105 cursor-pointer"} `,
41625
+ children: i ? "Connecting..." : "Connect"
41624
41626
  }
41625
41627
  ),
41626
41628
  /* @__PURE__ */ wt.jsx(
41627
41629
  VH,
41628
41630
  {
41629
- open: n,
41630
- onClose: () => r(!1),
41631
- onSigned: (i) => e(i)
41631
+ open: i,
41632
+ onClose: () => s(!1),
41633
+ onSigned: (a) => o(a)
41632
41634
  }
41633
41635
  )
41634
41636
  ] });
package/dist/main.d.ts ADDED
File without changes
@@ -0,0 +1,2 @@
1
+ export * from './metamask.ts';
2
+ export * from './phantom.ts';
@@ -0,0 +1,12 @@
1
+ import { SignState } from '../types/sign';
2
+ export declare class Metamask {
3
+ /**
4
+ * Signs a login message via MetaMask using personal_sign.
5
+ * Note: returning Promise<SignState> is required because wallet calls are async.
6
+ */
7
+ Login(message: string): Promise<SignState>;
8
+ /**
9
+ * Returns true if MetaMask is installed (or detectable among injected providers).
10
+ */
11
+ isMetamaskInstalled(): boolean;
12
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { SignState } from '../types/sign';
2
+ export declare class Phantom {
3
+ /**
4
+ * Signs a login message via Phantom.
5
+ * Note: returning Promise<SignState> is required because wallet calls are async.
6
+ */
7
+ Login(message: string): Promise<SignState>;
8
+ /**
9
+ * Returns true if Phantom is installed (or detectable among injected providers).
10
+ */
11
+ isPhantomInstalled(): boolean;
12
+ }
@@ -0,0 +1 @@
1
+ export * from './sign.ts';
@@ -0,0 +1,6 @@
1
+ export type SignState = {
2
+ signature?: string;
3
+ message?: string;
4
+ accountId?: string;
5
+ accountType?: string;
6
+ };
@@ -0,0 +1,9 @@
1
+ export type WalletItem = {
2
+ name: string;
3
+ title: string;
4
+ logoUrl: string;
5
+ downloadUrl: string;
6
+ onClick: () => void;
7
+ detected: boolean;
8
+ disabled?: boolean;
9
+ };
@@ -0,0 +1 @@
1
+ export declare function buildChallenge(message: string): string;
@@ -0,0 +1,4 @@
1
+ export declare function bytesToBase64(bytes: Uint8Array): string;
2
+ export declare function base64ToBytes(b64: string): Uint8Array;
3
+ export declare function toArrayBuffer(bytes: Uint8Array): ArrayBuffer;
4
+ export declare function toNumberArray(u8: Uint8Array): number[];
@@ -0,0 +1 @@
1
+ export declare function short(v?: string, head?: number, tail?: number): string;
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "@antigane/wallet-adapters",
3
3
  "private": false,
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "type": "module",
6
+ "homepage": "https://github.com/antiganehq",
7
+ "repository": {
8
+ "url": "git+https://github.com/antiganehq/peridot-ui.git"
9
+ },
6
10
  "files": [
7
11
  "dist",
8
12
  "README.md",