kinda```lua
-- able to compute down to 2e18 for the math to handle BN to OrderedDataStore
function Bn.lbencode(val: any): number
val = Bn.convert(val)
local man, exp = val.man, val.exp
if man == 0 then return 4e18 end
local sign = (man < 0) and -1 or 1
man = math.abs(man)
if exp < 15 then
return sign * math.floor(man * 10^exp + 0.5)
end
local scale = 1e16 / 308
local encoded = sign * (math.log10(exp+1) * scale + math.log10(man) * 1e6)
return math.abs(encoded)
end
function Bn.lbdecode(val: number): BN
if val == 4e18 then return zero end
local sign = (val < 0) and -1 or 1
val = math.abs(val)
if val < 1e15 then
local exp = math.floor(math.log10(val))
local man = val / 10^exp
return Bn.new(man * sign, exp)
end
local scale = 1e16 / 308
local manLog = val % 1e6
local expLog = (val - manLog) / scale
local exp = 10^expLog-1
local man = 10^(manLog/1e6)
return {man = man * sign, exp = exp}
end