packages feed

blockfrost-api-0.15.0.0: test/Cardano/Epochs.hs

{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}

module Cardano.Epochs
  where

import Data.Aeson (decode, eitherDecode, encode)
import qualified Data.Map
import Data.Text (Text)
import qualified Money
import Test.Hspec
import Test.Tasty.Hspec
import Text.RawString.QQ

import Blockfrost.Types

spec_epochs :: Spec
spec_epochs = do
  it "parses epoch info sample" $ do
    eitherDecode epochInfoSample
    `shouldBe`
    Right epochInfoExpected

  it "parses protocol params sample" $ do
    eitherDecode protocolParamsSample
    `shouldBe`
    Right protocolParamsExpected

  it "parses stake distribution sample" $ do
    eitherDecode stakeDistributionSample
    `shouldBe`
    Right stakeDistributionExpected

  it "parses pool stake distribution sample" $ do
    eitherDecode poolStakeDistributionSample
    `shouldBe`
    Right poolStakeDistributionExpected

epochInfoSample = [r|
{
    "epoch": 225,
    "start_time": 1603403091,
    "end_time": 1603835086,
    "first_block_time": 1603403092,
    "last_block_time": 1603835084,
    "block_count": 21298,
    "tx_count": 17856,
    "output": "7849943934049314",
    "fees": "4203312194",
    "active_stake": "784953934049314"
}
|]

epochInfoExpected =
  EpochInfo
    { _epochInfoEpoch = 225
    , _epochInfoStartTime = 1603403091
    , _epochInfoEndTime = 1603835086
    , _epochInfoFirstBlockTime = 1603403092
    , _epochInfoLastBlockTime = 1603835084
    , _epochInfoBlockCount = 21298
    , _epochInfoTxCount = 17856
    , _epochInfoOutput = 7849943934049314
    , _epochInfoFees = 4203312194
    , _epochInfoActiveStake = pure 784953934049314
    }

protocolParamsSample = [r|
{
    "epoch": 225,
    "min_fee_a": 44,
    "min_fee_b": 155381,
    "max_block_size": 65536,
    "max_tx_size": 16384,
    "max_block_header_size": 1100,
    "key_deposit": "2000000",
    "pool_deposit": "500000000",
    "e_max": 18,
    "n_opt": 150,
    "a0": 0.3,
    "rho": 0.003,
    "tau": 0.2,
    "decentralisation_param": 0.5,
    "extra_entropy": null,
    "protocol_major_ver": 2,
    "protocol_minor_ver": 0,
    "min_utxo": "1000000",
    "min_pool_cost": "340000000",
    "nonce": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81",
    "cost_models": {
      "PlutusV1": {
        "addInteger-cpu-arguments-intercept": 197209,
        "addInteger-cpu-arguments-slope": 0
      },
      "PlutusV2":
      {
        "addInteger-cpu-arguments-intercept": 197209,
        "addInteger-cpu-arguments-slope": 0
      }
    },
    "cost_models_raw": {
      "PlutusV1": [
        197209,
        0
      ],
      "PlutusV2": [
        197209,
        0
      ],
      "PlutusV3": [
        197209,
        0
      ]
    },
    "price_mem": 0.0577,
    "price_step": 0.0000721,
    "max_tx_ex_mem": "10000000",
    "max_tx_ex_steps": "10000000000",
    "max_block_ex_mem": "50000000",
    "max_block_ex_steps": "40000000000",
    "max_val_size": "5000",
    "collateral_percent": 150,
    "max_collateral_inputs": 3,
    "coins_per_utxo_size": "34482",
    "coins_per_utxo_word": "34482",
    "pvt_motion_no_confidence": 0.51,
    "pvt_committee_normal": 0.51,
    "pvt_committee_no_confidence": 0.51,
    "pvt_hard_fork_initiation": 0.51,
    "dvt_motion_no_confidence": 0.67,
    "dvt_committee_normal": 0.67,
    "dvt_committee_no_confidence": 0.6,
    "dvt_update_to_constitution": 0.75,
    "dvt_hard_fork_initiation": 0.6,
    "dvt_p_p_network_group": 0.67,
    "dvt_p_p_economic_group": 0.67,
    "dvt_p_p_technical_group": 0.67,
    "dvt_p_p_gov_group": 0.75,
    "dvt_treasury_withdrawal": 0.67,
    "committee_min_size": "7",
    "committee_max_term_length": "146",
    "gov_action_lifetime": "6",
    "gov_action_deposit": "100000000000",
    "drep_deposit": "500000000",
    "drep_activity": "20",
    "pvtpp_security_group": 0.51,
    "min_fee_ref_script_cost_per_byte": 15
}
|]

protocolParamsExpected =
  ProtocolParams
    { _protocolParamsEpoch = 225
    , _protocolParamsMinFeeA = 44
    , _protocolParamsMinFeeB = 155381
    , _protocolParamsMaxBlockSize = 65536
    , _protocolParamsMaxTxSize = 16384
    , _protocolParamsMaxBlockHeaderSize = 1100
    , _protocolParamsKeyDeposit = 2000000
    , _protocolParamsPoolDeposit = 500000000
    , _protocolParamsEMax = 18
    , _protocolParamsNOpt = 150
    , _protocolParamsA0 = 0.3
    , _protocolParamsRho = 0.003
    , _protocolParamsTau = 0.2
    , _protocolParamsDecentralisationParam = 0.5
    , _protocolParamsExtraEntropy = Nothing
    , _protocolParamsProtocolMajorVer = 2
    , _protocolParamsProtocolMinorVer = 0
    , _protocolParamsMinUtxo = 1000000
    , _protocolParamsMinPoolCost = 340000000
    , _protocolParamsNonce = "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81"
    , _protocolParamsCostModels =
        CostModels
      $ Data.Map.fromList
      [ ( PlutusV1
        , Data.Map.fromList
          [ ("addInteger-cpu-arguments-intercept", 197209)
          , ("addInteger-cpu-arguments-slope", 0)
          ]
        )
      , (PlutusV2
        , Data.Map.fromList
          [ ("addInteger-cpu-arguments-intercept", 197209)
          , ("addInteger-cpu-arguments-slope", 0)
          ]
        )
      ]
    , _protocolParamsCostModelsRaw =
        CostModelsRaw
      $ Data.Map.fromList
      [ ( PlutusV1
        , [ 197209
          , 0
          ]
        )
      , (PlutusV2
        , [ 197209
          , 0
          ]
        )
      , (PlutusV3
        , [ 197209
          , 0
          ]
        )
      ]
    , _protocolParamsPriceMem = 0.0577
    , _protocolParamsPriceStep = 0.0000721
    , _protocolParamsMaxTxExMem = 10000000
    , _protocolParamsMaxTxExSteps = 10000000000
    , _protocolParamsMaxBlockExMem = 50000000
    , _protocolParamsMaxBlockExSteps = 40000000000
    , _protocolParamsMaxValSize = 5000
    , _protocolParamsCollateralPercent = 150
    , _protocolParamsMaxCollateralInputs = 3
    , _protocolParamsCoinsPerUtxoSize = 34482
    -- deprecated
    , _protocolParamsCoinsPerUtxoWord = 34482
    , _protocolParamsPvtMotionNoConfidence = Just 0.51
    , _protocolParamsPvtCommitteeNormal = Just 0.51
    , _protocolParamsPvtCommitteeNoConfidence = Just 0.51
    , _protocolParamsPvtHardForkInitiation = Just 0.51
    , _protocolParamsPvtppSecurityGroup = Just 0.51
    , _protocolParamsDvtMotionNoConfidence = Just 0.67
    , _protocolParamsDvtCommitteeNormal = Just 0.67
    , _protocolParamsDvtCommitteeNoConfidence = Just 0.6
    , _protocolParamsDvtUpdateToConstitution = Just 0.75
    , _protocolParamsDvtHardForkInitiation = Just 0.6
    , _protocolParamsDvtPPNetworkGroup = Just 0.67
    , _protocolParamsDvtPPEconomicGroup = Just 0.67
    , _protocolParamsDvtPPTechnicalGroup = Just 0.67
    , _protocolParamsDvtPPGovGroup = Just 0.75
    , _protocolParamsDvtTreasuryWithdrawal = Just 0.67
    , _protocolParamsCommitteeMinSize = Just 7
    , _protocolParamsCommitteeMaxTermLength = Just 146
    , _protocolParamsGovActionLifetime = Just 6
    , _protocolParamsGovActionDeposit = Just 100000000000
    , _protocolParamsDrepDeposit = Just 500000000
    , _protocolParamsDrepActivity = Just 20
    , _protocolParamsMinFeeRefScriptCostPerByte = Just 15
    }

stakeDistributionSample = [r|
{
  "stake_address": "stake1u9l5q5jwgelgagzyt6nuaasefgmn8pd25c8e9qpeprq0tdcp0e3uk",
  "pool_id": "pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy",
  "amount": "4440295078"
}
|]

stakeDistributionExpected =
  StakeDistribution
    { _stakeDistributionStakeAddress = "stake1u9l5q5jwgelgagzyt6nuaasefgmn8pd25c8e9qpeprq0tdcp0e3uk"
    , _stakeDistributionPoolId = "pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy"
    , _stakeDistributionAmount = 4440295078
    }

poolStakeDistributionSample = [r|
{
  "stake_address": "stake1u9l5q5jwgelgagzyt6nuaasefgmn8pd25c8e9qpeprq0tdcp0e3uk",
  "amount": "4440295078"
}
|]

poolStakeDistributionExpected =
  PoolStakeDistribution
    { _poolStakeDistributionStakeAddress = "stake1u9l5q5jwgelgagzyt6nuaasefgmn8pd25c8e9qpeprq0tdcp0e3uk"
    , _poolStakeDistributionAmount = 4440295078
    }