{-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} module Main ( main ) where import Control.Concurrent import Control.Monad (when) import Control.Monad.IO.Class (MonadIO (..)) import Data.Aeson (Result (..), fromJSON) import Data.Monoid (Last (..)) import Data.Proxy (Proxy (..)) import Data.Text (pack) import Data.UUID import Ledger.Value (flattenValue) import Network.HTTP.Req import Plutus.PAB.Events.ContractInstanceState (PartiallyDecodedResponse (..)) import Plutus.PAB.Webserver.Types import System.Environment (getArgs) import Week06.Oracle.PAB (OracleContracts) main :: IO () main = do [(i :: Int)] <- map read <$> getArgs uuid <- read <$> readFile ('W' : show i ++ ".cid") putStrLn $ "swap contract instance id for Wallet " ++ show i ++ ": " ++ show uuid getFunds uuid getFunds :: UUID -> IO () getFunds uuid = runReq defaultHttpConfig $ do v <- req POST (http "127.0.0.1" /: "api" /: "new" /: "contract" /: "instance" /: pack (show uuid) /: "endpoint" /: "funds") (ReqBodyJson ()) (Proxy :: Proxy (JsonResponse ())) (port 8080) if responseStatusCode v /= 200 then liftIO $ putStrLn "error getting funds" else do w <- req GET (http "127.0.0.1" /: "api" /: "new" /: "contract" /: "instance" /: pack (show uuid) /: "status") NoReqBody (Proxy :: Proxy (JsonResponse (ContractInstanceClientState OracleContracts))) (port 8080) liftIO $ putStrLn $ case fromJSON $ observableState $ cicCurrentState $ responseBody w of Success (Last (Just f)) -> "fund: " ++ show (flattenValue f) _ -> "error decoding state" {- liftIO $ putStrLn $ if responseStatusCode v == 200 then "updated oracle to " ++ show x else "error updating oracle" -} {- updateOracle :: UUID -> Integer -> IO () updateOracle uuid x = runReq defaultHttpConfig $ do v <- req POST (http "127.0.0.1" /: "api" /: "new" /: "contract" /: "instance" /: pack (show uuid) /: "endpoint" /: "update") (ReqBodyJson x) (Proxy :: Proxy (JsonResponse ())) (port 8080) liftIO $ putStrLn $ if responseStatusCode v == 200 then "updated oracle to " ++ show x else "error updating oracle" getExchangeRate :: IO Integer getExchangeRate = runReq defaultHttpConfig $ do v <- req GET (https "coinmarketcap.com" /: "currencies" /: "cardano") NoReqBody bsResponse mempty let priceRegex = "priceValue___11gHJ\">\\$([\\.0-9]*)" :: ByteString (_, _, _, [bs]) = responseBody v =~ priceRegex :: (ByteString, ByteString, ByteString, [ByteString]) d = read $ unpack bs :: Double x = round $ 1_000_000 * d liftIO $ putStrLn $ "queried exchange rate: " ++ show d return x -}