Skip to content

Commit 465e330

Browse files
committed
feat(providers): rewrite validators
1 parent 9e637cd commit 465e330

File tree

2 files changed

+197
-136
lines changed

2 files changed

+197
-136
lines changed

packages/providers/src/types.ts

Lines changed: 14 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,16 @@
1+
import type { z } from "zod";
12
import type {
2-
CreateNullifierParams,
3-
Nullifier,
4-
PublicKey,
5-
SendTransactionParams,
6-
SignFieldsParams,
7-
SignMessageParams,
8-
SignTransactionParams,
9-
SignedFields,
10-
SignedMessage,
11-
SignedTransaction,
12-
TransactionReceipt,
13-
} from "@mina-js/shared";
14-
import type { AddChainData, SwitchChainData } from "./validation";
3+
MinaProviderClientSchema,
4+
MinaProviderDetailSchema,
5+
MinaProviderInfoSchema,
6+
ProviderListenerSchema,
7+
ProviderRequestSchema,
8+
ProviderRpcErrorSchema,
9+
} from "./validation";
1510

16-
export type MinaProviderDetail = {
17-
info: MinaProviderInfo;
18-
provider: MinaProviderClient;
19-
};
11+
export type MinaProviderDetail = z.infer<typeof MinaProviderDetailSchema>;
2012

21-
export type MinaProviderInfo = {
22-
icon: `data:image/${string}`;
23-
name: string;
24-
rdns: string;
25-
slug: string;
26-
};
13+
export type MinaProviderInfo = z.infer<typeof MinaProviderInfoSchema>;
2714

2815
export interface MinaAnnounceProviderEvent
2916
extends CustomEvent<MinaProviderDetail> {
@@ -34,14 +21,7 @@ export interface MinaRequestProviderEvent extends Event {
3421
type: "mina:requestProvider";
3522
}
3623

37-
export type ProviderRpcError = (
38-
| { message: "User Rejected Request"; code: 4001 }
39-
| { message: "Unauthorized"; code: 4100 }
40-
| { message: "Unsupported Method"; code: 4200 }
41-
| { message: "Disconnected"; code: 4900 }
42-
| { message: "Chain Disconnected"; code: 4901 }
43-
) &
44-
Error;
24+
export type ProviderRpcError = z.infer<typeof ProviderRpcErrorSchema> & Error;
4525

4626
export type ProviderRpcEvent =
4727
| "connect"
@@ -50,105 +30,8 @@ export type ProviderRpcEvent =
5030
| "accountsChanged"
5131
| "mina_message";
5232

53-
// Request variants
54-
export type AccountsRequest = (args: {
55-
method: "mina_accounts";
56-
}) => Promise<PublicKey[]>;
33+
export type ProviderRequest = z.infer<typeof ProviderRequestSchema>;
5734

58-
export type ChainIdRequest = (args: {
59-
method: "mina_chainId";
60-
}) => Promise<string>;
35+
export type ProviderListener = z.infer<typeof ProviderListenerSchema>;
6136

62-
export type ChainInformationRequest = (args: {
63-
method: "mina_chainInformation";
64-
}) => Promise<{ url: string; name: string }>;
65-
66-
export type GetBalanceRequest = (args: {
67-
method: "mina_getBalance";
68-
}) => Promise<number>;
69-
70-
export type SignRequest = (args: {
71-
method: "mina_sign";
72-
params: SignMessageParams;
73-
}) => Promise<SignedMessage>;
74-
75-
export type SignFieldsRequest = (args: {
76-
method: "mina_signFields";
77-
params: SignFieldsParams;
78-
}) => Promise<SignedFields>;
79-
80-
export type SignTransactionRequest = (args: {
81-
method: "mina_signTransaction";
82-
params: SignTransactionParams;
83-
}) => Promise<SignedTransaction>;
84-
85-
export type SendTransactionRequest = (args: {
86-
method: "mina_sendTransaction";
87-
params: SendTransactionParams;
88-
}) => Promise<TransactionReceipt>;
89-
90-
export type CreateNullifierRequest = (args: {
91-
method: "mina_createNullifier";
92-
params: CreateNullifierParams;
93-
}) => Promise<Nullifier>;
94-
95-
export type SwitchChainRequest = (args: {
96-
method: "mina_switchChain";
97-
params: SwitchChainData;
98-
}) => Promise<string>;
99-
100-
export type AddChainRequest = (args: {
101-
method: "mina_addChain";
102-
params: AddChainData;
103-
}) => Promise<string>;
104-
105-
export type ProviderRequest =
106-
| AccountsRequest
107-
| ChainIdRequest
108-
| ChainInformationRequest
109-
| GetBalanceRequest
110-
| SignRequest
111-
| SignFieldsRequest
112-
| SignTransactionRequest
113-
| SendTransactionRequest
114-
| CreateNullifierRequest
115-
| SwitchChainRequest
116-
| AddChainRequest;
117-
118-
export type ConnectedListener = (
119-
event: "connected",
120-
callback: (params: { chainId: string }) => void,
121-
) => void;
122-
123-
export type DisconnectedListener = (
124-
event: "disconnected",
125-
callback: (params: { error: ProviderRpcError }) => void,
126-
) => void;
127-
128-
export type ChainChangedListener = (
129-
event: "chainChanged",
130-
callback: (params: { chainId: string }) => void,
131-
) => void;
132-
133-
export type AccountsChangedListener = (
134-
event: "accountsChanged",
135-
callback: (params: { accounts: PublicKey[] }) => void,
136-
) => void;
137-
138-
export type MessageListener = (
139-
event: "mina_message",
140-
callback: (params: { type: string; data: unknown }) => void,
141-
) => void;
142-
143-
export type ProviderListener =
144-
| ConnectedListener
145-
| DisconnectedListener
146-
| ChainChangedListener
147-
| AccountsChangedListener
148-
| MessageListener;
149-
150-
export type MinaProviderClient = {
151-
request: ProviderRequest;
152-
on: ProviderListener;
153-
removeListener: ProviderListener;
154-
};
37+
export type MinaProviderClient = z.infer<typeof MinaProviderClientSchema>;

packages/providers/src/validation.ts

Lines changed: 183 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,192 @@
1+
import {
2+
CreateNullifierParamsSchema,
3+
NullifierSchema,
4+
PublicKeySchema,
5+
SendTransactionParamsSchema,
6+
SignFieldsParamsSchema,
7+
SignMessageParamsSchema,
8+
SignTransactionParamsSchema,
9+
SignedFieldsSchema,
10+
SignedMessageSchema,
11+
SignedTransactionSchema,
12+
TransactionReceiptSchema,
13+
} from "@mina-js/shared";
114
import { z } from "zod";
215

3-
export const switchChainRequestSchema = z.object({
16+
export const SwitchChainRequestParams = z.object({
417
chainId: z.string(),
518
});
619

7-
export type SwitchChainData = z.infer<typeof switchChainRequestSchema>;
8-
9-
export const addChainRequestSchema = z.object({
20+
export const AddChainRequestParams = z.object({
1021
url: z.string().url(),
1122
name: z.string(),
1223
});
1324

14-
export type AddChainData = z.infer<typeof addChainRequestSchema>;
25+
export const AccountsRequestSchema = z
26+
.function()
27+
.args(z.object({ method: z.literal("mina_accounts") }))
28+
.returns(z.promise(z.array(PublicKeySchema)));
29+
export const ChainIdRequestSchema = z
30+
.function()
31+
.args(z.object({ method: z.literal("mina_chainId") }))
32+
.returns(z.promise(z.string()));
33+
export const ChainInformationRequestSchema = z
34+
.function()
35+
.args(z.object({ method: z.literal("mina_chainInformation") }))
36+
.returns(z.promise(z.object({ url: z.string(), name: z.string() })));
37+
export const GetBalanceRequestSchema = z
38+
.function()
39+
.args(z.object({ method: z.literal("mina_getBalance") }))
40+
.returns(z.promise(z.number()));
41+
export const SignRequestSchema = z
42+
.function()
43+
.args(
44+
z.object({
45+
method: z.literal("mina_sign"),
46+
params: SignMessageParamsSchema,
47+
}),
48+
)
49+
.returns(z.promise(SignedMessageSchema));
50+
export const SignFieldsRequestSchema = z
51+
.function()
52+
.args(
53+
z.object({
54+
method: z.literal("mina_signFields"),
55+
params: SignFieldsParamsSchema,
56+
}),
57+
)
58+
.returns(z.promise(SignedFieldsSchema));
59+
export const SignTransactionRequestSchema = z
60+
.function()
61+
.args(
62+
z.object({
63+
method: z.literal("mina_signTransaction"),
64+
params: SignTransactionParamsSchema,
65+
}),
66+
)
67+
.returns(z.promise(SignedTransactionSchema));
68+
export const SendTransactionRequestSchema = z
69+
.function()
70+
.args(
71+
z.object({
72+
method: z.literal("mina_sendTransaction"),
73+
params: SendTransactionParamsSchema,
74+
}),
75+
)
76+
.returns(z.promise(TransactionReceiptSchema));
77+
export const CreateNullifierRequestSchema = z
78+
.function()
79+
.args(
80+
z.object({
81+
method: z.literal("mina_createNullifier"),
82+
params: CreateNullifierParamsSchema,
83+
}),
84+
)
85+
.returns(z.promise(NullifierSchema));
86+
export const SwitchChainRequestSchema = z
87+
.function()
88+
.args(
89+
z.object({
90+
method: z.literal("mina_switchChain"),
91+
params: SwitchChainRequestParams,
92+
}),
93+
)
94+
.returns(z.promise(z.string()));
95+
export const AddChainRequestSchema = z
96+
.function()
97+
.args(
98+
z.object({
99+
method: z.literal("mina_addChain"),
100+
params: AddChainRequestParams,
101+
}),
102+
)
103+
.returns(z.promise(z.string()));
104+
105+
export const ProviderRequestSchema = z.union([
106+
AccountsRequestSchema,
107+
ChainIdRequestSchema,
108+
ChainInformationRequestSchema,
109+
GetBalanceRequestSchema,
110+
SignRequestSchema,
111+
SignFieldsRequestSchema,
112+
SignTransactionRequestSchema,
113+
SendTransactionRequestSchema,
114+
CreateNullifierRequestSchema,
115+
SwitchChainRequestSchema,
116+
AddChainRequestSchema,
117+
]);
118+
119+
export const ChainIdCallbackSchema = z
120+
.function()
121+
.args(z.object({ chainId: z.string() }))
122+
.returns(z.void());
123+
124+
export const ConnectedListenerSchema = z
125+
.function()
126+
.args(z.literal("connected"), ChainIdCallbackSchema)
127+
.returns(z.void());
128+
export const DisconnectedListenerSchema = z
129+
.function()
130+
.args(z.literal("disconnected"), z.function())
131+
.returns(z.void());
132+
export const ChainChangedListenerSchema = z
133+
.function()
134+
.args(z.literal("chainChanged"), ChainIdCallbackSchema)
135+
.returns(z.void());
136+
export const AccountsChangedListenerSchema = z
137+
.function()
138+
.args(z.literal("accountsChanged"), z.function())
139+
.returns(z.void());
140+
export const MessageListenerSchema = z
141+
.function()
142+
.args(z.literal("mina_message"), z.function())
143+
.returns(z.void());
144+
145+
export const ProviderListenerSchema = z.union([
146+
ConnectedListenerSchema,
147+
DisconnectedListenerSchema,
148+
ChainChangedListenerSchema,
149+
AccountsChangedListenerSchema,
150+
MessageListenerSchema,
151+
]);
152+
153+
export const ProviderRpcErrorSchema = z.discriminatedUnion("code", [
154+
z.object({
155+
code: z.literal(4001),
156+
message: z.literal("User Rejected Request"),
157+
}),
158+
z.object({
159+
code: z.literal(4100),
160+
message: z.literal("Unauthorized"),
161+
}),
162+
z.object({
163+
code: z.literal(4200),
164+
message: z.literal("Unsupported Method"),
165+
}),
166+
z.object({
167+
code: z.literal(4900),
168+
message: z.literal("Disconnected"),
169+
}),
170+
z.object({
171+
code: z.literal(4901),
172+
message: z.literal("Chain Disconnected"),
173+
}),
174+
]);
175+
176+
export const MinaProviderInfoSchema = z.object({
177+
icon: z.string().startsWith("data:image/"),
178+
name: z.string(),
179+
rdns: z.string(),
180+
slug: z.string(),
181+
});
182+
183+
export const MinaProviderClientSchema = z.object({
184+
request: ProviderRequestSchema,
185+
on: ProviderListenerSchema,
186+
removeListener: ProviderListenerSchema,
187+
});
188+
189+
export const MinaProviderDetailSchema = z.object({
190+
info: MinaProviderInfoSchema,
191+
provider: MinaProviderClientSchema,
192+
});

0 commit comments

Comments
 (0)