2018-02-28 15:06:05 +00:00
|
|
|
import ttmath, constants, strformat, strutils, sequtils, endians, macros, utils / padding, rlp
|
2018-01-16 17:05:20 +00:00
|
|
|
|
2018-03-13 14:30:38 +00:00
|
|
|
# some methods based on py-evm utils/numeric
|
|
|
|
|
2018-02-20 17:27:43 +00:00
|
|
|
# TODO improve
|
2018-01-15 18:42:40 +00:00
|
|
|
|
2018-02-20 17:27:43 +00:00
|
|
|
proc intToBigEndian*(value: UInt256): Bytes =
|
|
|
|
result = repeat(0.byte, 32)
|
|
|
|
for z in 0 ..< 4:
|
|
|
|
var temp = value.table[z]
|
|
|
|
bigEndian64(result[24 - z * 8].addr, temp.addr)
|
|
|
|
|
|
|
|
proc bigEndianToInt*(value: Bytes): UInt256 =
|
|
|
|
var bytes = value.padLeft(32, 0.byte)
|
|
|
|
result = 0.u256
|
|
|
|
for z in 0 ..< 4:
|
|
|
|
var temp = 0.uint
|
|
|
|
bigEndian64(temp.addr, bytes[24 - z * 8].addr)
|
|
|
|
result.table[z] = temp
|
2018-01-16 17:05:20 +00:00
|
|
|
|
2018-02-20 17:27:43 +00:00
|
|
|
#echo intToBigEndian("32482610168005790164680892356840817100452003984372336767666156211029086934369".u256)
|
2018-01-16 17:05:20 +00:00
|
|
|
|
2018-02-28 15:06:05 +00:00
|
|
|
proc bitLength*(value: UInt256): int =
|
|
|
|
var b = ""
|
|
|
|
for z in 0 ..< 4:
|
|
|
|
b.add(value.table[3 - z].int64.toBin(64))
|
|
|
|
result = b.strip(chars={'0'}, trailing=false).len
|
|
|
|
|
|
|
|
#proc log256*(value: UInt256): UInt256 =
|
|
|
|
# log2(value) div 8
|
|
|
|
|
|
|
|
proc ceil8*(value: int): int =
|
|
|
|
let remainder = value mod 8
|
|
|
|
if remainder == 0:
|
|
|
|
value
|
|
|
|
else:
|
|
|
|
value + 8 - remainder
|
|
|
|
|
2018-02-20 17:27:43 +00:00
|
|
|
proc unsignedToSigned*(value: UInt256): Int256 =
|
|
|
|
0.i256
|
|
|
|
# TODO
|
|
|
|
# if value <= UINT_255_MAX_INT:
|
|
|
|
# return value
|
|
|
|
# else:
|
|
|
|
# return value - UINT_256_CEILING_INT
|
|
|
|
|
|
|
|
proc signedToUnsigned*(value: Int256): UInt256 =
|
|
|
|
0.u256
|
|
|
|
# TODO
|
|
|
|
# if value < 0:
|
|
|
|
# return value + UINT_256_CEILING_INT
|
|
|
|
# else:
|
|
|
|
# return value
|
2018-01-16 17:05:20 +00:00
|
|
|
|
2018-03-13 14:30:38 +00:00
|
|
|
# it's deasible to map nameXX methods like that (originally decorator)
|
2018-01-16 17:05:20 +00:00
|
|
|
macro ceilXX(ceiling: static[int]): untyped =
|
2018-01-22 22:23:07 +00:00
|
|
|
var name = ident(&"ceil{ceiling}")
|
2018-01-16 17:05:20 +00:00
|
|
|
result = quote:
|
2018-02-20 17:27:43 +00:00
|
|
|
proc `name`*(value: UInt256): UInt256 =
|
|
|
|
var remainder = value mod `ceiling`.u256
|
2018-01-16 17:05:20 +00:00
|
|
|
if remainder == 0:
|
|
|
|
return value
|
|
|
|
else:
|
2018-02-20 17:27:43 +00:00
|
|
|
return value + `ceiling`.u256 - remainder
|
2018-01-16 18:42:38 +00:00
|
|
|
|
2018-01-16 17:05:20 +00:00
|
|
|
|
|
|
|
ceilXX(32)
|
|
|
|
ceilXX(8)
|