From bab693a34e9953994c81457dd32d7f666c389c11 Mon Sep 17 00:00:00 2001 From: sourabhxyz Date: Wed, 14 Aug 2024 18:26:32 +0530 Subject: [PATCH] feat: clean out usage of `unsafeCoerce` Related to #326. --- src/GeniusYield/Types/Certificate.hs | 1 - src/GeniusYield/Types/StakeKeyHash.hs | 22 ++++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/GeniusYield/Types/Certificate.hs b/src/GeniusYield/Types/Certificate.hs index c3a8e54a..9566c912 100644 --- a/src/GeniusYield/Types/Certificate.hs +++ b/src/GeniusYield/Types/Certificate.hs @@ -17,7 +17,6 @@ module GeniusYield.Types.Certificate ( import qualified Cardano.Api as Api import qualified Cardano.Api.ReexposeLedger as Ledger -import Cardano.Ledger.Api (ppKeyDepositL) import qualified Cardano.Ledger.Api as Ledger import Control.Lens ((^.)) import GeniusYield.Types.Credential (GYStakeCredential, diff --git a/src/GeniusYield/Types/StakeKeyHash.hs b/src/GeniusYield/Types/StakeKeyHash.hs index 254b0c05..fa6cf42d 100644 --- a/src/GeniusYield/Types/StakeKeyHash.hs +++ b/src/GeniusYield/Types/StakeKeyHash.hs @@ -10,20 +10,26 @@ module GeniusYield.Types.StakeKeyHash ( GYStakeKeyHash, stakeKeyHashToApi, stakeKeyHashFromApi, + stakeKeyHashToLedger, + stakeKeyHashFromLedger, ) where import Control.Lens ((?~)) import GeniusYield.Imports import qualified Cardano.Api as Api +import qualified Cardano.Api.Ledger as Ledger +import qualified Cardano.Api.Shelley as Api +import qualified Cardano.Ledger.Keys as Ledger import qualified Data.Aeson.Types as Aeson import qualified Data.Csv as Csv import qualified Data.Swagger as Swagger import qualified Data.Swagger.Internal.Schema as Swagger import qualified Data.Text.Encoding as Text -import GeniusYield.Types.PubKeyHash (AsPubKeyHash (..), CanSignTx) +import GeniusYield.Types.PubKeyHash (AsPubKeyHash (..), CanSignTx, + pubKeyHashFromLedger, + pubKeyHashToLedger) import qualified Text.Printf as Printf -import Unsafe.Coerce (unsafeCoerce) -- $setup -- @@ -38,8 +44,8 @@ newtype GYStakeKeyHash = GYStakeKeyHash (Api.Hash Api.StakeKey) deriving newtype (Eq, Ord, IsString) instance AsPubKeyHash GYStakeKeyHash where - toPubKeyHash = unsafeCoerce - fromPubKeyHash = unsafeCoerce + toPubKeyHash = stakeKeyHashToLedger >>> Ledger.coerceKeyRole >>> pubKeyHashFromLedger + fromPubKeyHash = pubKeyHashToLedger >>> Ledger.coerceKeyRole >>> stakeKeyHashFromLedger instance CanSignTx GYStakeKeyHash @@ -60,6 +66,14 @@ stakeKeyHashToApi = coerce stakeKeyHashFromApi :: Api.Hash Api.StakeKey -> GYStakeKeyHash stakeKeyHashFromApi = coerce +-- | Convert to corresponding ledger type. +stakeKeyHashToLedger :: GYStakeKeyHash -> Ledger.KeyHash Ledger.Staking Ledger.StandardCrypto +stakeKeyHashToLedger = stakeKeyHashToApi >>> Api.unStakeKeyHash + +-- | Convert from corresponding ledger type. +stakeKeyHashFromLedger :: Ledger.KeyHash Ledger.Staking Ledger.StandardCrypto -> GYStakeKeyHash +stakeKeyHashFromLedger = Api.StakeKeyHash >>> stakeKeyHashFromApi + -- | -- -- >>> let Just skh = Aeson.decode @GYStakeKeyHash "\"7a77d120b9e86addc7388dbbb1bd2350490b7d140ab234038632334d\""