diff --git a/apps/web/src/composables/ledger.ts b/apps/web/src/composables/ledger.ts index ccdebfc6e..974477618 100644 --- a/apps/web/src/composables/ledger.ts +++ b/apps/web/src/composables/ledger.ts @@ -1,8 +1,12 @@ import { BitcoinLedgerSigner, EthersLedgerSigner } from '@casimir/wallets' import { ethers } from 'ethers' import { MessageInit, TransactionInit } from '@/interfaces/index' +import { Currency, ProviderString } from '@casimir/types' import useEnvironment from '@/composables/environment' import useEthers from '@/composables/ethers' +import useAuth from '@/composables/auth' + +const { getMessage, login } = useAuth() export default function useLedger() { const { ethereumURL, ledgerType, speculosURL } = useEnvironment() @@ -35,6 +39,25 @@ export default function useLedger() { return await signer.getAddress() } + async function loginWithLedger(provider: ProviderString, address: string, currency: Currency) { + try { + const { message } = await (await getMessage(provider, address)).json() + const signer = getEthersLedgerSigner() + const signature = await signer.signMessage(message) + const loginResponse = await login({ + provider, + address, + message: message.toString(), + signedMessage: signature, + currency + }) + return await loginResponse.json() + } catch (err) { + console.log('Error logging in: ', err) + return err + } + } + async function sendLedgerTransaction({ from, to, value, currency }: TransactionInit) { if (currency === 'ETH') { const signer = getEthersLedgerSigner() @@ -73,11 +96,12 @@ export default function useLedger() { } return { - signLedgerMessage, - sendLedgerTransaction, getBitcoinLedgerAddress, - getEthersLedgerAddress, getBitcoinLedgerSigner, + getEthersLedgerAddress, getEthersLedgerSigner, + loginWithLedger, + signLedgerMessage, + sendLedgerTransaction, } } diff --git a/apps/web/src/composables/wallet.ts b/apps/web/src/composables/wallet.ts index c2d70acc4..b07bcda6a 100644 --- a/apps/web/src/composables/wallet.ts +++ b/apps/web/src/composables/wallet.ts @@ -42,7 +42,7 @@ export default function useWallet() { const { ethereumURL } = useEnvironment() const { ethersProviderList, getEthersAddress, getEthersBalance, sendEthersTransaction, signEthersMessage, loginWithEthers, getEthersBrowserProviderSelectedCurrency, switchEthersNetwork } = useEthers() const { solanaProviderList, getSolanaAddress, sendSolanaTransaction, signSolanaMessage } = useSolana() - const { getBitcoinLedgerAddress, getEthersLedgerAddress, sendLedgerTransaction, signLedgerMessage } = useLedger() + const { getBitcoinLedgerAddress, getEthersLedgerAddress, loginWithLedger, sendLedgerTransaction, signLedgerMessage } = useLedger() const { getTrezorAddress, sendTrezorTransaction, signTrezorMessage } = useTrezor() const { getWalletConnectAddress, sendWalletConnectTransaction, signWalletConnectMessage } = useWalletConnect() const { user, getUser, setUser, addAccount, removeAccount, updatePrimaryAddress } = useUsers() @@ -118,7 +118,7 @@ export default function useWallet() { if (!loggedIn.value) { loadingUserWallets.value = true const connectedAddress = await getConnectedAddressFromProvider(provider, currency) - const connectedCurrency = await detectCurrencyInProvider(provider) as Currency + const connectedCurrency = currency ? currency : await detectCurrencyInProvider(provider) as Currency const loginResponse = await loginWithWallet(provider, connectedAddress, connectedCurrency) if (!loginResponse?.error) { // STEP 2 @@ -210,6 +210,8 @@ export default function useWallet() { async function loginWithWallet(provider: ProviderString, address: string, currency: Currency) { if (ethersProviderList.includes(provider)) { return await loginWithEthers(provider, address, currency) + } else if (provider === 'Ledger') { + return await loginWithLedger(provider, address, currency) } else { // TODO: Implement this for other providers console.log('Sign up not yet supported for this wallet provider')