uint128 umrechnen in Decimal

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Kurt_Wallander
User
Beiträge: 7
Registriert: Montag 21. August 2023, 13:02

Ahoi!

Ich lese aus einem Smart Contract (auf Arbitrum) einen Wert aus. In der Doku für Developer heißt es, dabei handele es sich um einen uint128-Wert („Expressed in ray“). Ich möchte diesen umrechnen in einen Dezimalwert mit zwei Nachkommastellen. Stehe gerade etwas auf dem Schlauch. Wie mache ich das?

Lieben Gruß und Dank vorab
Kurt
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Durch 100 teilen.
Kurt_Wallander
User
Beiträge: 7
Registriert: Montag 21. August 2023, 13:02

__deets__ hat geschrieben: Montag 21. August 2023, 14:01 Durch 100 teilen.
Sicher? Das haut nicht wirklich hin.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Was haut nicht hin?
Was ist Deine Eingabe, wie sieht der Code aus, wie die Ausgabe und was wäre Deine erwartete Ausgabe?
Kurt_Wallander
User
Beiträge: 7
Registriert: Montag 21. August 2023, 13:02

Sirius3 hat geschrieben: Montag 21. August 2023, 14:39 Was haut nicht hin?
Was ist Deine Eingabe, wie sieht der Code aus, wie die Ausgabe und was wäre Deine erwartete Ausgabe?
Zurück kriege ich den Wert 33555008. Draus werden müsste eine Zahl mit einer Stelle vor dem Komma.

Sollte es helfen: Ich lese aus dem Pool Smart Contract von Aave den Wert für currentLiquidityRate aus und bekomme obigen Wert.

https://docs.aave.com/developers/core-contracts/pool
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Also durch 10000000 teilen?
Kurt_Wallander
User
Beiträge: 7
Registriert: Montag 21. August 2023, 13:02

Sorry, verguckt, das ist der Wert:

26307950997624296042583108

Und irgendwo habe ich was gelesen von Ray = 27 Stellen. Das passt dann aber auch nicht. Hmmm …
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kurt_Wallander hat geschrieben: Montag 21. August 2023, 14:22
__deets__ hat geschrieben: Montag 21. August 2023, 14:01 Durch 100 teilen.
Sicher? Das haut nicht wirklich hin.
Todsicher. Das haut so hin:

Code: Alles auswählen

>>> v = 1234567
>>> v / 100
12345.67
>>> import decimal as d
>>> d.Decimal(v) / d.Decimal(100)
Decimal('12345.67')
Das sind Ganzzaheln, umgerechnet in " Dezimalwert mit zwei Nachkommastellen".
Kurt_Wallander
User
Beiträge: 7
Registriert: Montag 21. August 2023, 13:02

Probiere es später aus und melde mich nochmal. Danke!
Kurt_Wallander
User
Beiträge: 7
Registriert: Montag 21. August 2023, 13:02

Hallo,

also ich kriege näherungsweise die richtigen Werte raus, wenn ich die vom Smart Contract zurückgelieferte Zahl durch 10000000000000000000000000 teile. Die Ungenauigkeit könnte damit zusammenhängen, dass die Aave-Website die Rates nicht so oft aktualisiert. Sicher bin ich mir nicht, aber ich habe mehrere Assets abgeglichen, und jetzt scheint es einigermaßen zu passen. Nun würde ich nur zu gern verstehen, warum ...

Lieben Gruß
Kurt
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Warum nicht? Nach einer kurzen Recherche ist ein ”ray” halt so definiert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kurt_Wallander
User
Beiträge: 7
Registriert: Montag 21. August 2023, 13:02

__blackjack__ hat geschrieben: Montag 21. August 2023, 23:39 Warum nicht? Nach einer kurzen Recherche ist ein ”ray” halt so definiert.
Dann habe ich falsch gesucht. Aber gut, damit wäre das Problem dann erstmal gelöst.
Antworten