# Use Magic with kernel.js Magic is an embedded wallet provider that allows users to generate wallets scoped to your application via Social Logins, Email OTP, or Webauthn. ## Set up You must first create an app that utilizes Magic. - Follow the directions on the [Magic documentation site](https://magic.link/docs/home/welcome) to set up an app that integrates the Magic SDK - Magic also offers a cli to generate a starter project which can be found [here](https://magic.link/posts/magic-vue#cli-quickstart-tool). ## Integration Using kernel.js with Magic is very straightforward once you have the Magic sdk set up. Magic will provide you with an EOA wallet that we can use as a signer for the Kernel account. ### Create the Magic object After following the directions from the Magic docs you should have access to a MagicBase object like so. ```typescript= import { Magic as MagicBase } from 'magic-sdk'; const magic = new MagicBase(process.env.MAGIC_API_KEY as string, { network: { rpcUrl: getNetworkUrl(), chainId: getChainId(), }, extensions: [new AuthExtension(), new OAuthExtension()], }); ``` ### Use with kernel.js ```typescript= import { createEcdsaKernelAccountClient } from '@kerneljs/presets/zerodev'; import { polygonMumbai } from 'viem/chains'; // TODO import providerToSmartAccountSigner helper function // Get the Provider from Magic and convert it to a SmartAccountSigner const magicProvider = await magic.wallet.getProvider(); const smartAccountSigner = providerToSmartAccountSigner(magicProvider); // Set up your Kernel client const kernelClient = await createEcdsaKernelAccountClient({ chain: polygonMumbai, projectId: process.env.ZERODEV_PROJECT_ID, signer: smartAccountSigner, }); const kernelAddress = kernelClient.account.address; ``` ## TODO Proposed kernel.js Helper function ```typescript= import { walletClientToCustomSigner } from 'permissionless'; function providerToSmartAccountSigner(provider: any) { const [account] = await provider.request({ method: 'eth_requestAccounts' }); const walletClient = createWalletClient({ account: account as Hex, transport: custom(provider), }) return walletClientToCustomSigner(walletClient); } ```