From e73a4067893768b5f0522c43d5c78cf9ad3284b5 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Thu, 22 Sep 2022 12:33:34 -0700 Subject: [PATCH 1/6] Remove JSON types --- packages/sdk/src/core/types.ts | 18 +----- .../sdk/src/schema/contracts/common/index.ts | 3 +- packages/sdk/src/schema/contracts/custom.ts | 3 +- packages/sdk/src/schema/shared.ts | 60 ++++++++----------- .../sdk/src/schema/tokens/common/index.ts | 4 +- .../src/schema/tokens/common/properties.ts | 8 ++- 6 files changed, 35 insertions(+), 61 deletions(-) diff --git a/packages/sdk/src/core/types.ts b/packages/sdk/src/core/types.ts index 18612c2b710..e7ab36f3e80 100644 --- a/packages/sdk/src/core/types.ts +++ b/packages/sdk/src/core/types.ts @@ -1,13 +1,6 @@ import type { CONTRACTS_MAP, PREBUILT_CONTRACTS_MAP } from "../contracts"; import type { SmartContract } from "../contracts/smart-contract"; -import { - BigNumber, - BytesLike, - CallOverrides, - Signer, - providers, - BigNumberish, -} from "ethers"; +import { BigNumber, BytesLike, CallOverrides, Signer, providers } from "ethers"; // --- utility types extracted from from ts-toolbelt --- // @@ -115,12 +108,3 @@ export interface GaslessTransaction { functionArgs: any[]; callOverrides: CallOverrides; } - -type JsonLiteralOutput = boolean | null | number | string; -type JsonLiteralInput = JsonLiteralOutput | BigNumber | bigint; - -export type JsonOutput = JsonLiteralOutput | JsonObjectOutput | JsonOutput[]; -export type JsonObjectOutput = { [key: string]: JsonOutput }; - -export type JsonInput = JsonLiteralInput | JsonObjectInput | JsonInput[]; -export type JsonObjectInput = { [key: string]: JsonInput }; diff --git a/packages/sdk/src/schema/contracts/common/index.ts b/packages/sdk/src/schema/contracts/common/index.ts index 4365d355f34..fc8d8bbe65d 100644 --- a/packages/sdk/src/schema/contracts/common/index.ts +++ b/packages/sdk/src/schema/contracts/common/index.ts @@ -2,7 +2,6 @@ import { AddressSchema, BasisPointsSchema, FileOrBufferOrStringSchema, - JsonSchema, } from "../../shared"; import { constants } from "ethers"; import { z } from "zod"; @@ -24,7 +23,7 @@ export type CommonContractSchemaInput = z.input; */ export const CommonContractOutputSchema = CommonContractSchema.extend({ image: z.string().optional(), -}).catchall(z.lazy(() => JsonSchema)); +}).catchall(z.unknown()); /** * @internal diff --git a/packages/sdk/src/schema/contracts/custom.ts b/packages/sdk/src/schema/contracts/custom.ts index 9a108d3e920..dd24ff80e0f 100644 --- a/packages/sdk/src/schema/contracts/custom.ts +++ b/packages/sdk/src/schema/contracts/custom.ts @@ -3,7 +3,6 @@ import { AddressSchema, BigNumberishSchema, FileOrBufferOrStringSchema, - JsonSchema, } from "../shared"; import { CommonContractOutputSchema, @@ -22,7 +21,7 @@ import { z } from "zod"; * @internal */ export const BYOCContractMetadataSchema = CommonContractSchema.catchall( - z.lazy(() => JsonSchema), + z.union([BigNumberishSchema, z.unknown()]), ); /** diff --git a/packages/sdk/src/schema/shared.ts b/packages/sdk/src/schema/shared.ts index 01a2c03c083..f8a4a88f584 100644 --- a/packages/sdk/src/schema/shared.ts +++ b/packages/sdk/src/schema/shared.ts @@ -2,6 +2,30 @@ import { JsonOutput, JsonInput } from "../core/types"; import { BigNumber, CallOverrides, utils } from "ethers"; import { z, ZodTypeDef } from "zod"; +const isBrowser = () => typeof window !== "undefined"; +const FileOrBufferUnionSchema = isBrowser() + ? (z.instanceof(File) as z.ZodType>) + : (z.instanceof(Buffer) as z.ZodTypeAny); // @fixme, this is a hack to make browser happy for now + +/** + * @internal + */ +export const FileOrBufferSchema = z.union([ + FileOrBufferUnionSchema, + z.object({ + data: z.union([FileOrBufferUnionSchema, z.string()]), + name: z.string(), + }), +]); + +/** + * @internal + */ +export const FileOrBufferOrStringSchema = z.union([ + FileOrBufferSchema, + z.string(), +]); + export const MAX_BPS = 10000; export const BytesLikeSchema = z.union([z.array(z.number()), z.string()]); @@ -48,18 +72,6 @@ export const AddressSchema = z.string().refine( }, ); -export const JsonLiteral = z.union([ - z.string(), - z.number(), - z.boolean(), - z.null(), - BigNumberishSchema, -]); - -export const JsonSchema: z.ZodSchema = - z.lazy(() => z.union([JsonLiteral, JsonObjectSchema, z.array(JsonSchema)])); -export const JsonObjectSchema = z.record(JsonSchema); - export const AmountSchema = z .union([ z.string().regex(/^([0-9]+\.?[0-9]*|\.[0-9]+)$/, "Invalid amount"), @@ -96,27 +108,3 @@ export const CallOverrideSchema: z.ZodType = z type: z.number().optional(), }) .strict(); - -const isBrowser = () => typeof window !== "undefined"; -const FileOrBufferUnionSchema = isBrowser() - ? (z.instanceof(File) as z.ZodType>) - : (z.instanceof(Buffer) as z.ZodTypeAny); // @fixme, this is a hack to make browser happy for now - -/** - * @internal - */ -export const FileOrBufferSchema = z.union([ - FileOrBufferUnionSchema, - z.object({ - data: z.union([FileOrBufferUnionSchema, z.string()]), - name: z.string(), - }), -]); - -/** - * @internal - */ -export const FileOrBufferOrStringSchema = z.union([ - FileOrBufferSchema, - z.string(), -]); diff --git a/packages/sdk/src/schema/tokens/common/index.ts b/packages/sdk/src/schema/tokens/common/index.ts index 6c7dd7ede03..ab4b34f110e 100644 --- a/packages/sdk/src/schema/tokens/common/index.ts +++ b/packages/sdk/src/schema/tokens/common/index.ts @@ -1,8 +1,8 @@ import { + BigNumberishSchema, BigNumberSchema, FileOrBufferOrStringSchema, HexColor, - JsonSchema, } from "../../shared"; import { OptionalPropertiesInput } from "./properties"; import { z } from "zod"; @@ -17,7 +17,7 @@ export const CommonTokenInput = z image: FileOrBufferOrStringSchema.nullable().optional(), external_url: FileOrBufferOrStringSchema.nullable().optional(), }) - .catchall(z.lazy(() => JsonSchema)); + .catchall(z.union([BigNumberishSchema, z.unknown()])); /** * @internal diff --git a/packages/sdk/src/schema/tokens/common/properties.ts b/packages/sdk/src/schema/tokens/common/properties.ts index 49d0e7fc64a..f01b936bcfa 100644 --- a/packages/sdk/src/schema/tokens/common/properties.ts +++ b/packages/sdk/src/schema/tokens/common/properties.ts @@ -1,9 +1,13 @@ -import { JsonObjectSchema } from "../../shared"; +import { BigNumberishSchema } from "../../shared"; import { z } from "zod"; +const PropertiesInput = z + .object({}) + .catchall(z.union([BigNumberishSchema, z.unknown()])); + /** * @internal */ export const OptionalPropertiesInput = z - .union([z.array(JsonObjectSchema), JsonObjectSchema]) + .union([z.array(PropertiesInput), PropertiesInput]) .optional(); From cfe59ece422c02754e1b2a12024ad3027438acf2 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Thu, 22 Sep 2022 12:38:24 -0700 Subject: [PATCH 2/6] Update types file --- packages/sdk/src/schema/shared.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/sdk/src/schema/shared.ts b/packages/sdk/src/schema/shared.ts index f8a4a88f584..416a1d0d532 100644 --- a/packages/sdk/src/schema/shared.ts +++ b/packages/sdk/src/schema/shared.ts @@ -1,6 +1,5 @@ -import { JsonOutput, JsonInput } from "../core/types"; import { BigNumber, CallOverrides, utils } from "ethers"; -import { z, ZodTypeDef } from "zod"; +import { z } from "zod"; const isBrowser = () => typeof window !== "undefined"; const FileOrBufferUnionSchema = isBrowser() From 2b16c259bd97e83dc08190c6f9787b20e6614c22 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Thu, 22 Sep 2022 13:22:54 -0700 Subject: [PATCH 3/6] Update BigNumber shcema --- packages/sdk/src/schema/contracts/custom.ts | 3 ++- packages/sdk/src/schema/shared.ts | 10 ++++++++++ packages/sdk/src/schema/tokens/common/index.ts | 4 ++-- packages/sdk/src/schema/tokens/common/properties.ts | 4 ++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/sdk/src/schema/contracts/custom.ts b/packages/sdk/src/schema/contracts/custom.ts index dd24ff80e0f..84e61bffacc 100644 --- a/packages/sdk/src/schema/contracts/custom.ts +++ b/packages/sdk/src/schema/contracts/custom.ts @@ -2,6 +2,7 @@ import { toSemver } from "../../common/index"; import { AddressSchema, BigNumberishSchema, + BigNumberTransformSchema, FileOrBufferOrStringSchema, } from "../shared"; import { @@ -21,7 +22,7 @@ import { z } from "zod"; * @internal */ export const BYOCContractMetadataSchema = CommonContractSchema.catchall( - z.union([BigNumberishSchema, z.unknown()]), + z.union([BigNumberTransformSchema, z.unknown()]), ); /** diff --git a/packages/sdk/src/schema/shared.ts b/packages/sdk/src/schema/shared.ts index 416a1d0d532..e3c2833c2fd 100644 --- a/packages/sdk/src/schema/shared.ts +++ b/packages/sdk/src/schema/shared.ts @@ -44,6 +44,16 @@ export const BigNumberishSchema = BigNumberSchema.transform((arg) => arg.toString(), ); +export const BigNumberTransformSchema = z + .union([ + z.bigint(), + z.custom((data) => { + return BigNumber.isBigNumber(data); + }), + ]) + .transform((arg) => BigNumber.from(arg)) + .transform((arg) => arg.toString()); + export const BasisPointsSchema = z .number() .max(MAX_BPS, "Cannot exeed 100%") diff --git a/packages/sdk/src/schema/tokens/common/index.ts b/packages/sdk/src/schema/tokens/common/index.ts index ab4b34f110e..b25cd4706bf 100644 --- a/packages/sdk/src/schema/tokens/common/index.ts +++ b/packages/sdk/src/schema/tokens/common/index.ts @@ -1,6 +1,6 @@ import { - BigNumberishSchema, BigNumberSchema, + BigNumberTransformSchema, FileOrBufferOrStringSchema, HexColor, } from "../../shared"; @@ -17,7 +17,7 @@ export const CommonTokenInput = z image: FileOrBufferOrStringSchema.nullable().optional(), external_url: FileOrBufferOrStringSchema.nullable().optional(), }) - .catchall(z.union([BigNumberishSchema, z.unknown()])); + .catchall(z.union([BigNumberTransformSchema, z.unknown()])); /** * @internal diff --git a/packages/sdk/src/schema/tokens/common/properties.ts b/packages/sdk/src/schema/tokens/common/properties.ts index f01b936bcfa..37a36fcf180 100644 --- a/packages/sdk/src/schema/tokens/common/properties.ts +++ b/packages/sdk/src/schema/tokens/common/properties.ts @@ -1,9 +1,9 @@ -import { BigNumberishSchema } from "../../shared"; +import { BigNumberTransformSchema } from "../../shared"; import { z } from "zod"; const PropertiesInput = z .object({}) - .catchall(z.union([BigNumberishSchema, z.unknown()])); + .catchall(z.union([BigNumberTransformSchema, z.unknown()])); /** * @internal From 48ef497b7203e366d37f591eeb5bd599cbdce6b1 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Thu, 22 Sep 2022 13:29:42 -0700 Subject: [PATCH 4/6] Update solana schemas --- packages/solana/src/types/common.ts | 19 ++++++------------- packages/solana/src/types/contracts/index.ts | 8 ++------ packages/solana/src/types/nft.ts | 3 +-- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/packages/solana/src/types/common.ts b/packages/solana/src/types/common.ts index 750be9909d4..611da6c8e88 100644 --- a/packages/solana/src/types/common.ts +++ b/packages/solana/src/types/common.ts @@ -32,18 +32,6 @@ export const JsonLiteral = z.union([ z.null(), ]); -/** - * @internal - */ -export const JsonSchema: z.ZodType = z.lazy(() => - z.union([JsonLiteral, JsonObjectSchema, z.array(JsonSchema)]), -); - -/** - * @internal - */ -export const JsonObjectSchema = z.record(z.string(), JsonSchema); - /** * @internal */ @@ -70,11 +58,16 @@ export const HexColor = z.union([ z.string().length(0), ]); +/** + * @internal + */ +const PropertiesInput = z.object({}).catchall(z.unknown()); + /** * @internal */ export const OptionalPropertiesInput = z - .union([z.array(JsonObjectSchema), JsonObjectSchema]) + .union([z.array(PropertiesInput), PropertiesInput]) .optional(); /** diff --git a/packages/solana/src/types/contracts/index.ts b/packages/solana/src/types/contracts/index.ts index c46456c4e52..4b5706c0eb8 100644 --- a/packages/solana/src/types/contracts/index.ts +++ b/packages/solana/src/types/contracts/index.ts @@ -1,8 +1,4 @@ -import { - AmountSchema, - FileOrBufferOrStringSchema, - JsonSchema, -} from "../common"; +import { AmountSchema, FileOrBufferOrStringSchema } from "../common"; import { z } from "zod"; /** @@ -21,7 +17,7 @@ export const CommonContractSchema = z.object({ */ export const CommonContractOutputSchema = CommonContractSchema.extend({ image: z.string().optional(), -}).catchall(z.lazy(() => JsonSchema)); +}).catchall(z.unknown()); /// NFT /// diff --git a/packages/solana/src/types/nft.ts b/packages/solana/src/types/nft.ts index e3cceafd62c..b8565475583 100644 --- a/packages/solana/src/types/nft.ts +++ b/packages/solana/src/types/nft.ts @@ -2,7 +2,6 @@ import { CurrencyValueSchema, FileOrBufferOrStringSchema, HexColor, - JsonSchema, OptionalPropertiesInput, } from "./common"; import { z } from "zod"; @@ -18,7 +17,7 @@ export const CommonTokenInput = z image: FileOrBufferOrStringSchema.nullable().optional(), external_url: FileOrBufferOrStringSchema.nullable().optional(), }) - .catchall(z.lazy(() => JsonSchema)); + .catchall(z.unknown()); /** * @internal From 01e2f88b79e60b7f56b7bc7b8fb4b17ce7f3767c Mon Sep 17 00:00:00 2001 From: adam-maj Date: Thu, 22 Sep 2022 13:30:17 -0700 Subject: [PATCH 5/6] Add changeset --- .changeset/shiny-suits-kneel.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/shiny-suits-kneel.md diff --git a/.changeset/shiny-suits-kneel.md b/.changeset/shiny-suits-kneel.md new file mode 100644 index 00000000000..7f85665223a --- /dev/null +++ b/.changeset/shiny-suits-kneel.md @@ -0,0 +1,6 @@ +--- +"@thirdweb-dev/sdk": patch +"@thirdweb-dev/solana": patch +--- + +Update JSON schema in SDKs From 57d4684489ed83d8f5d12c143aecb72d9e2a5118 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Thu, 22 Sep 2022 13:52:56 -0700 Subject: [PATCH 6/6] Chain big number transform --- packages/sdk/src/schema/shared.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/sdk/src/schema/shared.ts b/packages/sdk/src/schema/shared.ts index e3c2833c2fd..e50082f469b 100644 --- a/packages/sdk/src/schema/shared.ts +++ b/packages/sdk/src/schema/shared.ts @@ -51,8 +51,9 @@ export const BigNumberTransformSchema = z return BigNumber.isBigNumber(data); }), ]) - .transform((arg) => BigNumber.from(arg)) - .transform((arg) => arg.toString()); + .transform((arg) => { + return BigNumber.from(arg).toString(); + }); export const BasisPointsSchema = z .number()