-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

{-# OPTIONS_GHC -Wno-orphans #-}

module Lorentz.Contracts.UpgradeableCounterSdu.V2
  ( CounterSduV
  , counterContract
  , migration
  , counterUpgradeParameters
  , counterUpgradeParametersFromV0
  , counterRollbackParameters
  ) where

import Lorentz
import Prelude (Identity)

import Lorentz.Contracts.Upgradeable.Common
import Lorentz.Contracts.Upgradeable.StorageDriven
import Lorentz.Contracts.UpgradeableCounterSdu
import qualified Lorentz.Contracts.UpgradeableCounterSdu.V1 as V1
import Lorentz.UStore
import Lorentz.UStore.Migration
import Util.Named

-- Moved all entrypoints to a dedicated datatype for convenience
data UStoreEntrypoints store = UStoreEntrypoints
  { UStoreEntrypoints store -> UStoreEntrypoint store ()
epInc :: UStoreEntrypoint store ()
  , UStoreEntrypoints store -> UStoreEntrypoint store ()
epDec :: UStoreEntrypoint store ()
  , UStoreEntrypoints store
-> UStoreEntrypoint store (Void_ () Integer)
epGetCounterValue :: UStoreEntrypoint store (Void_ () Integer)
  } deriving stock (UStoreEntrypoints store -> UStoreEntrypoints store -> Bool
(UStoreEntrypoints store -> UStoreEntrypoints store -> Bool)
-> (UStoreEntrypoints store -> UStoreEntrypoints store -> Bool)
-> Eq (UStoreEntrypoints store)
forall store.
UStoreEntrypoints store -> UStoreEntrypoints store -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UStoreEntrypoints store -> UStoreEntrypoints store -> Bool
$c/= :: forall store.
UStoreEntrypoints store -> UStoreEntrypoints store -> Bool
== :: UStoreEntrypoints store -> UStoreEntrypoints store -> Bool
$c== :: forall store.
UStoreEntrypoints store -> UStoreEntrypoints store -> Bool
Eq, (forall x.
 UStoreEntrypoints store -> Rep (UStoreEntrypoints store) x)
-> (forall x.
    Rep (UStoreEntrypoints store) x -> UStoreEntrypoints store)
-> Generic (UStoreEntrypoints store)
forall x.
Rep (UStoreEntrypoints store) x -> UStoreEntrypoints store
forall x.
UStoreEntrypoints store -> Rep (UStoreEntrypoints store) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall store x.
Rep (UStoreEntrypoints store) x -> UStoreEntrypoints store
forall store x.
UStoreEntrypoints store -> Rep (UStoreEntrypoints store) x
$cto :: forall store x.
Rep (UStoreEntrypoints store) x -> UStoreEntrypoints store
$cfrom :: forall store x.
UStoreEntrypoints store -> Rep (UStoreEntrypoints store) x
Generic)

data UStoreTemplate = UStoreTemplate
  { -- We want to keep a value of significantly different type comparing to V1
    UStoreTemplate -> UStoreField ("i" :! Integer, ())
counterValue :: UStoreField ("i" :! Integer, ())
  , UStoreTemplate -> UStoreEntrypoints UStoreTemplate
code :: UStoreEntrypoints UStoreTemplate
  } deriving stock (UStoreTemplate -> UStoreTemplate -> Bool
(UStoreTemplate -> UStoreTemplate -> Bool)
-> (UStoreTemplate -> UStoreTemplate -> Bool) -> Eq UStoreTemplate
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UStoreTemplate -> UStoreTemplate -> Bool
$c/= :: UStoreTemplate -> UStoreTemplate -> Bool
== :: UStoreTemplate -> UStoreTemplate -> Bool
$c== :: UStoreTemplate -> UStoreTemplate -> Bool
Eq, (forall x. UStoreTemplate -> Rep UStoreTemplate x)
-> (forall x. Rep UStoreTemplate x -> UStoreTemplate)
-> Generic UStoreTemplate
forall x. Rep UStoreTemplate x -> UStoreTemplate
forall x. UStoreTemplate -> Rep UStoreTemplate x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep UStoreTemplate x -> UStoreTemplate
$cfrom :: forall x. UStoreTemplate -> Rep UStoreTemplate x
Generic)

type UStorage = UStore UStoreTemplate

type Interface = UStoreEpInterface UStoreTemplate

instance KnownContractVersion (CounterSduV 2) where
  type VerInterface (CounterSduV 2) = Interface
  type VerUStoreTemplate (CounterSduV 2) = UStoreTemplate
  type VerPermanent (CounterSduV 2) = Permanent

addInt :: Integer -> Entrypoint () UStorage
addInt :: Integer -> Entrypoint () UStorage
addInt Integer
x = do
  forall (s :: [*]). (() : s) :-> s
forall a (s :: [*]). (a : s) :-> s
drop @()
  Label "counterValue"
-> '[UStorage]
   :-> '[GetUStoreField UStoreTemplate "counterValue", UStorage]
forall store (name :: Symbol) (s :: [*]).
FieldAccessC store name =>
Label name
-> (UStore store : s)
   :-> (GetUStoreField store name : UStore store : s)
ustoreGetField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue
  Label "i"
-> '[("i" :! Integer, ()), UStorage]
   :-> '[GetFieldType ("i" :! Integer, ()) "i", ("i" :! Integer, ()),
         UStorage]
forall dt (name :: Symbol) (st :: [*]).
InstrGetFieldC dt name =>
Label name -> (dt : st) :-> (GetFieldType dt name : dt : st)
getField Label "i"
forall a. IsLabel "i" a => a
forall (x :: Symbol) a. IsLabel x a => a
#i
  Integer
-> '[Integer, ("i" :! Integer, ()), UStorage]
   :-> '[Integer, Integer, ("i" :! Integer, ()), UStorage]
forall t (s :: [*]). NiceConstant t => t -> s :-> (t : s)
push Integer
x
  '[Integer, Integer, ("i" :! Integer, ()), UStorage]
:-> '[Integer, ("i" :! Integer, ()), UStorage]
forall n m (s :: [*]).
ArithOpHs Add n m =>
(n : m : s) :-> (ArithResHs Add n m : s)
add
  Label "i"
-> '[GetFieldType ("i" :! Integer, ()) "i", ("i" :! Integer, ()),
     UStorage]
   :-> '[("i" :! Integer, ()), UStorage]
forall dt (name :: Symbol) (st :: [*]).
InstrSetFieldC dt name =>
Label name -> (GetFieldType dt name : dt : st) :-> (dt : st)
setField Label "i"
forall a. IsLabel "i" a => a
forall (x :: Symbol) a. IsLabel x a => a
#i
  Label "counterValue"
-> '[GetUStoreField UStoreTemplate "counterValue", UStorage]
   :-> '[UStorage]
forall store (name :: Symbol) (s :: [*]).
FieldAccessC store name =>
Label name
-> (GetUStoreField store name : UStore store : s)
   :-> (UStore store : s)
ustoreSetField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue
  '[UStorage] :-> '[List Operation, UStorage]
forall p (s :: [*]). KnownValue p => s :-> (List p : s)
nil; '[List Operation, UStorage] :-> '[(List Operation, UStorage)]
forall a b (s :: [*]). (a : b : s) :-> ((a, b) : s)
pair

runInc :: Entrypoint () UStorage
runInc :: Entrypoint () UStorage
runInc = Integer -> Entrypoint () UStorage
addInt Integer
1

runDec :: Entrypoint () UStorage
runDec :: Entrypoint () UStorage
runDec = Integer -> Entrypoint () UStorage
addInt (Integer
-1)

runGetCounterValue :: Entrypoint (Void_ () Integer) UStorage
runGetCounterValue :: Entrypoint (Void_ () Integer) UStorage
runGetCounterValue = ('[(), UStorage] :-> '[Integer])
-> Entrypoint (Void_ () Integer) UStorage
forall a b (s :: [*]) (s' :: [*]) (anything :: [*]).
(IsError (VoidResult b), NiceConstant b) =>
((a : s) :-> (b : s')) -> (Void_ a b : s) :-> anything
void_ (('[(), UStorage] :-> '[Integer])
 -> Entrypoint (Void_ () Integer) UStorage)
-> ('[(), UStorage] :-> '[Integer])
-> Entrypoint (Void_ () Integer) UStorage
forall a b. (a -> b) -> a -> b
$ do
  forall (s :: [*]). (() : s) :-> s
forall a (s :: [*]). (a : s) :-> s
drop @()
  Label "counterValue"
-> '[UStorage]
   :-> '[GetUStoreField UStoreTemplate "counterValue", UStorage]
forall store (name :: Symbol) (s :: [*]).
FieldAccessC store name =>
Label name
-> (UStore store : s)
   :-> (GetUStoreField store name : UStore store : s)
ustoreGetField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue
  Label "i"
-> '[("i" :! Integer, ()), UStorage]
   :-> '[GetFieldType ("i" :! Integer, ()) "i", UStorage]
forall dt (name :: Symbol) (st :: [*]).
InstrGetFieldC dt name =>
Label name -> (dt : st) :-> (GetFieldType dt name : st)
toField Label "i"
forall a. IsLabel "i" a => a
forall (x :: Symbol) a. IsLabel x a => a
#i
  ('[UStorage] :-> '[]) -> '[Integer, UStorage] :-> '[Integer]
forall a (s :: [*]) (s' :: [*]).
HasCallStack =>
(s :-> s') -> (a : s) :-> (a : s')
dip '[UStorage] :-> '[]
forall a (s :: [*]). (a : s) :-> s
drop

counterContract :: UContractRouter (CounterSduV 2)
counterContract :: UContractRouter (CounterSduV 2)
counterContract = SduFallback (VerUStoreTemplate (CounterSduV 2))
-> UContractRouter (CounterSduV 2)
forall (ver :: VersionKind).
Typeable (VerUStoreTemplate ver) =>
SduFallback (VerUStoreTemplate ver) -> UContractRouter ver
mkSduContract SduFallback (VerUStoreTemplate (CounterSduV 2))
forall store. SduFallback store
sduFallbackFail

permImpl :: PermanentImpl (CounterSduV 2)
permImpl :: PermanentImpl (CounterSduV 2)
permImpl = IsoRecTuple
  (Rec
     (CaseClauseL '[UStorage] '[(List Operation, UStorage)])
     '[ 'CaseClauseParam "GetCounter" ('OneField (Void_ () Integer)),
        'CaseClauseParam "GetNothing" ('OneField Empty)])
-> PermanentImpl (CounterSduV 2)
forall (ver :: VersionKind) dt (out :: [*]) (inp :: [*]) clauses.
(CaseTC dt out inp clauses,
 DocumentEntrypoints PermanentEntrypointsKind dt,
 dt ~ VerPermanent ver, inp ~ '[VerUStore ver],
 out ~ ContractOut (VerUStore ver)) =>
IsoRecTuple clauses -> PermanentImpl ver
mkSmallPermanentImpl
  ( Label "cGetCounter"
forall a. IsLabel "cGetCounter" a => a
forall (x :: Symbol) a. IsLabel x a => a
#cGetCounter Label "cGetCounter"
-> Entrypoint (Void_ () Integer) UStorage
-> CaseClauseL
     '[UStorage]
     '[(List Operation, UStorage)]
     ('CaseClauseParam "GetCounter" ('OneField (Void_ () Integer)))
forall (name :: Symbol) body clause.
CaseArrow name body clause =>
Label name -> body -> clause
/-> ('[(), UStorage] :-> '[Integer])
-> Entrypoint (Void_ () Integer) UStorage
forall a b (s :: [*]) (s' :: [*]) (anything :: [*]).
(IsError (VoidResult b), NiceConstant b) =>
((a : s) :-> (b : s')) -> (Void_ a b : s) :-> anything
void_ (('[(), UStorage] :-> '[Integer])
 -> Entrypoint (Void_ () Integer) UStorage)
-> ('[(), UStorage] :-> '[Integer])
-> Entrypoint (Void_ () Integer) UStorage
forall a b. (a -> b) -> a -> b
$ do
      forall (s :: [*]). (() : s) :-> s
forall a (s :: [*]). (a : s) :-> s
drop @(); Label "counterValue"
-> '[UStorage] :-> '[GetUStoreField UStoreTemplate "counterValue"]
forall store (name :: Symbol) (s :: [*]).
FieldAccessC store name =>
Label name
-> (UStore store : s) :-> (GetUStoreField store name : s)
ustoreToField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue; Label "i"
-> '[("i" :! Integer, ())]
   :-> '[GetFieldType ("i" :! Integer, ()) "i"]
forall dt (name :: Symbol) (st :: [*]).
InstrGetFieldC dt name =>
Label name -> (dt : st) :-> (GetFieldType dt name : st)
toField Label "i"
forall a. IsLabel "i" a => a
forall (x :: Symbol) a. IsLabel x a => a
#i
  , Label "cGetNothing"
forall a. IsLabel "cGetNothing" a => a
forall (x :: Symbol) a. IsLabel x a => a
#cGetNothing Label "cGetNothing"
-> ('[Empty, UStorage] :-> '[(List Operation, UStorage)])
-> CaseClauseL
     '[UStorage]
     '[(List Operation, UStorage)]
     ('CaseClauseParam "GetNothing" ('OneField Empty))
forall (name :: Symbol) body clause.
CaseArrow name body clause =>
Label name -> body -> clause
/-> '[Empty, UStorage] :-> '[(List Operation, UStorage)]
forall (s :: [*]) (s' :: [*]). (Empty : s) :-> s'
absurd_
  )

mkStorage :: UStoreTemplate
mkStorage :: UStoreTemplate
mkStorage = UStoreTemplate :: UStoreField ("i" :! Integer, ())
-> UStoreEntrypoints UStoreTemplate -> UStoreTemplate
UStoreTemplate
  { counterValue :: UStoreField ("i" :! Integer, ())
counterValue = ("i" :! Integer, ()) -> UStoreField ("i" :! Integer, ())
forall (m :: UStoreMarkerType) v. v -> UStoreFieldExt m v
UStoreField (Name "i"
forall a. IsLabel "i" a => a
forall (x :: Symbol) a. IsLabel x a => a
#i Name "i" -> Integer -> "i" :! Integer
forall (name :: Symbol) a. Name name -> a -> NamedF Identity a name
.! Integer
0, ())
  , code :: UStoreEntrypoints UStoreTemplate
code = UStoreEntrypoints :: forall store.
UStoreEntrypoint store ()
-> UStoreEntrypoint store ()
-> UStoreEntrypoint store (Void_ () Integer)
-> UStoreEntrypoints store
UStoreEntrypoints
    { epInc :: UStoreEntrypoint UStoreTemplate ()
epInc = Entrypoint () UStorage -> UStoreEntrypoint UStoreTemplate ()
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> UStoreEntrypoint store arg
mkUStoreEntrypoint Entrypoint () UStorage
runInc
    , epDec :: UStoreEntrypoint UStoreTemplate ()
epDec = Entrypoint () UStorage -> UStoreEntrypoint UStoreTemplate ()
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> UStoreEntrypoint store arg
mkUStoreEntrypoint Entrypoint () UStorage
runDec
    , epGetCounterValue :: UStoreEntrypoint UStoreTemplate (Void_ () Integer)
epGetCounterValue = Entrypoint (Void_ () Integer) UStorage
-> UStoreEntrypoint UStoreTemplate (Void_ () Integer)
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> UStoreEntrypoint store arg
mkUStoreEntrypoint Entrypoint (Void_ () Integer) UStorage
runGetCounterValue
    }
  }

migration :: UStoreMigration (VerUStoreTemplate (CounterSduV 1)) UStoreTemplate
migration :: UStoreMigration (VerUStoreTemplate (CounterSduV 1)) UStoreTemplate
migration = Lambda
  (MUStore
     UStoreTemplate
     UStoreTemplate
     (BuildDiff UStoreTemplate UStoreTemplate)
     '[])
  (MUStore
     UStoreTemplate
     UStoreTemplate
     '[]
     '["epGetCounterValue", "epDec", "epInc", "epAdd", "counterValue",
       "counterValue"])
-> UStoreMigration UStoreTemplate UStoreTemplate
forall oldTempl newTempl (_1 :: [Symbol]).
Lambda
  (MUStore oldTempl newTempl (BuildDiff oldTempl newTempl) '[])
  (MUStore oldTempl newTempl '[] _1)
-> UStoreMigration oldTempl newTempl
mkUStoreMigration (Lambda
   (MUStore
      UStoreTemplate
      UStoreTemplate
      (BuildDiff UStoreTemplate UStoreTemplate)
      '[])
   (MUStore
      UStoreTemplate
      UStoreTemplate
      '[]
      '["epGetCounterValue", "epDec", "epInc", "epAdd", "counterValue",
        "counterValue"])
 -> UStoreMigration UStoreTemplate UStoreTemplate)
-> Lambda
     (MUStore
        UStoreTemplate
        UStoreTemplate
        (BuildDiff UStoreTemplate UStoreTemplate)
        '[])
     (MUStore
        UStoreTemplate
        UStoreTemplate
        '[]
        '["epGetCounterValue", "epDec", "epInc", "epAdd", "counterValue",
          "counterValue"])
-> UStoreMigration UStoreTemplate UStoreTemplate
forall a b. (a -> b) -> a -> b
$ do
  Label "counterValue"
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
          '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
          '( 'ToDel,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToDel,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '[]]
   :-> '[Natural,
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
              '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToDel,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcRemove field diff,
 HasUField field fieldTy oldTempl,
 RequireUntouched field (IsElem field touched)) =>
Label field
-> (MUStore oldTempl newTempl diff touched : s)
   :-> (fieldTy
          : MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateExtractField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue
  '[Natural,
  MUStore
    UStoreTemplate
    UStoreTemplate
    '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
       '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd,
          '("epGetCounterValue",
            UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
       '( 'ToDel,
          '("epInc",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
       '( 'ToDel,
          '("epAdd",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
       '( 'ToDel,
          '("epGetCounterValue",
            UStoreFieldExt
              UMarkerEntrypoint
              (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
    '["counterValue"]]
:-> '[Integer,
      MUStore
        UStoreTemplate
        UStoreTemplate
        '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
           '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd,
              '("epGetCounterValue",
                UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
           '( 'ToDel,
              '("epInc",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
           '( 'ToDel,
              '("epAdd",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
           '( 'ToDel,
              '("epGetCounterValue",
                UStoreFieldExt
                  UMarkerEntrypoint
                  (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
        '["counterValue"]]
forall i (s :: [*]).
ToIntegerArithOpHs i =>
(i : s) :-> (Integer : s)
int; Label "i"
-> '[Integer,
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
          '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToDel,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["counterValue"]]
   :-> '["i" :! Integer,
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
              '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToDel,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["counterValue"]]
forall (name :: Symbol) a (s :: [*]).
Label name -> (a : s) :-> (NamedF Identity a name : s)
toNamed Label "i"
forall a. IsLabel "i" a => a
forall (x :: Symbol) a. IsLabel x a => a
#i
  '["i" :! Integer,
  MUStore
    UStoreTemplate
    UStoreTemplate
    '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
       '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd,
          '("epGetCounterValue",
            UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
       '( 'ToDel,
          '("epInc",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
       '( 'ToDel,
          '("epAdd",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
       '( 'ToDel,
          '("epGetCounterValue",
            UStoreFieldExt
              UMarkerEntrypoint
              (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
    '["counterValue"]]
:-> '[(), "i" :! Integer,
      MUStore
        UStoreTemplate
        UStoreTemplate
        '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
           '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd,
              '("epGetCounterValue",
                UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
           '( 'ToDel,
              '("epInc",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
           '( 'ToDel,
              '("epAdd",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
           '( 'ToDel,
              '("epGetCounterValue",
                UStoreFieldExt
                  UMarkerEntrypoint
                  (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
        '["counterValue"]]
forall (s :: [*]). s :-> (() : s)
unit; '[(), "i" :! Integer,
  MUStore
    UStoreTemplate
    UStoreTemplate
    '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
       '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd,
          '("epGetCounterValue",
            UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
       '( 'ToDel,
          '("epInc",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
       '( 'ToDel,
          '("epAdd",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
       '( 'ToDel,
          '("epGetCounterValue",
            UStoreFieldExt
              UMarkerEntrypoint
              (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
    '["counterValue"]]
:-> '["i" :! Integer, (),
      MUStore
        UStoreTemplate
        UStoreTemplate
        '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
           '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd,
              '("epGetCounterValue",
                UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
           '( 'ToDel,
              '("epInc",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
           '( 'ToDel,
              '("epAdd",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
           '( 'ToDel,
              '("epGetCounterValue",
                UStoreFieldExt
                  UMarkerEntrypoint
                  (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
        '["counterValue"]]
forall a b (s :: [*]). (a : b : s) :-> (b : a : s)
swap; '["i" :! Integer, (),
  MUStore
    UStoreTemplate
    UStoreTemplate
    '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
       '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToAdd,
          '("epGetCounterValue",
            UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
       '( 'ToDel,
          '("epInc",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
       '( 'ToDel,
          '("epAdd",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
       '( 'ToDel,
          '("epGetCounterValue",
            UStoreFieldExt
              UMarkerEntrypoint
              (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
    '["counterValue"]]
:-> '[("i" :! Integer, ()),
      MUStore
        UStoreTemplate
        UStoreTemplate
        '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
           '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToAdd,
              '("epGetCounterValue",
                UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
           '( 'ToDel,
              '("epInc",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
           '( 'ToDel,
              '("epAdd",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
           '( 'ToDel,
              '("epGetCounterValue",
                UStoreFieldExt
                  UMarkerEntrypoint
                  (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
        '["counterValue"]]
forall a b (s :: [*]). (a : b : s) :-> ((a, b) : s)
pair
  Label "counterValue"
-> '[("i" :! Integer, ()),
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("counterValue", UStoreField ("i" :! Integer, ()))),
          '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToDel,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToDel,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcAdd field diff,
 HasUField field fieldTy newTempl) =>
Label field
-> (fieldTy : MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateAddField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue

  Label "epAdd"
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToDel,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["epAdd", "counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcRemove field diff,
 HasUField field fieldTy oldTempl) =>
Label field
-> (MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateRemoveField Label "epAdd"
forall a. IsLabel "epAdd" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epAdd

  SduEntrypoint UStoreTemplate ()
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["epAdd", "counterValue", "counterValue"]]
   :-> '[SduEntrypoint UStoreTemplate (),
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["epAdd", "counterValue", "counterValue"]]
forall t (s :: [*]). NiceConstant t => t -> s :-> (t : s)
push (Entrypoint () UStorage -> SduEntrypoint UStoreTemplate ()
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> SduEntrypoint store arg
mkSduEntrypoint Entrypoint () UStorage
runInc)
  Label "epInc"
-> '[SduEntrypoint UStoreTemplate (),
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["epAdd", "counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["epInc", "epAdd", "counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy oldFieldTy
       (marker :: UStoreMarkerType) (oldMarker :: UStoreMarkerType)
       (newDiff :: [DiffItem]) (newDiff0 :: [DiffItem]) (s :: [*]).
('(UStoreFieldExt oldMarker oldFieldTy, newDiff0)
 ~ CoverDiff 'DcRemove field diff,
 '(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcAdd field newDiff0,
 HasUField field fieldTy newTempl) =>
Label field
-> (fieldTy : MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateOverwriteField Label "epInc"
forall a. IsLabel "epInc" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epInc

  SduEntrypoint UStoreTemplate ()
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["epInc", "epAdd", "counterValue", "counterValue"]]
   :-> '[SduEntrypoint UStoreTemplate (),
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["epInc", "epAdd", "counterValue", "counterValue"]]
forall t (s :: [*]). NiceConstant t => t -> s :-> (t : s)
push (Entrypoint () UStorage -> SduEntrypoint UStoreTemplate ()
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> SduEntrypoint store arg
mkSduEntrypoint Entrypoint () UStorage
runDec)
  Label "epDec"
-> '[SduEntrypoint UStoreTemplate (),
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["epInc", "epAdd", "counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["epDec", "epInc", "epAdd", "counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcAdd field diff,
 HasUField field fieldTy newTempl) =>
Label field
-> (fieldTy : MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateAddField Label "epDec"
forall a. IsLabel "epDec" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epDec

  SduEntrypoint UStoreTemplate (Void_ () Integer)
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["epDec", "epInc", "epAdd", "counterValue", "counterValue"]]
   :-> '[SduEntrypoint UStoreTemplate (Void_ () Integer),
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
           '["epDec", "epInc", "epAdd", "counterValue", "counterValue"]]
forall t (s :: [*]). NiceConstant t => t -> s :-> (t : s)
push (Entrypoint (Void_ () Integer) UStorage
-> SduEntrypoint UStoreTemplate (Void_ () Integer)
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> SduEntrypoint store arg
mkSduEntrypoint Entrypoint (Void_ () Integer) UStorage
runGetCounterValue)
  Label "epGetCounterValue"
-> '[SduEntrypoint UStoreTemplate (Void_ () Integer),
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural))))]
       '["epDec", "epInc", "epAdd", "counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[]
           '["epGetCounterValue", "epDec", "epInc", "epAdd", "counterValue",
             "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy oldFieldTy
       (marker :: UStoreMarkerType) (oldMarker :: UStoreMarkerType)
       (newDiff :: [DiffItem]) (newDiff0 :: [DiffItem]) (s :: [*]).
('(UStoreFieldExt oldMarker oldFieldTy, newDiff0)
 ~ CoverDiff 'DcRemove field diff,
 '(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcAdd field newDiff0,
 HasUField field fieldTy newTempl) =>
Label field
-> (fieldTy : MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateOverwriteField Label "epGetCounterValue"
forall a. IsLabel "epGetCounterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epGetCounterValue

  '[MUStore
    UStoreTemplate
    UStoreTemplate
    '[]
    '["epGetCounterValue", "epDec", "epInc", "epAdd", "counterValue",
      "counterValue"]]
:-> '[MUStore
        UStoreTemplate
        UStoreTemplate
        '[]
        '["epGetCounterValue", "epDec", "epInc", "epAdd", "counterValue",
          "counterValue"]]
forall a. MigrationFinishCheckPosition a => a
migrationFinish

counterUpgradeParameters :: EpwUpgradeParameters Identity (CounterSduV 1) (CounterSduV 2)
counterUpgradeParameters :: EpwUpgradeParameters Identity (CounterSduV 1) (CounterSduV 2)
counterUpgradeParameters = EpwUpgradeParameters :: forall (t :: * -> *) (curVer :: VersionKind)
       (newVer :: VersionKind) code codePerm.
(Traversable t, KnownContractVersion curVer,
 KnownContractVersion newVer,
 RequireSamePermanents (VerPermanent curVer) (VerPermanent newVer),
 RecognizeUpgPiece (UContractRouterUpdate curVer newVer) code,
 RecognizeUpgPiece (PermanentImplUpdate curVer newVer) codePerm) =>
t (MigrationScript
     (VerUStoreTemplate curVer) (VerUStoreTemplate newVer))
-> code -> codePerm -> EpwUpgradeParameters t curVer newVer
EpwUpgradeParameters
  { upMigrationScripts :: Identity
  (MigrationScript
     (VerUStoreTemplate (CounterSduV 1))
     (VerUStoreTemplate (CounterSduV 2)))
upMigrationScripts = UStoreMigration UStoreTemplate UStoreTemplate
-> Identity (MigrationScript UStoreTemplate UStoreTemplate)
forall os ns.
UStoreMigration os ns -> Identity (MigrationScript os ns)
migrationToScriptI UStoreMigration (VerUStoreTemplate (CounterSduV 1)) UStoreTemplate
UStoreMigration UStoreTemplate UStoreTemplate
migration
  , upNewCode :: UContractRouter (CounterSduV 2)
upNewCode = UContractRouter (CounterSduV 2)
counterContract
  , upNewPermCode :: PermanentImpl (CounterSduV 2)
upNewPermCode = PermanentImpl (CounterSduV 2)
permImpl
  }

counterUpgradeParametersFromV0 :: EpwUpgradeParameters Identity (CounterSduV 0) (CounterSduV 2)
counterUpgradeParametersFromV0 :: EpwUpgradeParameters Identity (CounterSduV 0) (CounterSduV 2)
counterUpgradeParametersFromV0 = EpwUpgradeParameters :: forall (t :: * -> *) (curVer :: VersionKind)
       (newVer :: VersionKind) code codePerm.
(Traversable t, KnownContractVersion curVer,
 KnownContractVersion newVer,
 RequireSamePermanents (VerPermanent curVer) (VerPermanent newVer),
 RecognizeUpgPiece (UContractRouterUpdate curVer newVer) code,
 RecognizeUpgPiece (PermanentImplUpdate curVer newVer) codePerm) =>
t (MigrationScript
     (VerUStoreTemplate curVer) (VerUStoreTemplate newVer))
-> code -> codePerm -> EpwUpgradeParameters t curVer newVer
EpwUpgradeParameters
  { upMigrationScripts :: Identity
  (MigrationScript
     (VerUStoreTemplate (CounterSduV 0))
     (VerUStoreTemplate (CounterSduV 2)))
upMigrationScripts = UStoreMigration () UStoreTemplate
-> Identity (MigrationScript () UStoreTemplate)
forall os ns.
UStoreMigration os ns -> Identity (MigrationScript os ns)
migrationToScriptI (UStoreMigration () UStoreTemplate
 -> Identity (MigrationScript () UStoreTemplate))
-> UStoreMigration () UStoreTemplate
-> Identity (MigrationScript () UStoreTemplate)
forall a b. (a -> b) -> a -> b
$ UStoreTemplate -> UStoreMigration () UStoreTemplate
forall template.
UStoreTraversable FillUStoreTW template =>
template -> UStoreMigration () template
fillUStore UStoreTemplate
mkStorage
  , upNewCode :: UContractRouter (CounterSduV 2)
upNewCode = UContractRouter (CounterSduV 2)
counterContract
  , upNewPermCode :: PermanentImpl (CounterSduV 2)
upNewPermCode = PermanentImpl (CounterSduV 2)
permImpl
  }

rollback :: UStoreMigration UStoreTemplate (VerUStoreTemplate (CounterSduV 1))
rollback :: UStoreMigration UStoreTemplate (VerUStoreTemplate (CounterSduV 1))
rollback = Lambda
  (MUStore
     UStoreTemplate
     UStoreTemplate
     (BuildDiff UStoreTemplate UStoreTemplate)
     '[])
  (MUStore
     UStoreTemplate
     UStoreTemplate
     '[]
     '["epGetCounterValue", "epDec", "epAdd", "counterValue",
       "counterValue"])
-> UStoreMigration UStoreTemplate UStoreTemplate
forall oldTempl newTempl (_1 :: [Symbol]).
Lambda
  (MUStore oldTempl newTempl (BuildDiff oldTempl newTempl) '[])
  (MUStore oldTempl newTempl '[] _1)
-> UStoreMigration oldTempl newTempl
mkUStoreMigration (Lambda
   (MUStore
      UStoreTemplate
      UStoreTemplate
      (BuildDiff UStoreTemplate UStoreTemplate)
      '[])
   (MUStore
      UStoreTemplate
      UStoreTemplate
      '[]
      '["epGetCounterValue", "epDec", "epAdd", "counterValue",
        "counterValue"])
 -> UStoreMigration UStoreTemplate UStoreTemplate)
-> Lambda
     (MUStore
        UStoreTemplate
        UStoreTemplate
        (BuildDiff UStoreTemplate UStoreTemplate)
        '[])
     (MUStore
        UStoreTemplate
        UStoreTemplate
        '[]
        '["epGetCounterValue", "epDec", "epAdd", "counterValue",
          "counterValue"])
-> UStoreMigration UStoreTemplate UStoreTemplate
forall a b. (a -> b) -> a -> b
$ do
  Label "counterValue"
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
          '( 'ToAdd,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToAdd,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("counterValue", UStoreField ("i" :! Integer, ()))),
          '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '[]]
   :-> '[("i" :! Integer, ()),
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
              '( 'ToAdd,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToAdd,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcRemove field diff,
 HasUField field fieldTy oldTempl,
 RequireUntouched field (IsElem field touched)) =>
Label field
-> (MUStore oldTempl newTempl diff touched : s)
   :-> (fieldTy
          : MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateExtractField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue
  Label "i"
-> '[("i" :! Integer, ()),
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
          '( 'ToAdd,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToAdd,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["counterValue"]]
   :-> '[GetFieldType ("i" :! Integer, ()) "i",
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
              '( 'ToAdd,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToAdd,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["counterValue"]]
forall dt (name :: Symbol) (st :: [*]).
InstrGetFieldC dt name =>
Label name -> (dt : st) :-> (GetFieldType dt name : st)
toField Label "i"
forall a. IsLabel "i" a => a
forall (x :: Symbol) a. IsLabel x a => a
#i; '[Integer,
  MUStore
    UStoreTemplate
    UStoreTemplate
    '[ '( 'ToAdd,
          '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
       '( 'ToAdd,
          '("epInc",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
       '( 'ToAdd,
          '("epAdd",
            UStoreFieldExt
              UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
       '( 'ToAdd,
          '("epGetCounterValue",
            UStoreFieldExt
              UMarkerEntrypoint
              (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
       '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
       '( 'ToDel,
          '("epGetCounterValue",
            UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
    '["counterValue"]]
:-> '[Maybe Natural,
      MUStore
        UStoreTemplate
        UStoreTemplate
        '[ '( 'ToAdd,
              '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
           '( 'ToAdd,
              '("epInc",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
           '( 'ToAdd,
              '("epAdd",
                UStoreFieldExt
                  UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
           '( 'ToAdd,
              '("epGetCounterValue",
                UStoreFieldExt
                  UMarkerEntrypoint
                  (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
           '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
           '( 'ToDel,
              '("epGetCounterValue",
                UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
        '["counterValue"]]
forall (s :: [*]). (Integer : s) :-> (Maybe Natural : s)
isNat
  MText
-> '[Maybe Natural,
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
          '( 'ToAdd,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToAdd,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["counterValue"]]
   :-> '[Natural,
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
              '( 'ToAdd,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToAdd,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["counterValue"]]
forall err a (s :: [*]).
IsError err =>
err -> (Maybe a : s) :-> (a : s)
assertSome [mt|Rollback is impossible|]
  Label "counterValue"
-> '[Natural,
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("counterValue", UStoreFieldExt UMarkerPlainField Natural)),
          '( 'ToAdd,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToAdd,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToAdd,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcAdd field diff,
 HasUField field fieldTy newTempl) =>
Label field
-> (fieldTy : MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateAddField Label "counterValue"
forall a. IsLabel "counterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#counterValue

  SduEntrypoint UStoreTemplate Natural
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToAdd,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["counterValue", "counterValue"]]
   :-> '[SduEntrypoint UStoreTemplate Natural,
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToAdd,
                 '("epAdd",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["counterValue", "counterValue"]]
forall t (s :: [*]). NiceConstant t => t -> s :-> (t : s)
push (Entrypoint Natural (UStore UStoreTemplate)
-> SduEntrypoint UStoreTemplate Natural
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> SduEntrypoint store arg
mkSduEntrypoint Entrypoint Natural (UStore UStoreTemplate)
V1.runAdd)
  Label "epAdd"
-> '[SduEntrypoint UStoreTemplate Natural,
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToAdd,
             '("epAdd",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate Natural))),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epInc",
                   UStoreFieldExt
                     UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
              '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["epAdd", "counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcAdd field diff,
 HasUField field fieldTy newTempl) =>
Label field
-> (fieldTy : MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateAddField Label "epAdd"
forall a. IsLabel "epAdd" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epAdd

  Label "epInc"
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epInc",
               UStoreFieldExt
                 UMarkerEntrypoint (SduEntrypoint UStoreTemplate ()))),
          '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("epInc", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["epAdd", "counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["epAdd", "counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) (newDiff :: [DiffItem])
       (newDiff0 :: [DiffItem]) _1 _2 (s :: [*]).
('(_1, newDiff0) ~ CoverDiff 'DcRemove field diff,
 '(_2, newDiff) ~ CoverDiff 'DcAdd field newDiff0) =>
Label field
-> (MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff touched : s)
migrateCoerceUnsafe Label "epInc"
forall a. IsLabel "epInc" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epInc

  Label "epDec"
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel, '("epDec", UStoreEntrypoint UStoreTemplate ())),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["epAdd", "counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["epDec", "epAdd", "counterValue", "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy (newDiff :: [DiffItem])
       (marker :: UStoreMarkerType) (s :: [*]).
('(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcRemove field diff,
 HasUField field fieldTy oldTempl) =>
Label field
-> (MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateRemoveField Label "epDec"
forall a. IsLabel "epDec" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epDec

  SduEntrypoint UStoreTemplate (Void_ () Natural)
-> '[MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["epDec", "epAdd", "counterValue", "counterValue"]]
   :-> '[SduEntrypoint UStoreTemplate (Void_ () Natural),
         MUStore
           UStoreTemplate
           UStoreTemplate
           '[ '( 'ToAdd,
                 '("epGetCounterValue",
                   UStoreFieldExt
                     UMarkerEntrypoint
                     (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
              '( 'ToDel,
                 '("epGetCounterValue",
                   UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
           '["epDec", "epAdd", "counterValue", "counterValue"]]
forall t (s :: [*]). NiceConstant t => t -> s :-> (t : s)
push (Entrypoint (Void_ () Natural) (UStore UStoreTemplate)
-> SduEntrypoint UStoreTemplate (Void_ () Natural)
forall arg store.
NiceUnpackedValue arg =>
Entrypoint arg (UStore store) -> SduEntrypoint store arg
mkSduEntrypoint Entrypoint (Void_ () Natural) (UStore UStoreTemplate)
V1.runGetCounterValue)
  Label "epGetCounterValue"
-> '[SduEntrypoint UStoreTemplate (Void_ () Natural),
     MUStore
       UStoreTemplate
       UStoreTemplate
       '[ '( 'ToAdd,
             '("epGetCounterValue",
               UStoreFieldExt
                 UMarkerEntrypoint
                 (SduEntrypoint UStoreTemplate (Void_ () Natural)))),
          '( 'ToDel,
             '("epGetCounterValue",
               UStoreEntrypoint UStoreTemplate (Void_ () Integer)))]
       '["epDec", "epAdd", "counterValue", "counterValue"]]
   :-> '[MUStore
           UStoreTemplate
           UStoreTemplate
           '[]
           '["epGetCounterValue", "epDec", "epAdd", "counterValue",
             "counterValue"]]
forall (field :: Symbol) oldTempl newTempl (diff :: [DiffItem])
       (touched :: [Symbol]) fieldTy oldFieldTy
       (marker :: UStoreMarkerType) (oldMarker :: UStoreMarkerType)
       (newDiff :: [DiffItem]) (newDiff0 :: [DiffItem]) (s :: [*]).
('(UStoreFieldExt oldMarker oldFieldTy, newDiff0)
 ~ CoverDiff 'DcRemove field diff,
 '(UStoreFieldExt marker fieldTy, newDiff)
 ~ CoverDiff 'DcAdd field newDiff0,
 HasUField field fieldTy newTempl) =>
Label field
-> (fieldTy : MUStore oldTempl newTempl diff touched : s)
   :-> (MUStore oldTempl newTempl newDiff (field : touched) : s)
migrateOverwriteField Label "epGetCounterValue"
forall a. IsLabel "epGetCounterValue" a => a
forall (x :: Symbol) a. IsLabel x a => a
#epGetCounterValue

  '[MUStore
    UStoreTemplate
    UStoreTemplate
    '[]
    '["epGetCounterValue", "epDec", "epAdd", "counterValue",
      "counterValue"]]
:-> '[MUStore
        UStoreTemplate
        UStoreTemplate
        '[]
        '["epGetCounterValue", "epDec", "epAdd", "counterValue",
          "counterValue"]]
forall a. MigrationFinishCheckPosition a => a
migrationFinish

-- Needed for one of our tests
counterRollbackParameters :: EpwUpgradeParameters Identity (CounterSduV 2) (CounterSduV 1)
counterRollbackParameters :: EpwUpgradeParameters Identity (CounterSduV 2) (CounterSduV 1)
counterRollbackParameters = EpwUpgradeParameters :: forall (t :: * -> *) (curVer :: VersionKind)
       (newVer :: VersionKind) code codePerm.
(Traversable t, KnownContractVersion curVer,
 KnownContractVersion newVer,
 RequireSamePermanents (VerPermanent curVer) (VerPermanent newVer),
 RecognizeUpgPiece (UContractRouterUpdate curVer newVer) code,
 RecognizeUpgPiece (PermanentImplUpdate curVer newVer) codePerm) =>
t (MigrationScript
     (VerUStoreTemplate curVer) (VerUStoreTemplate newVer))
-> code -> codePerm -> EpwUpgradeParameters t curVer newVer
EpwUpgradeParameters
  { upMigrationScripts :: Identity
  (MigrationScript
     (VerUStoreTemplate (CounterSduV 2))
     (VerUStoreTemplate (CounterSduV 1)))
upMigrationScripts = UStoreMigration UStoreTemplate UStoreTemplate
-> Identity (MigrationScript UStoreTemplate UStoreTemplate)
forall os ns.
UStoreMigration os ns -> Identity (MigrationScript os ns)
migrationToScriptI UStoreMigration UStoreTemplate (VerUStoreTemplate (CounterSduV 1))
UStoreMigration UStoreTemplate UStoreTemplate
rollback
  , upNewCode :: UContractRouter (CounterSduV 1)
upNewCode = UContractRouter (CounterSduV 1)
V1.counterContract
  , upNewPermCode :: PermanentImpl (CounterSduV 1)
upNewPermCode = PermanentImpl (CounterSduV 1)
V1.permImpl
  }