Skip to main content
Version: 11.x

Class: CairoSecp256k1Point

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:62

A Cairo core::starknet::secp256k1::Secp256k1Point : a point on the secp256k1 curve, the one Ethereum signs with.

A point is two 256-bit coordinates, x and y, and Cairo carries each of them as two 128-bit limbs — so four felts in all, in the order xLow, xHigh, yLow, yHigh. The single number this class accepts is the 512-bit concatenation x || y, x in the upper half : that is the shape an uncompressed public key already has once its 04 prefix is dropped.

Both ways in are supported : one number, or the four limbs directly, which is how a response is read back.

Example

// one number, x in the upper 256 bits
const point = new CairoSecp256k1Point(1n);
point.toApiRequest(); // ["0", "0", "1", "0"] x = 0, y = 1

// the four limbs, as a call carries them
const same = new CairoSecp256k1Point(0, 0, 1, 0);
same.toBigInt(); // 1n

Constructors

Constructor

new CairoSecp256k1Point(input): CairoSecp256k1Point

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:116

Build from the 512-bit number x || y, or from an object carrying the four limbs.

Parameters

input

unknown

Returns

CairoSecp256k1Point

Constructor

new CairoSecp256k1Point(xLow, xHigh, yLow, yHigh): CairoSecp256k1Point

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:120

Build from the four limbs, in the order a contract response returns them.

Parameters

xLow

BigNumberish

xHigh

BigNumberish

yLow

BigNumberish

yHigh

BigNumberish

Returns

CairoSecp256k1Point

Properties

abiSelector

static abiSelector: "core::starknet::secp256k1::Secp256k1Point" = Literal.Secp256k1Point

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:111

The abi type this class serializes.

Example

const result = CairoSecp256k1Point.abiSelector;
// result = "core::starknet::secp256k1::Secp256k1Point"

xLow

xLow: bigint

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:71

The low 128 bits of the x coordinate.

Example

const result = new CairoSecp256k1Point({ xLow: 1, xHigh: 2, yLow: 3, yHigh: 4 }).xLow;
// result = 1n

xHigh

xHigh: bigint

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:81

The high 128 bits of the x coordinate.

Example

const result = new CairoSecp256k1Point({ xLow: 1, xHigh: 2, yLow: 3, yHigh: 4 }).xHigh;
// result = 2n

yLow

yLow: bigint

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:91

The low 128 bits of the y coordinate.

Example

const result = new CairoSecp256k1Point({ xLow: 1, xHigh: 2, yLow: 3, yHigh: 4 }).yLow;
// result = 3n

yHigh

yHigh: bigint

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:101

The high 128 bits of the y coordinate.

Example

const result = new CairoSecp256k1Point({ xLow: 1, xHigh: 2, yLow: 3, yHigh: 4 }).yHigh;
// result = 4n

Methods

validate()

static validate(input): bigint

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:198

Throw unless the value can be carried by a Secp256k1Point, and return it as a number.

Unlike the other classes here this one gives the number back rather than returning nothing : the constructor needs it, and computing it twice would mean splitting a 512-bit value twice.

Parameters

input

unknown

the 512-bit value to check

Returns

bigint

the value, once checked

Throws

when the value is null, undefined, of an unread type, or outside [0, 2^512 - 1]

Example

const result = CairoSecp256k1Point.validate('0x1234');
// result = 4660n
CairoSecp256k1Point.validate(SECP256K1_POINT_MAX + 1n);
// throws Error("input is bigger than SECP256K1_POINT_MAX")

validateProps()

static validateProps(xLow, xHigh, yLow, yHigh): object

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:228

Throw unless the four limbs can each be carried by 128 bits, and return them as numbers.

Parameters

xLow

BigNumberish

the low 128 bits of x

xHigh

BigNumberish

the high 128 bits of x

yLow

BigNumberish

the low 128 bits of y

yHigh

BigNumberish

the high 128 bits of y

Returns

object

the four limbs, checked

xLow

xLow: bigint

xHigh

xHigh: bigint

yLow

yLow: bigint

yHigh

yHigh: bigint

Throws

when a limb is null, undefined, not a number, negative, or wider than 128 bits

Example

const result = CairoSecp256k1Point.validateProps(1, 2, 3, 4);
// result = { xLow: 1n, xHigh: 2n, yLow: 3n, yHigh: 4n }
CairoSecp256k1Point.validateProps(1, 2, 3, 2n ** 128n);
// throws Error("yHigh must fit in 128 bits")

is()

static is(data): boolean

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:267

Can this value be carried by a Secp256k1Point?

The non-throwing form of CairoSecp256k1Point.validate, so it answers false for every input that one refuses, whatever the reason.

Parameters

data

any

the value to test

Returns

boolean

true when the value fits in 512 bits

Example

const result = CairoSecp256k1Point.is(SECP256K1_POINT_MAX);
// result = true
const result2 = CairoSecp256k1Point.is(SECP256K1_POINT_MAX + 1n);
// result2 = false

isAbiType()

static isAbiType(abiType): boolean

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:288

Is this abi type the one this class serializes?

Parameters

abiType

string

the abi type to test

Returns

boolean

true for core::starknet::secp256k1::Secp256k1Point

Example

const result = CairoSecp256k1Point.isAbiType('core::starknet::secp256k1::Secp256k1Point');
// result = true
const result2 = CairoSecp256k1Point.isAbiType('core::felt252');
// result2 = false

factoryFromApiResponse()

static factoryFromApiResponse(responseIterator): CairoSecp256k1Point

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:303

Read one point off a contract response, advancing the iterator past its four felts.

Parameters

responseIterator

Iterator<string>

the response felts, positioned on this point

Returns

CairoSecp256k1Point

the point that was read

Example

const response = ['0x0', '0x0', '0x1', '0x0'];
const result = CairoSecp256k1Point.factoryFromApiResponse(response.values()).toBigInt();
// result = 1n

fromHex()

static fromHex(hexString): CairoSecp256k1Point

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:394

Build from a hexadecimal string spelling the 512-bit value.

A shorter string is left-padded to the 128 hex digits a point occupies, so a small value is read as a point whose upper limbs are zero. A longer one is refused rather than truncated.

Parameters

hexString

string

the value, 0x-prefixed or not, at most 128 hex digits

Returns

CairoSecp256k1Point

the point the string spells

Throws

when the string holds more than 128 hex digits

Example

const result = CairoSecp256k1Point.fromHex('0x1').toApiRequest();
// result = ["0", "0", "1", "0"]

toBigInt()

toBigInt(): bigint

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:325

The point as the single 512-bit number x || y.

The inverse of what the constructor does with one number, so a point built that way comes back unchanged.

Returns

bigint

the two coordinates concatenated, x in the upper 256 bits

Example

const result = new CairoSecp256k1Point(1n).toBigInt();
// result = 1n
const result2 = new CairoSecp256k1Point(0, 0, 3, 0).toBigInt();
// result2 = 3n

toStruct()

toStruct(): Secp256k1PointStruct

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:340

The four limbs as hexadecimal strings.

Returns

Secp256k1PointStruct

the limbs, each 0x-prefixed and unpadded

Example

const result = new CairoSecp256k1Point({ xLow: 1, xHigh: 2, yLow: 3, yHigh: 4 }).toStruct();
// result = { xLow: "0x1", xHigh: "0x2", yLow: "0x3", yHigh: "0x4" }

toHexString()

toHexString(): string

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:358

The point in hexadecimal, without padding.

Returns

string

the 512-bit value as a 0x-prefixed hex string

Example

const result = new CairoSecp256k1Point(4660n).toHexString();
// result = "0x1234"

toApiRequest()

toApiRequest(): string[]

Defined in: src/utils/cairoDataTypes/secp256k1Point.ts:371

Serialize to the four felts a contract call carries.

Returns

string[]

the limbs as decimal strings, [xLow, xHigh, yLow, yHigh], flagged as compiled

Example

const result = new CairoSecp256k1Point({ xLow: 1, xHigh: 2, yLow: 3, yHigh: 4 }).toApiRequest();
// result = ["1", "2", "3", "4"]