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

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

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

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

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

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

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

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

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

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

instance ShelleyEraAccounts MaryEra