protobuf message for state channel updates

This commit is contained in:
Mark Spanbroek 2021-04-07 14:30:33 +02:00 committed by markspanbroek
parent f60df42c88
commit c819ba1be1
4 changed files with 36 additions and 0 deletions

View File

@ -6,6 +6,7 @@ import pkg/upraises
import_proto3 "payments.proto"
export PricingMessage
export StateChannelUpdate
export nitro
@ -44,3 +45,9 @@ func init*(_: type Pricing, message: PricingMessage): ?Pricing =
if address.isNone or asset.isNone or price.isNone:
return Pricing.none
Pricing(address: address.get, asset: asset.get, price: price.get).some
func init*(_: type StateChannelUpdate, state: SignedState): StateChannelUpdate =
StateChannelUpdate(update: state.toJson.toBytes)
proc init*(_: type SignedState, update: StateChannelUpdate): ?SignedState =
SignedState.fromJson(string.fromBytes(update.update))

View File

@ -7,3 +7,7 @@ message PricingMessage {
bytes asset = 2; // Asset (coin) with which to pay
bytes price = 3; // Amount of assets to pay per byte (UInt256)
}
message StateChannelUpdate {
bytes update = 1; // Signed Nitro state, serialized as JSON
}

View File

@ -1,5 +1,6 @@
import pkg/asynctest
import pkg/chronos
import pkg/stew/byteutils
import ../../examples
import ../../../../dagger/bitswap/protobuf/payments
@ -43,3 +44,19 @@ suite "pricing protobuf messages":
var incorrect = message
incorrect.price = newSeq[byte](33)
check Pricing.init(incorrect).isNone
suite "channel update messages":
let state = SignedState.example
let update = StateChannelUpdate.init(state)
test "encodes a nitro signed state":
check update.update == state.toJson.toBytes
test "decodes a channel update":
check SignedState.init(update) == state.some
test "fails to decode incorrect channel update":
var incorrect = update
incorrect.update.del(0)
check SignedState.init(incorrect).isNone

View File

@ -9,3 +9,11 @@ proc example*(_: type UInt256): UInt256 =
for b in bytes.mitems:
b = rand(byte)
UInt256.fromBytes(bytes)
proc example*(_: type SignedState): SignedState =
var wallet = Wallet.init(EthPrivateKey.random())
let hub, asset, receiver = EthAddress.example
let chainId, amount = UInt256.example
let nonce = UInt48.rand()
let channel = wallet.openLedgerChannel(hub, chainId, nonce, asset, amount).get
wallet.pay(channel, asset, receiver, amount).get