starknet-io / starknet.js

JavaScript library for StarkNet
https://www.starknetjs.com
MIT License
1.22k stars 742 forks source link

Add test and support for negative Signed integers smaller than 252 bits #1014

Open tabaktoni opened 6 months ago

tabaktoni commented 6 months ago

Is your feature request related to a problem? Please describe. https://docs.starknet.io/documentation/architecture_and_concepts/Smart_Contracts/serialization_of_Cairo_types/#data_types_of_252_bits_or_less

Describe the solution you'd like Test current behavior and support required field el calc i8, i16, i32, i64, and i128

Negativ value should be 2^{251} + 172^{192} + 1 + (negative value) ex -5 should serialise to 2^{251} + 172^{192} + 1 - 5

AryanGodara commented 6 months ago

@tabaktoni Can I work on this one after completing #1018 ? :)

tabaktoni commented 6 months ago

Yes ofc, maybe the task will need to be expanded to multiple sub tasks we will need to check how to implement all Cairo int types in the manner of CairoInt. But the initial step (Test current behavior ) can be immediately tackled.

AryanGodara commented 6 months ago

Yes ofc, maybe the task will need to be expanded to multiple sub tasks we will need to check how to implement all Cairo int types in the manner of CairoInt. But the initial step (Test current behavior ) can be immediately tackled.

Got it! I'll start looking into the tests first! Then see how to break this down into subtasks :)

ivpavici commented 5 months ago

Task will be offered again on the ODHack event https://onlydust.notion.site/ODHack-Common-Guidelines-b9c6b6a4ac4146d087185568aca38a3f

AryanGodara commented 5 months ago

@ivpavici I'm still working on the other issue. So please don't unassign there šŸ˜… I had left a doubt regarding testing earlier. And I'd like to complete it during this week

ivpavici commented 5 months ago

ok when you are done there we can assign you here if no one else wants to pick it up

lucilapastore commented 5 months ago

Hey! I am from Argentina. I am at the mu. I want to contribute and make this my first issue. Regards!

ivpavici commented 5 months ago

@lucilapastore good luck!

fmmesen commented 4 months ago

Could I work on this? @ivpavici

ivpavici commented 4 months ago

good luck!

fmmesen commented 3 months ago

Hey @ivpavici , sorry for the delay! I just have a doubt

Doing the serialization manually:

2^{251} + 172^{192} + 1 - 5

I'll receive:

3618502788666131113263695016908177884250476444008934042335404944711319814140 result that will be returned as a felt252

So the idea is to create a unit test that will expect(result).ToBe(361850278866613111......) for i8, i16, i32, i64 and i128?

tabaktoni commented 3 months ago

Implementation needs to be the similar to CairoUint256

In addition to this you need to define and store:

  1. LImits: For each signed variant can store numbers from: $āˆ’(2^{nāˆ’1})$ to $2^{nāˆ’1}āˆ’1$ inclusive, where n is the number of bits that variant uses. Example: So an i8 can store numbers from $āˆ’(2^7)$ to $2^7āˆ’1$, which equals -128 to 127

  2. felt252 representation in field math notation (one you mentioning)

  3. JSC Representation in ''standard'' math example you provided will return -5

The class will contain all these properties + existing ones as in the uint256 example. Class needs to encode for request -5 to 3618502788... , and decode on response to -5 This needs to be a public class method. From an end-user perspective, it would be used as a normal number -X ... +X, and lib will based on ABI compile it to field math representation.

So to finally answer the question, yes for unit testing you need to test all Class methods as you described, but in e2e test you will expect -5.

fmmesen commented 3 months ago

Understood, I'll update you soon!