Skip to content

Commit

Permalink
refactor from_bytes CSL calls
Browse files Browse the repository at this point in the history
  • Loading branch information
MitchyCola committed Sep 30, 2022
1 parent 46a4eab commit 9af3e2e
Show file tree
Hide file tree
Showing 12 changed files with 96 additions and 130 deletions.
45 changes: 32 additions & 13 deletions src/Internal/Deserialization/FromBytes.purs
Expand Up @@ -12,17 +12,21 @@ import Ctl.Internal.Error (E)
import Ctl.Internal.FfiHelpers (ErrorFfiHelper)
import Ctl.Internal.Serialization.Hash (VRFKeyHash)
import Ctl.Internal.Serialization.Types
( DataHash
( AuxiliaryDataHash
, DataHash
, GenesisDelegateHash
, GenesisHash
, Mint
, NativeScript
, PlutusData
, PoolMetadataHash
, ScriptDataHash
, Transaction
, TransactionHash
, TransactionUnspentOutput
, TransactionWitnessSet
, Value
)
-- import Ctl.Internal.Types.ByteArray (ByteArray)
import Ctl.Internal.Types.CborBytes (CborBytes)
import Data.Either (hush)
import Data.Maybe (Maybe(Just, Nothing))
Expand All @@ -34,36 +38,51 @@ import Type.Row (type (+))
class FromBytes a where
fromBytes' :: forall (r :: Row Type). CborBytes -> E (FromBytesError + r) a

instance FromBytes AuxiliaryDataHash where
fromBytes' = _fromBytes "AuxiliaryDataHash" fromBytesErrorHelper

instance FromBytes DataHash where
fromBytes' = _fromBytes "DataHash" fromBytesErrorHelper

instance FromBytes GenesisDelegateHash where
fromBytes' = _fromBytes "GenesisDelegateHash" fromBytesErrorHelper

instance FromBytes GenesisHash where
fromBytes' = _fromBytes "GenesisHash" fromBytesErrorHelper

instance FromBytes Mint where
fromBytes' = _fromBytes "Mint" fromBytesErrorHelper

instance FromBytes NativeScript where
fromBytes' = _fromBytes "NativeScript" fromBytesErrorHelper

instance FromBytes PlutusData where
fromBytes' = _fromBytes "PlutusData" fromBytesErrorHelper

instance FromBytes PoolMetadataHash where
fromBytes' = _fromBytes "PoolMetadataHash" fromBytesErrorHelper

instance FromBytes ScriptDataHash where
fromBytes' = _fromBytes "ScriptDataHash" fromBytesErrorHelper

instance FromBytes Transaction where
fromBytes' = _fromBytes "Transaction" fromBytesErrorHelper

instance FromBytes TransactionHash where
fromBytes' = _fromBytes "TransactionHash" fromBytesErrorHelper

instance FromBytes PlutusData where
fromBytes' = _fromBytes "PlutusData" fromBytesErrorHelper

instance FromBytes TransactionUnspentOutput where
fromBytes' = _fromBytes "TransactionUnspentOutput" fromBytesErrorHelper

instance FromBytes TransactionWitnessSet where
fromBytes' = _fromBytes "TransactionWitnessSet" fromBytesErrorHelper

instance FromBytes NativeScript where
fromBytes' = _fromBytes "NativeScript" fromBytesErrorHelper

instance FromBytes Mint where
fromBytes' = _fromBytes "Mint" fromBytesErrorHelper
instance FromBytes Value where
fromBytes' = _fromBytes "Value" fromBytesErrorHelper

instance FromBytes VRFKeyHash where
fromBytes' = _fromBytes "VRFKeyHash" fromBytesErrorHelper

instance FromBytes Value where
fromBytes' = _fromBytes "Value" fromBytesErrorHelper

-- for backward compatibility until `Maybe` is abandoned. Then to be renamed.
fromBytes :: forall (a :: Type). FromBytes a => CborBytes -> Maybe a
fromBytes = fromBytes' >>> hush
Expand Down
7 changes: 0 additions & 7 deletions src/Internal/Deserialization/UnspentOutput.js
Expand Up @@ -64,10 +64,3 @@ exports.extractAssets = extractDict;
exports.getDataHash = callMaybe("data_hash");
exports.mkTransactionUnspentOutput = input => output =>
lib.TransactionUnspentOutput.new(input, output);
exports._newTransactionUnspentOutputFromBytes = maybe => bytes => {
try {
return maybe.just(lib.TransactionUnspentOutput.from_bytes(bytes));
} catch (_) {
return maybe.nothing;
}
};
10 changes: 0 additions & 10 deletions src/Internal/Deserialization/UnspentOutput.purs
@@ -1,7 +1,6 @@
module Ctl.Internal.Deserialization.UnspentOutput
( convertUnspentOutput
, mkTransactionUnspentOutput
, newTransactionUnspentOutputFromBytes
, convertInput
, convertOutput
, convertValue
Expand Down Expand Up @@ -50,7 +49,6 @@ import Ctl.Internal.Serialization.Types
)
import Ctl.Internal.Types.BigNum (BigNum)
import Ctl.Internal.Types.BigNum (toBigInt) as BigNum
import Ctl.Internal.Types.ByteArray (ByteArray)
import Ctl.Internal.Types.OutputDatum
( OutputDatum(NoOutputDatum, OutputDatumHash, OutputDatum)
)
Expand Down Expand Up @@ -181,11 +179,3 @@ foreign import getDataHash

foreign import mkTransactionUnspentOutput
:: TransactionInput -> TransactionOutput -> TransactionUnspentOutput

foreign import _newTransactionUnspentOutputFromBytes
:: MaybeFfiHelper -> ByteArray -> Maybe TransactionUnspentOutput

newTransactionUnspentOutputFromBytes
:: ByteArray -> Maybe TransactionUnspentOutput
newTransactionUnspentOutputFromBytes = _newTransactionUnspentOutputFromBytes
maybeFfiHelper
16 changes: 0 additions & 16 deletions src/Internal/Deserialization/WitnessSet.js
@@ -1,12 +1,3 @@
/* global BROWSER_RUNTIME */

let lib;
if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) {
lib = require("@emurgo/cardano-serialization-lib-browser");
} else {
lib = require("@emurgo/cardano-serialization-lib-nodejs");
}

const call = property => object => object[property]();

const callMaybe = property => maybe => object => {
Expand Down Expand Up @@ -59,10 +50,3 @@ exports.getRedeemerPlutusData = call("data");
exports.getExUnits = call("ex_units");
exports.getExUnitsMem = call("mem");
exports.getExUnitsSteps = call("steps");
exports._deserializeWitnessSet = maybe => bytes => {
try {
return maybe.just(lib.TransactionWitnessSet.from_bytes(bytes));
} catch (_) {
return maybe.nothing;
}
};
6 changes: 0 additions & 6 deletions src/Internal/Deserialization/WitnessSet.purs
Expand Up @@ -5,7 +5,6 @@ module Ctl.Internal.Deserialization.WitnessSet
, convertVkeyWitnesses
, convertVkeyWitness
, convertWitnessSet
, deserializeWitnessSet
, plutusScriptBytes
) where

Expand Down Expand Up @@ -59,9 +58,6 @@ import Data.Traversable (for, traverse)
import Data.Tuple (curry)
import Data.Tuple.Nested ((/\))

deserializeWitnessSet :: ByteArray -> Maybe TransactionWitnessSet
deserializeWitnessSet = _deserializeWitnessSet maybeFfiHelper

convertWitnessSet :: TransactionWitnessSet -> Maybe T.TransactionWitnessSet
convertWitnessSet ws = do
nativeScripts <- for (getNativeScripts maybeFfiHelper ws) convertNativeScripts
Expand Down Expand Up @@ -200,5 +196,3 @@ foreign import getRedeemerPlutusData :: Redeemer -> PlutusData
foreign import getExUnits :: Redeemer -> ExUnits
foreign import getExUnitsMem :: ExUnits -> BigNum
foreign import getExUnitsSteps :: ExUnits -> BigNum
foreign import _deserializeWitnessSet
:: MaybeFfiHelper -> ByteArray -> Maybe TransactionWitnessSet
20 changes: 3 additions & 17 deletions src/Internal/Serialization.js
Expand Up @@ -51,15 +51,9 @@ exports.newTransaction = body => witness_set => auxiliary_data => () =>
exports.newTransaction_ = body => witness_set => () =>
lib.Transaction.new(body, witness_set);

exports.newTransactionUnspentOutputFromBytes = bytes => () =>
lib.TransactionUnspentOutput.from_bytes(bytes);

exports.newTransactionUnspentOutput = input => output => () =>
lib.TransactionUnspentOutput.new(input, output);

exports.newTransactionWitnessSetFromBytes = bytes => () =>
lib.TransactionWitnessSet.from_bytes(bytes);

exports.newMultiAsset = () => lib.MultiAsset.new();

exports.insertMultiAsset = multiasset => key => value => () =>
Expand Down Expand Up @@ -161,9 +155,6 @@ exports.addRedeemer = rs => r => () => rs.add(r);
exports.setTxBodyReferenceInputs = txBody => referenceInputs => () =>
txBody.set_reference_inputs(referenceInputs);

exports.newScriptDataHashFromBytes = bytes => () =>
lib.ScriptDataHash.from_bytes(bytes);

exports.setTxBodyScriptDataHash = setter("script_data_hash");

exports.setTxBodyMint = setter("mint");
Expand Down Expand Up @@ -283,8 +274,8 @@ exports.transactionBodySetValidityStartInterval = setter(
"validity_start_interval_bignum"
);

exports.transactionBodySetAuxiliaryDataHash = txBody => hashBytes => () =>
txBody.set_auxiliary_data_hash(lib.AuxiliaryDataHash.from_bytes(hashBytes));
exports.transactionBodySetAuxiliaryDataHash = txBody => hash => () =>
txBody.set_auxiliary_data_hash(hash);

exports.convertPoolOwners = containerHelper => keyHashes => () =>
containerHelper.pack(lib.Ed25519KeyHashes, keyHashes);
Expand All @@ -310,12 +301,7 @@ exports.newMultiHostName = dnsName => () =>
);

exports.newPoolMetadata = url => hash => () =>
lib.PoolMetadata.new(lib.URL.new(url), lib.PoolMetadataHash.from_bytes(hash));

exports.newGenesisHash = bytes => () => lib.GenesisHash.from_bytes(bytes);

exports.newGenesisDelegateHash = bytes => () =>
lib.GenesisDelegateHash.from_bytes(bytes);
lib.PoolMetadata.new(lib.URL.new(url), hash);

exports.newMoveInstantaneousRewardToOtherPot = pot => amount => () =>
lib.MoveInstantaneousReward.new_to_other_pot(pot, amount);
Expand Down
54 changes: 29 additions & 25 deletions src/Internal/Serialization.purs
Expand Up @@ -9,8 +9,6 @@ module Ctl.Internal.Serialization
, convertTransactionUnspentOutput
, convertValue
, serializeData
, newTransactionUnspentOutputFromBytes
, newTransactionWitnessSetFromBytes
, hashScriptData
, hashTransaction
, publicKeyHash
Expand Down Expand Up @@ -90,6 +88,7 @@ import Ctl.Internal.Serialization.Types
( AssetName
, Assets
, AuxiliaryData
, AuxiliaryDataHash
, BigInt
, Certificate
, Certificates
Expand All @@ -115,6 +114,7 @@ import Ctl.Internal.Serialization.Types
, PlutusData
, PlutusScript
, PoolMetadata
, PoolMetadataHash
, PrivateKey
, ProposedProtocolParameterUpdates
, ProtocolParamUpdate
Expand Down Expand Up @@ -214,12 +214,6 @@ foreign import newTransaction_
-> TransactionWitnessSet
-> Effect Transaction

foreign import newTransactionWitnessSetFromBytes
:: CborBytes -> Effect TransactionWitnessSet

foreign import newTransactionUnspentOutputFromBytes
:: CborBytes -> Effect TransactionUnspentOutput

foreign import newTransactionUnspentOutput
:: TransactionInput -> TransactionOutput -> Effect TransactionUnspentOutput

Expand Down Expand Up @@ -292,7 +286,6 @@ foreign import setTxBodyReferenceInputs
-> TransactionInputs
-> Effect Unit

foreign import newScriptDataHashFromBytes :: CborBytes -> Effect ScriptDataHash
foreign import setTxBodyScriptDataHash
:: TransactionBody -> ScriptDataHash -> Effect Unit

Expand Down Expand Up @@ -362,9 +355,9 @@ foreign import newSingleHostAddr

foreign import newSingleHostName :: UndefinedOr Int -> String -> Effect Relay
foreign import newMultiHostName :: String -> Effect Relay
foreign import newPoolMetadata :: String -> ByteArray -> Effect PoolMetadata
foreign import newGenesisHash :: ByteArray -> Effect GenesisHash
foreign import newGenesisDelegateHash :: ByteArray -> Effect GenesisDelegateHash
foreign import newPoolMetadata
:: String -> PoolMetadataHash -> Effect PoolMetadata

foreign import newMoveInstantaneousRewardToOtherPot
:: Number -> BigNum -> Effect MoveInstantaneousReward

Expand All @@ -389,7 +382,7 @@ foreign import transactionBodySetValidityStartInterval
:: TransactionBody -> BigNum -> Effect Unit

foreign import transactionBodySetAuxiliaryDataHash
:: TransactionBody -> ByteArray -> Effect Unit
:: TransactionBody -> AuxiliaryDataHash -> Effect Unit

foreign import newWithdrawals
:: ContainerHelper
Expand Down Expand Up @@ -504,20 +497,18 @@ convertTxBody (T.TxBody body) = do
for_ body.withdrawals $ convertWithdrawals >=> setTxBodyWithdrawals txBody
for_ body.update $ convertUpdate >=> setTxBodyUpdate txBody
for_ body.auxiliaryDataHash $
unwrap >>> unwrap >>> transactionBodySetAuxiliaryDataHash txBody
unwrap >>> fromBytes >>> fromJustEff "Failed to convert auxiliary data hash"
>=> transactionBodySetAuxiliaryDataHash txBody
for_ body.validityStartInterval $
unwrap >>> BigNum.toString >>> BigNum.fromStringUnsafe >>>
transactionBodySetValidityStartInterval txBody
for_ body.requiredSigners $
map unwrap >>> transactionBodySetRequiredSigners containerHelper txBody
for_ body.auxiliaryDataHash $
unwrap >>> unwrap >>> transactionBodySetAuxiliaryDataHash txBody
for_ body.networkId $ convertNetworkId >=> setTxBodyNetworkId txBody
for_ body.mint $ convertMint >=> setTxBodyMint txBody
for_ body.scriptDataHash
( unwrap >>> newScriptDataHashFromBytes >=>
setTxBodyScriptDataHash txBody
)
for_ body.scriptDataHash $
unwrap >>> fromBytes >>> fromJustEff "Failed to convert script data hash"
>=> setTxBodyScriptDataHash txBody
for_ body.collateral $ convertTxInputs >=> setTxBodyCollateral txBody
for_ body.requiredSigners $
map unwrap >>> transactionBodySetRequiredSigners containerHelper txBody
Expand Down Expand Up @@ -558,8 +549,13 @@ convertProposedProtocolParameterUpdates
convertProposedProtocolParameterUpdates ppus =
newProposedProtocolParameterUpdates containerHelper =<<
for (Map.toUnfoldable $ unwrap ppus) \(genesisHash /\ ppu) -> do
Tuple <$> newGenesisHash (unwrap $ unwrap genesisHash) <*>
convertProtocolParamUpdate ppu
Tuple
<$>
( fromJustEff "Failed to convert genesis hash" $ fromBytes
(unwrap genesisHash)
)
<*>
convertProtocolParamUpdate ppu

convertProtocolParamUpdate
:: T.ProtocolParamUpdate -> Effect ProtocolParamUpdate
Expand Down Expand Up @@ -695,8 +691,14 @@ convertCert = case _ of
, vrfKeyhash
} -> do
join $ newGenesisKeyDelegationCertificate
<$> newGenesisHash (unwrap genesisHash)
<*> newGenesisDelegateHash (unwrap genesisDelegateHash)
<$>
( fromJustEff "Failed to convert genesis hash" $
fromBytes genesisHash
)
<*>
( fromJustEff "Failed to convert genesis delegate hash" $
fromBytes genesisDelegateHash
)
<*>
pure vrfKeyhash
T.MoveInstantaneousRewardsCert mir -> do
Expand All @@ -719,7 +721,9 @@ convertMoveInstantaneousReward (T.ToStakeCreds { pot, amounts }) =
convertPoolMetadata :: T.PoolMetadata -> Effect PoolMetadata
convertPoolMetadata
(T.PoolMetadata { url: T.URL url, hash: T.PoolMetadataHash hash }) =
newPoolMetadata url hash
( (fromJustEff "Failed to convert script data hash" <<< fromBytes <<< wrap)
>=> (newPoolMetadata url)
) hash

convertRelays :: Array T.Relay -> Effect Relays
convertRelays relays = do
Expand Down
1 change: 1 addition & 0 deletions src/Internal/Serialization/Address.purs
Expand Up @@ -313,6 +313,7 @@ instance EncodeAeson StakeCredential where
foreign import _addressFromBech32
:: MaybeFfiHelper -> Bech32String -> Maybe Address

-- We can't use FromBytes class here, because of cyclic dependencies
foreign import _addressFromBytes :: MaybeFfiHelper -> CborBytes -> Maybe Address
foreign import addressBytes :: Address -> CborBytes
foreign import addressBech32 :: Address -> Bech32String
Expand Down

0 comments on commit 9af3e2e

Please sign in to comment.