Plutus.V1.Ledger.Time

  • 1. 📜 Overview

  • 2. 🔧 LANGUAGE PRAGMAS AND IMPORTS

  • 3. 🗄️ Data Types

    • 3.1 ⏱️ DiffMilliSeconds

    • 3.2 ⏲️ POSIXTime

    • 3.3 📅 POSIXTimeRange

  • 4. ⚙️ Functions

    • 4.1 ↔️ fromMilliSeconds

  • 5. 🤝 Typeclass Instances

  • 6. 🏭 On-Chain Derivations

  • 7. 📚 Glossary


1 📜 Overview

The Plutus.V1.Ledger.Time module defines types and functions for working with time in Plutus on-chain code:

  • DiffMilliSeconds: duration measured in milliseconds.

  • POSIXTime: absolute time since the Unix epoch, in milliseconds.

  • POSIXTimeRange: alias for Interval POSIXTime, representing valid time windows.

  • Utility to convert between DiffMilliSeconds and POSIXTime.

All types derive numeric, ordering, and on-chain serialization classes for use in scripts.


2 🔧 LANGUAGE PRAGMAS AND IMPORTS

{-# LANGUAGE DeriveAnyClass       #-}
{-# LANGUAGE DeriveGeneric        #-}
{-# LANGUAGE DerivingStrategies   #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE MonoLocalBinds       #-}
{-# LANGUAGE NoImplicitPrelude    #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-identities #-}
{-# OPTIONS_GHC -fno-ignore-interface-pragmas #-}
{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}

module Plutus.V1.Ledger.Time (
    DiffMilliSeconds(..),
    POSIXTime(..),
    POSIXTimeRange,
    fromMilliSeconds
  ) where

import Control.DeepSeq (NFData)
import GHC.Generics    (Generic)
import Plutus.V1.Ledger.Interval (Interval)
import PlutusTx qualified
import PlutusTx.Lift (makeLift)
import PlutusTx.Prelude
import Prelude qualified as Haskell
import Prettyprinter (Pretty(pretty), (<+>))
  • Deriving: generic, anyclass, numeric, and on-chain ToData/FromData.

  • Imports: Interval for time ranges, PlutusTx.Prelude for on-chain code.


3 🗄️ Data Types

3.1 ⏱️ DiffMilliSeconds

newtype DiffMilliSeconds = DiffMilliSeconds Integer
  deriving stock   (Haskell.Eq, Haskell.Ord, Haskell.Show, Generic)
  deriving anyclass (NFData)
  deriving newtype (
    Haskell.Num,
    AdditiveSemigroup,
    AdditiveMonoid,
    AdditiveGroup,
    Haskell.Enum,
    Eq,
    Ord,
    Haskell.Real,
    Haskell.Integral,
    PlutusTx.ToData,
    PlutusTx.FromData,
    PlutusTx.UnsafeFromData
  )
  • Represents a duration in milliseconds.

  • Derives all standard numeric and on-chain data classes via newtype.

3.2 ⏲️ POSIXTime

newtype POSIXTime = POSIXTime { getPOSIXTime :: Integer }
  deriving stock   (Haskell.Eq, Haskell.Ord, Haskell.Show, Generic)
  deriving anyclass (NFData)
  deriving newtype (
    AdditiveSemigroup,
    AdditiveMonoid,
    AdditiveGroup,
    Eq,
    Ord,
    Enum,
    PlutusTx.ToData,
    PlutusTx.FromData,
    PlutusTx.UnsafeFromData,
    Haskell.Num,
    Haskell.Enum,
    Haskell.Real,
    Haskell.Integral
  )
  • Represents milliseconds since 1970-01-01T00:00:00Z.

  • Convenient numeric operations and on-chain serialization.

instance Pretty POSIXTime where
  pretty (POSIXTime i) = "POSIXTime" <+> pretty i
  • Pretty instance for human-readable output.

3.3 📅 POSIXTimeRange

type POSIXTimeRange = Interval POSIXTime
  • Alias for time intervals, e.g., validity windows on transactions.


4 ⚙️ Functions

4.1 ↔️ fromMilliSeconds

{-# INLINABLE fromMilliSeconds #-}
fromMilliSeconds :: DiffMilliSeconds -> POSIXTime
fromMilliSeconds (DiffMilliSeconds s) = POSIXTime s
  • Converts a DiffMilliSeconds duration into a POSIXTime offset.

  • Use case: add or subtract durations to/from POSIXTime values in contracts.


5 🤝 Typeclass Instances

  • Eq, Ord, Show, Generic, NFData for both DiffMilliSeconds and POSIXTime.

  • Numeric (Num, Integral, etc.) and Additive for arithmetic.

  • On-chain serialization via PlutusTx.ToData, FromData, and UnsafeFromData.


6 🏭 On-Chain Derivations

makeLift ''DiffMilliSeconds
makeLift ''POSIXTime
  • makeLift Template Haskell to embed these types in PlutusTx code.


7 📚 Glossary

  • DiffMilliSeconds: a wrapper around Integer representing milliseconds.

  • POSIXTime: milliseconds since UNIX epoch.

  • POSIXTimeRange: interval of POSIXTime, used for validity ranges.

  • Interval: generic open/closed interval type from Plutus.V1.Ledger.Interval.

  • MonoLocalBinds and UndecidableInstances: GHC pragmas enabling certain instance definitions.

  • makeLift: TH function to create on-chain Lift instances.

  • AdditiveSemigroup / Monoid / Group: algebraic classes for addition.

  • INLINABLE: pragma exposing function for on-chain optimization.

Last updated