@alchemy/aa-core
Version:
viem based SDK that enables interactions with ERC-4337 Smart Accounts. ABIs are based off the definitions generated in @account-abstraction/contracts
53 lines (45 loc) • 1.38 kB
text/typescript
import { isHex, type Chain } from "viem";
import { z } from "zod";
import type { BigNumberish, Multiplier } from "../types";
export const ChainSchema = z.custom<Chain>(
(chain) =>
chain != null &&
typeof chain === "object" &&
"id" in chain &&
typeof chain.id === "number"
);
export const HexSchema = z.custom<`0x${string}` | "0x">((val) => {
return isHex(val, { strict: true });
});
// [!region BigNumberish]
export const BigNumberishSchema = z.union([HexSchema, z.number(), z.bigint()]);
// [!endregion BigNumberish]
// [!region BigNumberishRange]
export const BigNumberishRangeSchema = z
.object({
min: BigNumberishSchema.optional(),
max: BigNumberishSchema.optional(),
})
.strict();
// [!endregion BigNumberishRange]
// [!region Multiplier]
export const MultiplierSchema = z
.object({
/**
* Multiplier value with max precision of 4 decimal places
*/
multiplier: z.number().refine(
(n) => {
return (n.toString().split(".")[1]?.length ?? 0) <= 4;
},
{ message: "Max precision is 4 decimal places" }
),
})
.strict();
// [!endregion Multiplier]
export function isBigNumberish(x: any): x is BigNumberish {
return x != null && BigNumberishSchema.safeParse(x).success;
}
export function isMultiplier(x: any): x is Multiplier {
return x != null && MultiplierSchema.safeParse(x).success;
}