import type { Address } from 'abitype' import { expectTypeOf, test } from 'vitest' import type { EIP1193Parameters, EIP1193RequestFn, PublicRpcSchema, TestRpcSchema, WalletRpcSchema, } from './eip1193.js' import type { Hash, Hex } from './misc.js' import type { Quantity, RpcLog, RpcTransaction } from './rpc.js' test('default', async () => { type DefaultRequestFn = EIP1193RequestFn type DefaultParameters = EIP1193Parameters const request: DefaultRequestFn = null as any const x = await request({ method: 'eth_wagmi' }) expectTypeOf().toEqualTypeOf() request({ method: 'eth_wagmi', params: undefined }) request({ method: 'eth_wagmi', params: [] }) request({ method: 'eth_wagmi', params: [{ foo: 'bar' }] }) expectTypeOf().toEqualTypeOf<{ method: string params?: unknown }>() expectTypeOf>().toEqualTypeOf>() }) test('public methods', async () => { type PublicRequestFn = EIP1193RequestFn type PublicParameters = EIP1193Parameters const request: PublicRequestFn = null as any const x1 = await request({ method: 'eth_blockNumber' }) expectTypeOf().toEqualTypeOf() const x2 = await request({ method: 'eth_newFilter', params: [{ address: '0x', fromBlock: '0x', toBlock: '0x', topics: ['0x'] }], }) expectTypeOf().toEqualTypeOf() const x3 = await request({ method: 'eth_getLogs', params: [{ address: '0x', fromBlock: '0x', toBlock: '0x', topics: ['0x'] }], }) expectTypeOf().toEqualTypeOf() const x4 = await request<{ Method: 'eth_wagmi' Parameters: undefined ReturnType: number }>({ method: 'eth_wagmi' }) expectTypeOf().toEqualTypeOf() // @ts-expect-error request({ method: 'eth_newFilter' }) // @ts-expect-error request({ method: 'eth_wagmi' }) expectTypeOf().toEqualTypeOf< PublicRpcSchema[number]['Method'] >() }) test('wallet methods', async () => { type WalletRequestFn = EIP1193RequestFn type WalletParameters = EIP1193Parameters const request: WalletRequestFn = null as any const x1 = await request({ method: 'eth_accounts' }) expectTypeOf().toEqualTypeOf() const x2 = await request({ method: 'eth_sendTransaction', params: [ { from: '0x', }, ], }) expectTypeOf().toEqualTypeOf() const x3 = await request({ method: 'personal_sign', params: ['0x', '0x'], }) expectTypeOf().toEqualTypeOf() const x4 = await request<{ Method: 'eth_wagmi' Parameters: undefined ReturnType: number }>({ method: 'eth_wagmi' }) expectTypeOf().toEqualTypeOf() // @ts-expect-error request({ method: 'eth_sendTransaction' }) // @ts-expect-error request({ method: 'eth_wagmi' }) expectTypeOf().toEqualTypeOf< WalletRpcSchema[number]['Method'] >() }) test('test methods (strict)', async () => { type TestRequestFn = EIP1193RequestFn> type TestParameters = EIP1193Parameters> const request: TestRequestFn = null as any const x1 = await request({ method: 'anvil_addCompilationResult', params: [1], }) expectTypeOf().toEqualTypeOf() const x2 = await request({ method: 'anvil_enableTraces', }) expectTypeOf().toEqualTypeOf() const x3 = await request({ method: 'txpool_content', }) expectTypeOf().toEqualTypeOf<{ pending: Record<`0x${string}`, Record> queued: Record<`0x${string}`, Record> }>() const x4 = await request<{ Parameters: undefined ReturnType: number }>({ method: 'eth_wagmi' }) expectTypeOf().toEqualTypeOf() // @ts-expect-error request({ method: 'anvil_addCompilationResult' }) // @ts-expect-error request({ method: 'anvil_addCompilationResult', params: 'lol' }) // @ts-expect-error request({ method: 'eth_wagmi' }) expectTypeOf().toEqualTypeOf< TestRpcSchema<'anvil'>[number]['Method'] >() }) test('custom methods (strict)', async () => { type CustomSchema = [ { Method: 'eth_wagmi'; Parameters: [number]; ReturnType: string }, { Method: 'eth_viem'; Parameters?: never; ReturnType: number }, ] type CustomRequestFn = EIP1193RequestFn type CustomParameters = EIP1193Parameters const request: CustomRequestFn = null as any const x1 = await request({ method: 'eth_wagmi', params: [1] }) expectTypeOf().toEqualTypeOf() const x2 = await request<{ Parameters: undefined; ReturnType: number }>({ method: 'eth_wagmi', }) expectTypeOf().toEqualTypeOf() // @ts-expect-error request({ method: 'eth_wagmi' }) // @ts-expect-error request({ method: 'eth_lol' }) expectTypeOf().toEqualTypeOf< CustomSchema[number]['Method'] >() })