UNPKG

accounts

Version:

Tempo Accounts SDK

246 lines (224 loc) 7.88 kB
import type { RpcSchema } from 'ox' import type { Hex } from 'viem' import { describe, expectTypeOf, test } from 'vp/test' import type * as Schema from './Schema.js' import type * as Rpc from './zod/rpc.js' describe('Encoded', () => { test('eth_accounts', () => { expectTypeOf<Rpc.eth_accounts.Encoded>().toEqualTypeOf<{ method: 'eth_accounts' params: undefined returns: readonly Hex[] }>() }) test('eth_chainId', () => { expectTypeOf<Rpc.eth_chainId.Encoded>().toEqualTypeOf<{ method: 'eth_chainId' params: undefined returns: Hex }>() }) test('eth_requestAccounts', () => { expectTypeOf<Rpc.eth_requestAccounts.Encoded>().toEqualTypeOf<{ method: 'eth_requestAccounts' params: undefined returns: readonly Hex[] }>() }) test('eth_sendTransaction', () => { expectTypeOf<Rpc.eth_sendTransaction.Encoded>().toMatchTypeOf<{ method: 'eth_sendTransaction' params: readonly [ { accessList?: { address: Hex; storageKeys: Hex[] }[] | undefined calls?: readonly { data?: Hex | undefined; to?: Hex | undefined }[] | undefined chainId?: Hex | undefined feePayer?: boolean | string | undefined feeToken?: Hex | undefined from?: Hex | undefined gas?: Hex | undefined maxFeePerGas?: Hex | undefined maxPriorityFeePerGas?: Hex | undefined nonce?: Hex | undefined nonceKey?: Hex | undefined validAfter?: Hex | undefined validBefore?: Hex | undefined value?: Hex | undefined }, ] returns: Hex }>() }) test('wallet_connect: params', () => { expectTypeOf<Rpc.wallet_connect.Encoded['params']>().toExtend< | readonly [ { capabilities?: | { digest?: Hex | undefined authorizeAccessKey?: | { address?: Hex | undefined expiry: number keyType?: 'secp256k1' | 'p256' | 'webAuthn' | undefined limits?: readonly { token: Hex; limit: Hex }[] | undefined publicKey?: Hex | undefined } | undefined method: 'register' name?: string | undefined userId?: string | undefined } | { digest?: Hex | undefined credentialId?: string | undefined authorizeAccessKey?: | { address?: Hex | undefined expiry: number keyType?: 'secp256k1' | 'p256' | 'webAuthn' | undefined limits?: readonly { token: Hex; limit: Hex }[] | undefined publicKey?: Hex | undefined } | undefined method?: 'login' | undefined selectAccount?: boolean | undefined } | undefined version?: string | undefined }, ] | undefined >() }) test('wallet_connect: returns', () => { expectTypeOf<Rpc.wallet_connect.Encoded['returns']>().toHaveProperty('accounts') expectTypeOf< Rpc.wallet_connect.Encoded['returns']['accounts'][number]['address'] >().toEqualTypeOf<Hex>() }) test('wallet_authorizeAccessKey', () => { expectTypeOf<Rpc.wallet_authorizeAccessKey.Encoded>().toHaveProperty('method') expectTypeOf<Rpc.wallet_authorizeAccessKey.Encoded['returns']>().toHaveProperty('rootAddress') expectTypeOf<Rpc.wallet_authorizeAccessKey.Encoded['returns']>().toHaveProperty( 'keyAuthorization', ) }) test('wallet_disconnect', () => { expectTypeOf<Rpc.wallet_disconnect.Encoded>().toEqualTypeOf<{ method: 'wallet_disconnect' params: undefined returns: undefined }>() }) test('wallet_transfer', () => { expectTypeOf<Rpc.wallet_transfer.Encoded>().toMatchTypeOf<{ method: 'wallet_transfer' params: | readonly [ { amount?: string | undefined memo?: string | undefined to?: Hex | undefined token?: Hex | string | undefined }, ] | undefined returns: { receipt: { transactionHash: Hex } } }>() }) test('wallet_swap', () => { expectTypeOf<Rpc.wallet_swap.Encoded>().toMatchTypeOf<{ method: 'wallet_swap' params: | readonly [ { amount?: string | undefined pairToken?: Hex | undefined slippage?: number | undefined token?: Hex | undefined type?: 'buy' | 'sell' | undefined }, ] | undefined returns: { receipt: { transactionHash: Hex } } }>() }) test('wallet_switchEthereumChain', () => { expectTypeOf<Rpc.wallet_switchEthereumChain.Encoded>().toEqualTypeOf<{ method: 'wallet_switchEthereumChain' params: readonly [{ chainId: Hex }] returns: undefined }>() }) }) describe('ToOx', () => { test('produces RpcSchema.Generic members', () => { type OxSchema = Schema.ToOx<typeof Schema.schema> expectTypeOf<OxSchema>().toMatchTypeOf<RpcSchema.Generic>() }) }) describe('ToViem', () => { test('produces tuple with Method/Parameters/ReturnType', () => { type ViemSchema = Schema.ToViem<typeof Schema.schema> expectTypeOf<ViemSchema[0]['Method']>().toEqualTypeOf<'eth_accounts'>() expectTypeOf<ViemSchema[0]['Parameters']>().toEqualTypeOf<undefined>() expectTypeOf<ViemSchema[0]['ReturnType']>().toEqualTypeOf<readonly Hex[]>() }) }) describe('Ox', () => { test('includes RpcSchema.Eth', () => { expectTypeOf<RpcSchema.Eth>().toMatchTypeOf<Schema.Ox>() }) test('includes provider methods', () => { expectTypeOf<Schema.ToOx<typeof Schema.schema>>().toMatchTypeOf<Schema.Ox>() }) }) describe('Viem', () => { test('is a tuple of all provider methods', () => { expectTypeOf<Schema.Viem[0]['Method']>().toEqualTypeOf<'eth_accounts'>() expectTypeOf<Schema.Viem[21]['Method']>().toEqualTypeOf<'wallet_switchEthereumChain'>() }) }) describe('Request', () => { test('is a discriminated union of all methods', () => { type Methods = Schema.Request['method'] expectTypeOf<Methods>().toEqualTypeOf< | 'eth_chainId' | 'eth_fillTransaction' | 'eth_accounts' | 'eth_requestAccounts' | 'eth_sendTransaction' | 'eth_signTransaction' | 'eth_signTypedData_v4' | 'personal_sign' | 'wallet_connect' | 'wallet_disconnect' | 'wallet_getCallsStatus' | 'wallet_getCapabilities' | 'wallet_sendCalls' | 'wallet_switchEthereumChain' | 'wallet_authorizeAccessKey' | 'eth_sendTransactionSync' | 'wallet_deposit' | 'wallet_depositZone' | 'wallet_getBalances' | 'wallet_revokeAccessKey' | 'wallet_transfer' | 'wallet_swap' | 'wallet_withdrawZone' >() }) test('wallet_switchEthereumChain has decoded params', () => { type SwitchChain = Extract<Schema.Request, { method: 'wallet_switchEthereumChain' }> expectTypeOf<SwitchChain['params']>().toEqualTypeOf<readonly [{ chainId: number }]>() }) test('eth_accounts has no params', () => { type EthAccounts = Extract<Schema.Request, { method: 'eth_accounts' }> expectTypeOf<EthAccounts>().not.toHaveProperty('params') }) test('wallet_connect params are optional', () => { type WalletConnect = Extract<Schema.Request, { method: 'wallet_connect' }> expectTypeOf<WalletConnect>().toMatchTypeOf<{ method: 'wallet_connect' }>() }) })