Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
smelc committed Apr 29, 2024
1 parent 9f8553f commit 71b3c4f
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 71 deletions.
47 changes: 1 addition & 46 deletions cardano-faucet/src/Cardano/Faucet.hs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ module Cardano.Faucet (main) where

import Cardano.Address.Derivation (Depth(AccountK), XPrv)
import Cardano.Address.Style.Shelley (getKey, Shelley)
import Cardano.Api (TxInMode, CardanoMode, AddressAny, EraInMode, IsShelleyBasedEra, QueryInMode(QueryInEra, QueryCurrentEra), UTxO(unUTxO), QueryUTxOFilter(QueryUTxOByAddress), BlockInMode, ChainPoint, AnyCardanoEra(AnyCardanoEra), CardanoEraStyle(ShelleyBasedEra), LocalNodeConnectInfo(LocalNodeConnectInfo), LocalNodeClientProtocols(LocalNodeClientProtocols, localChainSyncClient, localStateQueryClient, localTxSubmissionClient, localTxMonitoringClient), toEraInMode, ConsensusMode(CardanoMode), QueryInEra(QueryInShelleyBasedEra), QueryInShelleyBasedEra(QueryUTxO, QueryStakeAddresses), LocalStateQueryClient(LocalStateQueryClient), ConsensusModeIsMultiEra(CardanoModeIsMultiEra), cardanoEraStyle, connectToLocalNode, LocalChainSyncClient(NoLocalChainSyncClient), SigningKey(PaymentExtendedSigningKey), getVerificationKey, Lovelace, serialiseAddress, ShelleyWitnessSigningKey(WitnessPaymentExtendedKey), File(File), AddressAny(AddressShelley))
import Cardano.Api (TxInMode, CardanoMode, AddressAny, EraInMode, IsShelleyBasedEra, QueryInMode(QueryInEra, QueryCurrentEra), UTxO(unUTxO), QueryUTxOFilter(QueryUTxOByAddress), BlockInMode, ChainPoint, AnyCardanoEra(AnyCardanoEra), CardanoEraStyle(ShelleyBasedEra), LocalNodeConnectInfo(LocalNodeConnectInfo), LocalNodeClientProtocols(LocalNodeClientProtocols, localChainSyncClient, localStateQueryClient, localTxSubmissionClient, localTxMonitoringClient), ConsensusMode(CardanoMode), QueryInEra(QueryInShelleyBasedEra), QueryInShelleyBasedEra(QueryUTxO, QueryStakeAddresses), LocalStateQueryClient(LocalStateQueryClient), ConsensusModeIsMultiEra(CardanoModeIsMultiEra), cardanoEraStyle, connectToLocalNode, LocalChainSyncClient(NoLocalChainSyncClient), SigningKey(PaymentExtendedSigningKey), getVerificationKey, Lovelace, serialiseAddress, ShelleyWitnessSigningKey(WitnessPaymentExtendedKey), File(File), AddressAny(AddressShelley))
import Cardano.Api.Byron ()
--import Cardano.CLI.Run.Friendly (friendlyTxBS)
import Cardano.Api.Shelley (makeStakeAddress, StakeCredential(StakeCredentialByKey), verificationKeyHash, castVerificationKey, SigningKey(StakeExtendedSigningKey), StakeAddress, PoolId, NetworkId, StakeExtendedKey, queryExpr, LocalStateQueryExpr, determineEraExpr, CardanoEra, CardanoEra(ConwayEra, ShelleyEra, AllegraEra, AlonzoEra, MaryEra, BabbageEra, ByronEra), shelleyBasedEra, IsCardanoEra, LocalTxMonitorClient(..), SlotNo, UnsupportedNtcVersionError)
Expand Down Expand Up @@ -249,51 +249,6 @@ newFaucetState fsConfig fsTxQueue = do
fsOwnAddress <- withExceptT FaucetErrorShelleyAddr $ AddressShelley <$> buildShelleyAddress (castVerificationKey pay_vkey) Nothing fsNetwork
pure $ FaucetState{..}

_newQueryClient :: Port -> FaucetConfigFile -> TQueue (TxInMode CardanoMode, ByteString) -> LocalStateQueryExpr block point (QueryInMode CardanoMode) r IO ()
_newQueryClient port config txQueue = do
rawEra <- determineEraExpr defaultCModeParams
withEra rawEra $ \era -> do
eFaucetState <- liftIO $ runExceptT $ newFaucetState config txQueue
let
faucetState = fromRight (Prelude.error "cant create state") eFaucetState
putStrLn $ "faucet address: " <> serialiseAddress (fsOwnAddress faucetState)
_child <- liftIO $ forkIO $ startApiServer era faucetState port
eUtxoResult <- queryExpr $ getUtxoQuery (fsOwnAddress faucetState) $ toEraInMode era CardanoMode
case eUtxoResult of
Right (Right result) -> do
let stats = computeUtxoStats (unUTxO result)
print stats
liftIO $ atomically $ putTMVar (fsUtxoTMVar faucetState) (unUTxO result)
putStrLn @Text "utxo set initialized"
Right (Left err) -> print err
Left err -> print err
case fcfMaxStakeKeyIndex config of
Just count -> do
let
manyStakeKeys :: Map StakeAddress (Word32, SigningKey StakeExtendedKey, StakeCredential)
manyStakeKeys = createManyStakeKeys (fsAcctKey faucetState) (fcfNetwork config) count
x :: [StakeCredential]
x = Map.elems $ map (\(_,_,v) -> v) manyStakeKeys
eResult <- queryExpr (queryManyStakeAddr (fcfNetwork config) (toEraInMode era CardanoMode) x)
print eResult
case eResult of
Right (Right result) -> do
let
(notRegistered, notDelegated, delegated) = sortStakeKeys result manyStakeKeys
case fcfDebug config of
True -> do
putStrLn $ format ("these stake key indexes are not registered: " % sh) notRegistered
putStrLn $ format ("these stake keys are registered and ready for use: " % sh) $ sort $ map (\(index,_skey,_vkey) -> index) notDelegated
putStrLn $ format ("these stake keys are delegated: " % sh) $ sort delegated
False -> do
putStrLn $ format (d % " stake keys not registered, " % d % " stake keys registered and ready for use, "%d%" stake keys delegated to pools") (length notRegistered) (length notDelegated) (length delegated)
liftIO $ atomically $ putTMVar (fsStakeTMVar faucetState) (notDelegated, delegated)
Right (Left err) -> print err
Left err -> print err
Nothing -> pure ()
pure ()
pure ()

finish :: IO (Net.Query.ClientStAcquired block point query IO ())
finish = do
void . forever $ threadDelay 43200 {- day in seconds -}
Expand Down
29 changes: 16 additions & 13 deletions cardano-faucet/src/Cardano/Faucet/Misc.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,28 @@

module Cardano.Faucet.Misc where

import Cardano.Api (ConsensusModeParams(CardanoModeParams), CardanoMode, EpochSlots(EpochSlots), AddressAny, parseAddressAny, TxOutValue(TxOutAdaOnly, TxOutValue), CardanoEra, EraInMode, toEraInMode, ConsensusMode(CardanoMode),AssetId(AdaAssetId), Quantity, valueToList)
import Cardano.Api.Shelley (Lovelace, selectLovelace, AssetId(AssetId))
import Cardano.Api (ConsensusModeParams(CardanoModeParams), EpochSlots(EpochSlots), AddressAny, parseAddressAny, TxOutValue(..), AssetId(AdaAssetId), Quantity, valueToList)
import qualified Cardano.Api.Ledger as L
import Cardano.Api.Shelley (selectLovelace, AssetId(AssetId))
import Cardano.Faucet.Types
import Cardano.Prelude
import Control.Monad.Trans.Except.Extra (left)
import Data.Text qualified as T
import Text.Parsec
import qualified Cardano.Api as Api

getValue :: TxOutValue era -> FaucetValue
getValue (TxOutAdaOnly _ ll) = Ada ll
getValue (TxOutValue _ val) = convertRemaining remaining
getValue (TxOutValueByron ll) = Ada ll
getValue (TxOutValueShelleyBased sbe val) = convertRemaining remaining
where
ll :: Lovelace
ll = selectLovelace val
apiValue = Api.fromLedgerValue sbe val
ll :: L.Coin
ll = selectLovelace apiValue
isntAda :: (AssetId, Quantity) -> Bool
isntAda (AdaAssetId, _) = False
isntAda (AssetId _ _, _) = True
remaining :: [(AssetId, Quantity)]
remaining = filter isntAda (valueToList val)
remaining = filter isntAda (valueToList apiValue)
convertRemaining :: [(AssetId, Quantity)] -> FaucetValue
convertRemaining [t] = FaucetValueMultiAsset ll (FaucetToken t)
convertRemaining [] = Ada ll
Expand All @@ -37,7 +40,7 @@ stripMintingTokens (FaucetValueMultiAsset ll (FaucetMintToken _)) = Ada ll
stripMintingTokens fv@(FaucetValueManyTokens _) = fv

-- returns just the lovelace component and ignores tokens
faucetValueToLovelace :: FaucetValue -> Lovelace
faucetValueToLovelace :: FaucetValue -> L.Coin
faucetValueToLovelace (Ada ll) = ll
faucetValueToLovelace (FaucetValueMultiAsset ll _token) = ll
faucetValueToLovelace (FaucetValueManyTokens ll) = ll
Expand All @@ -47,13 +50,13 @@ parseAddress addr = case parse (parseAddressAny <* eof) "" (T.unpack addr) of
Right a -> return $ a
Left e -> left $ FaucetWebErrorInvalidAddress addr (show e)

defaultCModeParams :: ConsensusModeParams CardanoMode
defaultCModeParams :: ConsensusModeParams
defaultCModeParams = CardanoModeParams (EpochSlots defaultByronEpochSlots)

defaultByronEpochSlots :: Word64
defaultByronEpochSlots = 21600

convertEra :: Monad m => CardanoEra era -> ExceptT FaucetWebError m (EraInMode era CardanoMode)
convertEra era = case (toEraInMode era CardanoMode) of
Just eraInMode -> pure eraInMode
Nothing -> left $ FaucetWebErrorEraConversion
-- convertEra :: Monad m => CardanoEra era -> ExceptT FaucetWebError m (EraInMode era CardanoMode)
-- convertEra era = case (toEraInMode era CardanoMode) of
-- Just eraInMode -> pure eraInMode
-- Nothing -> left $ FaucetWebErrorEraConversion
8 changes: 5 additions & 3 deletions cardano-faucet/src/Cardano/Faucet/TxUtils.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE OverloadedStrings #-}

Expand All @@ -12,7 +13,8 @@ import Cardano.Faucet.Utils
import Cardano.Prelude hiding ((%))
import Control.Monad.Trans.Except.Extra (left)
import Cardano.CLI.Types.Common
import Cardano.CLI.Legacy.Run.Transaction
import Cardano.CLI.EraBased.Run.Transaction
import Cardano.CLI.Types.Errors.TxCmdError
import qualified Cardano.Api.Ledger as L

getMintedValue :: TxMintValue BuildTx era -> Value
Expand Down Expand Up @@ -52,7 +54,7 @@ txBuild sbe (txin, txout) addressOrOutputs certs minting (Fee fixedFee) = do
<$> pure [(txin, BuildTxWith $ KeyWitness KeyWitnessForSpending)]
<*> pure TxInsCollateralNone
<*> pure TxInsReferenceNone
<*> mapM (\x -> withExceptT (FaucetWebErrorTodo . renderShelleyTxCmdError) $ toTxOutInAnyEra sbe x) (getTxOuts addressOrOutputs)
<*> mapM (\x -> withExceptT (FaucetWebErrorTodo . renderTxCmdError) $ toTxOutInAnyEra sbe x) (getTxOuts addressOrOutputs)
<*> pure TxTotalCollateralNone
<*> pure TxReturnCollateralNone
<*> validateTxFee era (Just fixedFee)
Expand Down Expand Up @@ -121,7 +123,7 @@ txSign :: IsShelleyBasedEra era
txSign txBody sks = tx
--let (sksByron, sksShelley) = partitionSomeWitnesses $ map categoriseSomeWitness sks
where
shelleyKeyWitnesses = map (makeShelleyKeyWitness txBody) sks
shelleyKeyWitnesses :: _ = map (makeShelleyKeyWitness txBody) sks
tx = makeSignedTransaction shelleyKeyWitnesses txBody

makeAndSignTx :: IsShelleyBasedEra era
Expand Down
14 changes: 7 additions & 7 deletions cardano-faucet/src/Cardano/Faucet/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import Prelude (fail)

import Cardano.Address.Derivation (Depth(RootK, AccountK, PaymentK, PolicyK), XPrv, genMasterKeyFromMnemonic, indexFromWord32, deriveAccountPrivateKey, deriveAddressPrivateKey, Index, DerivationType(Hardened, Soft))
import Cardano.Address.Style.Shelley (Shelley, Role(UTxOExternal, Stake), derivePolicyPrivateKey)
import Cardano.Api (AnyCardanoEra, IsCardanoEra, TxIn, TxOut, CtxUTxO, TxInMode, CardanoMode, TxId, FileError, Lovelace, AddressAny, AssetId(AssetId, AdaAssetId), Quantity, SigningKey, PaymentExtendedKey, VerificationKey, HashableScriptData)
import Cardano.Api (AnyCardanoEra, IsCardanoEra, TxIn, TxOut, CtxUTxO, TxInMode, TxId, FileError, AddressAny, AssetId(AssetId, AdaAssetId), Quantity, SigningKey, PaymentExtendedKey, VerificationKey, HashableScriptData)
import qualified Cardano.Api.Ledger as L
import Cardano.Api.Shelley (PoolId, StakeExtendedKey, StakeCredential, AssetName(..), NetworkId(Testnet, Mainnet), NetworkMagic(NetworkMagic), ShelleyWitnessSigningKey)
import Cardano.Api (InputDecodeError)
--import Cardano.CLI.Shelley.Run.Address (SomeAddressVerificationKey(AByronVerificationKey, APaymentVerificationKey, APaymentExtendedVerificationKey, AGenesisUTxOVerificationKey), ShelleyAddressCmdError, buildShelleyAddress)
Expand All @@ -35,7 +36,6 @@ import Data.Time.Clock (UTCTime, NominalDiffTime)
import Prelude (String, error, read)
import Servant (FromHttpApiData(parseHeader, parseQueryParam, parseUrlPiece))
import Web.Internal.FormUrlEncoded (ToForm(toForm), fromEntriesByKey)
import Cardano.CLI.Types.Errors.ShelleyAddressCmdError (ShelleyAddressCmdError)

-- the sitekey, secretkey, and token from recaptcha
newtype SiteKey = SiteKey { unSiteKey :: Text } deriving Show
Expand Down Expand Up @@ -63,7 +63,7 @@ data FaucetError = FaucetErrorSocketNotFound
| FaucetErrorConfigFileNotSet
| FaucetErrorBadMnemonic Text
| FaucetErrorBadIdx
| FaucetErrorShelleyAddr ShelleyAddressCmdError
| FaucetErrorShelleyAddr -- ShelleyAddressCmdError
| FaucetErrorTodo2 Text
deriving Generic

Expand All @@ -74,7 +74,7 @@ renderFaucetError (FaucetErrorParsingConfig err) = show err
renderFaucetError FaucetErrorConfigFileNotSet = "$CONFIG_FILE not set"
renderFaucetError (FaucetErrorBadMnemonic msg) = "bad mnemonic " <> msg
renderFaucetError FaucetErrorBadIdx = "bad index"
renderFaucetError (FaucetErrorShelleyAddr err) = show err
renderFaucetError (FaucetErrorShelleyAddr {-err-}) = undefined -- show err
renderFaucetError (FaucetErrorTodo2 err) = show err

-- errors that can be sent to the user
Expand All @@ -85,7 +85,7 @@ data FaucetWebError = FaucetWebErrorInvalidAddress Text Text
| FaucetWebErrorUtxoNotFound FaucetValue
| FaucetWebErrorEraConversion
| FaucetWebErrorTodo Text
| FaucetWebErrorFeatureMismatch AnyCardanoEra
| FaucetWebErrorFeatureMismatch -- AnyCardanoEra
| FaucetWebErrorConsensusModeMismatchTxBalance Text AnyCardanoEra
| FaucetWebErrorEraMismatch Text
| FaucetWebErrorAutoBalance Text
Expand All @@ -106,9 +106,9 @@ data ApiKey = Recaptcha Text | ApiKey Text deriving (Ord, Eq)
-- the state of the entire faucet
data IsCardanoEra era => FaucetState era = FaucetState
{ fsUtxoTMVar :: TMVar (Map TxIn (TxOut CtxUTxO era))
, fsStakeTMVar :: TMVar ([(Word32, SigningKey StakeExtendedKey, StakeCredential)], [(Word32, Lovelace, PoolId)])
, fsStakeTMVar :: TMVar ([(Word32, SigningKey StakeExtendedKey, StakeCredential)], [(Word32, L.Coin, PoolId)])
, fsNetwork :: NetworkId
, fsTxQueue :: TQueue (TxInMode CardanoMode, ByteString)
, fsTxQueue :: TQueue (TxInMode, ByteString)
, fsRootKey :: Shelley 'RootK XPrv
, fsPaymentSkey :: ShelleyWitnessSigningKey
, fsPaymentVkey :: VerificationKey PaymentExtendedKey
Expand Down
4 changes: 2 additions & 2 deletions cardano-faucet/src/Cardano/Faucet/Web.hs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@

module Cardano.Faucet.Web (userAPI, server, SiteVerifyRequest(..)) where

import Cardano.Api (CardanoEra, IsShelleyBasedEra, TxInMode(TxInMode), Lovelace(Lovelace), IsCardanoEra, TxCertificates(TxCertificatesNone), serialiseAddress, SigningKey(PaymentExtendedSigningKey), PaymentExtendedKey, makeStakeAddressPoolDelegationCertificate)
import Cardano.Api.Shelley (StakeCredential, PoolId, TxCertificates(TxCertificates), certificatesSupportedInEra, BuildTxWith(BuildTxWith), Witness(KeyWitness), KeyWitnessInCtx(KeyWitnessForStakeAddr), StakeExtendedKey, serialiseToBech32, AssetId(AssetId, AdaAssetId), PolicyId(PolicyId), serialiseToRawBytesHexText, AssetName(AssetName), TxMintValue(TxMintNone, TxMintValue), AddressAny, multiAssetSupportedInEra, valueFromList, ScriptWitness(SimpleScriptWitness), SimpleScript(RequireSignature), SimpleScriptOrReferenceInput(SScript), scriptLanguageSupportedInEra, ScriptLanguage(SimpleScriptLanguage), shelleyBasedEra, Tx, TxId, verificationKeyHash, getVerificationKey, castVerificationKey, VerificationKey, Quantity(Quantity), scriptPolicyId, TxOut(TxOut), TxOutValue(TxOutAdaOnly, TxOutValue), lovelaceToValue, negateValue, Value, BuildTx, CtxUTxO, WitCtxMint, Script(SimpleScript), SimpleScript, SimpleScript', ShelleyWitnessSigningKey(WitnessPaymentExtendedKey, WitnessStakeExtendedKey))
import Cardano.Api (CardanoEra, IsShelleyBasedEra, TxInMode(TxInMode), IsCardanoEra, TxCertificates(TxCertificatesNone), serialiseAddress, SigningKey(PaymentExtendedSigningKey), PaymentExtendedKey, makeStakeAddressPoolDelegationCertificate)
import Cardano.Api.Shelley (StakeCredential, PoolId, TxCertificates(TxCertificates), certificatesSupportedInEra, BuildTxWith(BuildTxWith), Witness(KeyWitness), KeyWitnessInCtx(KeyWitnessForStakeAddr), StakeExtendedKey, serialiseToBech32, AssetId(AssetId, AdaAssetId), PolicyId(PolicyId), serialiseToRawBytesHexText, AssetName(AssetName), TxMintValue(TxMintNone, TxMintValue), AddressAny, multiAssetSupportedInEra, valueFromList, ScriptWitness(SimpleScriptWitness), SimpleScript(RequireSignature), SimpleScriptOrReferenceInput(SScript), scriptLanguageSupportedInEra, ScriptLanguage(SimpleScriptLanguage), shelleyBasedEra, Tx, TxId, verificationKeyHash, getVerificationKey, castVerificationKey, VerificationKey, Quantity(Quantity), scriptPolicyId, TxOut(TxOut), TxOutValue(..), lovelaceToValue, negateValue, Value, BuildTx, CtxUTxO, WitCtxMint, Script(SimpleScript), SimpleScript, SimpleScript', ShelleyWitnessSigningKey(WitnessPaymentExtendedKey, WitnessStakeExtendedKey))
import Cardano.Faucet.Misc (convertEra, parseAddress, toFaucetValue, faucetValueToLovelace, stripMintingTokens)
import Cardano.Faucet.TxUtils (makeAndSignTx, Fee(..))
import Cardano.Faucet.Types (CaptchaToken, ForwardedFor(..), SendMoneyReply(..), DelegationReply(..), SiteVerifyReply(..), SiteVerifyRequest(..), SecretKey, FaucetState(..), ApiKeyValue(..), RateLimitResult(..), ApiKey(..), RateLimitAddress(..), UtxoStats(..), FaucetValue(..), FaucetConfigFile(..), FaucetWebError(..), SiteKey(..), SendMoneySent(..), FaucetToken(FaucetToken, FaucetMintToken), rootKeyToPolicyKey)
Expand Down

0 comments on commit 71b3c4f

Please sign in to comment.