194 lines
5.1 KiB
Nim
194 lines
5.1 KiB
Nim
import std/hashes
|
|
import pkg/contractabi
|
|
import pkg/nimcrypto
|
|
import pkg/ethers/fields
|
|
import pkg/questionable/results
|
|
|
|
export contractabi
|
|
|
|
type
|
|
StorageRequest* = object
|
|
client*: Address
|
|
ask*: StorageAsk
|
|
content*: StorageContent
|
|
expiry*: UInt256
|
|
nonce*: Nonce
|
|
StorageAsk* = object
|
|
slots*: uint64
|
|
slotSize*: UInt256
|
|
duration*: UInt256
|
|
proofProbability*: UInt256
|
|
reward*: UInt256
|
|
maxSlotLoss*: uint64
|
|
StorageContent* = object
|
|
cid*: string
|
|
erasure*: StorageErasure
|
|
por*: StoragePoR
|
|
StorageErasure* = object
|
|
totalChunks*: uint64
|
|
StoragePoR* = object
|
|
u*: seq[byte]
|
|
publicKey*: seq[byte]
|
|
name*: seq[byte]
|
|
Slot* = object
|
|
request*: StorageRequest
|
|
slotIndex*: UInt256
|
|
SlotId* = distinct array[32, byte]
|
|
RequestId* = distinct array[32, byte]
|
|
Nonce* = distinct array[32, byte]
|
|
RequestState* {.pure.} = enum
|
|
New
|
|
Started
|
|
Cancelled
|
|
Finished
|
|
Failed
|
|
SlotState* {.pure.} = enum
|
|
Free
|
|
Filled
|
|
Finished
|
|
Failed
|
|
Paid
|
|
|
|
proc `==`*(x, y: Nonce): bool {.borrow.}
|
|
proc `==`*(x, y: RequestId): bool {.borrow.}
|
|
proc `==`*(x, y: SlotId): bool {.borrow.}
|
|
proc hash*(x: SlotId): Hash {.borrow.}
|
|
proc hash*(x: Nonce): Hash {.borrow.}
|
|
proc hash*(x: Address): Hash {.borrow.}
|
|
|
|
func toArray*(id: RequestId | SlotId | Nonce): array[32, byte] =
|
|
array[32, byte](id)
|
|
|
|
proc `$`*(id: RequestId | SlotId | Nonce): string =
|
|
id.toArray.toHex
|
|
|
|
func fromTuple(_: type StorageRequest, tupl: tuple): StorageRequest =
|
|
StorageRequest(
|
|
client: tupl[0],
|
|
ask: tupl[1],
|
|
content: tupl[2],
|
|
expiry: tupl[3],
|
|
nonce: tupl[4]
|
|
)
|
|
|
|
func fromTuple(_: type Slot, tupl: tuple): Slot =
|
|
Slot(
|
|
request: tupl[0],
|
|
slotIndex: tupl[1]
|
|
)
|
|
|
|
func fromTuple(_: type StorageAsk, tupl: tuple): StorageAsk =
|
|
StorageAsk(
|
|
slots: tupl[0],
|
|
slotSize: tupl[1],
|
|
duration: tupl[2],
|
|
proofProbability: tupl[3],
|
|
reward: tupl[4],
|
|
maxSlotLoss: tupl[5]
|
|
)
|
|
|
|
func fromTuple(_: type StorageContent, tupl: tuple): StorageContent =
|
|
StorageContent(
|
|
cid: tupl[0],
|
|
erasure: tupl[1],
|
|
por: tupl[2]
|
|
)
|
|
|
|
func fromTuple(_: type StorageErasure, tupl: tuple): StorageErasure =
|
|
StorageErasure(
|
|
totalChunks: tupl[0]
|
|
)
|
|
|
|
func fromTuple(_: type StoragePoR, tupl: tuple): StoragePoR =
|
|
StoragePoR(
|
|
u: tupl[0],
|
|
publicKey: tupl[1],
|
|
name: tupl[2]
|
|
)
|
|
|
|
func solidityType*(_: type StoragePoR): string =
|
|
solidityType(StoragePoR.fieldTypes)
|
|
|
|
func solidityType*(_: type StorageErasure): string =
|
|
solidityType(StorageErasure.fieldTypes)
|
|
|
|
func solidityType*(_: type StorageContent): string =
|
|
solidityType(StorageContent.fieldTypes)
|
|
|
|
func solidityType*(_: type StorageAsk): string =
|
|
solidityType(StorageAsk.fieldTypes)
|
|
|
|
func solidityType*(_: type StorageRequest): string =
|
|
solidityType(StorageRequest.fieldTypes)
|
|
|
|
func encode*(encoder: var AbiEncoder, por: StoragePoR) =
|
|
encoder.write(por.fieldValues)
|
|
|
|
func encode*(encoder: var AbiEncoder, erasure: StorageErasure) =
|
|
encoder.write(erasure.fieldValues)
|
|
|
|
func encode*(encoder: var AbiEncoder, content: StorageContent) =
|
|
encoder.write(content.fieldValues)
|
|
|
|
func encode*(encoder: var AbiEncoder, ask: StorageAsk) =
|
|
encoder.write(ask.fieldValues)
|
|
|
|
func encode*(encoder: var AbiEncoder, id: RequestId | SlotId | Nonce) =
|
|
encoder.write(id.toArray)
|
|
|
|
func encode*(encoder: var AbiEncoder, request: StorageRequest) =
|
|
encoder.write(request.fieldValues)
|
|
|
|
func encode*(encoder: var AbiEncoder, request: Slot) =
|
|
encoder.write(request.fieldValues)
|
|
|
|
func decode*(decoder: var AbiDecoder, T: type StoragePoR): ?!T =
|
|
let tupl = ?decoder.read(StoragePoR.fieldTypes)
|
|
success StoragePoR.fromTuple(tupl)
|
|
|
|
func decode*(decoder: var AbiDecoder, T: type StorageErasure): ?!T =
|
|
let tupl = ?decoder.read(StorageErasure.fieldTypes)
|
|
success StorageErasure.fromTuple(tupl)
|
|
|
|
func decode*(decoder: var AbiDecoder, T: type StorageContent): ?!T =
|
|
let tupl = ?decoder.read(StorageContent.fieldTypes)
|
|
success StorageContent.fromTuple(tupl)
|
|
|
|
func decode*(decoder: var AbiDecoder, T: type StorageAsk): ?!T =
|
|
let tupl = ?decoder.read(StorageAsk.fieldTypes)
|
|
success StorageAsk.fromTuple(tupl)
|
|
|
|
func decode*(decoder: var AbiDecoder, T: type StorageRequest): ?!T =
|
|
let tupl = ?decoder.read(StorageRequest.fieldTypes)
|
|
success StorageRequest.fromTuple(tupl)
|
|
|
|
func decode*(decoder: var AbiDecoder, T: type Slot): ?!T =
|
|
let tupl = ?decoder.read(Slot.fieldTypes)
|
|
success Slot.fromTuple(tupl)
|
|
|
|
func id*(request: StorageRequest): RequestId =
|
|
let encoding = AbiEncoder.encode((request, ))
|
|
RequestId(keccak256.digest(encoding).data)
|
|
|
|
func slotId*(requestId: RequestId, slot: UInt256): SlotId =
|
|
let encoding = AbiEncoder.encode((requestId, slot))
|
|
SlotId(keccak256.digest(encoding).data)
|
|
|
|
func slotId*(request: StorageRequest, slot: UInt256): SlotId =
|
|
slotId(request.id, slot)
|
|
|
|
func id*(slot: Slot): SlotId =
|
|
slotId(slot.request, slot.slotIndex)
|
|
|
|
func pricePerSlot*(ask: StorageAsk): UInt256 =
|
|
ask.duration * ask.reward
|
|
|
|
func price*(ask: StorageAsk): UInt256 =
|
|
ask.slots.u256 * ask.pricePerSlot
|
|
|
|
func price*(request: StorageRequest): UInt256 =
|
|
request.ask.price
|
|
|
|
func size*(ask: StorageAsk): UInt256 =
|
|
ask.slots.u256 * ask.slotSize
|