UNPKG

@lukasrosario/account

Version:

Base Account SDK

129 lines (102 loc) 3.5 kB
import { Hex, PublicKey } from 'ox'; import { type LocalAccount, type OneOf } from 'viem'; import { WebAuthnAccount } from 'viem/account-abstraction'; import { generateKeyPair, getCryptoKeyAccount, getKeypair, storage } from './index.js'; function assertWebAuthnAccount( account: OneOf<WebAuthnAccount | LocalAccount> | null ): asserts account is WebAuthnAccount { if (!account) { throw new Error('account is null'); } if (account.type !== 'webAuthn') { throw new Error('account is not a webAuthn account'); } } describe('crypto-key', () => { it('should generate a key pair', async () => { const keypair = await generateKeyPair(); expect(keypair.privateKey).toBeDefined(); expect(keypair.publicKey).toBeDefined(); }); it('should return null if no key pair is found', async () => { vi.spyOn(storage, 'getItem').mockResolvedValue(null); const keypair = await getKeypair(); expect(keypair).toBeNull(); }); it('should return the keypair if found', async () => { const mockKeypair = await generateKeyPair(); vi.spyOn(storage, 'getItem').mockResolvedValue(mockKeypair); const keypair = await getKeypair(); expect(keypair).toBe(mockKeypair); }); it('should generate a new keypair if no keypair is found', async () => { vi.spyOn(storage, 'getItem').mockResolvedValue(null); const kp = await getKeypair(); expect(kp).toBeNull(); await getCryptoKeyAccount(); const keypair = await getKeypair(); expect(keypair).toBeDefined(); }); it('should return the account', async () => { const mockKeypair = await generateKeyPair(); const publicKey = Hex.slice(PublicKey.toHex(mockKeypair.publicKey), 1); vi.spyOn(storage, 'getItem').mockResolvedValue(mockKeypair); const { account } = await getCryptoKeyAccount(); expect(account).toEqual( expect.objectContaining({ id: publicKey, publicKey, type: 'webAuthn', }) ); }); it('should sign a message', async () => { const mockKeypair = await generateKeyPair(); vi.spyOn(storage, 'getItem').mockResolvedValue(mockKeypair); const { account } = await getCryptoKeyAccount(); assertWebAuthnAccount(account); const signature = await account.signMessage({ message: 'Hello, world!' }); expect(signature).toEqual( expect.objectContaining({ signature: expect.any(String), }) ); }); it('should sign a typed data', async () => { const mockKeypair = await generateKeyPair(); vi.spyOn(storage, 'getItem').mockResolvedValue(mockKeypair); const { account } = await getCryptoKeyAccount(); assertWebAuthnAccount(account); const signature = await account.signTypedData({ primaryType: 'Test', domain: { name: 'Test', }, types: { Test: [{ name: 'foo', type: 'string' }], }, message: { foo: 'bar', }, }); expect(signature).toEqual( expect.objectContaining({ signature: expect.any(String), }) ); }); it('should sign', async () => { const mockKeypair = await generateKeyPair(); vi.spyOn(storage, 'getItem').mockResolvedValue(mockKeypair); const { account } = await getCryptoKeyAccount(); assertWebAuthnAccount(account); const signature = await account.sign({ hash: '0x123', }); expect(signature).toEqual( expect.objectContaining({ signature: expect.any(String), }) ); }); });