@sign-global/tokentable-wallets 1.0.1 → 1.2.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/providers/evm/index.tsx","../src/utils/index.ts","../src/WalletBase.ts","../src/providers/evm/EvmWallet.ts","../src/providers/ton/index.tsx","../src/providers/ton/TonWallet.ts","../src/providers/solana/index.tsx","../src/WalletFactory.tsx"],"sourcesContent":["export { WalletFactory } from './WalletFactory';\n\nexport * from './providers';\n","import '@rainbow-me/rainbowkit/styles.css';\nimport { RainbowKitProvider, darkTheme, useConnectModal } from '@rainbow-me/rainbowkit';\nimport { ResolvedRegister, WagmiProvider, useAccount, useWalletClient } from 'wagmi';\nimport { ReactNode, useEffect } from 'react';\n\nimport { evmStore, getEventKey, eventBus } from './EvmWallet';\n\nexport { EvmWallet } from './EvmWallet';\n\nexport const EVMConnector = () => {\n const connectModal = useConnectModal();\n const walletClient = useWalletClient();\n const account = useAccount();\n\n evmStore.connectModal = connectModal;\n evmStore.walletClient = walletClient;\n evmStore.account = account;\n\n useEffect(() => {\n if (account.isConnected) {\n const eventKey = getEventKey();\n eventBus.emit(eventKey, account);\n }\n }, [account]);\n\n return null;\n};\n\nexport const EvmProvider = ({\n children,\n config,\n theme\n}: {\n children: ReactNode;\n config: ResolvedRegister['config'];\n theme?: any;\n}) => {\n evmStore.config = config;\n return (\n <WagmiProvider config={config}>\n <RainbowKitProvider\n locale=\"en-US\"\n theme={\n theme ||\n darkTheme({\n accentColor: 'var(--t-primary)',\n accentColorForeground: 'var(--t-button-primary-foreground)'\n })\n }\n >\n {children}\n <EVMConnector />\n </RainbowKitProvider>\n </WagmiProvider>\n );\n};\n","import { getCustomNaNoId } from '@sign-global/tokentable-core';\nimport { ISignInMessage } from '../types';\n\nexport function prepareSignMessage({\n chainId,\n address,\n statement\n}: {\n address: string;\n chainId: number | string;\n statement?: string;\n}): ISignInMessage {\n return {\n statement: statement || 'Welcome to EthSign',\n chainId: chainId,\n address: address,\n issuedAt: new Date().toISOString(),\n domain: window.location.host,\n uri: window.location.origin,\n version: '1',\n nonce: getCustomNaNoId()\n };\n}\n\nexport const get4361Message = ({\n domain,\n version,\n nonce,\n issuedAt,\n statement,\n chainId,\n uri,\n address\n}: ISignInMessage): string => {\n const header = `${domain} wants you to sign in with your Ethereum account:`;\n const uriField = `URI: ${uri}`;\n let prefix = [header, address].join('\\n');\n const versionField = `Version: ${version}`;\n\n // const addressField = `Address: ` + address;\n\n const chainField = `Chain ID: ` + chainId || '1';\n\n const nonceField = `Nonce: ${nonce}`;\n\n const suffixArray = [uriField, versionField, chainField, nonceField];\n\n suffixArray.push(`Issued At: ${issuedAt}`);\n\n const suffix = suffixArray.join('\\n');\n prefix = [prefix, statement].join('\\n\\n');\n if (statement) {\n prefix += '\\n';\n }\n return [prefix, suffix].join('\\n');\n};\n","import { ISignResult } from './types';\nimport { prepareSignMessage } from './utils';\n\nexport abstract class WalletBase<S> {\n type: string;\n provider: any;\n address?: string;\n publicKey?: string;\n chainId?: number | string;\n protocolTag?: string;\n authType: string;\n userAddress?: string;\n network?: string;\n\n constructor(type: string, userAddress?: string) {\n this.type = type;\n this.provider = null;\n this.address = '';\n this.chainId = 1;\n this.authType = '';\n this.userAddress = userAddress || '';\n // this.init();\n }\n\n // abstract init(): void;\n\n // abstract init(): void;\n protected get isConnected(): boolean {\n throw new Error('Not implemented');\n }\n\n abstract connect(_?: string): void;\n\n // common sign\n abstract sign(_: string, _1?: string): Promise<ISignResult>;\n\n // checkAddressValidity(): boolean {\n // console.log(this.userAddress, this.address);\n // if (!this.address) {\n // // 兼容ton的情况,ton只有sign之后才有地址\n // return true;\n // }\n // if (this.userAddress && this.address !== this.userAddress) {\n // console.error('Wallet address and user address do not match.');\n // globalVm.toggleAccountChangedModal(true);\n // return false;\n // }\n // return true;\n // }\n\n async safeSign(_: string, _1?: string): Promise<ISignResult> {\n // if (!this.checkAddressValidity()) {\n // throw new Error('Wallet address and user address do not match.');\n // }\n return this.sign(_, _1);\n }\n\n async signin(statement?: string): Promise<ISignResult> {\n const msgRes = prepareSignMessage({ statement, chainId: this.chainId!, address: this.address! });\n return this.sign(JSON.stringify(msgRes, null, ' '));\n }\n\n // for metamask sign of EIP-712\n signByEIP712(_: string): Promise<ISignResult> {\n throw new Error(`received message:${_},Method not implemented.`);\n }\n\n getSignEIP712Message(_: { chainId: number | string; info: string; hash: string }): string {\n throw new Error(`received message:${JSON.stringify(_)},Method not implemented.`);\n }\n\n getWallet(): {\n address?: string;\n isConnected: boolean;\n publicKey: string | undefined;\n type: string;\n network: string | undefined;\n } {\n // 获取钱包信息\n return {\n type: this.type,\n isConnected: this.isConnected,\n address: this.address,\n publicKey: this.publicKey,\n network: this.network\n };\n }\n\n abstract getStore(): S;\n\n // abstract decrypt(message: string, address: string): Promise<string>;\n}\n","import { useConnectModal } from '@rainbow-me/rainbowkit';\nimport { ResolvedRegister, useAccount, useWalletClient } from 'wagmi';\nimport { WalletBase } from '../../WalletBase';\nimport { disconnect, getAccount, signMessage } from 'wagmi/actions';\nimport { EventEmitter } from 'events';\nimport { ISignResult } from '../../types';\nimport { get4361Message, prepareSignMessage } from '../../utils';\n\nexport const eventBus = new EventEmitter();\n\nconst EVM_EVENT_KEY = 'evm_signin';\n\nexport interface EVMStoreType {\n account: ReturnType<typeof useAccount> | null;\n connectModal: ReturnType<typeof useConnectModal> | undefined;\n walletClient: ReturnType<typeof useWalletClient> | undefined;\n config: ResolvedRegister['config'] | undefined;\n counter: number;\n}\n\nexport const evmStore: EVMStoreType = {\n account: null,\n connectModal: undefined,\n walletClient: undefined,\n config: undefined,\n counter: 0\n};\n\nexport const getEventKey = () => {\n return `${EVM_EVENT_KEY}_${evmStore.counter}`;\n};\n\nexport class EvmWallet extends WalletBase<EVMStoreType> {\n get isConnected() {\n return !!(evmStore.account?.address && evmStore.account?.isConnected);\n }\n\n connect() {\n evmStore?.connectModal?.openConnectModal?.();\n }\n\n async disconnect() {\n await disconnect(evmStore.config!);\n }\n\n async sign(_message: string) {\n try {\n const sign = await signMessage(evmStore.config!, {\n message: _message\n });\n return {\n message: _message,\n signature: sign\n };\n } catch (error) {\n throw error;\n }\n }\n\n override async signin(statement: string, prepare = true): Promise<ISignResult> {\n return new Promise((resolve, reject) => {\n const signCallback = async (data: ReturnType<typeof useAccount>) => {\n try {\n this.address = data.address;\n this.chainId = data.chainId;\n let fullMessage = statement;\n if (prepare) {\n const msg = prepareSignMessage({ statement, chainId: data.chainId!, address: data.address! });\n fullMessage = get4361Message(msg);\n }\n\n const res = await this.sign(fullMessage);\n\n resolve(res);\n } catch (error) {\n reject(error);\n }\n };\n\n const account = getAccount(evmStore.config!);\n this.provider = evmStore.walletClient;\n\n if (this.isConnected) {\n signCallback(account);\n return;\n }\n\n evmStore.counter++;\n this.connect();\n const eventKey = getEventKey();\n eventBus.once(eventKey, (data) => {\n console.log('listen event key success, event key = %s, data = %j', eventKey, data);\n signCallback(data);\n });\n });\n }\n\n getStore(): EVMStoreType {\n return evmStore;\n }\n}\n","import { ReactNode, useEffect } from 'react';\nimport {\n TonConnectUIProvider,\n useTonConnectUI,\n useTonWallet,\n useTonConnectModal,\n TonConnectUIProviderProps\n} from '@tonconnect/ui-react';\n\nimport { tonStore, eventBus, getEventKey, TonWallet } from './TonWallet';\n\nexport { TonWallet };\n\nexport const TonConnector = () => {\n const wallet = useTonWallet();\n const [tonConnectUI] = useTonConnectUI();\n const connectModal = useTonConnectModal();\n\n tonStore.connectModal = connectModal;\n tonStore.walletClient = tonConnectUI;\n tonStore.account = wallet;\n\n useEffect(() => {\n if (wallet) {\n eventBus.emit(getEventKey(), wallet);\n }\n }, [wallet]);\n\n return null;\n};\n\nexport const TonProvider = ({ children, config }: { children: ReactNode; config: TonConnectUIProviderProps }) => {\n tonStore.config = config;\n\n return (\n <TonConnectUIProvider {...config}>\n {children}\n <TonConnector />\n </TonConnectUIProvider>\n );\n};\n","import {\n useTonConnectUI,\n useTonWallet,\n useTonConnectModal,\n WalletInfoRemote,\n TonConnectUIProviderProps\n} from '@tonconnect/ui-react';\nimport { WalletBase } from '../../WalletBase';\nimport { ISignResult } from '../../types';\nimport { getCustomNaNoId } from '@sign-global/tokentable-core';\nimport { hashSha256 } from '@ethsign/utils-web';\nimport { CHAIN, TonProofItemReplySuccess, toUserFriendlyAddress, Wallet } from '@tonconnect/ui';\nimport { EventEmitter } from 'events';\nimport { Cell } from 'ton-core';\n\nexport interface TonStoreType {\n account: ReturnType<typeof useTonWallet> | null;\n connectModal: ReturnType<typeof useTonConnectModal> | undefined;\n walletClient: ReturnType<typeof useTonConnectUI>[0] | undefined;\n config: TonConnectUIProviderProps | undefined;\n counter: number;\n}\n\nexport const tonStore: TonStoreType = {\n account: null,\n connectModal: undefined,\n walletClient: undefined,\n config: undefined,\n counter: 0\n};\n\nexport const eventBus = new EventEmitter();\n\nexport const getEventKey = () => {\n return `ton_sign_${tonStore.counter}`;\n};\n\nexport class TonWallet extends WalletBase<TonStoreType> {\n get isConnected() {\n return !!tonStore.account?.account;\n }\n\n connect() {\n tonStore?.connectModal?.open?.();\n }\n\n async disconnect() {\n await tonStore.walletClient?.disconnect();\n }\n\n private getPublicKey(stateInit: string): string {\n const state_init = Cell.fromBase64(stateInit);\n const bits = state_init.refs[1].bits;\n const pubKey = bits.toString().substring(16, 80).toLowerCase();\n return pubKey;\n }\n\n async sign(originMsg: string): Promise<ISignResult> {\n const message = await hashSha256(originMsg);\n const tonConnectUI = tonStore.walletClient as any;\n // const walletInfo = tonConnectUI?.wallet;\n const authType = '';\n // if (walletInfo?.jsBridgeKey && walletInfo?.openMethod !== 'qrcode') {\n // authType = walletInfo.jsBridgeKey;\n // }\n\n console.log(this.isConnected, tonConnectUI, 'connected');\n if (this.isConnected) {\n await tonConnectUI.disconnect();\n }\n tonStore.counter++;\n if (authType) {\n const wallets = await tonConnectUI.getWallets();\n\n const currentWallet = wallets.find((wallet: any) =>\n [wallet.name, wallet.appName].includes(authType)\n ) as WalletInfoRemote;\n\n const link = tonConnectUI.connector.connect(\n {\n bridgeUrl: currentWallet.bridgeUrl,\n universalLink: currentWallet.universalLink\n },\n {\n tonProof: message\n }\n );\n\n // tonspace在tg内部打开\n window.open(link);\n } else {\n console.log('first time, call setConnectRequestParameters');\n tonConnectUI.setConnectRequestParameters({\n state: 'ready',\n value: {\n tonProof: message // 不能有空格,特殊字符\n }\n });\n this.connect();\n }\n\n const connectedWallet: Wallet = await new Promise((resolve) => {\n const eventKey = getEventKey();\n console.log('start listen event key, key = %s', eventKey);\n eventBus.once(eventKey, (data) => {\n console.log('listen event key success, event key = %s, data = %j', eventKey, data);\n resolve(data);\n });\n });\n\n this.provider = tonStore.walletClient;\n const proof = (connectedWallet.connectItems?.tonProof as TonProofItemReplySuccess)?.proof;\n this.publicKey = connectedWallet.account.publicKey || this.getPublicKey(connectedWallet.account.walletStateInit); //使用walletStateInit,publicKey由后端计算\n this.address = toUserFriendlyAddress(connectedWallet.account.address);\n this.chainId = connectedWallet.account.chain;\n this.network = this.chainId === CHAIN.MAINNET ? 'TON_MAINNET' : 'TON_TESTNET';\n const fullMessage = JSON.stringify({\n timestamp: proof.timestamp,\n payload: proof.payload,\n domain: proof.domain\n });\n const signature = proof.signature;\n\n return {\n message: JSON.stringify({\n fullMessage,\n message: originMsg\n }),\n signature,\n tonProof: message\n };\n }\n\n override async signin(statement: string, prepare = true): Promise<ISignResult> {\n const fullMessage = prepare\n ? JSON.stringify(\n {\n statement: statement || 'Welcome to EthSign',\n issuedAt: new Date().toISOString(),\n nonce: getCustomNaNoId()\n },\n null,\n ' '\n )\n : statement;\n const signRes = await this.sign(fullMessage);\n return signRes;\n }\n\n getStore(): TonStoreType {\n return tonStore;\n }\n}\n","import { ReactNode, useCallback, useEffect, useMemo } from 'react';\nimport { WalletBase } from '../../WalletBase';\nimport { useWalletModal, WalletModalProvider } from '@solana/wallet-adapter-react-ui';\nimport '@solana/wallet-adapter-react-ui/styles.css';\nimport { ISignResult } from '../../types';\nimport { ConnectionProvider, useWallet, WalletProvider } from '@solana/wallet-adapter-react';\nimport { PhantomWalletAdapter, TrustWalletAdapter, LedgerWalletAdapter } from '@solana/wallet-adapter-wallets';\nimport { type Adapter } from '@solana/wallet-adapter-base';\n\nimport { Cluster } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport { get4361Message, prepareSignMessage } from '../../utils';\nimport EventEmitter from 'events';\nimport { clusterApiUrl } from '@sign-global/tokentable-core';\n\ninterface SolStoreType {\n connectModal: ReturnType<typeof useWalletModal> | null;\n account: ReturnType<typeof useWallet> | null;\n counter: number;\n}\n\nconst solStore: SolStoreType = {\n connectModal: null,\n account: null,\n counter: 0\n};\n\nexport const eventBus = new EventEmitter();\n\nconst SOL_EVENT_KEY = 'sol_signin';\n\nexport const getEventKey = () => {\n return `${SOL_EVENT_KEY}_${solStore.counter}`;\n};\n\nexport class SolWallet extends WalletBase<SolStoreType> {\n getStore(): SolStoreType {\n return solStore;\n }\n get isConnected() {\n return !!solStore.account?.connected;\n }\n connect(): void {\n solStore.connectModal?.setVisible(true);\n }\n\n disconnect() {\n solStore.account?.disconnect();\n }\n\n async sign(message: string): Promise<ISignResult> {\n try {\n const provider = solStore.account!;\n const encodedMessage = new TextEncoder().encode(message);\n const signedMessage = await provider.signMessage?.(encodedMessage);\n\n return {\n message,\n signature: bs58.encode(signedMessage!)\n };\n } catch (error) {\n console.error(error);\n throw error;\n }\n }\n\n signin(statement: string, prepare = true): Promise<ISignResult> {\n return new Promise((resolve) => {\n const signCallback = (data: ReturnType<typeof useWallet>) => {\n this.publicKey = data.publicKey?.toString();\n this.address = this.publicKey;\n this.chainId = 1;\n let fullMessage = statement;\n if (prepare) {\n const msg = prepareSignMessage({ statement, chainId: '1', address: this.address! });\n fullMessage = get4361Message(msg);\n }\n\n const res = this.sign(fullMessage);\n\n resolve(res);\n };\n\n if (this.isConnected) {\n signCallback(solStore.account!);\n return;\n }\n solStore.counter++;\n this.connect();\n const eventKey = getEventKey();\n eventBus.once(eventKey, (data) => {\n console.log('listen event key success, event key = %s, data = %j', eventKey, data);\n signCallback(data);\n });\n });\n }\n}\n\n//Solana connection process: Open the modal first, then manually call wallet connect\nexport const SolConnector = () => {\n const walletModal = useWalletModal();\n const wallet = useWallet();\n\n useEffect(() => {\n if (wallet.wallet) {\n if (wallet.connected) {\n const eventKey = getEventKey();\n eventBus.emit(eventKey, wallet);\n }\n }\n }, [wallet]);\n\n solStore.connectModal = walletModal;\n solStore.account = wallet;\n return null;\n};\n\nexport const SolanaProvider = ({\n children,\n cluster,\n wallets\n}: {\n children: ReactNode;\n cluster?: Cluster;\n wallets?: Adapter[];\n}) => {\n const endpoint = clusterApiUrl(cluster ? cluster : 'mainnet-beta');\n\n const defaultWallets = useMemo(\n () => [new PhantomWalletAdapter(), new TrustWalletAdapter(), new LedgerWalletAdapter()],\n []\n );\n\n const onError = useCallback((error: any) => {\n console.error(error);\n }, []);\n return (\n <ConnectionProvider endpoint={endpoint}>\n <WalletProvider wallets={wallets ? wallets : defaultWallets} onError={onError} autoConnect>\n <WalletModalProvider>\n <SolConnector />\n {children}\n </WalletModalProvider>\n </WalletProvider>\n </ConnectionProvider>\n );\n};\n","import { EvmWallet } from './providers/evm';\nimport { ChainType } from './types';\nimport { TonWallet } from './providers/ton';\nimport { SolWallet } from './providers/solana';\n\nexport abstract class WalletFactory {\n private static instances: Record<string, EvmWallet | TonWallet | SolWallet> = {};\n static getWallet(type: ChainType, userAddress?: string): EvmWallet | TonWallet | SolWallet {\n if (!this.instances[type]) {\n let WalletClass;\n switch (type) {\n case ChainType.Evm:\n WalletClass = EvmWallet;\n break;\n case ChainType.Ton:\n WalletClass = TonWallet;\n break;\n // case ChainType.Starknet:\n // WalletClass = StarknetWallet;\n // break;\n case ChainType.Solana:\n WalletClass = SolWallet;\n break;\n default:\n throw new Error('Unsupported wallet type');\n }\n\n if (!WalletClass) {\n throw new Error('Unsupported wallet type');\n }\n this.instances[type] = new WalletClass(type, userAddress);\n }\n return this.instances[type];\n }\n}\n"],"mappings":"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","names":["import_react","import_tokentable_core","import_events","eventBus","getEventKey","import_jsx_runtime","eventBus","getEventKey","import_react","import_styles","import_events","import_tokentable_core","import_jsx_runtime","eventBus","EventEmitter","getEventKey","bs58"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/providers/evm/index.tsx","../src/utils/index.ts","../src/WalletBase.ts","../src/providers/evm/EvmWallet.ts","../src/providers/ton/index.tsx","../src/providers/ton/TonWallet.ts","../src/providers/solana/index.tsx","../src/utils/ledger/adapter.ts","../src/utils/ledger/polyfills/Buffer.ts","../src/utils/ledger/util.ts","../src/WalletFactory.tsx"],"sourcesContent":["export { WalletFactory } from './WalletFactory';\n\nexport * from './providers';\n","import '@rainbow-me/rainbowkit/styles.css';\nimport { RainbowKitProvider, darkTheme, useConnectModal } from '@rainbow-me/rainbowkit';\nimport { ResolvedRegister, WagmiProvider, useAccount, useWalletClient } from 'wagmi';\nimport { ReactNode, useEffect } from 'react';\n\nimport { evmStore, getEventKey, eventBus } from './EvmWallet';\n\nexport { EvmWallet } from './EvmWallet';\n\nexport const EVMConnector = () => {\n const connectModal = useConnectModal();\n const walletClient = useWalletClient();\n const account = useAccount();\n\n evmStore.connectModal = connectModal;\n evmStore.walletClient = walletClient;\n evmStore.account = account;\n\n useEffect(() => {\n if (account.isConnected) {\n const eventKey = getEventKey();\n eventBus.emit(eventKey, account);\n }\n }, [account]);\n\n return null;\n};\n\nexport const EvmProvider = ({\n children,\n config,\n theme\n}: {\n children: ReactNode;\n config: ResolvedRegister['config'];\n theme?: any;\n}) => {\n evmStore.config = config;\n return (\n <WagmiProvider config={config}>\n <RainbowKitProvider\n locale=\"en-US\"\n theme={\n theme ||\n darkTheme({\n accentColor: 'var(--t-primary)',\n accentColorForeground: 'var(--t-button-primary-foreground)'\n })\n }\n >\n {children}\n <EVMConnector />\n </RainbowKitProvider>\n </WagmiProvider>\n );\n};\n","import { getCustomNaNoId } from '@sign-global/tokentable-core';\nimport { ISignInMessage } from '../types';\n\nexport function prepareSignMessage({\n chainId,\n address,\n statement\n}: {\n address: string;\n chainId: number | string;\n statement?: string;\n}): ISignInMessage {\n return {\n statement: statement || 'Welcome to EthSign',\n chainId: chainId,\n address: address,\n issuedAt: new Date().toISOString(),\n domain: window.location.host,\n uri: window.location.origin,\n version: '1',\n nonce: getCustomNaNoId()\n };\n}\n\nexport const get4361Message = ({\n domain,\n version,\n nonce,\n issuedAt,\n statement,\n chainId,\n uri,\n address\n}: ISignInMessage): string => {\n const header = `${domain} wants you to sign in with your Ethereum account:`;\n const uriField = `URI: ${uri}`;\n let prefix = [header, address].join('\\n');\n const versionField = `Version: ${version}`;\n\n // const addressField = `Address: ` + address;\n\n const chainField = `Chain ID: ` + chainId || '1';\n\n const nonceField = `Nonce: ${nonce}`;\n\n const suffixArray = [uriField, versionField, chainField, nonceField];\n\n suffixArray.push(`Issued At: ${issuedAt}`);\n\n const suffix = suffixArray.join('\\n');\n prefix = [prefix, statement].join('\\n\\n');\n if (statement) {\n prefix += '\\n';\n }\n return [prefix, suffix].join('\\n');\n};\n","import { ISignResult } from './types';\nimport { prepareSignMessage } from './utils';\n\nexport abstract class WalletBase<S> {\n type: string;\n provider: any;\n address?: string;\n publicKey?: string;\n chainId?: number | string;\n protocolTag?: string;\n authType: string;\n userAddress?: string;\n network?: string;\n\n constructor(type: string, userAddress?: string) {\n this.type = type;\n this.provider = null;\n this.address = '';\n this.chainId = 1;\n this.authType = '';\n this.userAddress = userAddress || '';\n // this.init();\n }\n\n // abstract init(): void;\n\n // abstract init(): void;\n protected get isConnected(): boolean {\n throw new Error('Not implemented');\n }\n\n abstract connect(_?: string): void;\n\n // common sign\n abstract sign(_: string, _1?: string): Promise<ISignResult>;\n\n // checkAddressValidity(): boolean {\n // console.log(this.userAddress, this.address);\n // if (!this.address) {\n // // 兼容ton的情况,ton只有sign之后才有地址\n // return true;\n // }\n // if (this.userAddress && this.address !== this.userAddress) {\n // console.error('Wallet address and user address do not match.');\n // globalVm.toggleAccountChangedModal(true);\n // return false;\n // }\n // return true;\n // }\n\n async safeSign(_: string, _1?: string): Promise<ISignResult> {\n // if (!this.checkAddressValidity()) {\n // throw new Error('Wallet address and user address do not match.');\n // }\n return this.sign(_, _1);\n }\n\n async signin(statement?: string): Promise<ISignResult> {\n const msgRes = prepareSignMessage({ statement, chainId: this.chainId!, address: this.address! });\n return this.sign(JSON.stringify(msgRes, null, ' '));\n }\n\n // for metamask sign of EIP-712\n signByEIP712(_: string): Promise<ISignResult> {\n throw new Error(`received message:${_},Method not implemented.`);\n }\n\n getSignEIP712Message(_: { chainId: number | string; info: string; hash: string }): string {\n throw new Error(`received message:${JSON.stringify(_)},Method not implemented.`);\n }\n\n getWallet(): {\n address?: string;\n isConnected: boolean;\n publicKey: string | undefined;\n type: string;\n network: string | undefined;\n } {\n // 获取钱包信息\n return {\n type: this.type,\n isConnected: this.isConnected,\n address: this.address,\n publicKey: this.publicKey,\n network: this.network\n };\n }\n\n abstract getStore(): S;\n\n // abstract decrypt(message: string, address: string): Promise<string>;\n}\n","import { useConnectModal } from '@rainbow-me/rainbowkit';\nimport { ResolvedRegister, useAccount, useWalletClient } from 'wagmi';\nimport { WalletBase } from '../../WalletBase';\nimport { disconnect, getAccount, signMessage } from 'wagmi/actions';\nimport { EventEmitter } from 'events';\nimport { ISignResult } from '../../types';\nimport { get4361Message, prepareSignMessage } from '../../utils';\n\nexport const eventBus = new EventEmitter();\n\nconst EVM_EVENT_KEY = 'evm_signin';\n\nexport interface EVMStoreType {\n account: ReturnType<typeof useAccount> | null;\n connectModal: ReturnType<typeof useConnectModal> | undefined;\n walletClient: ReturnType<typeof useWalletClient> | undefined;\n config: ResolvedRegister['config'] | undefined;\n counter: number;\n}\n\nexport const evmStore: EVMStoreType = {\n account: null,\n connectModal: undefined,\n walletClient: undefined,\n config: undefined,\n counter: 0\n};\n\nexport const getEventKey = () => {\n return `${EVM_EVENT_KEY}_${evmStore.counter}`;\n};\n\nexport class EvmWallet extends WalletBase<EVMStoreType> {\n get isConnected() {\n return !!(evmStore.account?.address && evmStore.account?.isConnected);\n }\n\n connect() {\n evmStore?.connectModal?.openConnectModal?.();\n }\n\n async disconnect() {\n await disconnect(evmStore.config!);\n }\n\n async sign(_message: string) {\n try {\n const sign = await signMessage(evmStore.config!, {\n message: _message\n });\n return {\n message: _message,\n signature: sign\n };\n } catch (error) {\n throw error;\n }\n }\n\n override async signin(statement: string, prepare = true): Promise<ISignResult> {\n return new Promise((resolve, reject) => {\n const signCallback = async (data: ReturnType<typeof useAccount>) => {\n try {\n this.address = data.address;\n this.chainId = data.chainId;\n let fullMessage = statement;\n if (prepare) {\n const msg = prepareSignMessage({ statement, chainId: data.chainId!, address: data.address! });\n fullMessage = get4361Message(msg);\n }\n\n const res = await this.sign(fullMessage);\n\n resolve(res);\n } catch (error) {\n reject(error);\n }\n };\n\n const account = getAccount(evmStore.config!);\n this.provider = evmStore.walletClient;\n\n if (this.isConnected) {\n signCallback(account);\n return;\n }\n\n evmStore.counter++;\n this.connect();\n const eventKey = getEventKey();\n eventBus.once(eventKey, (data) => {\n console.log('listen event key success, event key = %s, data = %j', eventKey, data);\n signCallback(data);\n });\n });\n }\n\n getStore(): EVMStoreType {\n return evmStore;\n }\n}\n","import { ReactNode, useEffect } from 'react';\nimport {\n TonConnectUIProvider,\n useTonConnectUI,\n useTonWallet,\n useTonConnectModal,\n TonConnectUIProviderProps\n} from '@tonconnect/ui-react';\n\nimport { tonStore, eventBus, getEventKey, TonWallet } from './TonWallet';\n\nexport { TonWallet };\n\nexport const TonConnector = () => {\n const wallet = useTonWallet();\n const [tonConnectUI] = useTonConnectUI();\n const connectModal = useTonConnectModal();\n\n tonStore.connectModal = connectModal;\n tonStore.walletClient = tonConnectUI;\n tonStore.account = wallet;\n\n useEffect(() => {\n if (wallet) {\n eventBus.emit(getEventKey(), wallet);\n }\n }, [wallet]);\n\n return null;\n};\n\nexport const TonProvider = ({ children, config }: { children: ReactNode; config: TonConnectUIProviderProps }) => {\n tonStore.config = config;\n\n return (\n <TonConnectUIProvider {...config}>\n {children}\n <TonConnector />\n </TonConnectUIProvider>\n );\n};\n","import {\n useTonConnectUI,\n useTonWallet,\n useTonConnectModal,\n WalletInfoRemote,\n TonConnectUIProviderProps\n} from '@tonconnect/ui-react';\nimport { WalletBase } from '../../WalletBase';\nimport { ISignResult } from '../../types';\nimport { getCustomNaNoId } from '@sign-global/tokentable-core';\nimport { hashSha256 } from '@ethsign/utils-web';\nimport { CHAIN, TonProofItemReplySuccess, toUserFriendlyAddress, Wallet } from '@tonconnect/ui';\nimport { EventEmitter } from 'events';\nimport { Cell } from 'ton-core';\n\nexport interface TonStoreType {\n account: ReturnType<typeof useTonWallet> | null;\n connectModal: ReturnType<typeof useTonConnectModal> | undefined;\n walletClient: ReturnType<typeof useTonConnectUI>[0] | undefined;\n config: TonConnectUIProviderProps | undefined;\n counter: number;\n}\n\nexport const tonStore: TonStoreType = {\n account: null,\n connectModal: undefined,\n walletClient: undefined,\n config: undefined,\n counter: 0\n};\n\nexport const eventBus = new EventEmitter();\n\nexport const getEventKey = () => {\n return `ton_sign_${tonStore.counter}`;\n};\n\nexport class TonWallet extends WalletBase<TonStoreType> {\n get isConnected() {\n return !!tonStore.account?.account;\n }\n\n connect() {\n tonStore?.connectModal?.open?.();\n }\n\n async disconnect() {\n await tonStore.walletClient?.disconnect();\n }\n\n private getPublicKey(stateInit: string): string {\n const state_init = Cell.fromBase64(stateInit);\n const bits = state_init.refs[1].bits;\n const pubKey = bits.toString().substring(16, 80).toLowerCase();\n return pubKey;\n }\n\n async sign(originMsg: string): Promise<ISignResult> {\n const message = await hashSha256(originMsg);\n const tonConnectUI = tonStore.walletClient as any;\n // const walletInfo = tonConnectUI?.wallet;\n const authType = '';\n // if (walletInfo?.jsBridgeKey && walletInfo?.openMethod !== 'qrcode') {\n // authType = walletInfo.jsBridgeKey;\n // }\n\n console.log(this.isConnected, tonConnectUI, 'connected');\n if (this.isConnected) {\n await tonConnectUI.disconnect();\n }\n tonStore.counter++;\n if (authType) {\n const wallets = await tonConnectUI.getWallets();\n\n const currentWallet = wallets.find((wallet: any) =>\n [wallet.name, wallet.appName].includes(authType)\n ) as WalletInfoRemote;\n\n const link = tonConnectUI.connector.connect(\n {\n bridgeUrl: currentWallet.bridgeUrl,\n universalLink: currentWallet.universalLink\n },\n {\n tonProof: message\n }\n );\n\n // tonspace在tg内部打开\n window.open(link);\n } else {\n console.log('first time, call setConnectRequestParameters');\n tonConnectUI.setConnectRequestParameters({\n state: 'ready',\n value: {\n tonProof: message // 不能有空格,特殊字符\n }\n });\n this.connect();\n }\n\n const connectedWallet: Wallet = await new Promise((resolve) => {\n const eventKey = getEventKey();\n console.log('start listen event key, key = %s', eventKey);\n eventBus.once(eventKey, (data) => {\n console.log('listen event key success, event key = %s, data = %j', eventKey, data);\n resolve(data);\n });\n });\n\n this.provider = tonStore.walletClient;\n const proof = (connectedWallet.connectItems?.tonProof as TonProofItemReplySuccess)?.proof;\n this.publicKey = connectedWallet.account.publicKey || this.getPublicKey(connectedWallet.account.walletStateInit); //使用walletStateInit,publicKey由后端计算\n this.address = toUserFriendlyAddress(connectedWallet.account.address);\n this.chainId = connectedWallet.account.chain;\n this.network = this.chainId === CHAIN.MAINNET ? 'TON_MAINNET' : 'TON_TESTNET';\n const fullMessage = JSON.stringify({\n timestamp: proof.timestamp,\n payload: proof.payload,\n domain: proof.domain\n });\n const signature = proof.signature;\n\n return {\n message: JSON.stringify({\n fullMessage,\n message: originMsg\n }),\n signature,\n tonProof: message\n };\n }\n\n override async signin(statement: string, prepare = true): Promise<ISignResult> {\n const fullMessage = prepare\n ? JSON.stringify(\n {\n statement: statement || 'Welcome to EthSign',\n issuedAt: new Date().toISOString(),\n nonce: getCustomNaNoId()\n },\n null,\n ' '\n )\n : statement;\n const signRes = await this.sign(fullMessage);\n return signRes;\n }\n\n getStore(): TonStoreType {\n return tonStore;\n }\n}\n","import { ReactNode, useCallback, useEffect, useMemo } from 'react';\nimport { WalletBase } from '../../WalletBase';\nimport { useWalletModal, WalletModalProvider } from '@solana/wallet-adapter-react-ui';\nimport '@solana/wallet-adapter-react-ui/styles.css';\nimport { ISignResult } from '../../types';\nimport { ConnectionProvider, useWallet, WalletProvider } from '@solana/wallet-adapter-react';\nimport { PhantomWalletAdapter, TrustWalletAdapter } from '@solana/wallet-adapter-wallets';\nimport { type Adapter } from '@solana/wallet-adapter-base';\n\nimport { Cluster } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport { get4361Message, prepareSignMessage } from '../../utils';\nimport EventEmitter from 'events';\nimport { clusterApiUrl } from '@sign-global/tokentable-core';\nimport { getDerivationPath, LedgerWalletAdapter } from '../../utils/ledger';\n\ninterface SolStoreType {\n connectModal: ReturnType<typeof useWalletModal> | null;\n account: ReturnType<typeof useWallet> | null;\n counter: number;\n}\n\nconst solStore: SolStoreType = {\n connectModal: null,\n account: null,\n counter: 0\n};\n\nexport const eventBus = new EventEmitter();\n\nconst SOL_EVENT_KEY = 'sol_signin';\n\nexport const getEventKey = () => {\n return `${SOL_EVENT_KEY}_${solStore.counter}`;\n};\n\nexport class SolWallet extends WalletBase<SolStoreType> {\n getStore(): SolStoreType {\n return solStore;\n }\n get isConnected() {\n return !!solStore.account?.connected;\n }\n connect(): void {\n solStore.connectModal?.setVisible(true);\n }\n\n disconnect() {\n solStore.account?.disconnect();\n }\n\n async sign(message: string): Promise<ISignResult> {\n try {\n const provider = solStore.account!;\n const encodedMessage = new TextEncoder().encode(message);\n const result = await provider.signMessage?.(encodedMessage);\n\n const { signature, signedMessage } =\n result instanceof Uint8Array ? { signature: result, signedMessage: '' } : (result as any);\n return {\n message,\n signature: bs58.encode(signature),\n signedMessage: signedMessage instanceof Uint8Array ? bs58.encode(signedMessage) : ''\n };\n } catch (error) {\n console.error(error);\n throw error;\n }\n }\n\n signin(statement: string, prepare = true): Promise<ISignResult> {\n return new Promise((resolve, reject) => {\n try {\n const signCallback = async (data: ReturnType<typeof useWallet>) => {\n try {\n this.publicKey = data.publicKey?.toString();\n this.address = this.publicKey;\n this.chainId = 1;\n let fullMessage = statement;\n if (prepare) {\n const msg = prepareSignMessage({ statement, chainId: '1', address: this.address! });\n fullMessage = get4361Message(msg);\n }\n\n const res = await this.sign(fullMessage);\n\n resolve(res);\n } catch (error) {\n console.error('Error in signCallback:', error);\n reject(error);\n }\n };\n\n if (this.isConnected) {\n signCallback(solStore.account!);\n return;\n }\n solStore.counter++;\n this.connect();\n const eventKey = getEventKey();\n eventBus.once(eventKey, (data) => {\n console.log('listen event key success, event key = %s, data = %j', eventKey, data);\n signCallback(data);\n });\n } catch (error) {\n console.error('Error in signin:', error);\n reject(error);\n }\n });\n }\n}\n\n//Solana connection process: Open the modal first, then manually call wallet connect\nexport const SolConnector = () => {\n const walletModal = useWalletModal();\n const wallet = useWallet();\n\n useEffect(() => {\n if (wallet.wallet) {\n if (wallet.connected) {\n const eventKey = getEventKey();\n eventBus.emit(eventKey, wallet);\n }\n }\n }, [wallet]);\n\n solStore.connectModal = walletModal;\n solStore.account = wallet;\n return null;\n};\n\nexport const SolanaProvider = ({\n children,\n cluster,\n wallets\n}: {\n children: ReactNode;\n cluster?: Cluster;\n wallets?: Adapter[];\n}) => {\n const endpoint = clusterApiUrl(cluster ? cluster : 'mainnet-beta');\n\n const defaultWallets = useMemo(\n () => [\n new PhantomWalletAdapter(),\n new TrustWalletAdapter(),\n new LedgerWalletAdapter({\n derivationPath: getDerivationPath(0)\n })\n ],\n []\n );\n\n const onError = useCallback((error: any) => {\n console.error(error);\n }, []);\n return (\n <ConnectionProvider endpoint={endpoint}>\n <WalletProvider wallets={wallets ? wallets : defaultWallets} onError={onError} autoConnect>\n <WalletModalProvider>\n <SolConnector />\n {children}\n </WalletModalProvider>\n </WalletProvider>\n </ConnectionProvider>\n );\n};\n","import type { default as Transport } from '@ledgerhq/hw-transport';\nimport type { default as TransportWebHID } from '@ledgerhq/hw-transport-webhid';\nimport {\n BaseSignerWalletAdapter,\n WalletConnectionError,\n WalletDisconnectedError,\n WalletDisconnectionError,\n WalletLoadError,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletPublicKeyError,\n WalletReadyState,\n WalletSignMessageError,\n WalletSignTransactionError,\n type WalletName\n} from '@solana/wallet-adapter-base';\nimport type { PublicKey, Transaction, TransactionVersion, VersionedTransaction } from '@solana/web3.js';\nimport './polyfills/index.js';\nimport {\n getAppConfiguration,\n getDerivationPath,\n getPublicKey,\n OffchainMessage,\n signMessage,\n signTransaction\n} from './util.js';\n\nexport interface SignMessageOutput {\n /**\n * Message bytes that were signed.\n * The wallet may prefix or otherwise modify the message before signing it.\n */\n readonly signedMessage: Uint8Array;\n\n /**\n * Message signature produced.\n * If the signature type is provided, the signature must be Ed25519.\n */\n readonly signature: Uint8Array;\n\n /**\n * Optional type of the message signature produced.\n * If not provided, the signature must be Ed25519.\n */\n readonly signatureType?: 'ed25519';\n}\n\nexport interface LedgerWalletAdapterConfig {\n derivationPath?: Buffer;\n}\n\nexport const LedgerWalletName = 'Ledger' as WalletName<'Ledger'>;\n\nexport class LedgerWalletAdapter extends BaseSignerWalletAdapter {\n name = LedgerWalletName;\n url = 'https://ledger.com';\n icon =\n 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzUgMzUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0ibTIzLjU4OCAwaC0xNnYyMS41ODNoMjEuNnYtMTZhNS41ODUgNS41ODUgMCAwIDAgLTUuNi01LjU4M3oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNzM5KSIvPjxwYXRoIGQ9Im04LjM0MiAwaC0yLjc1N2E1LjU4NSA1LjU4NSAwIDAgMCAtNS41ODUgNS41ODV2Mi43NTdoOC4zNDJ6Ii8+PHBhdGggZD0ibTAgNy41OWg4LjM0MnY4LjM0MmgtOC4zNDJ6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDUuNzM5KSIvPjxwYXRoIGQ9Im0xNS4xOCAyMy40NTFoMi43NTdhNS41ODUgNS41ODUgMCAwIDAgNS41ODUtNS42di0yLjY3MWgtOC4zNDJ6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS40NzggMTEuNDc4KSIvPjxwYXRoIGQ9Im03LjU5IDE1LjE4aDguMzQydjguMzQyaC04LjM0MnoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNzM5IDExLjQ3OCkiLz48cGF0aCBkPSJtMCAxNS4xOHYyLjc1N2E1LjU4NSA1LjU4NSAwIDAgMCA1LjU4NSA1LjU4NWgyLjc1N3YtOC4zNDJ6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDExLjQ3OCkiLz48L2c+PC9zdmc+';\n supportedTransactionVersions: ReadonlySet<TransactionVersion> = new Set(['legacy', 0]);\n\n private _derivationPath: Buffer;\n private _connecting: boolean;\n private _transport: Transport | null;\n private _publicKey: PublicKey | null;\n private _readyState: WalletReadyState =\n typeof window === 'undefined' ||\n typeof document === 'undefined' ||\n typeof navigator === 'undefined' ||\n !(navigator as any).hid\n ? WalletReadyState.Unsupported\n : WalletReadyState.Loadable;\n\n constructor(config: LedgerWalletAdapterConfig = {}) {\n super();\n this._derivationPath = config.derivationPath || getDerivationPath(0, 0);\n this._connecting = false;\n this._transport = null;\n this._publicKey = null;\n }\n\n get publicKey() {\n return this._publicKey;\n }\n\n get connecting() {\n return this._connecting;\n }\n\n get readyState() {\n return this._readyState;\n }\n\n async connect(): Promise<void> {\n try {\n if (this.connected || this.connecting) return;\n if (this._readyState !== WalletReadyState.Loadable) throw new WalletNotReadyError();\n\n this._connecting = true;\n\n let TransportWebHIDClass: typeof TransportWebHID;\n try {\n TransportWebHIDClass = (await import('@ledgerhq/hw-transport-webhid')).default;\n } catch (error: any) {\n throw new WalletLoadError(error?.message, error);\n }\n\n let transport: Transport;\n try {\n transport = await TransportWebHIDClass.create();\n } catch (error: any) {\n throw new WalletConnectionError(error?.message, error);\n }\n\n let publicKey: PublicKey;\n try {\n publicKey = await getPublicKey(transport, this._derivationPath);\n } catch (error: any) {\n throw new WalletPublicKeyError(error?.message, error);\n }\n\n transport.on('disconnect', this._disconnected);\n\n this._transport = transport;\n this._publicKey = publicKey;\n\n this.emit('connect', publicKey);\n } catch (error: any) {\n this.emit('error', error);\n throw error;\n } finally {\n this._connecting = false;\n }\n }\n\n async disconnect(): Promise<void> {\n const transport = this._transport;\n if (transport) {\n transport.off('disconnect', this._disconnected);\n\n this._transport = null;\n this._publicKey = null;\n\n try {\n await transport.close();\n } catch (error: any) {\n this.emit('error', new WalletDisconnectionError(error?.message, error));\n }\n }\n\n this.emit('disconnect');\n }\n\n async signTransaction<T extends Transaction | VersionedTransaction>(transaction: T): Promise<T> {\n try {\n const transport = this._transport;\n const publicKey = this._publicKey;\n if (!transport || !publicKey) throw new WalletNotConnectedError();\n\n try {\n const signature = await signTransaction(transport, transaction, this._derivationPath);\n transaction.addSignature(publicKey, signature);\n } catch (error: any) {\n throw new WalletSignTransactionError(error?.message, error);\n }\n\n return transaction;\n } catch (error: any) {\n this.emit('error', error);\n throw error;\n }\n }\n\n async signMessage(message: Uint8Array): Promise<SignMessageOutput> {\n try {\n try {\n const transport = this._transport;\n const publicKey = this._publicKey;\n if (!transport || !publicKey) throw new WalletNotConnectedError();\n\n const appConfig = await getAppConfiguration(transport);\n const [major, minor] = appConfig.version.split('.').map(Number);\n if (major < 1 || (major === 1 && minor < 8)) {\n throw new WalletSignMessageError('Signing off-chain messages requires Solana Ledger App 1.8.0 or later');\n }\n\n const offchainMessage = new OffchainMessage({\n message: Buffer.from(message.buffer),\n signerAddress: publicKey\n });\n if (!offchainMessage.isLedgerSupported(appConfig.blindSigningEnabled)) {\n if (!offchainMessage.isValid()) {\n throw new WalletSignMessageError('Message is not valid for signing.');\n } else if (offchainMessage.messageFormat === 1 && !appConfig.blindSigningEnabled) {\n throw new WalletSignMessageError(\n 'Message contains non-ASCII characters and requires blind signing to be enabled on your Ledger device.'\n );\n } else if (offchainMessage.messageFormat === 2) {\n throw new WalletSignMessageError('Message is too long to be signed on Ledger device.');\n } else {\n throw new WalletSignMessageError('Message format is not supported by Ledger device.');\n }\n }\n\n const signature = await signMessage(transport, offchainMessage.serialize(), this._derivationPath);\n return { signature: new Uint8Array(signature), signedMessage: offchainMessage.serialize() };\n } catch (error: any) {\n throw new WalletSignMessageError(error?.message, error);\n }\n } catch (error: any) {\n this.emit('error', error);\n throw error;\n }\n }\n\n private _disconnected = () => {\n const transport = this._transport;\n if (transport) {\n transport.off('disconnect', this._disconnected);\n\n this._transport = null;\n this._publicKey = null;\n\n this.emit('error', new WalletDisconnectedError());\n this.emit('disconnect');\n }\n };\n}\n","import { Buffer } from 'buffer';\n\nif (typeof window !== 'undefined' && window.Buffer === undefined) {\n (window as any).Buffer = Buffer;\n}\n\nexport {};\n","import { StatusCodes, TransportStatusError, type default as Transport } from '@ledgerhq/hw-transport';\nimport { isVersionedTransaction } from '@solana/wallet-adapter-base';\nimport { PublicKey, type Transaction, type VersionedTransaction } from '@solana/web3.js';\nimport './polyfills/index.js';\n\nexport function getDerivationPath(account?: number, change?: number): Buffer {\n const length = account !== undefined ? (change === undefined ? 3 : 4) : 2;\n const derivationPath = Buffer.alloc(1 + length * 4);\n\n let offset = derivationPath.writeUInt8(length, 0);\n offset = derivationPath.writeUInt32BE(harden(44), offset); // Using BIP44\n offset = derivationPath.writeUInt32BE(harden(501), offset); // Solana's BIP44 path\n\n if (account !== undefined) {\n offset = derivationPath.writeUInt32BE(harden(account), offset);\n if (change !== undefined) {\n derivationPath.writeUInt32BE(harden(change), offset);\n }\n }\n\n return derivationPath;\n}\n\nconst BIP32_HARDENED_BIT = (1 << 31) >>> 0;\n\nfunction harden(n: number): number {\n return (n | BIP32_HARDENED_BIT) >>> 0;\n}\n\nconst INS_GET_VERSION = 0x04;\nconst INS_GET_PUBKEY = 0x05;\nconst INS_SIGN_MESSAGE = 0x06;\nconst INS_SIGN_MESSAGE_OFFCHAIN = 0x07;\n\nconst P1_NON_CONFIRM = 0x00;\nconst P1_CONFIRM = 0x01;\n\nconst P2_EXTEND = 0x01;\nconst P2_MORE = 0x02;\n\nconst MAX_PAYLOAD = 255;\n\nconst LEDGER_CLA = 0xe0;\n\n// Max off-chain message length supported by Ledger\nconst OFFCM_MAX_LEDGER_LEN = 1212;\n// Max length of version 0 off-chain message\nconst OFFCM_MAX_V0_LEN = 65515;\n\nexport class OffchainMessage {\n version: number;\n messageFormat: number | undefined;\n message: Buffer | undefined;\n signerAddress: PublicKey;\n\n /**\n * Constructs a new OffchainMessage\n * @param {version: number, messageFormat: number, message: string | Buffer} opts - Constructor parameters\n */\n constructor(opts: { version?: number; messageFormat?: number; message: Buffer; signerAddress: PublicKey }) {\n this.version = 0;\n this.messageFormat = undefined;\n this.message = undefined;\n this.signerAddress = opts.signerAddress;\n\n if (!opts) {\n return;\n }\n if (opts.version) {\n this.version = opts.version;\n }\n if (opts.messageFormat) {\n this.messageFormat = opts.messageFormat;\n }\n if (opts.message) {\n this.message = Buffer.from(opts.message);\n if (this.version === 0) {\n if (!this.messageFormat) {\n this.messageFormat = OffchainMessage.guessMessageFormat(this.message);\n }\n }\n }\n }\n\n static guessMessageFormat(message: Buffer) {\n if (Object.prototype.toString.call(message) !== '[object Uint8Array]') {\n return undefined;\n }\n if (message.length <= OFFCM_MAX_LEDGER_LEN) {\n if (OffchainMessage.isPrintableASCII(message)) {\n return 0;\n } else if (OffchainMessage.isUTF8(message)) {\n return 1;\n }\n } else if (message.length <= OFFCM_MAX_V0_LEN) {\n if (OffchainMessage.isUTF8(message)) {\n return 2;\n }\n }\n return undefined;\n }\n\n static isPrintableASCII(buffer: Buffer) {\n return (\n buffer &&\n buffer.every((element) => {\n return element == 0xa || (element >= 0x20 && element <= 0x7e);\n })\n );\n }\n\n static isUTF8(buffer: Buffer) {\n try {\n new TextDecoder('utf8', { fatal: true }).decode(buffer);\n return true;\n } catch {\n return false;\n }\n }\n\n isValid() {\n if (this.version !== 0) {\n return false;\n }\n if (!this.message) {\n return false;\n }\n const format = OffchainMessage.guessMessageFormat(this.message);\n return format != null && format === this.messageFormat;\n }\n\n isLedgerSupported(allowBlindSigning: boolean) {\n return this.isValid() && (this.messageFormat === 0 || (this.messageFormat === 1 && allowBlindSigning));\n }\n\n serialize() {\n if (!this.isValid()) {\n throw new Error(`Invalid OffchainMessage: ${JSON.stringify(this)}`);\n }\n const signingDomain = Buffer.concat([Buffer.from([255]), Buffer.from('solana offchain')]);\n const headerVersion = Buffer.alloc(1);\n const applicationDomain = Buffer.alloc(32);\n const messageFormat = Buffer.alloc(1);\n const signerCount = Buffer.alloc(1);\n signerCount.writeUInt8(1);\n\n const messageLength = Buffer.alloc(2);\n\n // isValid() checks message\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const messageBuffer = Buffer.from(this.message!);\n\n // isValid() checks messageFormat\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n messageFormat.writeUInt8(this.messageFormat!);\n\n const signers = this.signerAddress.toBuffer();\n messageLength.writeUInt16LE(messageBuffer.length);\n\n return Buffer.concat([\n signingDomain,\n headerVersion,\n applicationDomain,\n messageFormat,\n signerCount,\n signers,\n messageLength,\n messageBuffer\n ]);\n }\n}\n\n/** @internal */\nexport async function getPublicKey(transport: Transport, derivationPath: Buffer): Promise<PublicKey> {\n const bytes = await send(transport, INS_GET_PUBKEY, P1_NON_CONFIRM, derivationPath);\n return new PublicKey(bytes);\n}\n\n/** @internal */\nexport async function signTransaction(\n transport: Transport,\n transaction: Transaction | VersionedTransaction,\n derivationPath: Buffer\n): Promise<Buffer> {\n const paths = Buffer.alloc(1);\n paths.writeUInt8(1, 0);\n\n const message = isVersionedTransaction(transaction)\n ? transaction.message.serialize()\n : transaction.serializeMessage();\n const data = Buffer.concat([paths, derivationPath, message]);\n\n return await send(transport, INS_SIGN_MESSAGE, P1_CONFIRM, data);\n}\n\n/** @internal */\nexport async function signMessage(transport: Transport, message: Buffer, derivationPath: Buffer): Promise<Buffer> {\n const paths = Buffer.alloc(1);\n paths.writeUInt8(1, 0);\n\n const data = Buffer.concat([paths, derivationPath, message]);\n\n return await send(transport, INS_SIGN_MESSAGE_OFFCHAIN, P1_CONFIRM, data);\n}\n\n/** @internal */\nexport async function getAppConfiguration(transport: Transport): Promise<AppConfig> {\n const [blindSigningEnabled, pubKeyDisplayMode, major, minor, patch] = await send(\n transport,\n INS_GET_VERSION,\n P1_NON_CONFIRM,\n Buffer.alloc(0)\n );\n return {\n blindSigningEnabled: Boolean(blindSigningEnabled),\n pubKeyDisplayMode,\n version: `${major}.${minor}.${patch}`\n };\n}\n\nenum PubKeyDisplayMode {\n LONG,\n SHORT\n}\n\ntype AppConfig = {\n blindSigningEnabled: boolean;\n pubKeyDisplayMode: PubKeyDisplayMode;\n version: string;\n};\n\nasync function send(transport: Transport, instruction: number, p1: number, data: Buffer): Promise<Buffer> {\n let p2 = 0;\n let offset = 0;\n\n if (data.length > MAX_PAYLOAD) {\n while (data.length - offset > MAX_PAYLOAD) {\n const buffer = data.slice(offset, offset + MAX_PAYLOAD);\n const response = await transport.send(LEDGER_CLA, instruction, p1, p2 | P2_MORE, buffer);\n\n if (response.length !== 2) throw new TransportStatusError(StatusCodes.INCORRECT_DATA);\n\n p2 |= P2_EXTEND;\n offset += MAX_PAYLOAD;\n }\n }\n\n const buffer = data.slice(offset);\n const response = await transport.send(LEDGER_CLA, instruction, p1, p2, buffer);\n\n return response.slice(0, response.length - 2);\n}\n","import { EvmWallet } from './providers/evm';\nimport { ChainType } from './types';\nimport { TonWallet } from './providers/ton';\nimport { SolWallet } from './providers/solana';\n\nexport abstract class WalletFactory {\n private static instances: Record<string, EvmWallet | TonWallet | SolWallet> = {};\n static getWallet(type: ChainType, userAddress?: string): EvmWallet | TonWallet | SolWallet {\n if (!this.instances[type]) {\n let WalletClass;\n switch (type) {\n case ChainType.Evm:\n WalletClass = EvmWallet;\n break;\n case ChainType.Ton:\n WalletClass = TonWallet;\n break;\n // case ChainType.Starknet:\n // WalletClass = StarknetWallet;\n // break;\n case ChainType.Solana:\n WalletClass = SolWallet;\n break;\n default:\n throw new Error('Unsupported wallet type');\n }\n\n if (!WalletClass) {\n throw new Error('Unsupported wallet type');\n }\n this.instances[type] = new WalletClass(type, userAddress);\n }\n return this.instances[type];\n }\n}\n"],"mappings":"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","names":["import_react","import_tokentable_core","import_events","eventBus","getEventKey","import_jsx_runtime","eventBus","getEventKey","import_react","import_styles","import_events","import_tokentable_core","import_wallet_adapter_base","signMessage","buffer","response","signMessage","import_jsx_runtime","eventBus","EventEmitter","getEventKey","bs58"]}
package/dist/index.mjs CHANGED
@@ -378,10 +378,359 @@ import { useCallback, useEffect as useEffect3, useMemo } from "react";
378
378
  import { useWalletModal, WalletModalProvider } from "@solana/wallet-adapter-react-ui";
379
379
  import "@solana/wallet-adapter-react-ui/styles.css";
380
380
  import { ConnectionProvider, useWallet, WalletProvider } from "@solana/wallet-adapter-react";
381
- import { PhantomWalletAdapter, TrustWalletAdapter, LedgerWalletAdapter } from "@solana/wallet-adapter-wallets";
381
+ import { PhantomWalletAdapter, TrustWalletAdapter } from "@solana/wallet-adapter-wallets";
382
382
  import bs58 from "bs58";
383
383
  import EventEmitter3 from "events";
384
384
  import { clusterApiUrl } from "@sign-global/tokentable-core";
385
+
386
+ // src/utils/ledger/adapter.ts
387
+ import {
388
+ BaseSignerWalletAdapter,
389
+ WalletConnectionError,
390
+ WalletDisconnectedError,
391
+ WalletDisconnectionError,
392
+ WalletLoadError,
393
+ WalletNotConnectedError,
394
+ WalletNotReadyError,
395
+ WalletPublicKeyError,
396
+ WalletReadyState,
397
+ WalletSignMessageError,
398
+ WalletSignTransactionError
399
+ } from "@solana/wallet-adapter-base";
400
+
401
+ // src/utils/ledger/polyfills/Buffer.ts
402
+ import { Buffer as Buffer2 } from "buffer";
403
+ if (typeof window !== "undefined" && window.Buffer === void 0) {
404
+ window.Buffer = Buffer2;
405
+ }
406
+
407
+ // src/utils/ledger/util.ts
408
+ import { StatusCodes, TransportStatusError } from "@ledgerhq/hw-transport";
409
+ import { isVersionedTransaction } from "@solana/wallet-adapter-base";
410
+ import { PublicKey } from "@solana/web3.js";
411
+ function getDerivationPath(account, change) {
412
+ const length = account !== void 0 ? change === void 0 ? 3 : 4 : 2;
413
+ const derivationPath = Buffer.alloc(1 + length * 4);
414
+ let offset = derivationPath.writeUInt8(length, 0);
415
+ offset = derivationPath.writeUInt32BE(harden(44), offset);
416
+ offset = derivationPath.writeUInt32BE(harden(501), offset);
417
+ if (account !== void 0) {
418
+ offset = derivationPath.writeUInt32BE(harden(account), offset);
419
+ if (change !== void 0) {
420
+ derivationPath.writeUInt32BE(harden(change), offset);
421
+ }
422
+ }
423
+ return derivationPath;
424
+ }
425
+ var BIP32_HARDENED_BIT = 1 << 31 >>> 0;
426
+ function harden(n) {
427
+ return (n | BIP32_HARDENED_BIT) >>> 0;
428
+ }
429
+ var INS_GET_VERSION = 4;
430
+ var INS_GET_PUBKEY = 5;
431
+ var INS_SIGN_MESSAGE = 6;
432
+ var INS_SIGN_MESSAGE_OFFCHAIN = 7;
433
+ var P1_NON_CONFIRM = 0;
434
+ var P1_CONFIRM = 1;
435
+ var P2_EXTEND = 1;
436
+ var P2_MORE = 2;
437
+ var MAX_PAYLOAD = 255;
438
+ var LEDGER_CLA = 224;
439
+ var OFFCM_MAX_LEDGER_LEN = 1212;
440
+ var OFFCM_MAX_V0_LEN = 65515;
441
+ var OffchainMessage = class _OffchainMessage {
442
+ version;
443
+ messageFormat;
444
+ message;
445
+ signerAddress;
446
+ /**
447
+ * Constructs a new OffchainMessage
448
+ * @param {version: number, messageFormat: number, message: string | Buffer} opts - Constructor parameters
449
+ */
450
+ constructor(opts) {
451
+ this.version = 0;
452
+ this.messageFormat = void 0;
453
+ this.message = void 0;
454
+ this.signerAddress = opts.signerAddress;
455
+ if (!opts) {
456
+ return;
457
+ }
458
+ if (opts.version) {
459
+ this.version = opts.version;
460
+ }
461
+ if (opts.messageFormat) {
462
+ this.messageFormat = opts.messageFormat;
463
+ }
464
+ if (opts.message) {
465
+ this.message = Buffer.from(opts.message);
466
+ if (this.version === 0) {
467
+ if (!this.messageFormat) {
468
+ this.messageFormat = _OffchainMessage.guessMessageFormat(this.message);
469
+ }
470
+ }
471
+ }
472
+ }
473
+ static guessMessageFormat(message) {
474
+ if (Object.prototype.toString.call(message) !== "[object Uint8Array]") {
475
+ return void 0;
476
+ }
477
+ if (message.length <= OFFCM_MAX_LEDGER_LEN) {
478
+ if (_OffchainMessage.isPrintableASCII(message)) {
479
+ return 0;
480
+ } else if (_OffchainMessage.isUTF8(message)) {
481
+ return 1;
482
+ }
483
+ } else if (message.length <= OFFCM_MAX_V0_LEN) {
484
+ if (_OffchainMessage.isUTF8(message)) {
485
+ return 2;
486
+ }
487
+ }
488
+ return void 0;
489
+ }
490
+ static isPrintableASCII(buffer) {
491
+ return buffer && buffer.every((element) => {
492
+ return element == 10 || element >= 32 && element <= 126;
493
+ });
494
+ }
495
+ static isUTF8(buffer) {
496
+ try {
497
+ new TextDecoder("utf8", { fatal: true }).decode(buffer);
498
+ return true;
499
+ } catch {
500
+ return false;
501
+ }
502
+ }
503
+ isValid() {
504
+ if (this.version !== 0) {
505
+ return false;
506
+ }
507
+ if (!this.message) {
508
+ return false;
509
+ }
510
+ const format = _OffchainMessage.guessMessageFormat(this.message);
511
+ return format != null && format === this.messageFormat;
512
+ }
513
+ isLedgerSupported(allowBlindSigning) {
514
+ return this.isValid() && (this.messageFormat === 0 || this.messageFormat === 1 && allowBlindSigning);
515
+ }
516
+ serialize() {
517
+ if (!this.isValid()) {
518
+ throw new Error(`Invalid OffchainMessage: ${JSON.stringify(this)}`);
519
+ }
520
+ const signingDomain = Buffer.concat([Buffer.from([255]), Buffer.from("solana offchain")]);
521
+ const headerVersion = Buffer.alloc(1);
522
+ const applicationDomain = Buffer.alloc(32);
523
+ const messageFormat = Buffer.alloc(1);
524
+ const signerCount = Buffer.alloc(1);
525
+ signerCount.writeUInt8(1);
526
+ const messageLength = Buffer.alloc(2);
527
+ const messageBuffer = Buffer.from(this.message);
528
+ messageFormat.writeUInt8(this.messageFormat);
529
+ const signers = this.signerAddress.toBuffer();
530
+ messageLength.writeUInt16LE(messageBuffer.length);
531
+ return Buffer.concat([
532
+ signingDomain,
533
+ headerVersion,
534
+ applicationDomain,
535
+ messageFormat,
536
+ signerCount,
537
+ signers,
538
+ messageLength,
539
+ messageBuffer
540
+ ]);
541
+ }
542
+ };
543
+ async function getPublicKey(transport, derivationPath) {
544
+ const bytes = await send(transport, INS_GET_PUBKEY, P1_NON_CONFIRM, derivationPath);
545
+ return new PublicKey(bytes);
546
+ }
547
+ async function signTransaction(transport, transaction, derivationPath) {
548
+ const paths = Buffer.alloc(1);
549
+ paths.writeUInt8(1, 0);
550
+ const message = isVersionedTransaction(transaction) ? transaction.message.serialize() : transaction.serializeMessage();
551
+ const data = Buffer.concat([paths, derivationPath, message]);
552
+ return await send(transport, INS_SIGN_MESSAGE, P1_CONFIRM, data);
553
+ }
554
+ async function signMessage2(transport, message, derivationPath) {
555
+ const paths = Buffer.alloc(1);
556
+ paths.writeUInt8(1, 0);
557
+ const data = Buffer.concat([paths, derivationPath, message]);
558
+ return await send(transport, INS_SIGN_MESSAGE_OFFCHAIN, P1_CONFIRM, data);
559
+ }
560
+ async function getAppConfiguration(transport) {
561
+ const [blindSigningEnabled, pubKeyDisplayMode, major, minor, patch] = await send(
562
+ transport,
563
+ INS_GET_VERSION,
564
+ P1_NON_CONFIRM,
565
+ Buffer.alloc(0)
566
+ );
567
+ return {
568
+ blindSigningEnabled: Boolean(blindSigningEnabled),
569
+ pubKeyDisplayMode,
570
+ version: `${major}.${minor}.${patch}`
571
+ };
572
+ }
573
+ async function send(transport, instruction, p1, data) {
574
+ let p2 = 0;
575
+ let offset = 0;
576
+ if (data.length > MAX_PAYLOAD) {
577
+ while (data.length - offset > MAX_PAYLOAD) {
578
+ const buffer2 = data.slice(offset, offset + MAX_PAYLOAD);
579
+ const response2 = await transport.send(LEDGER_CLA, instruction, p1, p2 | P2_MORE, buffer2);
580
+ if (response2.length !== 2) throw new TransportStatusError(StatusCodes.INCORRECT_DATA);
581
+ p2 |= P2_EXTEND;
582
+ offset += MAX_PAYLOAD;
583
+ }
584
+ }
585
+ const buffer = data.slice(offset);
586
+ const response = await transport.send(LEDGER_CLA, instruction, p1, p2, buffer);
587
+ return response.slice(0, response.length - 2);
588
+ }
589
+
590
+ // src/utils/ledger/adapter.ts
591
+ var LedgerWalletName = "Ledger";
592
+ var LedgerWalletAdapter = class extends BaseSignerWalletAdapter {
593
+ name = LedgerWalletName;
594
+ url = "https://ledger.com";
595
+ icon = "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzUgMzUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0ibTIzLjU4OCAwaC0xNnYyMS41ODNoMjEuNnYtMTZhNS41ODUgNS41ODUgMCAwIDAgLTUuNi01LjU4M3oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNzM5KSIvPjxwYXRoIGQ9Im04LjM0MiAwaC0yLjc1N2E1LjU4NSA1LjU4NSAwIDAgMCAtNS41ODUgNS41ODV2Mi43NTdoOC4zNDJ6Ii8+PHBhdGggZD0ibTAgNy41OWg4LjM0MnY4LjM0MmgtOC4zNDJ6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDUuNzM5KSIvPjxwYXRoIGQ9Im0xNS4xOCAyMy40NTFoMi43NTdhNS41ODUgNS41ODUgMCAwIDAgNS41ODUtNS42di0yLjY3MWgtOC4zNDJ6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS40NzggMTEuNDc4KSIvPjxwYXRoIGQ9Im03LjU5IDE1LjE4aDguMzQydjguMzQyaC04LjM0MnoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNzM5IDExLjQ3OCkiLz48cGF0aCBkPSJtMCAxNS4xOHYyLjc1N2E1LjU4NSA1LjU4NSAwIDAgMCA1LjU4NSA1LjU4NWgyLjc1N3YtOC4zNDJ6IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDExLjQ3OCkiLz48L2c+PC9zdmc+";
596
+ supportedTransactionVersions = /* @__PURE__ */ new Set(["legacy", 0]);
597
+ _derivationPath;
598
+ _connecting;
599
+ _transport;
600
+ _publicKey;
601
+ _readyState = typeof window === "undefined" || typeof document === "undefined" || typeof navigator === "undefined" || !navigator.hid ? WalletReadyState.Unsupported : WalletReadyState.Loadable;
602
+ constructor(config = {}) {
603
+ super();
604
+ this._derivationPath = config.derivationPath || getDerivationPath(0, 0);
605
+ this._connecting = false;
606
+ this._transport = null;
607
+ this._publicKey = null;
608
+ }
609
+ get publicKey() {
610
+ return this._publicKey;
611
+ }
612
+ get connecting() {
613
+ return this._connecting;
614
+ }
615
+ get readyState() {
616
+ return this._readyState;
617
+ }
618
+ async connect() {
619
+ try {
620
+ if (this.connected || this.connecting) return;
621
+ if (this._readyState !== WalletReadyState.Loadable) throw new WalletNotReadyError();
622
+ this._connecting = true;
623
+ let TransportWebHIDClass;
624
+ try {
625
+ TransportWebHIDClass = (await import("@ledgerhq/hw-transport-webhid")).default;
626
+ } catch (error) {
627
+ throw new WalletLoadError(error?.message, error);
628
+ }
629
+ let transport;
630
+ try {
631
+ transport = await TransportWebHIDClass.create();
632
+ } catch (error) {
633
+ throw new WalletConnectionError(error?.message, error);
634
+ }
635
+ let publicKey;
636
+ try {
637
+ publicKey = await getPublicKey(transport, this._derivationPath);
638
+ } catch (error) {
639
+ throw new WalletPublicKeyError(error?.message, error);
640
+ }
641
+ transport.on("disconnect", this._disconnected);
642
+ this._transport = transport;
643
+ this._publicKey = publicKey;
644
+ this.emit("connect", publicKey);
645
+ } catch (error) {
646
+ this.emit("error", error);
647
+ throw error;
648
+ } finally {
649
+ this._connecting = false;
650
+ }
651
+ }
652
+ async disconnect() {
653
+ const transport = this._transport;
654
+ if (transport) {
655
+ transport.off("disconnect", this._disconnected);
656
+ this._transport = null;
657
+ this._publicKey = null;
658
+ try {
659
+ await transport.close();
660
+ } catch (error) {
661
+ this.emit("error", new WalletDisconnectionError(error?.message, error));
662
+ }
663
+ }
664
+ this.emit("disconnect");
665
+ }
666
+ async signTransaction(transaction) {
667
+ try {
668
+ const transport = this._transport;
669
+ const publicKey = this._publicKey;
670
+ if (!transport || !publicKey) throw new WalletNotConnectedError();
671
+ try {
672
+ const signature = await signTransaction(transport, transaction, this._derivationPath);
673
+ transaction.addSignature(publicKey, signature);
674
+ } catch (error) {
675
+ throw new WalletSignTransactionError(error?.message, error);
676
+ }
677
+ return transaction;
678
+ } catch (error) {
679
+ this.emit("error", error);
680
+ throw error;
681
+ }
682
+ }
683
+ async signMessage(message) {
684
+ try {
685
+ try {
686
+ const transport = this._transport;
687
+ const publicKey = this._publicKey;
688
+ if (!transport || !publicKey) throw new WalletNotConnectedError();
689
+ const appConfig = await getAppConfiguration(transport);
690
+ const [major, minor] = appConfig.version.split(".").map(Number);
691
+ if (major < 1 || major === 1 && minor < 8) {
692
+ throw new WalletSignMessageError("Signing off-chain messages requires Solana Ledger App 1.8.0 or later");
693
+ }
694
+ const offchainMessage = new OffchainMessage({
695
+ message: Buffer.from(message.buffer),
696
+ signerAddress: publicKey
697
+ });
698
+ if (!offchainMessage.isLedgerSupported(appConfig.blindSigningEnabled)) {
699
+ if (!offchainMessage.isValid()) {
700
+ throw new WalletSignMessageError("Message is not valid for signing.");
701
+ } else if (offchainMessage.messageFormat === 1 && !appConfig.blindSigningEnabled) {
702
+ throw new WalletSignMessageError(
703
+ "Message contains non-ASCII characters and requires blind signing to be enabled on your Ledger device."
704
+ );
705
+ } else if (offchainMessage.messageFormat === 2) {
706
+ throw new WalletSignMessageError("Message is too long to be signed on Ledger device.");
707
+ } else {
708
+ throw new WalletSignMessageError("Message format is not supported by Ledger device.");
709
+ }
710
+ }
711
+ const signature = await signMessage2(transport, offchainMessage.serialize(), this._derivationPath);
712
+ return { signature: new Uint8Array(signature), signedMessage: offchainMessage.serialize() };
713
+ } catch (error) {
714
+ throw new WalletSignMessageError(error?.message, error);
715
+ }
716
+ } catch (error) {
717
+ this.emit("error", error);
718
+ throw error;
719
+ }
720
+ }
721
+ _disconnected = () => {
722
+ const transport = this._transport;
723
+ if (transport) {
724
+ transport.off("disconnect", this._disconnected);
725
+ this._transport = null;
726
+ this._publicKey = null;
727
+ this.emit("error", new WalletDisconnectedError());
728
+ this.emit("disconnect");
729
+ }
730
+ };
731
+ };
732
+
733
+ // src/providers/solana/index.tsx
385
734
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
386
735
  var solStore = {
387
736
  connectModal: null,
@@ -410,10 +759,12 @@ var SolWallet = class extends WalletBase {
410
759
  try {
411
760
  const provider = solStore.account;
412
761
  const encodedMessage = new TextEncoder().encode(message);
413
- const signedMessage = await provider.signMessage?.(encodedMessage);
762
+ const result = await provider.signMessage?.(encodedMessage);
763
+ const { signature, signedMessage } = result instanceof Uint8Array ? { signature: result, signedMessage: "" } : result;
414
764
  return {
415
765
  message,
416
- signature: bs58.encode(signedMessage)
766
+ signature: bs58.encode(signature),
767
+ signedMessage: signedMessage instanceof Uint8Array ? bs58.encode(signedMessage) : ""
417
768
  };
418
769
  } catch (error) {
419
770
  console.error(error);
@@ -421,30 +772,40 @@ var SolWallet = class extends WalletBase {
421
772
  }
422
773
  }
423
774
  signin(statement, prepare = true) {
424
- return new Promise((resolve) => {
425
- const signCallback = (data) => {
426
- this.publicKey = data.publicKey?.toString();
427
- this.address = this.publicKey;
428
- this.chainId = 1;
429
- let fullMessage = statement;
430
- if (prepare) {
431
- const msg = prepareSignMessage({ statement, chainId: "1", address: this.address });
432
- fullMessage = get4361Message(msg);
775
+ return new Promise((resolve, reject) => {
776
+ try {
777
+ const signCallback = async (data) => {
778
+ try {
779
+ this.publicKey = data.publicKey?.toString();
780
+ this.address = this.publicKey;
781
+ this.chainId = 1;
782
+ let fullMessage = statement;
783
+ if (prepare) {
784
+ const msg = prepareSignMessage({ statement, chainId: "1", address: this.address });
785
+ fullMessage = get4361Message(msg);
786
+ }
787
+ const res = await this.sign(fullMessage);
788
+ resolve(res);
789
+ } catch (error) {
790
+ console.error("Error in signCallback:", error);
791
+ reject(error);
792
+ }
793
+ };
794
+ if (this.isConnected) {
795
+ signCallback(solStore.account);
796
+ return;
433
797
  }
434
- const res = this.sign(fullMessage);
435
- resolve(res);
436
- };
437
- if (this.isConnected) {
438
- signCallback(solStore.account);
439
- return;
798
+ solStore.counter++;
799
+ this.connect();
800
+ const eventKey = getEventKey3();
801
+ eventBus3.once(eventKey, (data) => {
802
+ console.log("listen event key success, event key = %s, data = %j", eventKey, data);
803
+ signCallback(data);
804
+ });
805
+ } catch (error) {
806
+ console.error("Error in signin:", error);
807
+ reject(error);
440
808
  }
441
- solStore.counter++;
442
- this.connect();
443
- const eventKey = getEventKey3();
444
- eventBus3.once(eventKey, (data) => {
445
- console.log("listen event key success, event key = %s, data = %j", eventKey, data);
446
- signCallback(data);
447
- });
448
809
  });
449
810
  }
450
811
  };
@@ -470,7 +831,13 @@ var SolanaProvider = ({
470
831
  }) => {
471
832
  const endpoint = clusterApiUrl(cluster ? cluster : "mainnet-beta");
472
833
  const defaultWallets = useMemo(
473
- () => [new PhantomWalletAdapter(), new TrustWalletAdapter(), new LedgerWalletAdapter()],
834
+ () => [
835
+ new PhantomWalletAdapter(),
836
+ new TrustWalletAdapter(),
837
+ new LedgerWalletAdapter({
838
+ derivationPath: getDerivationPath(0)
839
+ })
840
+ ],
474
841
  []
475
842
  );
476
843
  const onError = useCallback((error) => {