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

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

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

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

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

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

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

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

  stakePoolDelegationAccountStateL :: Lens' (AccountState BabbageEra) (Maybe (KeyHash 'StakePool))
stakePoolDelegationAccountStateL =
    (AccountState BabbageEra -> Maybe (KeyHash 'StakePool))
-> (AccountState BabbageEra
    -> Maybe (KeyHash 'StakePool) -> AccountState BabbageEra)
-> Lens' (AccountState BabbageEra) (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 BabbageEra
    -> StrictMaybe (KeyHash 'StakePool))
-> ShelleyAccountState BabbageEra
-> Maybe (KeyHash 'StakePool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShelleyAccountState BabbageEra -> StrictMaybe (KeyHash 'StakePool)
forall era.
ShelleyAccountState era -> StrictMaybe (KeyHash 'StakePool)
sasStakePoolDelegation) ((AccountState BabbageEra
  -> Maybe (KeyHash 'StakePool) -> AccountState BabbageEra)
 -> Lens' (AccountState BabbageEra) (Maybe (KeyHash 'StakePool)))
-> (AccountState BabbageEra
    -> Maybe (KeyHash 'StakePool) -> AccountState BabbageEra)
-> Lens' (AccountState BabbageEra) (Maybe (KeyHash 'StakePool))
forall a b. (a -> b) -> a -> b
$ \AccountState BabbageEra
sas Maybe (KeyHash 'StakePool)
d ->
      AccountState BabbageEra
sas {sasStakePoolDelegation = maybeToStrictMaybe d}

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

instance ShelleyEraAccounts BabbageEra