Skip to content

Commit 73c2e4b

Browse files
committed
chore(lib): allowlist helpers to allowlists lib
To gradually clean up the repo, we agreed on restructuring helpers from utils to more cleanly scoped libs. Additionally, added some tests
1 parent a57f65a commit 73c2e4b

11 files changed

+256
-87
lines changed

pnpm-lock.yaml

Lines changed: 0 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/controllers/AllowListController.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
Tags,
1010
} from "tsoa";
1111
import { StorageService } from "../services/StorageService.js";
12-
import { parseAndValidateMerkleTree } from "../utils/parseAndValidateMerkleTreeDump.js";
12+
import { parseAndValidateMerkleTree } from "../lib/allowlists/parseAndValidateMerkleTreeDump.js";
1313
import type {
1414
StorageResponse,
1515
StoreAllowListRequest,

src/controllers/MetadataController.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import type {
1919
} from "../types/api.js";
2020
import { validateMetadataAndClaimdata } from "../utils/validateMetadataAndClaimdata.js";
2121
import { validateRemoteAllowList } from "../utils/validateRemoteAllowList.js";
22-
import { parseAndValidateMerkleTree } from "../utils/parseAndValidateMerkleTreeDump.js";
22+
import { parseAndValidateMerkleTree } from "../lib/allowlists/parseAndValidateMerkleTreeDump.js";
2323

2424
@Route("v1/metadata")
2525
@Tags("Metadata")
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { StandardMerkleTree } from "@openzeppelin/merkle-tree";
2+
3+
export const tryParseMerkleTree = (allowList: unknown) => {
4+
try {
5+
StandardMerkleTree.load(JSON.parse(allowList as string));
6+
7+
return true;
8+
} catch (e) {
9+
console.warn("Error loading merkle tree as JSON", e);
10+
}
11+
12+
try {
13+
StandardMerkleTree.load(allowList as never);
14+
15+
return true;
16+
} catch (e) {
17+
console.warn("Error loading merkle tree from dump", e);
18+
}
19+
20+
return false;
21+
};

src/utils/parseAndValidateMerkleTreeDump.ts renamed to src/lib/allowlists/parseAndValidateMerkleTreeDump.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { validateAllowlist } from "@hypercerts-org/sdk";
22
import { parseMerkleTree } from "./parseMerkleTree.js";
3-
import { parseEther } from "viem";
4-
import { ValidateAllowListRequest } from "../types/api.js";
3+
import { ValidateAllowListRequest } from "../../types/api.js";
54

6-
export const parseAndValidateMerkleTree = (request: ValidateAllowListRequest) => {
5+
export const parseAndValidateMerkleTree = (
6+
request: ValidateAllowListRequest,
7+
) => {
78
const { allowList, totalUnits } = request;
89
const _merkleTree = parseMerkleTree(allowList);
910

@@ -12,17 +13,20 @@ export const parseAndValidateMerkleTree = (request: ValidateAllowListRequest) =>
1213
data: _merkleTree,
1314
valid: false,
1415
errors: {
15-
allowListData: "Data could not be parsed to OpenZeppelin MerkleTree"
16-
}
16+
allowListData: "Data could not be parsed to OpenZeppelin MerkleTree",
17+
},
1718
};
1819
}
1920

20-
const allowListEntries = Array.from(_merkleTree.entries()).map(entry => ({
21+
const allowListEntries = Array.from(_merkleTree.entries()).map((entry) => ({
2122
address: entry[1][0],
22-
units: BigInt(entry[1][1])
23+
units: BigInt(entry[1][1]),
2324
}));
2425

25-
const totalUnitsInEntries = allowListEntries.reduce((acc, entry) => acc + entry.units, BigInt(0));
26+
const totalUnitsInEntries = allowListEntries.reduce(
27+
(acc, entry) => acc + entry.units,
28+
BigInt(0),
29+
);
2630

2731
if (totalUnits) {
2832
if (totalUnitsInEntries !== BigInt(totalUnits)) {
@@ -31,8 +35,8 @@ export const parseAndValidateMerkleTree = (request: ValidateAllowListRequest) =>
3135
valid: false,
3236
errors: {
3337
totalUnits:
34-
"Total units do not match the sum of units in the allowlist"
35-
}
38+
"Total units do not match the sum of units in the allowlist",
39+
},
3640
};
3741
}
3842

@@ -41,8 +45,8 @@ export const parseAndValidateMerkleTree = (request: ValidateAllowListRequest) =>
4145
data: _merkleTree,
4246
valid: false,
4347
errors: {
44-
totalUnits: "Total units should amount to 100M (100_000_000) units"
45-
}
48+
totalUnits: "Total units should amount to 100M (100_000_000) units",
49+
},
4650
};
4751
}
4852
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { StandardMerkleTree } from "@openzeppelin/merkle-tree";
2+
3+
export const parseMerkleTree = (allowList: string) => {
4+
try {
5+
return StandardMerkleTree.load(JSON.parse(allowList));
6+
} catch (e) {
7+
console.warn("Error loading merkle tree as JSON", e);
8+
}
9+
10+
try {
11+
return StandardMerkleTree.load(allowList as never);
12+
} catch (e) {
13+
console.warn("Error loading merkle tree from dump", e);
14+
}
15+
};

src/utils/isParsableToMerkleTree.ts

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

src/utils/parseMerkleTree.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
import { getFromIPFS } from "@hypercerts-org/sdk";
2-
import { tryParseMerkleTree } from "./isParsableToMerkleTree.js";
2+
import { tryParseMerkleTree } from "../lib/allowlists/isParsableToMerkleTree.js";
33
import { ValidationResult } from "../types/api.js";
44

5-
export const validateRemoteAllowList = async (uri: string): Promise<ValidationResult<unknown>> => {
5+
export const validateRemoteAllowList = async (
6+
uri: string,
7+
): Promise<ValidationResult<unknown>> => {
68
try {
79
const allowList = await getFromIPFS(uri, 30000);
810

911
if (!allowList || typeof allowList !== "string") {
1012
return {
1113
valid: false,
1214
errors: {
13-
message: "Allow list data not found or not of expected type"
14-
}
15+
message: "Allow list data not found or not of expected type",
16+
},
1517
};
1618
}
1719

1820
if (tryParseMerkleTree(allowList)) {
1921
return {
2022
valid: true,
21-
data: allowList
23+
data: allowList,
2224
};
2325
} else {
2426
return {
2527
valid: false,
2628
errors: {
27-
message: `Allow list at ${uri} should be a valid openzeppelin merkle tree`
28-
}
29+
message: `Allow list at ${uri} should be a valid openzeppelin merkle tree`,
30+
},
2931
};
3032
}
3133
} catch (e) {
@@ -34,11 +36,8 @@ export const validateRemoteAllowList = async (uri: string): Promise<ValidationRe
3436
return {
3537
valid: false,
3638
errors: {
37-
message: error.message
38-
}
39+
message: error.message,
40+
},
3941
};
40-
4142
}
42-
43-
44-
};
43+
};

0 commit comments

Comments
 (0)