Class: CairoTypeCustomEnum
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:46
A Cairo custom enum : one of several named variants, each carrying its own type.
On the wire it is the index of the active variant, then that variant's value. Which variant is meant cannot be read off the value, so building one from raw data asks for the index — unless the content is a CairoCustomEnum, which names its own active variant.
Like a struct, a custom enum has no shape to recognize : its abi type is the name the contract
chose. It is found by that exact name among a strategy's constructors, which is what
enumStrategy builds from an abi.
Example
const abiEnum: AbiEnum = {
type: 'enum',
name: 'test::MyEnum',
variants: [
{ name: 'Empty', type: '()' },
{ name: 'Number', type: 'core::integer::u8' },
],
};
const strategies = [cairoTypeStrategy, enumStrategy([abiEnum])];
new CairoTypeCustomEnum(7, abiEnum, strategies, 1).toApiRequest();
// ["1", "7"]
Constructors
Constructor
new CairoTypeCustomEnum(
content,abiEnum,parsingStrategy,variant?,subType?):CairoTypeCustomEnum
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:118
Build a custom enum, from a value a caller passed or from the felts of a response.
A CairoCustomEnum names its own active variant, so variant must be left out with one
— as with the response iterator and with a CairoTypeCustomEnum being copied. Anywhere else
it is required, the index being the only thing that says which variant a value belongs to.
A CairoOption or a CairoResult is turned into its own Cairo type here rather
than through the strategy : the strategy is handed variant, and those two would read it as
their own branch instead of as the enum's index.
subType is what makes an enum of enums work. Handed a CairoCustomEnum, this constructor
unwraps it and calls itself with what was inside; the flag stops that second call from
unwrapping again and losing a level.
Parameters
content
unknown
the value, a CairoCustomEnum, an instance already built, or the
response iterator
abiEnum
the abi definition of this enum
parsingStrategy
how to build the variant's value
variant?
number
the index of the active variant, when the content does not say
subType?
boolean = false
true when called from the unwrapping of a nested
CairoCustomEnum, which is the only caller that should set it
Returns
CairoTypeCustomEnum
Throws
when the content is missing, the variant is missing or out of range, or the variant type is one no strategy knows
Example
new CairoTypeCustomEnum(7, abiEnum, strategies, 1).toApiRequest();
// ["1", "7"]
new CairoTypeCustomEnum(new CairoCustomEnum({ Number: 7 }), abiEnum, strategies).toApiRequest();
// ["1", "7"] the CairoCustomEnum names its own variant
Properties
dynamicSelector
readonlydynamicSelector:string
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:55
The name this enum is registered under, which is the name the abi gave it.
Example
const result = new CairoTypeCustomEnum(7, abiEnum, strategies, 1).dynamicSelector;
// result = "test::MyEnum"
content
readonlycontent:CairoType
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:65
The value the active variant carries.
Example
const result = new CairoTypeCustomEnum(7, abiEnum, strategies, 1).content.toApiRequest();
// result = ["7"]
abiEnum
readonlyabiEnum:AbiEnum
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:75
The abi definition this enum was built from.
Example
const result = new CairoTypeCustomEnum(7, abiEnum, strategies, 1).abiEnum.name;
// result = "test::MyEnum"
enumVariant
readonlyenumVariant:number
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:85
The index of the active variant, in the abi's order.
Example
const result = new CairoTypeCustomEnum(7, abiEnum, strategies, 1).enumVariant;
// result = 1
Methods
validate()
staticvalidate(_input,type,_variant):void
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:285
Throw unless this name can be a Cairo 1 type at all.
There is nothing more to check : a custom enum's abi type is the name the contract chose, and what the value is worth is the business of the active variant's type.
Parameters
_input
unknown
the value, which this does not read
type
string
the abi name it is meant for
_variant
VariantType | undefined
the variant, which this does not read
Returns
void
Throws
when the name is not a Cairo 1 type name
Example
CairoTypeCustomEnum.validate(7, 'test::MyEnum', 1); // passes
CairoTypeCustomEnum.validate(7, 'wrong', 1);
// throws Error("The type wrong is not a Cairo Enum. Needs impl::name.")
is()
staticis(input,type,variant):boolean
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:308
Can this name be a Cairo custom enum?
The non-throwing form of CairoTypeCustomEnum.validate.
Parameters
input
unknown
the value to test
type
string
the abi name it is meant for
variant
the variant
Returns
boolean
true when the name could be one
Example
const result = CairoTypeCustomEnum.is(7, 'test::MyEnum', 1);
// result = true
const result2 = CairoTypeCustomEnum.is(7, 'wrong', 1);
// result2 = false
isAbiType()
staticisAbiType(type):boolean
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:333
Could this abi type name a Cairo custom enum?
Only the shape of the name is testable — a custom enum has no pattern of its own, so this says no more than that the name looks like a Cairo 1 type. It is deliberately not used as a dynamic selector : one that answered true this widely would shadow every other type.
Parameters
type
string
the abi type to test
Returns
boolean
true when the name contains ::
Example
const result = CairoTypeCustomEnum.isAbiType('my_contract::my_enum');
// result = true
const result2 = CairoTypeCustomEnum.isAbiType('wrong');
// result2 = false
getVariantTypes()
staticgetVariantTypes(type):string[]
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:347
The types of the variants, in the abi's order.
Parameters
type
the abi definition to read
Returns
string[]
one type per variant
Example
const result = CairoTypeCustomEnum.getVariantTypes(abiEnum);
// result = ["()", "core::integer::u8"]
extractEnumMembersNames()
staticextractEnumMembersNames(type):string[]
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:361
The names of the variants, in the abi's order.
Parameters
type
the abi definition to read
Returns
string[]
one name per variant
Example
const result = CairoTypeCustomEnum.extractEnumMembersNames(abiEnum);
// result = ["Empty", "Number"]
toApiRequest()
toApiRequest():
string[]
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:376
Serialize to the felts a contract call carries.
The index of the active variant comes first, then its value.
Returns
string[]
the variant index then the value, flagged as compiled
Example
const result = new CairoTypeCustomEnum(7, abiEnum, strategies, 1).toApiRequest();
// result = ["1", "7"]
decompose()
decompose(
strategyDecompose):CairoCustomEnum
Defined in: src/utils/cairoDataTypes/cairoTypeCustomEnum.ts:396
Read the enum back as the CairoCustomEnum a caller reads.
Every variant the abi declares appears in the result, the inactive ones as undefined — which
is how CairoCustomEnum tells which one is active.
Parameters
strategyDecompose
how to read the value back
Returns
the enum, with its active variant carrying the value
Throws
when no strategy can read the value back
Example
const result = new CairoTypeCustomEnum(7, abiEnum, strategies, 1).decompose(strategies);
// result = CairoCustomEnum { Empty: undefined, Number: 7n }