Skip to main content
Version: 11.x

Class: CairoStruct

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:35

A Cairo struct : a fixed set of named members, each of its own type.

Unlike a tuple or an array, a struct has no shape to recognize — its abi type is just the name the contract gave it, my_contract::Point, which looks like any other type. So there is no isAbiType here : a struct is found by its exact name among a strategy's constructors, and the strategy that carries those names is built from the abi that declares them.

On the wire a struct is its members one after another, with nothing in front — its shape is entirely in the abi, exactly as a tuple's is in its type.

Example

const point: AbiStruct = {
type: 'struct',
name: 'test::Point',
members: [
{ name: 'x', type: 'core::integer::u8' },
{ name: 'y', type: 'core::integer::u32' },
],
};
const strategies = [cairoTypeStrategy, structStrategy([point])];
const struct = new CairoStruct({ x: 1, y: 2 }, point, strategies);
struct.toApiRequest(); // ["1", "2"]
struct.decompose(strategies); // { x: 1n, y: 2n }

Constructors

Constructor

new CairoStruct(content, abiStruct, parsingStrategy): CairoStruct

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:88

Build a struct, from values a caller passed or from the felts of a response.

An object is read by the member names the abi declares, in the abi's order — so the order the caller wrote them in does not matter. An array is taken as already being in that order.

Parameters

content

unknown

the members, as an object, an array, or the response iterator

abiStruct

AbiStruct

the abi definition of this struct

parsingStrategy

AllowArray<CairoTypeStrategy>

how to build each member, which must carry this struct's own name for a struct that holds another

Returns

CairoStruct

Throws

when a member is missing, when the count does not match, or when a member type no strategy knows is met

Example

new CairoStruct({ x: 1, y: 2 }, point, strategies).toApiRequest(); // ["1", "2"]
new CairoStruct({ y: 2, x: 1 }, point, strategies).toApiRequest(); // ["1", "2"] abi order
new CairoStruct([1, 2], point, strategies).toApiRequest(); // ["1", "2"]

Properties

dynamicSelector

readonly dynamicSelector: string

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:48

The name this struct is registered under, which is the name the abi gave it.

Every other composite has one selector for the whole class; a struct has one per struct, so this is set from the abi rather than declared on the class.

Example

const struct = new CairoStruct({ x: 1, y: 2 }, point, strategies);
const result = struct.dynamicSelector;
// result = "test::Point"

content

readonly content: CairoType[]

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:58

The members, each already built as the type the abi declares for it.

Example

const result = new CairoStruct({ x: 1, y: 2 }, point, strategies).content.length;
// result = 2

abiStruct

readonly abiStruct: AbiStruct

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:68

The abi definition this struct was built from.

Example

const result = new CairoStruct({ x: 1, y: 2 }, point, strategies).abiStruct.name;
// result = "test::Point"

Methods

getStructMembersTypes()

static getStructMembersTypes(abiStruct): string[]

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:195

The types of the members, in the abi's order.

Parameters

abiStruct

AbiStruct

the abi definition to read

Returns

string[]

one type per member

Example

const result = CairoStruct.getStructMembersTypes(point);
// result = ["core::integer::u8", "core::integer::u32"]

extractStructMembersNames()

static extractStructMembersNames(abiStruct): string[]

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:209

The names of the members, in the abi's order.

Parameters

abiStruct

AbiStruct

the abi definition to read

Returns

string[]

one name per member

Example

const result = CairoStruct.extractStructMembersNames(point);
// result = ["x", "y"]

validate()

static validate(input, abiStruct?): void

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:229

Throw unless this input can be read as this struct.

Given an abi, the member count is checked too : a struct is a fixed set, so a list of the wrong size is refused rather than padded or cut. Without one, only the shape is checked.

Parameters

input

unknown

the members to check

abiStruct?

AbiStruct

the abi definition, when there is one to check against

Returns

void

Throws

when the input is neither an array nor an object, when the abi is not a struct, or when the member count does not match

Example

CairoStruct.validate({ x: 1, y: 2 }, point); // passes
CairoStruct.validate([1], point);
// throws Error("Invalid input: expected 2 members, got 1")

is()

static is(input, abiStruct?): boolean

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:260

Can this input be read as this struct?

The non-throwing form of CairoStruct.validate.

Parameters

input

unknown

the members to test

abiStruct?

AbiStruct

the abi definition, when there is one to check against

Returns

boolean

true when the shape fits

Example

const result = CairoStruct.is({ x: 1, y: 2 }, point);
// result = true
const result2 = CairoStruct.is([1], point);
// result2 = false (one member short)

toApiRequest()

toApiRequest(): string[]

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:281

Serialize to the felts a contract call carries.

The members follow one another with nothing in front, as a tuple's do : what a struct holds is said by the abi, not by the calldata.

Returns

string[]

the members' felts, in the abi's order, flagged as compiled

Example

const result = new CairoStruct({ x: 1, y: 2 }, point, strategies).toApiRequest();
// result = ["1", "2"]

decompose()

decompose(strategyDecompose): Object

Defined in: src/utils/cairoDataTypes/cairoStruct.ts:299

Read the struct back as the plain object a caller reads.

Each member is handed to the strategy entry for its type — or for what built it, when that is a composite, which is what its dynamicSelector says. The result is keyed by member name.

Parameters

strategyDecompose

AllowArray<CairoTypeStrategy>

how to read each member back

Returns

Object

the members' values, keyed by name

Throws

when no strategy can read a member back

Example

const result = new CairoStruct({ x: 1, y: 2 }, point, strategies).decompose(strategies);
// result = { x: 1n, y: 2n }