diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 75172a3547..7d53cdd264 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -22,3 +22,4 @@ export * from './amount'; export * from './chain'; export * from './denom-metadata'; export * from './jsonified'; +export * from './type-predicates'; diff --git a/packages/types/src/schemas/address.ts b/packages/types/src/schemas/address.ts new file mode 100644 index 0000000000..8647e9de4a --- /dev/null +++ b/packages/types/src/schemas/address.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; + +export const address = z.object({ + inner: z.instanceof(Uint8Array), + altBech32m: z.string(), +}); diff --git a/packages/types/src/schemas/asset-id.ts b/packages/types/src/schemas/asset-id.ts new file mode 100644 index 0000000000..d681178319 --- /dev/null +++ b/packages/types/src/schemas/asset-id.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const assetId = z.object({ + inner: z.instanceof(Uint8Array), + altBech32m: z.string(), + altBaseDenom: z.string(), +}); diff --git a/packages/types/src/schemas/asset-image--theme.ts b/packages/types/src/schemas/asset-image--theme.ts new file mode 100644 index 0000000000..cf700877b2 --- /dev/null +++ b/packages/types/src/schemas/asset-image--theme.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const assetImage_Theme = z.object({ + primaryColorHex: z.string(), + circle: z.boolean(), + darkMode: z.boolean(), +}); diff --git a/packages/types/src/schemas/asset-image.ts b/packages/types/src/schemas/asset-image.ts new file mode 100644 index 0000000000..bb370dd17d --- /dev/null +++ b/packages/types/src/schemas/asset-image.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; +import { assetImage_Theme } from './asset-image--theme'; + +export const assetImage = z.object({ + png: z.string(), + svg: z.string(), + theme: assetImage_Theme.optional(), +}); diff --git a/packages/types/src/schemas/denom-metadata.ts b/packages/types/src/schemas/denom-metadata.ts new file mode 100644 index 0000000000..be5ab9d165 --- /dev/null +++ b/packages/types/src/schemas/denom-metadata.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import { denomUnit } from './denom-unit'; +import { assetId } from './asset-id'; +import { assetImage } from './asset-image'; + +export const denomMetadata = z.object({ + description: z.string(), + denomUnits: z.array(denomUnit), + base: z.string(), + display: z.string(), + name: z.string(), + symbol: z.string(), + penumbraAssetId: assetId.optional(), + images: z.array(assetImage), +}); diff --git a/packages/types/src/schemas/denom-unit.ts b/packages/types/src/schemas/denom-unit.ts new file mode 100644 index 0000000000..41d3b02d3c --- /dev/null +++ b/packages/types/src/schemas/denom-unit.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const denomUnit = z.object({ + denom: z.string(), + exponent: z.number().int(), + aliases: z.array(z.string()), +}); diff --git a/packages/types/src/type-predicates/address-view.ts b/packages/types/src/type-predicates/address-view.ts new file mode 100644 index 0000000000..3b9b06dcb0 --- /dev/null +++ b/packages/types/src/type-predicates/address-view.ts @@ -0,0 +1,25 @@ +import { address } from '../schemas/address'; +import { isType } from '../validation'; +import { z } from 'zod'; + +export const hasAccountIndex = isType( + z.object({ + addressView: z.object({ + case: z.enum(['visible']), + value: z.object({ + index: z.object({ + account: z.number(), + }), + }), + }), + }), +); + +export const hasAddress = isType( + z.object({ + addressView: z.object({ + case: z.enum(['visible', 'opaque']), + value: z.object({ address }), + }), + }), +); diff --git a/packages/types/src/type-predicates/index.ts b/packages/types/src/type-predicates/index.ts new file mode 100644 index 0000000000..ffec9bd128 --- /dev/null +++ b/packages/types/src/type-predicates/index.ts @@ -0,0 +1,2 @@ +export * from './address-view'; +export * from './value-view'; diff --git a/packages/types/src/type-predicates/value-view.ts b/packages/types/src/type-predicates/value-view.ts new file mode 100644 index 0000000000..cc55023581 --- /dev/null +++ b/packages/types/src/type-predicates/value-view.ts @@ -0,0 +1,14 @@ +import { denomMetadata } from '../schemas/denom-metadata'; +import { isType } from '../validation'; +import { z } from 'zod'; + +export const hasDenomMetadata = isType( + z.object({ + valueView: z.object({ + case: z.enum(['knownDenom']), + value: z.object({ + denom: denomMetadata, + }), + }), + }), +);