{-# LANGUAGE AllowAmbiguousTypes #-}

-- | This module provides an attack to try and redirect selectable outputs to a
-- given thief target.
module Cooked.Attack.DatumHijacking
  ( -- * Datum hijacking params
    DatumHijackingParams (..),
    typedByDatumHijackingParams,
    ownedByDatumHijackingParams,
    scriptsDatumHijackingParams,
    defaultDatumHijackingParams,
    datumOfDatumHijackingParams,
    outPredDatumHijackingParams,

    -- * Datum hijacking label
    DatumHijackingLabel (..),

    -- * Datum hijacking attack
    datumHijackingAttack,
  )
where

import Control.Applicative (Alternative)
import Cooked.Pretty.Class
import Cooked.Pretty.Skeleton ()
import Cooked.Skeleton
import Cooked.Tweak
import Data.Kind (Type)
import Data.Typeable
import Optics.Core
import Polysemy
import Polysemy.NonDet

-- | A label added to a 'TxSkel' on which a tweak hijacking a datum has been
-- applied. The label contains all the outputs that have been hijacked, before
-- the hijacking happened.
newtype DatumHijackingLabel = DatumHijackingLabel [TxSkelOut]
  deriving (Int -> DatumHijackingLabel -> ShowS
[DatumHijackingLabel] -> ShowS
DatumHijackingLabel -> String
(Int -> DatumHijackingLabel -> ShowS)
-> (DatumHijackingLabel -> String)
-> ([DatumHijackingLabel] -> ShowS)
-> Show DatumHijackingLabel
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DatumHijackingLabel -> ShowS
showsPrec :: Int -> DatumHijackingLabel -> ShowS
$cshow :: DatumHijackingLabel -> String
show :: DatumHijackingLabel -> String
$cshowList :: [DatumHijackingLabel] -> ShowS
showList :: [DatumHijackingLabel] -> ShowS
Show, DatumHijackingLabel -> DatumHijackingLabel -> Bool
(DatumHijackingLabel -> DatumHijackingLabel -> Bool)
-> (DatumHijackingLabel -> DatumHijackingLabel -> Bool)
-> Eq DatumHijackingLabel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
== :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
$c/= :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
/= :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
Eq, Eq DatumHijackingLabel
Eq DatumHijackingLabel =>
(DatumHijackingLabel -> DatumHijackingLabel -> Ordering)
-> (DatumHijackingLabel -> DatumHijackingLabel -> Bool)
-> (DatumHijackingLabel -> DatumHijackingLabel -> Bool)
-> (DatumHijackingLabel -> DatumHijackingLabel -> Bool)
-> (DatumHijackingLabel -> DatumHijackingLabel -> Bool)
-> (DatumHijackingLabel
    -> DatumHijackingLabel -> DatumHijackingLabel)
-> (DatumHijackingLabel
    -> DatumHijackingLabel -> DatumHijackingLabel)
-> Ord DatumHijackingLabel
DatumHijackingLabel -> DatumHijackingLabel -> Bool
DatumHijackingLabel -> DatumHijackingLabel -> Ordering
DatumHijackingLabel -> DatumHijackingLabel -> DatumHijackingLabel
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DatumHijackingLabel -> DatumHijackingLabel -> Ordering
compare :: DatumHijackingLabel -> DatumHijackingLabel -> Ordering
$c< :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
< :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
$c<= :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
<= :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
$c> :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
> :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
$c>= :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
>= :: DatumHijackingLabel -> DatumHijackingLabel -> Bool
$cmax :: DatumHijackingLabel -> DatumHijackingLabel -> DatumHijackingLabel
max :: DatumHijackingLabel -> DatumHijackingLabel -> DatumHijackingLabel
$cmin :: DatumHijackingLabel -> DatumHijackingLabel -> DatumHijackingLabel
min :: DatumHijackingLabel -> DatumHijackingLabel -> DatumHijackingLabel
Ord)

instance PrettyCooked DatumHijackingLabel where
  prettyCookedOpt :: PrettyCookedOpts -> DatumHijackingLabel -> DocCooked
prettyCookedOpt PrettyCookedOpts
opts (DatumHijackingLabel [TxSkelOut]
txSkelOutputs) =
    PrettyCookedOpts
-> DocCooked -> DocCooked -> [TxSkelOut] -> DocCooked
forall a.
PrettyCookedList a =>
PrettyCookedOpts -> DocCooked -> DocCooked -> a -> DocCooked
prettyItemize PrettyCookedOpts
opts DocCooked
"Hijacked outputs" DocCooked
"-" [TxSkelOut]
txSkelOutputs

-- | Parameters of the datum hijacking attacks
data DatumHijackingParams owner f k is
  = DatumHijackingParams
  { -- | The branching policy to use when several outputs are targeted
    forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> Branching
dhpBranching :: Branching,
    -- | The optic selecting the outputs eligible for redirection, directly from
    -- the skeleton. Only outputs focused by this optic are redirected.
    forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> Optic' k is TxSkel TxSkelOut
dhpOptic :: Optic' k is TxSkel TxSkelOut,
    -- | Returns the new owner (embedded in @f@) of a targeted output. The @f@
    -- allows this computation to fail or branch, offering an extra layer of
    -- selection and multiplication on top of 'dhpOptic'.
    forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> TxSkelOut -> f owner
dhpNewOwner :: TxSkelOut -> f owner,
    -- | The redirection described by the previous arguments might apply to more
    -- than one of the outputs of the transaction. Use this predicate to select
    -- which of the redirectable outputs to actually redirect. We count the
    -- redirectable outputs from the left to the right, starting with zero.
    forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> Int -> Bool
dhpIndexPred :: Int -> Bool
  }

-- | Hijacks all the outputs for which the focus of a given optic exist. Returns
-- the list of hijacked outputs, as they were before being hijacked.
defaultDatumHijackingParams ::
  (Is k An_AffineFold) =>
  Branching ->
  Optic' k is TxSkelOut a ->
  owner ->
  DatumHijackingParams owner Maybe A_Traversal NoIx
defaultDatumHijackingParams :: forall k (is :: IxList) a owner.
Is k An_AffineFold =>
Branching
-> Optic' k is TxSkelOut a
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
defaultDatumHijackingParams Branching
branching Optic' k is TxSkelOut a
optic owner
thief =
  Branching
-> Optic' A_Traversal NoIx TxSkel TxSkelOut
-> (TxSkelOut -> Maybe owner)
-> (Int -> Bool)
-> DatumHijackingParams owner Maybe A_Traversal NoIx
forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
Branching
-> Optic' k is TxSkel TxSkelOut
-> (TxSkelOut -> f owner)
-> (Int -> Bool)
-> DatumHijackingParams owner f k is
DatumHijackingParams
    Branching
branching
    (Lens' TxSkel [TxSkelOut]
txSkelOutputsL Lens' TxSkel [TxSkelOut]
-> Optic
     A_Traversal NoIx [TxSkelOut] [TxSkelOut] TxSkelOut TxSkelOut
-> Optic' A_Traversal NoIx TxSkel TxSkelOut
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Traversal NoIx [TxSkelOut] [TxSkelOut] TxSkelOut TxSkelOut
forall (t :: * -> *) a b.
Traversable t =>
Traversal (t a) (t b) a b
traversed Optic' A_Traversal NoIx TxSkel TxSkelOut
-> Optic A_Prism NoIx TxSkelOut TxSkelOut TxSkelOut TxSkelOut
-> Optic' A_Traversal NoIx TxSkel TxSkelOut
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% (TxSkelOut -> Bool)
-> Optic A_Prism NoIx TxSkelOut TxSkelOut TxSkelOut TxSkelOut
forall a. (a -> Bool) -> Prism' a a
selectP (Optic' A_Prism NoIx (Maybe a) a -> Maybe a -> Bool
forall k (is :: IxList) s a.
Is k A_Fold =>
Optic' k is s a -> s -> Bool
has Optic' A_Prism NoIx (Maybe a) a
forall a b. Prism (Maybe a) (Maybe b) a b
_Just (Maybe a -> Bool) -> (TxSkelOut -> Maybe a) -> TxSkelOut -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Optic' k is TxSkelOut a -> TxSkelOut -> Maybe a
forall k (is :: IxList) s a.
Is k An_AffineFold =>
Optic' k is s a -> s -> Maybe a
preview Optic' k is TxSkelOut a
optic))
    (Maybe owner -> TxSkelOut -> Maybe owner
forall a b. a -> b -> a
const (owner -> Maybe owner
forall a. a -> Maybe a
Just owner
thief))
    (Bool -> Int -> Bool
forall a b. a -> b -> a
const Bool
True)

-- | Targets all the outputs satisfying a given predicate
outPredDatumHijackingParams ::
  Branching ->
  (TxSkelOut -> Bool) ->
  owner ->
  DatumHijackingParams owner Maybe A_Traversal NoIx
outPredDatumHijackingParams :: forall owner.
Branching
-> (TxSkelOut -> Bool)
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
outPredDatumHijackingParams Branching
branching =
  Branching
-> Optic' An_AffineFold NoIx TxSkelOut TxSkelOut
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
forall k (is :: IxList) a owner.
Is k An_AffineFold =>
Branching
-> Optic' k is TxSkelOut a
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
defaultDatumHijackingParams Branching
branching (Optic' An_AffineFold NoIx TxSkelOut TxSkelOut
 -> owner -> DatumHijackingParams owner Maybe A_Traversal NoIx)
-> ((TxSkelOut -> Bool)
    -> Optic' An_AffineFold NoIx TxSkelOut TxSkelOut)
-> (TxSkelOut -> Bool)
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxSkelOut -> Bool)
-> Optic' An_AffineFold NoIx TxSkelOut TxSkelOut
forall a. (a -> Bool) -> AffineFold a a
filtered

-- | Datum hijacking parameters targeting all the outputs owned by a certain
-- type of owner.
typedByDatumHijackingParams ::
  forall (oldOwner :: Type) owner.
  (Typeable oldOwner) =>
  Branching ->
  owner ->
  DatumHijackingParams owner Maybe A_Traversal NoIx
typedByDatumHijackingParams :: forall oldOwner owner.
Typeable oldOwner =>
Branching
-> owner -> DatumHijackingParams owner Maybe A_Traversal NoIx
typedByDatumHijackingParams Branching
branching =
  Branching
-> Optic' An_AffineFold NoIx TxSkelOut oldOwner
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
forall k (is :: IxList) a owner.
Is k An_AffineFold =>
Branching
-> Optic' k is TxSkelOut a
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
defaultDatumHijackingParams Branching
branching (Lens' TxSkelOut (User 'IsEither 'Allocation)
txSkelOutOwnerL Lens' TxSkelOut (User 'IsEither 'Allocation)
-> Optic
     An_AffineFold
     NoIx
     (User 'IsEither 'Allocation)
     (User 'IsEither 'Allocation)
     oldOwner
     oldOwner
-> Optic' An_AffineFold NoIx TxSkelOut oldOwner
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% forall user (kind :: UserKind) (mode :: UserMode).
Typeable user =>
AffineFold (User kind mode) user
userTypedAF @oldOwner)

-- | Datum hijacking parameters targeting all the outputs owned by a given
-- user.
ownedByDatumHijackingParams ::
  forall oldOwner owner.
  ( Typeable oldOwner,
    Eq oldOwner
  ) =>
  Branching ->
  oldOwner ->
  owner ->
  DatumHijackingParams owner Maybe A_Traversal NoIx
ownedByDatumHijackingParams :: forall oldOwner owner.
(Typeable oldOwner, Eq oldOwner) =>
Branching
-> oldOwner
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
ownedByDatumHijackingParams Branching
branching oldOwner
user =
  Branching
-> Optic' An_AffineFold NoIx TxSkelOut oldOwner
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
forall k (is :: IxList) a owner.
Is k An_AffineFold =>
Branching
-> Optic' k is TxSkelOut a
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
defaultDatumHijackingParams Branching
branching (Lens' TxSkelOut (User 'IsEither 'Allocation)
txSkelOutOwnerL Lens' TxSkelOut (User 'IsEither 'Allocation)
-> Optic
     An_AffineFold
     NoIx
     (User 'IsEither 'Allocation)
     (User 'IsEither 'Allocation)
     oldOwner
     oldOwner
-> Optic' An_AffineFold NoIx TxSkelOut oldOwner
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% forall user (kind :: UserKind) (mode :: UserMode).
Typeable user =>
AffineFold (User kind mode) user
userTypedAF @oldOwner Optic' An_AffineFold NoIx TxSkelOut oldOwner
-> Optic An_AffineFold NoIx oldOwner oldOwner oldOwner oldOwner
-> Optic' An_AffineFold NoIx TxSkelOut oldOwner
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% (oldOwner -> Bool)
-> Optic An_AffineFold NoIx oldOwner oldOwner oldOwner oldOwner
forall a. (a -> Bool) -> AffineFold a a
filtered (oldOwner -> oldOwner -> Bool
forall a. Eq a => a -> a -> Bool
== oldOwner
user))

-- | Datum hijacking parameters targeting all the outputs owned by a script.
scriptsDatumHijackingParams ::
  Branching ->
  owner ->
  DatumHijackingParams owner Maybe A_Traversal NoIx
scriptsDatumHijackingParams :: forall owner.
Branching
-> owner -> DatumHijackingParams owner Maybe A_Traversal NoIx
scriptsDatumHijackingParams Branching
branching =
  Branching
-> Optic' An_AffineFold NoIx TxSkelOut ScriptHash
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
forall k (is :: IxList) a owner.
Is k An_AffineFold =>
Branching
-> Optic' k is TxSkelOut a
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
defaultDatumHijackingParams Branching
branching (Lens' TxSkelOut (User 'IsEither 'Allocation)
txSkelOutOwnerL Lens' TxSkelOut (User 'IsEither 'Allocation)
-> Optic
     An_AffineFold
     NoIx
     (User 'IsEither 'Allocation)
     (User 'IsEither 'Allocation)
     ScriptHash
     ScriptHash
-> Optic' An_AffineFold NoIx TxSkelOut ScriptHash
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic
  An_AffineFold
  NoIx
  (User 'IsEither 'Allocation)
  (User 'IsEither 'Allocation)
  ScriptHash
  ScriptHash
forall (kind :: UserKind) (mode :: UserMode).
AffineFold (User kind mode) ScriptHash
userScriptHashAF)

-- | Datum hijacking parameters targeting all the outputs with a certain type
-- of datum.
datumOfDatumHijackingParams ::
  forall dat owner.
  (DatumConstrs dat) =>
  Branching ->
  owner ->
  DatumHijackingParams owner Maybe A_Traversal NoIx
datumOfDatumHijackingParams :: forall dat owner.
DatumConstrs dat =>
Branching
-> owner -> DatumHijackingParams owner Maybe A_Traversal NoIx
datumOfDatumHijackingParams Branching
branching =
  Branching
-> Optic' An_AffineTraversal NoIx TxSkelOut dat
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
forall k (is :: IxList) a owner.
Is k An_AffineFold =>
Branching
-> Optic' k is TxSkelOut a
-> owner
-> DatumHijackingParams owner Maybe A_Traversal NoIx
defaultDatumHijackingParams Branching
branching (Lens' TxSkelOut TxSkelOutDatum
txSkelOutDatumL Lens' TxSkelOut TxSkelOutDatum
-> Optic
     An_AffineTraversal NoIx TxSkelOutDatum TxSkelOutDatum dat dat
-> Optic' An_AffineTraversal NoIx TxSkelOut dat
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% forall a b.
(DatumConstrs a, DatumConstrs b) =>
AffineTraversal TxSkelOutDatum TxSkelOutDatum a b
txSkelOutDatumTypedAT @dat)

-- | Hijacks all the outputs from which a new owner can be computed, and whose
-- indexes match a given predicate. Returns the list of hijacked outputs, as
-- they were before being hijacked.
datumHijackingAttack ::
  ( Members '[NonDet, Tweak] effs,
    IsTxSkelOutAllowedOwner owner,
    Is k A_Traversal,
    Foldable f,
    Alternative f
  ) =>
  DatumHijackingParams owner f k is ->
  Sem effs [TxSkelOut]
datumHijackingAttack :: forall (effs :: EffectRow) owner k (f :: * -> *) (is :: IxList).
(Members '[NonDet, Tweak] effs, IsTxSkelOutAllowedOwner owner,
 Is k A_Traversal, Foldable f, Alternative f) =>
DatumHijackingParams owner f k is -> Sem effs [TxSkelOut]
datumHijackingAttack DatumHijackingParams {Optic' k is TxSkel TxSkelOut
Branching
Int -> Bool
TxSkelOut -> f owner
dhpBranching :: forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> Branching
dhpOptic :: forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> Optic' k is TxSkel TxSkelOut
dhpNewOwner :: forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> TxSkelOut -> f owner
dhpIndexPred :: forall {k} (owner :: k) (f :: k -> *) k (is :: IxList).
DatumHijackingParams owner f k is -> Int -> Bool
dhpBranching :: Branching
dhpOptic :: Optic' k is TxSkel TxSkelOut
dhpNewOwner :: TxSkelOut -> f owner
dhpIndexPred :: Int -> Bool
..} = do
  [TxSkelOut]
modified <-
    ModifyTweakParams k An_Iso is NoIx f TxSkelOut TxSkelOut TxSkelOut
-> Sem effs [TxSkelOut]
forall (effs :: EffectRow) k k' (f :: * -> *) (is :: IxList)
       (is' :: IxList) a b c.
(Members '[Tweak, NonDet] effs, Is k A_Traversal,
 Is k' An_AffineTraversal, Foldable f, Alternative f) =>
ModifyTweakParams k k' is is' f a b c -> Sem effs [b]
modifyTweakFromParams (ModifyTweakParams k An_Iso is NoIx f TxSkelOut TxSkelOut TxSkelOut
 -> Sem effs [TxSkelOut])
-> ModifyTweakParams
     k An_Iso is NoIx f TxSkelOut TxSkelOut TxSkelOut
-> Sem effs [TxSkelOut]
forall a b. (a -> b) -> a -> b
$
      Branching
-> Optic' k is TxSkel TxSkelOut
-> Optic An_Iso NoIx TxSkelOut TxSkelOut TxSkelOut TxSkelOut
-> (TxSkelOut -> f TxSkelOut)
-> (Int -> Bool)
-> ModifyTweakParams
     k An_Iso is NoIx f TxSkelOut TxSkelOut TxSkelOut
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> Optic k' is' a a b c
-> (b -> f c)
-> (Int -> Bool)
-> ModifyTweakParams k k' is is' f a b c
ModifyTweakParams
        Branching
dhpBranching
        Optic' k is TxSkel TxSkelOut
dhpOptic
        Optic An_Iso NoIx TxSkelOut TxSkelOut TxSkelOut TxSkelOut
forall a. Iso' a a
simple
        (\TxSkelOut
out -> (\owner
owner -> Lens' TxSkelOut (User 'IsEither 'Allocation)
-> User 'IsEither 'Allocation -> TxSkelOut -> TxSkelOut
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
set Lens' TxSkelOut (User 'IsEither 'Allocation)
txSkelOutOwnerL (owner -> User 'IsEither 'Allocation
forall a.
IsTxSkelOutAllowedOwner a =>
a -> User 'IsEither 'Allocation
toPKHOrVScript owner
owner) TxSkelOut
out) (owner -> TxSkelOut) -> f owner -> f TxSkelOut
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TxSkelOut -> f owner
dhpNewOwner TxSkelOut
out)
        Int -> Bool
dhpIndexPred
  Optic' A_Lens NoIx TxSkel (Set TxSkelLabel)
-> TxSkelLabel -> Sem effs ()
forall (effs :: EffectRow) k a (is :: IxList).
(Members '[Tweak, NonDet] effs, Is k A_Traversal, Ord a) =>
Optic' k is TxSkel (Set a) -> a -> Sem effs ()
insertInTweak Optic' A_Lens NoIx TxSkel (Set TxSkelLabel)
txSkelLabelsL (TxSkelLabel -> Sem effs ()) -> TxSkelLabel -> Sem effs ()
forall a b. (a -> b) -> a -> b
$ DatumHijackingLabel -> TxSkelLabel
forall x. LabelConstrs x => x -> TxSkelLabel
TxSkelLabel (DatumHijackingLabel -> TxSkelLabel)
-> DatumHijackingLabel -> TxSkelLabel
forall a b. (a -> b) -> a -> b
$ [TxSkelOut] -> DatumHijackingLabel
DatumHijackingLabel [TxSkelOut]
modified
  [TxSkelOut] -> Sem effs [TxSkelOut]
forall a. a -> Sem effs a
forall (m :: * -> *) a. Monad m => a -> m a
return [TxSkelOut]
modified