{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Alonzo.State.Account () where

import Cardano.Ledger.Alonzo.Era
import Cardano.Ledger.BaseTypes
import Cardano.Ledger.Shelley.State
import Lens.Micro

instance EraAccounts AlonzoEra where
  type AccountState AlonzoEra = ShelleyAccountState AlonzoEra
  type Accounts AlonzoEra = ShelleyAccounts AlonzoEra

  addAccountState :: Credential 'Staking
-> AccountState AlonzoEra
-> Accounts AlonzoEra
-> Accounts AlonzoEra
addAccountState = Credential 'Staking
-> AccountState AlonzoEra
-> Accounts AlonzoEra
-> Accounts AlonzoEra
forall era.
ShelleyEraAccounts era =>
Credential 'Staking
-> AccountState era -> Accounts era -> Accounts era
shelleyAddAccountState

  accountsMapL :: Lens'
  (Accounts AlonzoEra)
  (Map (Credential 'Staking) (AccountState AlonzoEra))
accountsMapL = (Accounts AlonzoEra
 -> Map (Credential 'Staking) (AccountState AlonzoEra))
-> (Accounts AlonzoEra
    -> Map (Credential 'Staking) (AccountState AlonzoEra)
    -> Accounts AlonzoEra)
-> Lens'
     (Accounts AlonzoEra)
     (Map (Credential 'Staking) (AccountState AlonzoEra))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Accounts AlonzoEra
-> Map (Credential 'Staking) (AccountState AlonzoEra)
ShelleyAccounts AlonzoEra
-> Map (Credential 'Staking) (ShelleyAccountState AlonzoEra)
forall era.
ShelleyAccounts era
-> Map (Credential 'Staking) (ShelleyAccountState era)
saStates ((Accounts AlonzoEra
  -> Map (Credential 'Staking) (AccountState AlonzoEra)
  -> Accounts AlonzoEra)
 -> Lens'
      (Accounts AlonzoEra)
      (Map (Credential 'Staking) (AccountState AlonzoEra)))
-> (Accounts AlonzoEra
    -> Map (Credential 'Staking) (AccountState AlonzoEra)
    -> Accounts AlonzoEra)
-> Lens'
     (Accounts AlonzoEra)
     (Map (Credential 'Staking) (AccountState AlonzoEra))
forall a b. (a -> b) -> a -> b
$ \Accounts AlonzoEra
sas Map (Credential 'Staking) (AccountState AlonzoEra)
asMap -> Accounts AlonzoEra
sas {saStates = asMap}

  balanceAccountStateL :: Lens' (AccountState AlonzoEra) (CompactForm Coin)
balanceAccountStateL = (AccountState AlonzoEra -> CompactForm Coin)
-> (AccountState AlonzoEra
    -> CompactForm Coin -> AccountState AlonzoEra)
-> Lens' (AccountState AlonzoEra) (CompactForm Coin)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens AccountState AlonzoEra -> CompactForm Coin
ShelleyAccountState AlonzoEra -> CompactForm Coin
forall era. ShelleyAccountState era -> CompactForm Coin
sasBalance ((AccountState AlonzoEra
  -> CompactForm Coin -> AccountState AlonzoEra)
 -> Lens' (AccountState AlonzoEra) (CompactForm Coin))
-> (AccountState AlonzoEra
    -> CompactForm Coin -> AccountState AlonzoEra)
-> Lens' (AccountState AlonzoEra) (CompactForm Coin)
forall a b. (a -> b) -> a -> b
$ \AccountState AlonzoEra
sas CompactForm Coin
b -> AccountState AlonzoEra
sas {sasBalance = b}

  depositAccountStateL :: Lens' (AccountState AlonzoEra) (CompactForm Coin)
depositAccountStateL = (AccountState AlonzoEra -> CompactForm Coin)
-> (AccountState AlonzoEra
    -> CompactForm Coin -> AccountState AlonzoEra)
-> Lens' (AccountState AlonzoEra) (CompactForm Coin)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens AccountState AlonzoEra -> CompactForm Coin
ShelleyAccountState AlonzoEra -> CompactForm Coin
forall era. ShelleyAccountState era -> CompactForm Coin
sasDeposit ((AccountState AlonzoEra
  -> CompactForm Coin -> AccountState AlonzoEra)
 -> Lens' (AccountState AlonzoEra) (CompactForm Coin))
-> (AccountState AlonzoEra
    -> CompactForm Coin -> AccountState AlonzoEra)
-> Lens' (AccountState AlonzoEra) (CompactForm Coin)
forall a b. (a -> b) -> a -> b
$ \AccountState AlonzoEra
sas CompactForm Coin
d -> AccountState AlonzoEra
sas {sasDeposit = d}

  stakePoolDelegationAccountStateL :: Lens' (AccountState AlonzoEra) (Maybe (KeyHash 'StakePool))
stakePoolDelegationAccountStateL =
    (AccountState AlonzoEra -> Maybe (KeyHash 'StakePool))
-> (AccountState AlonzoEra
    -> Maybe (KeyHash 'StakePool) -> AccountState AlonzoEra)
-> Lens' (AccountState AlonzoEra) (Maybe (KeyHash 'StakePool))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (StrictMaybe (KeyHash 'StakePool) -> Maybe (KeyHash 'StakePool)
forall a. StrictMaybe a -> Maybe a
strictMaybeToMaybe (StrictMaybe (KeyHash 'StakePool) -> Maybe (KeyHash 'StakePool))
-> (ShelleyAccountState AlonzoEra
    -> StrictMaybe (KeyHash 'StakePool))
-> ShelleyAccountState AlonzoEra
-> Maybe (KeyHash 'StakePool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShelleyAccountState AlonzoEra -> StrictMaybe (KeyHash 'StakePool)
forall era.
ShelleyAccountState era -> StrictMaybe (KeyHash 'StakePool)
sasStakePoolDelegation) ((AccountState AlonzoEra
  -> Maybe (KeyHash 'StakePool) -> AccountState AlonzoEra)
 -> Lens' (AccountState AlonzoEra) (Maybe (KeyHash 'StakePool)))
-> (AccountState AlonzoEra
    -> Maybe (KeyHash 'StakePool) -> AccountState AlonzoEra)
-> Lens' (AccountState AlonzoEra) (Maybe (KeyHash 'StakePool))
forall a b. (a -> b) -> a -> b
$ \AccountState AlonzoEra
sas Maybe (KeyHash 'StakePool)
d ->
      AccountState AlonzoEra
sas {sasStakePoolDelegation = maybeToStrictMaybe d}

  unregisterAccount :: Credential 'Staking
-> Accounts AlonzoEra
-> (Maybe (AccountState AlonzoEra), Accounts AlonzoEra)
unregisterAccount = Credential 'Staking
-> Accounts AlonzoEra
-> (Maybe (AccountState AlonzoEra), Accounts AlonzoEra)
forall era.
ShelleyEraAccounts era =>
Credential 'Staking
-> Accounts era -> (Maybe (AccountState era), Accounts era)
unregisterShelleyAccount

instance ShelleyEraAccounts AlonzoEra