Initial commit
This commit is contained in:
commit
1c4c8ce735
10 changed files with 210 additions and 0 deletions
4
.gitmodules
vendored
Normal file
4
.gitmodules
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
[submodule "zcash-haskell"]
|
||||||
|
path = zcash-haskell
|
||||||
|
url = https://git.vergara.tech/Vergara_Tech/zcash-haskell.git
|
||||||
|
branch = milestone2
|
10
CHANGELOG.md
Normal file
10
CHANGELOG.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## 0.1.0.0 -- 2024-08-27
|
||||||
|
|
||||||
|
* First version. Released on an unsuspecting world.
|
20
LICENSE
Normal file
20
LICENSE
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2024 Vergara Technologies LLC
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
6
README.md
Normal file
6
README.md
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# exblo-server
|
||||||
|
|
||||||
|
[![Please don't upload to GitHub](https://nogithub.codeberg.page/badge.svg)](https://nogithub.codeberg.page) ![](https://img.shields.io/badge/License-MIT-green
|
||||||
|
)
|
||||||
|
|
||||||
|
The back end API for the [exblo](https://testnet.exblo.app) Zcash block explorer.
|
8
app/Main.hs
Normal file
8
app/Main.hs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module Main where
|
||||||
|
|
||||||
|
import Network.Wai.Handler.Warp (run)
|
||||||
|
import Server
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
run 8032 exbloApp
|
16
cabal.project
Normal file
16
cabal.project
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
packages:
|
||||||
|
./*.cabal
|
||||||
|
zcash-haskell/*.cabal
|
||||||
|
|
||||||
|
with-compiler: ghc-9.6.5
|
||||||
|
|
||||||
|
source-repository-package
|
||||||
|
type: git
|
||||||
|
location: https://git.vergara.tech/Vergara_Tech/haskell-hexstring.git
|
||||||
|
tag: 39d8da7b11a80269454c2f134a5c834e0f3cb9a7
|
||||||
|
|
||||||
|
source-repository-package
|
||||||
|
type: git
|
||||||
|
location: https://git.vergara.tech/Vergara_Tech/haskell-foreign-rust.git
|
||||||
|
tag: 335e804454cd30da2c526457be37e477f71e4665
|
||||||
|
|
60
exblo-server.cabal
Normal file
60
exblo-server.cabal
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
cabal-version: 3.4
|
||||||
|
name: exblo-server
|
||||||
|
version: 0.1.0.0
|
||||||
|
-- synopsis:
|
||||||
|
-- description:
|
||||||
|
homepage: https://vergara.tech/exblo
|
||||||
|
license: MIT
|
||||||
|
license-file: LICENSE
|
||||||
|
author: Vergara Technologies LLC
|
||||||
|
maintainer: contact@vergara.tech
|
||||||
|
-- copyright:
|
||||||
|
category: Web
|
||||||
|
build-type: Simple
|
||||||
|
extra-doc-files: CHANGELOG.md
|
||||||
|
-- extra-source-files:
|
||||||
|
|
||||||
|
common warnings
|
||||||
|
ghc-options: -Wall
|
||||||
|
|
||||||
|
library
|
||||||
|
import: warnings
|
||||||
|
exposed-modules: Server
|
||||||
|
-- other-modules:
|
||||||
|
-- other-extensions:
|
||||||
|
build-depends:
|
||||||
|
base ^>=4.18.2.1
|
||||||
|
, servant-server
|
||||||
|
, hexstring
|
||||||
|
, text
|
||||||
|
, aeson
|
||||||
|
, base16-bytestring
|
||||||
|
, zcash-haskell
|
||||||
|
hs-source-dirs: src
|
||||||
|
default-language: GHC2021
|
||||||
|
|
||||||
|
executable exblo-server
|
||||||
|
import: warnings
|
||||||
|
main-is: Main.hs
|
||||||
|
-- other-modules:
|
||||||
|
-- other-extensions:
|
||||||
|
build-depends:
|
||||||
|
base ^>=4.18.2.1
|
||||||
|
, warp
|
||||||
|
, exblo-server
|
||||||
|
|
||||||
|
hs-source-dirs: app
|
||||||
|
pkgconfig-depends: rustzcash_wrapper
|
||||||
|
default-language: GHC2021
|
||||||
|
|
||||||
|
test-suite exblo-server-test
|
||||||
|
import: warnings
|
||||||
|
default-language: GHC2021
|
||||||
|
-- other-modules:
|
||||||
|
-- other-extensions:
|
||||||
|
type: exitcode-stdio-1.0
|
||||||
|
hs-source-dirs: test
|
||||||
|
main-is: Spec.hs
|
||||||
|
build-depends:
|
||||||
|
base ^>=4.18.2.1,
|
||||||
|
exblo-server
|
81
src/Server.hs
Normal file
81
src/Server.hs
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
{-# LANGUAGE TypeOperators #-}
|
||||||
|
{-# LANGUAGE DataKinds #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
{-# LANGUAGE UndecidableInstances #-}
|
||||||
|
|
||||||
|
module Server where
|
||||||
|
|
||||||
|
import Control.Monad.IO.Class (liftIO)
|
||||||
|
import Data.Aeson
|
||||||
|
import qualified Data.ByteString.Base16 as BS16 (decode)
|
||||||
|
import Data.HexString
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import qualified Data.Text.Encoding as TE
|
||||||
|
import Servant
|
||||||
|
import ZcashHaskell.Types
|
||||||
|
( RawZebraTx(..)
|
||||||
|
, Transaction(..)
|
||||||
|
, ZebraGetBlockChainInfo(..)
|
||||||
|
, ZebraTxResponse(..)
|
||||||
|
, fromRawOBundle
|
||||||
|
, fromRawSBundle
|
||||||
|
, fromRawTBundle
|
||||||
|
)
|
||||||
|
import ZcashHaskell.Utils (makeZebraCall, readZebraTransaction)
|
||||||
|
|
||||||
|
instance FromHttpApiData HexString where
|
||||||
|
parseUrlPiece s =
|
||||||
|
case BS16.decode (TE.encodeUtf8 s) of
|
||||||
|
Right s -> Right $ HexString s
|
||||||
|
Left e -> Left $ T.pack e
|
||||||
|
|
||||||
|
type ExbloAPI
|
||||||
|
= "getblock" :> Get '[ JSON] Int -- getblock
|
||||||
|
:<|> "gettransaction" :> Capture "txid" HexString :> Get
|
||||||
|
'[ JSON]
|
||||||
|
Transaction -- gettransaction
|
||||||
|
|
||||||
|
api :: Proxy ExbloAPI
|
||||||
|
api = Proxy
|
||||||
|
|
||||||
|
exbloServer :: Server ExbloAPI
|
||||||
|
exbloServer = handleAPI :<|> handleTx
|
||||||
|
where
|
||||||
|
handleAPI :: Handler Int
|
||||||
|
handleAPI = do
|
||||||
|
s <- liftIO $ makeZebraCall "localhost" 18232 "getblockchaininfo" []
|
||||||
|
case s of
|
||||||
|
Left e -> fail e
|
||||||
|
Right bci -> return $ zgb_blocks bci
|
||||||
|
handleTx :: HexString -> Handler Transaction
|
||||||
|
handleTx i = do
|
||||||
|
s <-
|
||||||
|
liftIO $
|
||||||
|
makeZebraCall
|
||||||
|
"localhost"
|
||||||
|
18232
|
||||||
|
"getrawtransaction"
|
||||||
|
[Data.Aeson.String $ toText i, Data.Aeson.Number 1]
|
||||||
|
case s of
|
||||||
|
Left e -> fail e
|
||||||
|
Right t ->
|
||||||
|
case readZebraTransaction (ztr_hex t) of
|
||||||
|
Nothing -> fail "Unable to parse transaction"
|
||||||
|
Just tx ->
|
||||||
|
return $
|
||||||
|
Transaction
|
||||||
|
i
|
||||||
|
(ztr_blockheight t)
|
||||||
|
(ztr_conf t)
|
||||||
|
(fromIntegral $ zt_expiry tx)
|
||||||
|
(fromRawTBundle $ zt_tBundle tx)
|
||||||
|
(fromRawSBundle $ zt_sBundle tx)
|
||||||
|
(fromRawOBundle $ zt_oBundle tx)
|
||||||
|
|
||||||
|
exbloApp :: Application
|
||||||
|
exbloApp = serve api exbloServer
|
4
test/Spec.hs
Normal file
4
test/Spec.hs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
module Main (main) where
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = putStrLn "Test suite not yet implemented."
|
1
zcash-haskell
Submodule
1
zcash-haskell
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 0b2fae2b5db6878b7669d639a5cb8c73b986906e
|
Loading…
Reference in a new issue