diff --git a/nitro.nim b/nitro.nim index 2548175..7c1afe6 100644 --- a/nitro.nim +++ b/nitro.nim @@ -1,3 +1,5 @@ import ./nitro/protocol +import ./nitro/wallet export protocol +export wallet diff --git a/nitro/wallet.nim b/nitro/wallet.nim new file mode 100644 index 0000000..935648c --- /dev/null +++ b/nitro/wallet.nim @@ -0,0 +1,32 @@ +import ./basics +import ./keys +import ./protocol + +include questionable/errorban + +export basics +export keys + +type + Wallet* = object + key: PrivateKey + channels: seq[Channel] + Channel* = object + latest*, upcoming*: ?StateUpdate + StateUpdate* = object + state*: State + signatures*: seq[(EthAddress, Signature)] + +proc init*(_: type Wallet, key: PrivateKey): Wallet = + result.key = key + +proc address*(wallet: Wallet): EthAddress = + wallet.key.toPublicKey.toAddress + +proc openLedger*(wallet: Wallet, asset: EthAddress, amount: UInt256): Channel = + let me = wallet.address.toDestination + let outcome = Outcome.init(asset, {me: amount}) + let state = State(outcome: outcome) + let signature = wallet.key.sign(state) + let update = StateUpdate(state: state, signatures: @{wallet.address: signature}) + Channel(upcoming: update.some) diff --git a/tests/nitro/testWallet.nim b/tests/nitro/testWallet.nim new file mode 100644 index 0000000..a211794 --- /dev/null +++ b/tests/nitro/testWallet.nim @@ -0,0 +1,22 @@ +import ./basics + +suite "nitro wallet": + + let key = PrivateKey.random() + let asset = EthAddress.example + let amount = 42.u256 + + test "wallet can be created from private key": + let wallet = Wallet.init(key) + check wallet.address == key.toPublicKey.toAddress + + test "opens ledger channel": + let wallet = Wallet.init(key) + let me = wallet.address.toDestination + let channel = wallet.openLedger(asset, amount) + let expectedOutcome = Outcome.init(asset, {me: amount}) + let expectedState = State(outcome: expectedOutcome) + let expectedSignatures = @{wallet.address: key.sign(expectedState)} + check channel.latest.isNone + check channel.upcoming.?state == expectedState.some + check channel.upcoming.?signatures == expectedSignatures.some diff --git a/tests/testAll.nim b/tests/testAll.nim index ca8816d..3ed9f24 100644 --- a/tests/testAll.nim +++ b/tests/testAll.nim @@ -3,5 +3,6 @@ import ./nitro/protocol/testChannel import ./nitro/protocol/testOutcome import ./nitro/protocol/testState import ./nitro/protocol/testSignature +import ./nitro/testWallet {.warning[UnusedImport]: off.}