Skip to content

Commit ea8f744

Browse files
committed
continue offchain
1 parent e7e2ee2 commit ea8f744

File tree

9 files changed

+99
-41
lines changed

9 files changed

+99
-41
lines changed

src/programmable-tokens/lib/SmartTokens/LinkedList/Common.hs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import Plutarch.LedgerApi.AssocMap qualified as AssocMap
2828
import Plutarch.LedgerApi.V3
2929
import Plutarch.Monadic qualified as P
3030
import Plutarch.Prelude
31+
import SmartTokens.Contracts.IssuanceCborHex (PIssuanceCborHex (..))
3132
import SmartTokens.Types.PTokenDirectory (PDirectorySetNode (..), pisEmptyNode,
3233
pisInsertedNode, pisInsertedOnNode)
3334
import Types.Constants (pnodeKeyTN, poriginNodeTN)
@@ -184,11 +185,21 @@ pInit common = P.do
184185
-- - There should be only a single node token minted (token name of which should match the key we are inserting)
185186
pInsert ::
186187
forall (s :: S).
188+
Term s (PAsData PCurrencySymbol) ->
187189
PDirectoryCommon s ->
188-
Term s (PAsData PByteString :--> PUnit)
189-
pInsert common = plam $ \pkToInsert -> P.do
190-
keyToInsert <- plet $ pfromData pkToInsert
191-
190+
Term s (PByteString :--> PByteString :--> PUnit)
191+
pInsert issuanceCborHexCS common = plam $ \keyToInsert hashedParam -> P.do
192+
let issuanceCborHexUTxO =
193+
ptxInInfoResolved $ pfromData $
194+
pmustFind @PBuiltinList
195+
# plam (\txIn ->
196+
let resolvedIn = ptxInInfoResolved $ pfromData txIn
197+
in phasDataCS # issuanceCborHexCS # pfromData (ptxOutValue resolvedIn)
198+
)
199+
# common.referenceInputs
200+
POutputDatum issuanceDat' <- pmatch $ ptxOutDatum issuanceCborHexUTxO
201+
PIssuanceCborHex {pprefixCborHex, ppostfixCborHex} <- pmatch (pfromData $ punsafeCoerce @(PAsData PIssuanceCborHex) (pto issuanceDat'))
202+
passert "Registry Entry must be valid programmable asset" $ _pisProgrammableTokenRegistration keyToInsert (pfromData pprefixCborHex) (pfromData ppostfixCborHex) hashedParam common.mint
192203
passert "Key to insert must be valid Currency Symbol" $ ptraceInfoIfFalse (pshow keyToInsert) $ plengthBS # keyToInsert #== 28
193204

194205
-- Input Checks:
@@ -236,26 +247,21 @@ data PDirectoryCommon (s :: S) = MkCommon
236247
}
237248
deriving stock (Generic)
238249

239-
prefixScriptBytes :: Term s PByteString
240-
prefixScriptBytes = phexByteStr "deadbeef"
241-
242-
_pisProgrammableTokenRegistration :: Term s PCurrencySymbol -> Term s PByteString -> Term s (PValue 'Sorted 'NonZero) -> Term s PBool
243-
_pisProgrammableTokenRegistration csToInsert hashedParam mintValue =
250+
_pisProgrammableTokenRegistration :: Term s PByteString -> Term s PByteString -> Term s PByteString -> Term s PByteString -> Term s (PValue 'Sorted 'NonZero) -> Term s PBool
251+
_pisProgrammableTokenRegistration csToInsert prefixScriptBytes postfixScriptBytes hashedParam mintValue =
244252
pand'List
245-
[ phasCS # mintValue # csToInsert
246-
, _papplyHashedParameter prefixScriptBytes hashedParam #== (pto csToInsert)
253+
[ phasCS # mintValue # (pcon $ PCurrencySymbol csToInsert)
254+
, _papplyHashedParameter prefixScriptBytes postfixScriptBytes hashedParam #== csToInsert
247255
]
248256

249257
_papplyHashedParameter ::
250258
Term s PByteString
251259
-> Term s PByteString
252260
-> Term s PByteString
253-
_papplyHashedParameter prefix hashedParam =
261+
-> Term s PByteString
262+
_papplyHashedParameter prefix postfix hashedParam =
254263
pblake2b_224 # (scriptHeader <> postfix)
255264
where
256-
postfix :: Term s PByteString
257-
postfix = phexByteStr "0001"
258-
259265
versionHeader :: Term s PByteString
260266
versionHeader = unsafeEvalTerm NoTracing (pintegerToByteString # pmostSignificantFirst # 1 # plutusVersion)
261267

src/programmable-tokens/lib/SmartTokens/LinkedList/MintDirectory.hs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ import Generics.SOP qualified as SOP
2626
import GHC.Generics (Generic)
2727
import Plutarch.Core.Utils (passert, phasUTxO)
2828
import Plutarch.Internal.Lift
29-
import Plutarch.LedgerApi.V3 (PScriptContext (..), PTxInfo (..), PTxOutRef)
29+
import Plutarch.LedgerApi.V3 (PCurrencySymbol, PScriptContext (..),
30+
PTxInfo (..), PTxOutRef)
3031
import Plutarch.Monadic qualified as P
3132
import Plutarch.Prelude
3233
import Plutarch.Repr.Data
3334
import Plutarch.Unsafe (punsafeCoerce)
34-
import PlutusLedgerApi.V3 (CurrencySymbol)
35+
import PlutusLedgerApi.V3 (CurrencySymbol, ScriptHash)
3536
import PlutusTx qualified
3637
import SmartTokens.LinkedList.Common (makeCommon, pInit, pInsert)
3738

@@ -40,7 +41,7 @@ import SmartTokens.LinkedList.Common (makeCommon, pInit, pInsert)
4041
--------------------------------
4142
data DirectoryNodeAction
4243
= InitDirectory
43-
| InsertDirectoryNode CurrencySymbol
44+
| InsertDirectoryNode CurrencySymbol ScriptHash
4445
deriving stock (Show, Eq, Generic)
4546
deriving anyclass (SOP.Generic)
4647

@@ -49,7 +50,7 @@ PlutusTx.makeIsDataIndexed ''DirectoryNodeAction
4950

5051
data PDirectoryNodeAction (s :: S)
5152
= PInit
52-
| PInsert { pkeyToInsert :: Term s (PAsData PByteString) }
53+
| PInsert { pkeyToInsert :: Term s (PAsData PByteString), phashedParam :: Term s (PAsData PByteString) }
5354
deriving stock (Generic)
5455
deriving anyclass (SOP.Generic, PIsData, PEq)
5556
deriving (PlutusType) via DeriveAsDataStruct PDirectoryNodeAction
@@ -60,10 +61,11 @@ deriving via DeriveDataPLiftable PDirectoryNodeAction DirectoryNodeAction
6061
mkDirectoryNodeMP ::
6162
ClosedTerm
6263
( PAsData PTxOutRef
64+
:--> PAsData PCurrencySymbol
6365
:--> PScriptContext
6466
:--> PUnit
6567
)
66-
mkDirectoryNodeMP = plam $ \initUTxO ctx -> P.do
68+
mkDirectoryNodeMP = plam $ \initUTxO issuanceCborHexCS ctx -> P.do
6769
PScriptContext {pscriptContext'redeemer} <- pmatch ctx
6870
let red = punsafeCoerce @PDirectoryNodeAction (pto pscriptContext'redeemer)
6971

@@ -76,6 +78,6 @@ mkDirectoryNodeMP = plam $ \initUTxO ctx -> P.do
7678
passert "Init must consume TxOutRef" $
7779
phasUTxO # pfromData initUTxO # pfromData ptxInfo'inputs
7880
pInit common
79-
PInsert action -> P.do
81+
PInsert action hashedParam -> P.do
8082
pkToInsert <- plet action
81-
pInsert common # pkToInsert
83+
pInsert issuanceCborHexCS common # pfromData pkToInsert # pfromData hashedParam

src/regulated-stablecoin/lib/Wst/Offchain/BuildTx/DirectorySet.hs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import Plutarch.Evaluate (unsafeEvalTerm)
2727
import Plutarch.Internal.Term (Config (NoTracing))
2828
import Plutarch.Prelude (pconstant)
2929
import PlutusLedgerApi.V1 qualified as PlutusTx
30-
import PlutusLedgerApi.V3 (Credential (..), CurrencySymbol (..))
30+
import PlutusLedgerApi.V3 (Credential (..), CurrencySymbol (..),
31+
ScriptHash (..))
3132
import PlutusTx.Prelude (toBuiltin)
3233
import SmartTokens.CodeLens (_printTerm)
3334
import SmartTokens.LinkedList.MintDirectory (DirectoryNodeAction (..))
@@ -88,13 +89,14 @@ initDirectorySet = Utils.inBabbage @era $ do
8889
data InsertNodeArgs =
8990
InsertNodeArgs
9091
{ inaNewKey :: CurrencySymbol
92+
, inaHashedParam :: ScriptHash
9193
, inaTransferLogic :: C.StakeCredential
9294
, inaIssuerLogic :: C.StakeCredential
9395
, inaGlobalStateCS :: CurrencySymbol
9496
}
9597

9698
insertDirectoryNode :: forall era env m. (MonadReader env m, Env.HasDirectoryEnv env, C.IsBabbageBasedEra era, MonadBuildTx era m, C.HasScriptLanguageInEra C.PlutusScriptV3 era, MonadBlockchain era m) => UTxODat era ProgrammableLogicGlobalParams -> UTxODat era DirectorySetNode -> InsertNodeArgs -> m ()
97-
insertDirectoryNode UTxODat{uIn=paramsRef} UTxODat{uIn, uOut=firstTxOut, uDatum=firstTxData} InsertNodeArgs{inaNewKey, inaTransferLogic, inaIssuerLogic, inaGlobalStateCS} = Utils.inBabbage @era $ do
99+
insertDirectoryNode UTxODat{uIn=paramsRef} UTxODat{uIn, uOut=firstTxOut, uDatum=firstTxData} InsertNodeArgs{inaNewKey, inaHashedParam, inaTransferLogic, inaIssuerLogic, inaGlobalStateCS} = Utils.inBabbage @era $ do
98100
netId <- queryNetworkId
99101
directorySpendingScript <- asks (Env.dsDirectorySpendingScript . Env.directoryEnv)
100102
directoryMintingScript <- asks (Env.dsDirectoryMintingScript . Env.directoryEnv)
@@ -132,6 +134,6 @@ insertDirectoryNode UTxODat{uIn=paramsRef} UTxODat{uIn, uOut=firstTxOut, uDatum=
132134
firstOutput = C.TxOut addr firstTxVal (C.TxOutDatumInline C.babbageBasedEra $ toHashableScriptData firstDat) C.ReferenceScriptNone
133135
addReference paramsRef
134136
spendPlutusInlineDatum uIn directorySpendingScript ()
135-
mintPlutus directoryMintingScript (InsertDirectoryNode inaNewKey) newTokenName 1
137+
mintPlutus directoryMintingScript (InsertDirectoryNode inaNewKey inaHashedParam) newTokenName 1
136138
prependTxOut insertedNode
137139
prependTxOut firstOutput

src/regulated-stablecoin/lib/Wst/Offchain/BuildTx/IssuanceCborHexRef.hs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{-# LANGUAGE NamedFieldPuns #-}
22
module Wst.Offchain.BuildTx.IssuanceCborHexRef (
33
mintIssuanceCborHexNFT,
4+
frackUTxOs,
45
getCborHexInline,
56
) where
67

@@ -87,6 +88,27 @@ mintIssuanceCborHexNFT = Utils.inBabbage @era $ do
8788
mintPlutus dsProtocolParamsMintingScript () issuanceCborHexTokenC 1
8889
prependTxOut output
8990

91+
frackUTxOs :: forall era m. (C.IsBabbageBasedEra era, MonadBuildTx era m, MonadBlockchain era m) => (C.Hash C.PaymentKey, C.StakeAddressReference) -> m ()
92+
frackUTxOs bteOperator = Utils.inBabbage @era $ do
93+
netId <- queryNetworkId
94+
let val = C.TxOutValueShelleyBased C.shelleyBasedEra $ C.toLedgerValue @era C.maryBasedEra
95+
$ C.lovelaceToValue 150_000_000
96+
97+
addr =
98+
C.makeShelleyAddressInEra
99+
C.shelleyBasedEra
100+
netId
101+
(C.PaymentCredentialByKey (fst bteOperator))
102+
(snd bteOperator)
103+
104+
output :: C.TxOut C.CtxTx era
105+
output = C.TxOut addr val C.TxOutDatumNone C.ReferenceScriptNone
106+
107+
prependTxOut output
108+
prependTxOut output
109+
prependTxOut output
110+
prependTxOut output
111+
90112
getCborHexInline :: C.InAnyCardanoEra (C.TxOut C.CtxTx) -> Maybe ProgrammableLogicGlobalParams
91113
getCborHexInline (C.InAnyCardanoEra _ (C.TxOut _ _ dat _)) =
92114
case dat of

src/regulated-stablecoin/lib/Wst/Offchain/BuildTx/ProgrammableLogic.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ issueProgrammableToken paramsTxOut (an, q) directoryList = Utils.inBabbage @era
5757
glParams <- asks (Env.globalParams . Env.directoryEnv)
5858
dir <- asks Env.directoryEnv
5959

60-
let mintingLogicCred = SmartTokenMintingAction $ transCredential $ C.PaymentCredentialByScript . C.hashScript $ C.PlutusScript C.PlutusScriptV3 tleMintingScript
60+
let mintingLogicHash = C.hashScript $ C.PlutusScript C.plutusScriptVersion tleMintingScript
61+
mintingLogicCred = SmartTokenMintingAction $ transCredential $ C.PaymentCredentialByScript mintingLogicHash
6162

6263
-- The global params in the UTxO need to match those in our 'DirectoryEnv'.
6364
-- If they don't, we get a script error when trying to balance the transaction.
@@ -81,6 +82,7 @@ issueProgrammableToken paramsTxOut (an, q) directoryList = Utils.inBabbage @era
8182
let nodeArgs =
8283
InsertNodeArgs
8384
{ inaNewKey = issuedSymbol
85+
, inaHashedParam = transScriptHash mintingLogicHash
8486
, inaTransferLogic = C.StakeCredentialByScript $ C.hashScript $ C.PlutusScript C.plutusScriptVersion tleTransferScript
8587
, inaIssuerLogic = C.StakeCredentialByScript $ C.hashScript $ C.PlutusScript C.plutusScriptVersion tleIssuerScript
8688
, inaGlobalStateCS = CurrencySymbol ""

src/regulated-stablecoin/lib/Wst/Offchain/Endpoints/Deployment.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module Wst.Offchain.Endpoints.Deployment(
1313
removeBlacklistNodeTx,
1414
seizeCredentialAssetsTx,
1515
deployIssuanceCborHex,
16+
frackUtxosTx,
1617
) where
1718

1819
import Cardano.Api (Quantity)
@@ -38,11 +39,20 @@ import Wst.Offchain.BuildTx.ProgrammableLogic qualified as BuildTx
3839
import Wst.Offchain.BuildTx.ProtocolParams qualified as BuildTx
3940
import Wst.Offchain.BuildTx.TransferLogic (BlacklistReason)
4041
import Wst.Offchain.BuildTx.TransferLogic qualified as BuildTx
41-
import Wst.Offchain.Env (DirectoryScriptRoot (..))
42+
import Wst.Offchain.Env (DirectoryScriptRoot (..), OperatorEnv (..))
4243
import Wst.Offchain.Env qualified as Env
4344
import Wst.Offchain.Query (UTxODat (..))
4445
import Wst.Offchain.Query qualified as Query
4546

47+
{-| Build a transaction that fractionalizes the operators UTxOs.
48+
-}
49+
frackUtxosTx :: (MonadReader env m, Env.HasOperatorEnv era env, MonadBlockchain era m, MonadError (AppError era) m, C.IsBabbageBasedEra era) => m (C.Tx era)
50+
frackUtxosTx = do
51+
opEnv@OperatorEnv{bteOperator} <- asks Env.operatorEnv
52+
(tx, _) <- Env.withEnv $ Env.withOperator opEnv $ Env.balanceTxEnv_ $ BuildTx.frackUTxOs bteOperator
53+
pure (Convex.CoinSelection.signBalancedTxBody [] tx)
54+
55+
4656
{-| Build a transaction that deploys the directory and global params. Returns the
4757
transaction and the 'TxIn' that was selected for the one-shot NFTs.
4858
-}

src/regulated-stablecoin/lib/Wst/Offchain/Env.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ import Data.Maybe (listToMaybe)
103103
import Data.Proxy (Proxy (..))
104104
import Data.Set qualified as Set
105105
import Data.Text qualified as Text
106+
import Debug.Trace qualified
106107
import GHC.Generics (Generic)
107108
import SmartTokens.Core.Scripts (ScriptTarget)
108109
import SmartTokens.Types.ProtocolParams (ProgrammableLogicGlobalParams (..))
@@ -121,7 +122,6 @@ import Wst.Offchain.Scripts (alwaysSucceedsScript, blacklistMintingScript,
121122
programmableLogicMintingScript,
122123
protocolParamsMintingScript,
123124
protocolParamsSpendingScript, scriptPolicyIdV3)
124-
125125
{-| Environments that have an 'OperatorEnv'
126126
-}
127127
class HasOperatorEnv era e | e -> era where
@@ -168,7 +168,7 @@ selectTwoOperatorOutputs :: (MonadReader env m, HasOperatorEnv era env, MonadErr
168168
selectTwoOperatorOutputs = do
169169
utxos <- asks (C.unUTxO . bteOperatorUtxos . operatorEnv)
170170
case Map.toList utxos of
171-
[(k1, v1), (k2, v2)] -> pure ((k1, v1), (k2, v2))
171+
(k1, v1) : (k2, v2) : _rest -> pure ((k1, v1), (k2, v2))
172172
_ -> throwError OperatorNoUTxOs
173173

174174
{-| Balance a transaction using the operator's funds and return output

src/regulated-stablecoin/test/unit/Wst/Test/UnitTest.hs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import Control.Monad.IO.Class (MonadIO (..))
1414
import Control.Monad.Reader (MonadReader (ask), ReaderT (runReaderT), asks)
1515
import Convex.BuildTx qualified as BuildTx
1616
import Convex.Class (MonadBlockchain (queryProtocolParameters, sendTx),
17-
MonadMockchain, MonadUtxoQuery, ValidationError, getTxById)
17+
MonadMockchain, MonadUtxoQuery, ValidationError, getTxById,
18+
utxosByPaymentCredential)
1819
import Convex.CoinSelection (ChangeOutputPosition (TrailingChange))
1920
import Convex.MockChain (MockchainT)
2021
import Convex.MockChain.CoinSelection (tryBalanceAndSubmit)
@@ -27,9 +28,11 @@ import Convex.Wallet.MockWallet qualified as Wallet
2728
import Convex.Wallet.Operator (signTxOperator)
2829
import Convex.Wallet.Operator qualified as Operator
2930
import Data.List (isPrefixOf)
31+
import Data.Map qualified as Map
3032
import Data.String (IsString (..))
33+
import Debug.Trace qualified
3134
import GHC.Exception (SomeException, throw)
32-
import PlutusLedgerApi.V3 (CurrencySymbol (..))
35+
import PlutusLedgerApi.V3 (CurrencySymbol (..), ScriptHash (..))
3336
import PlutusTx.Builtins.HasOpaque (stringToBuiltinByteStringHex)
3437
import SmartTokens.Core.Scripts (ScriptTarget (Debug, Production))
3538
import Test.Tasty (TestTree, testGroup)
@@ -38,12 +41,11 @@ import Wst.Offchain.BuildTx.DirectorySet (InsertNodeArgs (..))
3841
import Wst.Offchain.BuildTx.Failing (BlacklistedTransferPolicy (..))
3942
import Wst.Offchain.BuildTx.Utils (addConwayStakeCredentialCertificate)
4043
import Wst.Offchain.Endpoints.Deployment qualified as Endpoints
41-
import Wst.Offchain.Env (DirectoryScriptRoot)
44+
import Wst.Offchain.Env (DirectoryScriptRoot, OperatorEnv (..))
4245
import Wst.Offchain.Env qualified as Env
4346
import Wst.Offchain.Query qualified as Query
4447
import Wst.Offchain.Scripts qualified as Scripts
4548
import Wst.Test.Env (admin, asAdmin, asWallet, user)
46-
4749
tests :: TestTree
4850
tests = testGroup "unit tests"
4951
[ scriptTargetTests Debug
@@ -83,14 +85,24 @@ deployAll = do
8385
deployDirectorySet :: (MonadReader ScriptTarget m, MonadUtxoQuery m, MonadBlockchain C.ConwayEra m, MonadFail m) => m DirectoryScriptRoot
8486
deployDirectorySet = do
8587
target <- ask
86-
failOnError $ Env.withEnv $ asAdmin @C.ConwayEra $ do
87-
(tx, scriptRoot) <- Endpoints.deployTx target
88-
void $ sendTx $ signTxOperator admin tx
89-
Env.withDirectoryFor scriptRoot $ do
90-
Query.registryNodes @C.ConwayEra
91-
>>= void . expectSingleton "registry output"
92-
void $ Query.globalParamsNode @C.ConwayEra
93-
pure scriptRoot
88+
failOnError $ Env.withEnv $ do
89+
asAdmin @C.ConwayEra $ Endpoints.frackUtxosTx
90+
>>= void . sendTx . signTxOperator admin
91+
92+
utxos <- utxosByPaymentCredential (C.PaymentCredentialByKey $ C.verificationKeyHash . Operator.verificationKey . Operator.oPaymentKey $ admin)
93+
94+
--Debug.Trace.traceM $ "UTxOs: " ++ show utxos
95+
96+
asAdmin @C.ConwayEra $ do
97+
OperatorEnv{bteOperator, bteOperatorUtxos} <- asks Env.operatorEnv
98+
-- Debug.Trace.traceM $ "OperatorEnv: " ++ (show $ Map.size $ C.unUTxO bteOperatorUtxos)
99+
(tx, scriptRoot) <- Endpoints.deployTx target
100+
void $ sendTx $ signTxOperator admin tx
101+
Env.withDirectoryFor scriptRoot $ do
102+
Query.registryNodes @C.ConwayEra
103+
>>= void . expectSingleton "registry output"
104+
void $ Query.globalParamsNode @C.ConwayEra
105+
pure scriptRoot
94106

95107
insertDirectoryNode :: (MonadUtxoQuery m, MonadBlockchain C.ConwayEra m, MonadFail m) => DirectoryScriptRoot -> m ()
96108
insertDirectoryNode scriptRoot = failOnError $ Env.withEnv $ asAdmin @C.ConwayEra $ Env.withDirectoryFor scriptRoot $ do
@@ -272,6 +284,7 @@ dummyNodeArgs :: InsertNodeArgs
272284
dummyNodeArgs =
273285
InsertNodeArgs
274286
{ inaNewKey = CurrencySymbol (stringToBuiltinByteStringHex "e165610232235bbbbeff5b998b23e165610232235bbbbeff5b998b23")
287+
, inaHashedParam = ScriptHash (stringToBuiltinByteStringHex "e165610232235bbbbeff5b998b23e165610232235bbbbeff5b998b23")
275288
, inaTransferLogic = C.StakeCredentialByScript "e165610232235bbbbeff5b998b23e165610232235bbbbeff5b998b23"
276289
, inaIssuerLogic = C.StakeCredentialByScript "e165610232235bbbbeff5b998b23e165610232235bbbbeff5b998b23"
277290
, inaGlobalStateCS = CurrencySymbol ""

src/regulated-stablecoin/wst-poc.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ test-suite wst-poc-test
195195
, cardano-api
196196
, cardano-ledger-api
197197
, cardano-ledger-core
198+
, containers
198199
, convex-base
199200
, convex-coin-selection
200201
, convex-mockchain

0 commit comments

Comments
 (0)