Utilities
Utility types for working with ABIs and EIP-712 Typed Data.
AbiParameterToPrimitiveType
Converts AbiParameter
to corresponding TypeScript primitive type.
Name | Description | Type |
---|---|---|
TAbiParameter | Parameter to convert to TypeScript representation. | AbiParameter |
TAbiParameterKind | Kind to narrow by parameter type. | AbiParameterKind (optional) |
returns | TypeScript primitive type. | TType (inferred) |
Example
import { type AbiParameterToPrimitiveType<TAbiParameter extends AbiParameter | { name: string; type: unknown; }, TAbiParameterKind extends AbiParameterKind = AbiParameterKind> = TAbiParameter["type"] extends AbiBasicType ? AbiTypeToPrimitiveType<TAbiParameter["type"], TAbiParameterKind> : TAbiParameter extends {
...;
} ? AbiComponentsToPrimitiveType<...> : MaybeExtractArrayParameterType<...> extends [...] ? AbiArrayToPrimitiveType<...> : TAbiParameter extends {
...;
} ? TAbiParameter["components"] : unknownConverts AbiParameter to corresponding TypeScript primitive type.
AbiParameterToPrimitiveType } from 'abitype'
type type Result = `0x${string}`Result = type AbiParameterToPrimitiveType<TAbiParameter extends AbiParameter | { name: string; type: unknown; }, TAbiParameterKind extends AbiParameterKind = AbiParameterKind> = TAbiParameter["type"] extends AbiBasicType ? AbiTypeToPrimitiveType<TAbiParameter["type"], TAbiParameterKind> : TAbiParameter extends {
...;
} ? AbiComponentsToPrimitiveType<...> : MaybeExtractArrayParameterType<...> extends [...] ? AbiArrayToPrimitiveType<...> : TAbiParameter extends {
...;
} ? TAbiParameter["components"] : unknownConverts AbiParameter to corresponding TypeScript primitive type.
AbiParameterToPrimitiveType<{
name: "owner"name: 'owner'
type: "address"type: 'address'
}>
AbiParametersToPrimitiveTypes
Converts array of AbiParameter
to corresponding TypeScript primitive types.
Name | Description | Type |
---|---|---|
TAbiParameters | Parameters to convert to TypeScript representations. | readonly AbiParameter[] |
TAbiParameterKind | Kind to narrow by parameter type. | AbiParameterKind (optional) |
returns | TypeScript primitive types. | TType[] (inferred) |
Example
import { type AbiParametersToPrimitiveTypes<TAbiParameters extends readonly AbiParameter[], TAbiParameterKind extends AbiParameterKind = AbiParameterKind> = { [K in keyof { [K in keyof TAbiParameters]: AbiParameterToPrimitiveType<TAbiParameters[K], TAbiParameterKind>; }]: { [K in keyof TAbiParameters]: AbiParameterToPrimitiveType<TAbiParameters[K], TAbiParameterKind>; }[K]; }Converts array of AbiParameter to corresponding TypeScript primitive types.
AbiParametersToPrimitiveTypes } from 'abitype'
type type Result = [`0x${string}`, bigint]Result = type AbiParametersToPrimitiveTypes<TAbiParameters extends readonly AbiParameter[], TAbiParameterKind extends AbiParameterKind = AbiParameterKind> = { [K in keyof { [K in keyof TAbiParameters]: AbiParameterToPrimitiveType<TAbiParameters[K], TAbiParameterKind>; }]: { [K in keyof TAbiParameters]: AbiParameterToPrimitiveType<TAbiParameters[K], TAbiParameterKind>; }[K]; }Converts array of AbiParameter to corresponding TypeScript primitive types.
AbiParametersToPrimitiveTypes<
[
{ name: "to"name: 'to'; type: "address"type: 'address'; },
{ name: "tokenId"name: 'tokenId'; type: "uint256"type: 'uint256'; },
]
>
AbiTypeToPrimitiveType
Converts AbiType
to corresponding TypeScript primitive type.
Name | Description | Type |
---|---|---|
TAbiType | ABI type to convert to TypeScript representation. | AbiType |
TAbiParameterKind | Kind to narrow by parameter type. | AbiParameterKind (optional) |
returns | TypeScript primitive type. | TType (inferred) |
Example
import { type AbiTypeToPrimitiveType<TAbiType extends AbiType, TAbiParameterKind extends AbiParameterKind = AbiParameterKind> = TAbiType extends "bytes" | "bytes1" | "bytes2" | "bytes3" | "bytes4" | "bytes5" | "bytes6" | "bytes7" | "bytes8" | "bytes9" | "bytes10" | "bytes11" | "bytes12" | ... 19 more ... | "bytes32" ? PrimitiveTypeLookup[TAbiType][TAbiParameterKind] : PrimitiveTypeLookup[TAbiType]Converts AbiType to corresponding TypeScript primitive type.
Does not include full array or tuple conversion. Use AbiParameterToPrimitiveType to fully convert arrays and tuples.
AbiTypeToPrimitiveType } from 'abitype'
type type Result = `0x${string}`Result = type AbiTypeToPrimitiveType<TAbiType extends AbiType, TAbiParameterKind extends AbiParameterKind = AbiParameterKind> = TAbiType extends "bytes" | "bytes1" | "bytes2" | "bytes3" | "bytes4" | "bytes5" | "bytes6" | "bytes7" | "bytes8" | "bytes9" | "bytes10" | "bytes11" | "bytes12" | ... 19 more ... | "bytes32" ? PrimitiveTypeLookup[TAbiType][TAbiParameterKind] : PrimitiveTypeLookup[TAbiType]Converts AbiType to corresponding TypeScript primitive type.
Does not include full array or tuple conversion. Use AbiParameterToPrimitiveType to fully convert arrays and tuples.
AbiTypeToPrimitiveType<'address'>
ExtractAbiError
Extracts AbiError
with name from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
TErrorName | Name of error. | string (inferred) |
returns | ABI Error. | AbiError |
Example
import { type ExtractAbiError<TAbi extends Abi, TErrorName extends ExtractAbiErrorNames<TAbi>> = Extract<TAbi[number], {
type: "error";
}> extends {
name: TErrorName;
} ? {
name: TErrorName;
} & Extract<TAbi[number], {
type: "error";
}> : neverExtracts AbiError with name from Abi.
ExtractAbiError } from 'abitype'
const const abi: readonly [{
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}]abi = [
{ name: "BarError"name: 'BarError', type: "error"type: 'error', inputs: readonly []inputs: [] },
{ name: "FooError"name: 'FooError', type: "error"type: 'error', inputs: readonly []inputs: [] },
] as type const = readonly [{
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}]const
type type Result = {
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}Result = type ExtractAbiError<TAbi extends Abi, TErrorName extends ExtractAbiErrorNames<TAbi>> = Extract<TAbi[number], {
type: "error";
}> extends {
name: TErrorName;
} ? {
name: TErrorName;
} & Extract<TAbi[number], {
type: "error";
}> : neverExtracts AbiError with name from Abi.
ExtractAbiError<typeof const abi: readonly [{
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}]abi, 'FooError'>
ExtractAbiErrorNames
Extracts all AbiError
names from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
returns | ABI Error names. | string (inferred) |
Example
import { type ExtractAbiErrorNames<TAbi extends Abi> = Extract<TAbi[number], {
type: "error";
}>["name"]Extracts all AbiError names from Abi.
ExtractAbiErrorNames } from 'abitype'
const const abi: readonly [{
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}]abi = [
{ name: "FooError"name: 'FooError', type: "error"type: 'error', inputs: readonly []inputs: [] },
{ name: "BarError"name: 'BarError', type: "error"type: 'error', inputs: readonly []inputs: [] },
] as type const = readonly [{
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}]const
type type Result = "FooError" | "BarError"Result = type ExtractAbiErrorNames<TAbi extends Abi> = Extract<TAbi[number], {
type: "error";
}>["name"]Extracts all AbiError names from Abi.
ExtractAbiErrorNames<typeof const abi: readonly [{
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}]abi>
ExtractAbiErrors
Extracts all AbiError
types from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
returns | ABI Errors. | AbiError (union) |
Example
import { type ExtractAbiErrors<TAbi extends Abi> = TAbi[number] extends {
type: 'error';
} ? TAbi[number] : neverExtracts all AbiError types from Abi.
ExtractAbiErrors } from 'abitype'
const const abi: readonly [{
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}]abi = [
{ name: "FooError"name: 'FooError', type: "error"type: 'error', inputs: readonly []inputs: [] },
{ name: "BarError"name: 'BarError', type: "error"type: 'error', inputs: readonly []inputs: [] },
] as type const = readonly [{
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}]const
type type Result = {
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
} | {
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}Result = type ExtractAbiErrors<TAbi extends Abi> = TAbi[number] extends {
type: 'error';
} ? TAbi[number] : neverExtracts all AbiError types from Abi.
ExtractAbiErrors<typeof const abi: readonly [{
readonly name: "FooError";
readonly type: "error";
readonly inputs: readonly [];
}, {
readonly name: "BarError";
readonly type: "error";
readonly inputs: readonly [];
}]abi>
ExtractAbiEvent
Extracts AbiEvent
with name from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
TEventName | Name of event. | string (inferred) |
returns | ABI Event. | AbiEvent |
Example
import { type ExtractAbiEvent<TAbi extends Abi, TEventName extends ExtractAbiEventNames<TAbi>> = Extract<TAbi[number], {
type: "event";
}> extends {
name: TEventName;
} ? {
name: TEventName;
} & Extract<TAbi[number], {
type: "event";
}> : neverExtracts AbiEvent with name from Abi.
ExtractAbiEvent } from 'abitype'
const const abi: readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]abi = [
{
name: "Approval"name: 'Approval',
type: "event"type: 'event',
anonymous: falseanonymous: false,
inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "tokenId";
readonly type: "uint256";
readonly indexed: true;
}]inputs: [
{ name: "owner"name: 'owner', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "approved"name: 'approved', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256', indexed: trueindexed: true },
],
},
{
name: "Transfer"name: 'Transfer',
type: "event"type: 'event',
anonymous: falseanonymous: false,
inputs: readonly [{
readonly name: "from";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "to";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "tokenId";
readonly type: "uint256";
readonly indexed: true;
}]inputs: [
{ name: "from"name: 'from', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "to"name: 'to', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256', indexed: trueindexed: true },
],
},
] as type const = readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]const
type type Result = {
readonly name: "Transfer";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "from";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "to";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}Result = type ExtractAbiEvent<TAbi extends Abi, TEventName extends ExtractAbiEventNames<TAbi>> = Extract<TAbi[number], {
type: "event";
}> extends {
name: TEventName;
} ? {
name: TEventName;
} & Extract<TAbi[number], {
type: "event";
}> : neverExtracts AbiEvent with name from Abi.
ExtractAbiEvent<typeof const abi: readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]abi, 'Transfer'>
ExtractAbiEventNames
Extracts all AbiEvent
names from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
returns | ABI Error names. | string (inferred) |
Example
import { type ExtractAbiEventNames<TAbi extends Abi> = Extract<TAbi[number], {
type: "event";
}>["name"]Extracts all AbiEvent names from Abi.
ExtractAbiEventNames } from 'abitype'
const const abi: readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]abi = [
{
name: "Approval"name: 'Approval',
type: "event"type: 'event',
anonymous: falseanonymous: false,
inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "tokenId";
readonly type: "uint256";
readonly indexed: true;
}]inputs: [
{ name: "owner"name: 'owner', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "approved"name: 'approved', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256', indexed: trueindexed: true },
],
},
{
name: "Transfer"name: 'Transfer',
type: "event"type: 'event',
anonymous: falseanonymous: false,
inputs: readonly [{
readonly name: "from";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "to";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "tokenId";
readonly type: "uint256";
readonly indexed: true;
}]inputs: [
{ name: "from"name: 'from', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "to"name: 'to', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256', indexed: trueindexed: true },
],
},
] as type const = readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]const
type type Result = "Approval" | "Transfer"Result = type ExtractAbiEventNames<TAbi extends Abi> = Extract<TAbi[number], {
type: "event";
}>["name"]Extracts all AbiEvent names from Abi.
ExtractAbiEventNames<typeof const abi: readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]abi>
ExtractAbiEvents
Extracts all AbiEvent
types from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
returns | ABI Events. | AbiEvent (union) |
Example
import { type ExtractAbiEvents<TAbi extends Abi> = TAbi[number] extends {
type: 'event';
} ? TAbi[number] : neverExtracts all AbiEvent types from Abi.
ExtractAbiEvents } from 'abitype'
const const abi: readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]abi = [
{
name: "Approval"name: 'Approval',
type: "event"type: 'event',
anonymous: falseanonymous: false,
inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "tokenId";
readonly type: "uint256";
readonly indexed: true;
}]inputs: [
{ name: "owner"name: 'owner', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "approved"name: 'approved', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256', indexed: trueindexed: true },
],
},
{
name: "Transfer"name: 'Transfer',
type: "event"type: 'event',
anonymous: falseanonymous: false,
inputs: readonly [{
readonly name: "from";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "to";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "tokenId";
readonly type: "uint256";
readonly indexed: true;
}]inputs: [
{ name: "from"name: 'from', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "to"name: 'to', type: "address"type: 'address', indexed: trueindexed: true },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256', indexed: trueindexed: true },
],
},
] as type const = readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]const
type type Result = {
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
} | {
...;
}Result = type ExtractAbiEvents<TAbi extends Abi> = TAbi[number] extends {
type: 'event';
} ? TAbi[number] : neverExtracts all AbiEvent types from Abi.
ExtractAbiEvents<typeof const abi: readonly [{
readonly name: "Approval";
readonly type: "event";
readonly anonymous: false;
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
readonly indexed: true;
}, {
readonly name: "approved";
readonly type: "address";
readonly indexed: true;
}, {
...;
}];
}, {
...;
}]abi>
ExtractAbiFunction
Extracts AbiFunction
with name from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
TFunctionName | Name of function. | string (inferred) |
TAbiStateMutability | ABI state mutability. | AbiStateMutability (optional) |
returns | ABI Function. | AbiFunction |
Example
import { type ExtractAbiFunction<TAbi extends Abi, TFunctionName extends ExtractAbiFunctionNames<TAbi, AbiStateMutability>, TAbiStateMutability extends AbiStateMutability = AbiStateMutability> = Extract<TAbi[number], {
type: "function";
stateMutability: TAbiStateMutability;
}> extends {
name: TFunctionName;
} ? {
name: TFunctionName;
} & Extract<TAbi[number], {
type: "function";
stateMutability: TAbiStateMutability;
}> : neverExtracts AbiFunction with name from Abi.
ExtractAbiFunction } from 'abitype'
const const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi = [
{
name: "balanceOf"name: 'balanceOf',
type: "function"type: 'function',
stateMutability: "view"stateMutability: 'view',
inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}]inputs: [{ name: "owner"name: 'owner', type: "address"type: 'address' }],
outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}]outputs: [{ name: "balance"name: 'balance', type: "uint256"type: 'uint256' }],
},
{
name: "safeTransferFrom"name: 'safeTransferFrom',
type: "function"type: 'function',
stateMutability: "nonpayable"stateMutability: 'nonpayable',
inputs: readonly [{
readonly name: "from";
readonly type: "address";
}, {
readonly name: "to";
readonly type: "address";
}, {
readonly name: "tokenId";
readonly type: "uint256";
}]inputs: [
{ name: "from"name: 'from', type: "address"type: 'address' },
{ name: "to"name: 'to', type: "address"type: 'address' },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256' },
],
outputs: readonly []outputs: [],
},
] as type const = readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]const
type type Result = {
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}Result = type ExtractAbiFunction<TAbi extends Abi, TFunctionName extends ExtractAbiFunctionNames<TAbi, AbiStateMutability>, TAbiStateMutability extends AbiStateMutability = AbiStateMutability> = Extract<TAbi[number], {
type: "function";
stateMutability: TAbiStateMutability;
}> extends {
name: TFunctionName;
} ? {
name: TFunctionName;
} & Extract<TAbi[number], {
type: "function";
stateMutability: TAbiStateMutability;
}> : neverExtracts AbiFunction with name from Abi.
ExtractAbiFunction<typeof const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi, 'balanceOf'>
ExtractAbiFunctionNames
Extracts all AbiFunction
names from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
TAbiStateMutability | ABI state mutability. | AbiStateMutability (optional) |
returns | ABI Event names. | string (inferred) |
Example
import { type ExtractAbiFunctionNames<TAbi extends Abi, TAbiStateMutability extends AbiStateMutability = AbiStateMutability> = Extract<TAbi[number], {
type: "function";
stateMutability: TAbiStateMutability;
}>["name"]Extracts all AbiFunction names from Abi.
ExtractAbiFunctionNames } from 'abitype'
const const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi = [
{
name: "balanceOf"name: 'balanceOf',
type: "function"type: 'function',
stateMutability: "view"stateMutability: 'view',
inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}]inputs: [{ name: "owner"name: 'owner', type: "address"type: 'address' }],
outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}]outputs: [{ name: "balance"name: 'balance', type: "uint256"type: 'uint256' }],
},
{
name: "safeTransferFrom"name: 'safeTransferFrom',
type: "function"type: 'function',
stateMutability: "nonpayable"stateMutability: 'nonpayable',
inputs: readonly [{
readonly name: "from";
readonly type: "address";
}, {
readonly name: "to";
readonly type: "address";
}, {
readonly name: "tokenId";
readonly type: "uint256";
}]inputs: [
{ name: "from"name: 'from', type: "address"type: 'address' },
{ name: "to"name: 'to', type: "address"type: 'address' },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256' },
],
outputs: readonly []outputs: [],
},
] as type const = readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]const
type type Result = "balanceOf" | "safeTransferFrom"Result = type ExtractAbiFunctionNames<TAbi extends Abi, TAbiStateMutability extends AbiStateMutability = AbiStateMutability> = Extract<TAbi[number], {
type: "function";
stateMutability: TAbiStateMutability;
}>["name"]Extracts all AbiFunction names from Abi.
ExtractAbiFunctionNames<typeof const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi>
ExtractAbiFunctions
Extracts all AbiFunction
types from Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
returns | ABI Functions. | AbiFunction (union) |
Example
import { type ExtractAbiFunctions<TAbi extends Abi, TAbiStateMutability extends AbiStateMutability = AbiStateMutability> = TAbi[number] extends {
type: 'function';
stateMutability: TAbiStateMutability;
} ? TAbi[number] : neverExtracts all AbiFunction types from Abi.
ExtractAbiFunctions } from 'abitype'
const const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi = [
{
name: "balanceOf"name: 'balanceOf',
type: "function"type: 'function',
stateMutability: "view"stateMutability: 'view',
inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}]inputs: [{ name: "owner"name: 'owner', type: "address"type: 'address' }],
outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}]outputs: [{ name: "balance"name: 'balance', type: "uint256"type: 'uint256' }],
},
{
name: "safeTransferFrom"name: 'safeTransferFrom',
type: "function"type: 'function',
stateMutability: "nonpayable"stateMutability: 'nonpayable',
inputs: readonly [{
readonly name: "from";
readonly type: "address";
}, {
readonly name: "to";
readonly type: "address";
}, {
readonly name: "tokenId";
readonly type: "uint256";
}]inputs: [
{ name: "from"name: 'from', type: "address"type: 'address' },
{ name: "to"name: 'to', type: "address"type: 'address' },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256' },
],
outputs: readonly []outputs: [],
},
] as type const = readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]const
type type Result = {
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
} | {
...;
}Result = type ExtractAbiFunctions<TAbi extends Abi, TAbiStateMutability extends AbiStateMutability = AbiStateMutability> = TAbi[number] extends {
type: 'function';
stateMutability: TAbiStateMutability;
} ? TAbi[number] : neverExtracts all AbiFunction types from Abi.
ExtractAbiFunctions<typeof const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi>
By default, extracts all functions, but you can also filter by AbiStateMutability
:
type Result = ExtractAbiFunctions<typeof erc721Abi, 'view'>
IsAbi
Checks if type is Abi
.
Name | Description | Type |
---|---|---|
TAbi | ABI. | Abi |
returns | Boolean value. true if valid Abi , false if not. | boolean |
Example
import { type IsAbi<TAbi> = TAbi extends Abi ? true : falseChecks if type is Abi.
IsAbi } from 'abitype'
const const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi = [
{
name: "balanceOf"name: 'balanceOf',
type: "function"type: 'function',
stateMutability: "view"stateMutability: 'view',
inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}]inputs: [{ name: "owner"name: 'owner', type: "address"type: 'address' }],
outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}]outputs: [{ name: "balance"name: 'balance', type: "uint256"type: 'uint256' }],
},
{
name: "safeTransferFrom"name: 'safeTransferFrom',
type: "function"type: 'function',
stateMutability: "nonpayable"stateMutability: 'nonpayable',
inputs: readonly [{
readonly name: "from";
readonly type: "address";
}, {
readonly name: "to";
readonly type: "address";
}, {
readonly name: "tokenId";
readonly type: "uint256";
}]inputs: [
{ name: "from"name: 'from', type: "address"type: 'address' },
{ name: "to"name: 'to', type: "address"type: 'address' },
{ name: "tokenId"name: 'tokenId', type: "uint256"type: 'uint256' },
],
outputs: readonly []outputs: [],
},
] as type const = readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]const
type type Result = trueResult = type IsAbi<TAbi> = TAbi extends Abi ? true : falseChecks if type is Abi.
IsAbi<typeof const abi: readonly [{
readonly name: "balanceOf";
readonly type: "function";
readonly stateMutability: "view";
readonly inputs: readonly [{
readonly name: "owner";
readonly type: "address";
}];
readonly outputs: readonly [{
readonly name: "balance";
readonly type: "uint256";
}];
}, {
...;
}]abi>
IsTypedData
Checks if type is TypedData
.
Name | Description | Type |
---|---|---|
TTypedData | EIP-712 Typed Data schema. | TypedData |
returns | Boolean value. true if valid TypedData , false if not. | boolean |
Example
import { type IsTypedData<TTypedData> = TTypedData extends {
[x: string]: readonly TypedDataParameter[];
[x: `string[${string}]`]: undefined;
[x: `function[${string}]`]: undefined;
[x: `address[${string}]`]: undefined;
[x: `bool[${string}]`]: undefined;
[x: `bytes[${string}]`]: undefined;
[x: `bytes2[${string}]`]: undefined;
[x: `bytes3[${string}]`]: undefined;
[x: `bytes1[${string}]`]: undefined;
[x: `bytes4[${string}]`]: undefined;
[x: `bytes5[${string}]`]: undefined;
[x: `bytes6[${string}]`]: undefined;
[x: `bytes7[${string}]`]: undefined;
[x: `bytes8[${string}]`]: undefined;
[x: `bytes9[${string}]`]: undefined;
[x: `bytes10[${string}]`]: undefined;
[x: `bytes11[${string}]`]: undefined;
[x: `bytes12[${string}]`]: undefined;
[x: `bytes13[${string}]`]: undefined;
[x: `bytes14[${string}]`]: undefined;
[x: `bytes15[${string}]`]: undefined;
[x: `bytes16[${string}]`]: undefined;
[x: `bytes17[${string}]`]: undefined;
[x: `bytes18[${string}]`]: undefined;
[x: `bytes19[${string}]`]: undefined;
[x: `bytes20[${string}]`]: undefined;
[x: `bytes21[${string}]`]: undefined;
[x: `bytes22[${string}]`]: undefined;
[x: `bytes23[${string}]`]: undefined;
[x: `bytes24[${string}]`]: undefined;
[x: `bytes25[${string}]`]: undefined;
[x: `bytes26[${string}]`]: undefined;
[x: `bytes27[${string}]`]: undefined;
[x: `bytes28[${string}]`]: undefined;
[x: `bytes29[${string}]`]: undefined;
[x: `bytes30[${string}]`]: undefined;
[x: `bytes31[${string}]`]: undefined;
[x: `bytes32[${string}]`]: undefined ...Checks if type is TypedData.
IsTypedData } from 'abitype'
const const types: {
readonly Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}];
readonly Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
...;
}, {
...;
}];
}types = {
type Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}]Person: [
{ name: "name"name: 'name', type: "string"type: 'string' },
{ name: "wallet"name: 'wallet', type: "address"type: 'address' },
],
type Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
readonly name: "to";
readonly type: "Person";
}, {
readonly name: "contents";
readonly type: "string";
}]Mail: [
{ name: "from"name: 'from', type: "Person"type: 'Person' },
{ name: "to"name: 'to', type: "Person"type: 'Person' },
{ name: "contents"name: 'contents', type: "string"type: 'string' },
],
} as type const = {
readonly Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}];
readonly Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
...;
}, {
...;
}];
}const
type type Result = trueResult = type IsTypedData<TTypedData> = TTypedData extends {
[x: string]: readonly TypedDataParameter[];
[x: `string[${string}]`]: undefined;
[x: `function[${string}]`]: undefined;
[x: `address[${string}]`]: undefined;
[x: `bool[${string}]`]: undefined;
[x: `bytes[${string}]`]: undefined;
[x: `bytes2[${string}]`]: undefined;
[x: `bytes3[${string}]`]: undefined;
[x: `bytes1[${string}]`]: undefined;
[x: `bytes4[${string}]`]: undefined;
[x: `bytes5[${string}]`]: undefined;
[x: `bytes6[${string}]`]: undefined;
[x: `bytes7[${string}]`]: undefined;
[x: `bytes8[${string}]`]: undefined;
[x: `bytes9[${string}]`]: undefined;
[x: `bytes10[${string}]`]: undefined;
[x: `bytes11[${string}]`]: undefined;
[x: `bytes12[${string}]`]: undefined;
[x: `bytes13[${string}]`]: undefined;
[x: `bytes14[${string}]`]: undefined;
[x: `bytes15[${string}]`]: undefined;
[x: `bytes16[${string}]`]: undefined;
[x: `bytes17[${string}]`]: undefined;
[x: `bytes18[${string}]`]: undefined;
[x: `bytes19[${string}]`]: undefined;
[x: `bytes20[${string}]`]: undefined;
[x: `bytes21[${string}]`]: undefined;
[x: `bytes22[${string}]`]: undefined;
[x: `bytes23[${string}]`]: undefined;
[x: `bytes24[${string}]`]: undefined;
[x: `bytes25[${string}]`]: undefined;
[x: `bytes26[${string}]`]: undefined;
[x: `bytes27[${string}]`]: undefined;
[x: `bytes28[${string}]`]: undefined;
[x: `bytes29[${string}]`]: undefined;
[x: `bytes30[${string}]`]: undefined;
[x: `bytes31[${string}]`]: undefined;
[x: `bytes32[${string}]`]: undefined ...Checks if type is TypedData.
IsTypedData<typeof const types: {
readonly Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}];
readonly Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
...;
}, {
...;
}];
}types>
TypedDataToPrimitiveTypes
Converts EIP-712 TypedData
to corresponding TypeScript primitive type.
Name | Description | Type |
---|---|---|
TTypedData | EIP-712 Typed Data schema. | TypedData |
returns | TypeScript representation of schema. | { [name: string]: TType } (inferred) |
Example
import { type TypedDataToPrimitiveTypes<TTypedData extends { [x: string]: readonly TypedDataParameter[]; [x: `string[${string}]`]: undefined; [x: `function[${string}]`]: undefined; [x: `address[${string}]`]: undefined; [x: `bool[${string}]`]: undefined; [x: `bytes[${string}]`]: undefined; [x: `bytes2[${string}]`]: undefined; [x: `bytes3[${string}]`]: undefined; [x: `bytes1[${string}]`]: undefined; [x: `bytes4[${string}]`]: undefined; [x: `bytes5[${string}]`]: undefined; [x: `bytes6[${string}]`]: undefined; [x: `bytes7[${string}]`]: undefined; [x: `bytes8[${string}]`]: undefined; [x: `bytes9[${string}]`]: undefined; [x: `bytes10[${string}]`]: undefined; [x: `bytes11[${string}]`]: undefined; [x: `bytes12[${string}]`]: undefined; [x: `bytes13[${string}]`]: undefined; [x: `bytes14[${string}]`]: undefined; [x: `bytes15[${string}]`]: undefined; [x: `bytes16[${string}]`]: undefined; [x: `bytes17[${string}]`]: undefined; [x: `bytes18[${string}]`]: undefined; [x: `bytes19[${string}]`]: undefined; [x: `bytes20[${string}]`]: undefined; [x: `bytes21[${string}]`]: undefined; [x: `bytes22[${string}]`]: undefined; [x: `bytes23[${string}]`]: undefined; [x: `bytes24[${string}]`]: undefined; [x: `bytes25[${string}]`]: undefined; [x: `bytes26[${string}]`]: undefined; [x: `bytes27[${string}]`]: undefined; [x: `bytes28[${string}]`]: undefined; [x: `bytes29[${string}]`]: undefined; [x: `bytes30[${string}]`]: undefined; [x: `bytes31[${string}]`]: undefined; [x: `bytes32[${string}]`]: undefined; [x: `int[${string}]`]: undefined; [x: `int8[${string}]`]: undefined; [x: `int16[${string}]`]: undefined; [x: `int24[${string}]`]: undefined; [x ... = { [K in keyof TTypedData]: { [K2 in TTypedData[K][number] as K2["name"]]: K2["type"] extends K ? Error<`Cannot convert self-referencing struct '${K2["type"]}' to primitive type.`> : K2["type"] extends keyof TTypedData ? K2["type"] extends keyof TKeyReferences ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 1 more ... | keyof TKeyReferences ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 3 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 5 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 7 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 9 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 11 more ... | K2["type"] ? Error<...Converts TTypedData to corresponding TypeScript primitive types.
TypedDataToPrimitiveTypes } from 'abitype'
const const types: {
readonly Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}];
readonly Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
...;
}, {
...;
}];
}types = {
type Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}]Person: [
{ name: "name"name: 'name', type: "string"type: 'string' },
{ name: "wallet"name: 'wallet', type: "address"type: 'address' },
],
type Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
readonly name: "to";
readonly type: "Person";
}, {
readonly name: "contents";
readonly type: "string";
}]Mail: [
{ name: "from"name: 'from', type: "Person"type: 'Person' },
{ name: "to"name: 'to', type: "Person"type: 'Person' },
{ name: "contents"name: 'contents', type: "string"type: 'string' },
],
} as type const = {
readonly Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}];
readonly Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
...;
}, {
...;
}];
}const
type type Result = {
readonly Person: {
name: string;
wallet: `0x${string}`;
};
readonly Mail: {
from: {
name: string;
wallet: `0x${string}`;
};
to: {
name: string;
wallet: `0x${string}`;
};
contents: string;
};
}Result = type TypedDataToPrimitiveTypes<TTypedData extends { [x: string]: readonly TypedDataParameter[]; [x: `string[${string}]`]: undefined; [x: `function[${string}]`]: undefined; [x: `address[${string}]`]: undefined; [x: `bool[${string}]`]: undefined; [x: `bytes[${string}]`]: undefined; [x: `bytes2[${string}]`]: undefined; [x: `bytes3[${string}]`]: undefined; [x: `bytes1[${string}]`]: undefined; [x: `bytes4[${string}]`]: undefined; [x: `bytes5[${string}]`]: undefined; [x: `bytes6[${string}]`]: undefined; [x: `bytes7[${string}]`]: undefined; [x: `bytes8[${string}]`]: undefined; [x: `bytes9[${string}]`]: undefined; [x: `bytes10[${string}]`]: undefined; [x: `bytes11[${string}]`]: undefined; [x: `bytes12[${string}]`]: undefined; [x: `bytes13[${string}]`]: undefined; [x: `bytes14[${string}]`]: undefined; [x: `bytes15[${string}]`]: undefined; [x: `bytes16[${string}]`]: undefined; [x: `bytes17[${string}]`]: undefined; [x: `bytes18[${string}]`]: undefined; [x: `bytes19[${string}]`]: undefined; [x: `bytes20[${string}]`]: undefined; [x: `bytes21[${string}]`]: undefined; [x: `bytes22[${string}]`]: undefined; [x: `bytes23[${string}]`]: undefined; [x: `bytes24[${string}]`]: undefined; [x: `bytes25[${string}]`]: undefined; [x: `bytes26[${string}]`]: undefined; [x: `bytes27[${string}]`]: undefined; [x: `bytes28[${string}]`]: undefined; [x: `bytes29[${string}]`]: undefined; [x: `bytes30[${string}]`]: undefined; [x: `bytes31[${string}]`]: undefined; [x: `bytes32[${string}]`]: undefined; [x: `int[${string}]`]: undefined; [x: `int8[${string}]`]: undefined; [x: `int16[${string}]`]: undefined; [x: `int24[${string}]`]: undefined; [x ... = { [K in keyof TTypedData]: { [K2 in TTypedData[K][number] as K2["name"]]: K2["type"] extends K ? Error<`Cannot convert self-referencing struct '${K2["type"]}' to primitive type.`> : K2["type"] extends keyof TTypedData ? K2["type"] extends keyof TKeyReferences ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 1 more ... | keyof TKeyReferences ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 3 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 5 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 7 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 9 more ... | K2["type"] ? Error<...> : { [K in keyof Exclude<...>]: { [K2 in Exclude<...>[K][number] as K2["name"]]: K2["type"] extends K ? Error<...> : K2["type"] extends keyof Exclude<...> ? K2["type"] extends K | ... 11 more ... | K2["type"] ? Error<...Converts TTypedData to corresponding TypeScript primitive types.
TypedDataToPrimitiveTypes<typeof const types: {
readonly Person: readonly [{
readonly name: "name";
readonly type: "string";
}, {
readonly name: "wallet";
readonly type: "address";
}];
readonly Mail: readonly [{
readonly name: "from";
readonly type: "Person";
}, {
...;
}, {
...;
}];
}types>