accounts
Version:
Tempo Accounts SDK
328 lines (304 loc) • 8.93 kB
text/typescript
import { describe, expect, test } from 'vp/test'
import * as z from 'zod/mini'
import * as Schema from '../Schema.js'
import * as RpcRequest from './request.js'
import * as Rpc from './rpc.js'
describe('validate', () => {
test('default: validates eth_accounts', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'eth_accounts',
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "eth_accounts",
}
`)
})
test('default: validates eth_chainId', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'eth_chainId',
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "eth_chainId",
}
`)
})
test('default: validates wallet_connect without params', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_connect",
}
`)
})
test('default: validates wallet_connect with capabilities', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
params: [{ capabilities: { method: 'register' } }],
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_connect",
"params": [
{
"capabilities": {
"method": "register",
},
},
],
}
`)
})
test('default: validates wallet_disconnect', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_disconnect',
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_disconnect",
}
`)
})
test('default: validates wallet_switchEthereumChain with hex chainId', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_switchEthereumChain',
params: [{ chainId: '0xa' }],
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_switchEthereumChain",
"params": [
{
"chainId": 10,
},
],
}
`)
})
test('default: validates wallet_swap with sell amount', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_swap',
params: [
{
amount: '1.5',
pairToken: '0x0000000000000000000000000000000000000002',
slippage: 0.01,
token: '0x0000000000000000000000000000000000000001',
type: 'sell',
},
],
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_swap",
"params": [
{
"amount": "1.5",
"pairToken": "0x0000000000000000000000000000000000000002",
"slippage": 0.01,
"token": "0x0000000000000000000000000000000000000001",
"type": "sell",
},
],
}
`)
})
test('behavior: preserves original request properties', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'eth_accounts',
id: 1,
jsonrpc: '2.0',
})
expect({ id: (result as any).id, jsonrpc: (result as any).jsonrpc }).toMatchInlineSnapshot(`
{
"id": 1,
"jsonrpc": "2.0",
}
`)
})
test('error: throws UnsupportedMethodError for unknown methods', () => {
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'eth_unknownMethod',
}),
).toThrowErrorMatchingInlineSnapshot(
`[Provider.UnsupportedMethodError: Unsupported method "eth_unknownMethod".]`,
)
})
test('error: throws ProviderRpcError for invalid params', () => {
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'wallet_switchEthereumChain',
params: [{ chainId: 'not-hex' }],
}),
).toThrowErrorMatchingInlineSnapshot(
`[ProviderRpcError: Invalid params: params.0.chainId: Expected hex value, params.0.chainId: Invalid input]`,
)
})
test('error: rejects wallet_swap with invalid type', () => {
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'wallet_swap',
params: [
{
type: 'hold',
},
],
}),
).toThrowErrorMatchingInlineSnapshot(
`[ProviderRpcError: Invalid params: params.0.type: Invalid input, params.0.type: Invalid input]`,
)
})
test('default: validates wallet_connect with personalSign capability (login branch)', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
params: [{ capabilities: { personalSign: { message: 'hello' } } }],
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_connect",
"params": [
{
"capabilities": {
"personalSign": {
"message": "hello",
},
},
},
],
}
`)
})
test('default: validates wallet_connect with personalSign capability (register branch)', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
params: [{ capabilities: { method: 'register', personalSign: { message: 'hello' } } }],
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_connect",
"params": [
{
"capabilities": {
"method": "register",
"personalSign": {
"message": "hello",
},
},
},
],
}
`)
})
test('default: validates wallet_connect with personalSign empty message', () => {
const result = RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
params: [{ capabilities: { personalSign: { message: '' } } }],
})
expect(result._decoded).toMatchInlineSnapshot(`
{
"method": "wallet_connect",
"params": [
{
"capabilities": {
"personalSign": {
"message": "",
},
},
},
],
}
`)
})
test('error: rejects wallet_connect personalSign as a string', () => {
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
params: [{ capabilities: { personalSign: 'hello' } }],
}),
).toThrowError(/Invalid params/)
})
test('error: rejects wallet_connect personalSign without message', () => {
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
params: [{ capabilities: { personalSign: {} } }],
}),
).toThrowError(/Invalid params/)
})
test('error: rejects wallet_connect personalSign with non-string message', () => {
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'wallet_connect',
params: [{ capabilities: { personalSign: { message: 0 } } }],
}),
).toThrowError(/Invalid params/)
})
test('error: rejects wallet_swap with out-of-range slippage', () => {
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'wallet_swap',
params: [
{
slippage: 1.1,
},
],
}),
).toThrowErrorMatchingInlineSnapshot(
`[ProviderRpcError: Invalid params: params.0.slippage: Invalid input]`,
)
expect(() =>
RpcRequest.validate(Schema.Request, {
method: 'wallet_swap',
params: [
{
slippage: -0.1,
},
],
}),
).toThrowErrorMatchingInlineSnapshot(
`[ProviderRpcError: Invalid params: params.0.slippage: Invalid input]`,
)
})
})
describe('wallet_connect_strict.parameters', () => {
test('default: parses personalSign on the strict (login) branch', () => {
const result = z.parse(Rpc.wallet_connect_strict.parameters, {
capabilities: { personalSign: { message: 'hello' } },
})
expect(result).toMatchInlineSnapshot(`
{
"capabilities": {
"personalSign": {
"message": "hello",
},
},
}
`)
})
test('default: parses personalSign on the strict (register) branch', () => {
const result = z.parse(Rpc.wallet_connect_strict.parameters, {
capabilities: { method: 'register', personalSign: { message: 'hello' } },
})
expect(result).toMatchInlineSnapshot(`
{
"capabilities": {
"method": "register",
"personalSign": {
"message": "hello",
},
},
}
`)
})
test('error: rejects strict personalSign without message', () => {
expect(() =>
z.parse(Rpc.wallet_connect_strict.parameters, {
capabilities: { personalSign: {} },
}),
).toThrowError()
})
})