Skip to content

Commit 2400378

Browse files
committed
feat: use zod directly for validating, make escrow-v2 and curate-v2 templates valid
1 parent d701b0d commit 2400378

File tree

3 files changed

+25
-50
lines changed

3 files changed

+25
-50
lines changed

kleros-sdk/src/dataMappings/utils/DisputeDetailsValidator.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.

kleros-sdk/src/dataMappings/utils/disputeDetailsSchema.ts

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import { z } from "zod";
22
import { isAddress } from "viem";
33
import { normalize } from "viem/ens";
44

5+
const isHexAddress = (str: string): boolean => /^0x[a-fA-F0-9]{40}$/.test(str);
6+
7+
const isHexId = (str: string): boolean => /^0x[a-fA-F0-9]{1,64}$/.test(str);
8+
59
export const ethAddressSchema = z.string().refine((value) => isAddress(value), {
610
message: "Provided address is invalid.",
711
});
@@ -26,40 +30,41 @@ export enum QuestionType {
2630
export const QuestionTypeSchema = z.nativeEnum(QuestionType);
2731

2832
export const AnswerSchema = z.object({
29-
id: z.string().regex(/^0x[0-9a-fA-F]+$/), // should be a bigint
33+
id: z
34+
.string()
35+
.regex(/^0x[0-9a-fA-F]+$/)
36+
.optional(), // should be a bigint
3037
title: z.string(),
3138
description: z.string(),
32-
reserved: z.boolean(),
39+
reserved: z.boolean().optional(),
3340
});
3441

3542
export const AttachmentSchema = z.object({
3643
label: z.string(),
3744
uri: z.string(),
3845
});
3946

40-
export const AliasSchema = z.object({
41-
id: z.string().optional(),
42-
name: z.string(),
43-
address: ethAddressOrEnsNameSchema,
44-
});
47+
export const AliasSchema = z.record(ethAddressOrEnsNameSchema);
48+
49+
const MetadataSchema = z.record(z.any());
4550

4651
const DisputeDetailsSchema = z.object({
4752
title: z.string(),
4853
description: z.string(),
4954
question: z.string(),
50-
type: QuestionTypeSchema,
5155
answers: z.array(AnswerSchema),
5256
policyURI: z.string(),
53-
attachment: AttachmentSchema,
57+
attachment: AttachmentSchema.optional(),
5458
frontendUrl: z.string(),
59+
metadata: MetadataSchema.optional(),
5560
arbitrableChainID: z.string(),
56-
arbitrableAddress: ethAddressSchema,
61+
arbitrableAddress: z.string(), // should be changed for ethAddressSchema eventually
5762
arbitratorChainID: z.string(),
58-
arbitratorAddress: ethAddressSchema,
63+
arbitratorAddress: z.string(), // should be changed for ethAddressSchema eventually
5964
category: z.string(),
60-
lang: z.string(),
61-
specification: z.string(),
62-
aliases: z.array(AliasSchema).optional(),
65+
lang: z.string().optional(),
66+
specification: z.string().optional(),
67+
aliases: AliasSchema.optional(),
6368
version: z.string(),
6469
});
6570

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import mustache from "mustache";
22
import { DisputeDetails } from "./disputeDetailsTypes";
3-
import { validate } from "./DisputeDetailsValidator";
3+
import DisputeDetailsSchema from "./disputeDetailsSchema";
44

55
export const populateTemplate = (mustacheTemplate: string, data: any): DisputeDetails => {
66
const render = mustache.render(mustacheTemplate, data);
77
const dispute = JSON.parse(render);
88

9-
// TODO: the validation below is too strict, it should be fixed, disabled for now, FIXME
10-
if (!validate(dispute)) {
11-
// throw new Error(`Invalid dispute details format: ${JSON.stringify(dispute)}`);
9+
const validation = DisputeDetailsSchema.safeParse(dispute);
10+
if (!validation.success) {
11+
console.error("Validation errors:", validation.error.errors, "\n\nDispute details:", `${JSON.stringify(dispute)}`);
12+
throw new Error("Invalid dispute details format");
1213
}
14+
console.log(dispute);
1315

1416
return dispute;
1517
};

0 commit comments

Comments
 (0)