diff --git a/Makefile b/Makefile index 5943f32..8bb5f0c 100644 --- a/Makefile +++ b/Makefile @@ -28,4 +28,4 @@ haskell: src/ZcashHaskell/Orchard.hs src/ZcashHaskell/Sapling.hs src/ZcashHaskel stack build $(rustlib)/rustzcash_wrapper.h: librustzcash-wrapper/src/lib.rs librustzcash-wrapper/Cargo.toml - cd librustzcash-wrapper && cargo +nightly cbuild + cd librustzcash-wrapper && cargo +nightly-2024-02-04 cbuild diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..3f8a220 --- /dev/null +++ b/Setup.hs @@ -0,0 +1,95 @@ +import Data.Maybe (fromMaybe) +import Distribution.PackageDescription +import Distribution.Simple +import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), localPkgDescr) +import Distribution.Simple.PreProcess +import Distribution.Simple.Program.Find + ( defaultProgramSearchPath + , findProgramOnSearchPath + ) +import Distribution.Simple.Setup +import Distribution.Simple.Utils + ( IODataMode(IODataModeBinary) + , maybeExit + , rawSystemStdInOut + ) +import Distribution.Verbosity (Verbosity) +import qualified Distribution.Verbosity as Verbosity +import System.Directory (getCurrentDirectory) +import System.FilePath (()) + +main :: IO () +main = defaultMainWithHooks hooks + where + hooks = + simpleUserHooks + { preConf = + \_ flags -> do + rsMake (fromFlag $ configVerbosity flags) + pure emptyHookedBuildInfo + , hookedPreProcessors = knownSuffixHandlers + , confHook = \a flags -> confHook simpleUserHooks a flags >>= rsAddDirs + , postClean = \_ flags _ _ -> rsClean (fromFlag $ cleanVerbosity flags) + } + +rsFolder :: FilePath +rsFolder = "librustzcash-wrapper" + +execCargo :: Verbosity -> String -> [String] -> IO () +execCargo verbosity command args = do + cargoPath <- + findProgramOnSearchPath Verbosity.silent defaultProgramSearchPath "cargo" + dir <- getCurrentDirectory + let cargoExec = + case cargoPath of + Just (p, _) -> p + Nothing -> "cargo" + cargoArgs = command : args + workingDir = Just (dir rsFolder) + thirdComponent (_, _, c) = c + maybeExit . fmap thirdComponent $ + rawSystemStdInOut + verbosity + cargoExec + cargoArgs + workingDir + Nothing + Nothing + IODataModeBinary + +rsMake :: Verbosity -> IO () +rsMake verbosity = execCargo verbosity "+nightly-2024-02-04" ["cbuild"] + +rsAddDirs :: LocalBuildInfo -> IO LocalBuildInfo +rsAddDirs lbi' = do + dir <- getCurrentDirectory + let rustIncludeDir = + dir rsFolder "target/x86_64-unknown-linux-gnu/debug" + rustLibDir = dir rsFolder "target/x86_64-unknown-linux-gnu/debug" + updateLbi lbi = lbi {localPkgDescr = updatePkgDescr (localPkgDescr lbi)} + updatePkgDescr pkgDescr = + pkgDescr {library = updateLib <$> library pkgDescr} + updateLib lib = lib {libBuildInfo = updateLibBi (libBuildInfo lib)} + updateLibBi libBuild = + libBuild + { includeDirs = rustIncludeDir : includeDirs libBuild + , extraLibDirs = rustLibDir : extraLibDirs libBuild + } + pure $ updateLbi lbi' + +rsClean :: Verbosity -> IO () +rsClean verbosity = execCargo verbosity "clean" [] + +cabalFlag :: FlagName -> ConfigFlags -> Bool +cabalFlag name = + fromMaybe False . lookupFlagAssignment name . configConfigurationsFlags + +unlessFlagM :: FlagName -> ConfigFlags -> IO () -> IO () +unlessFlagM name flags action + | cabalFlag name flags = pure () + | otherwise = action + +applyUnlessM :: FlagName -> ConfigFlags -> (a -> IO a) -> a -> IO a +applyUnlessM name flags apply a + | cabalFlag name flags = pure a + | otherwise = apply a diff --git a/cabal.project b/cabal.project new file mode 100644 index 0000000..60a9728 --- /dev/null +++ b/cabal.project @@ -0,0 +1,12 @@ +packages: ./*.cabal +with-compiler: ghc-9.4.8 + +source-repository-package + type: git + location: https://git.vergara.tech/Vergara_Tech/haskell-foreign-rust.git + tag: 335e804454cd30da2c526457be37e477f71e4665 + +source-repository-package + type: git + location: https://git.vergara.tech/Vergara_Tech/haskell-hexstring.git + tag: fd1ddce73c0ad18a2a4509a299c6e93f8c6c383d diff --git a/librustzcash-wrapper/Cargo.toml b/librustzcash-wrapper/Cargo.toml index 7496e7c..cf068e4 100644 --- a/librustzcash-wrapper/Cargo.toml +++ b/librustzcash-wrapper/Cargo.toml @@ -4,6 +4,8 @@ version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type=["staticlib"] [dependencies] haskell-ffi.git = "https://github.com/BeFunctional/haskell-rust-ffi.git" diff --git a/package.yaml b/package.yaml deleted file mode 100644 index 1749c60..0000000 --- a/package.yaml +++ /dev/null @@ -1,58 +0,0 @@ -name: zcash-haskell -version: 0.4.2 -git: "https://git.vergara.tech/Vergara_Tech/zcash-haskell" -license: MIT -author: "Rene Vergara" -maintainer: "pitmutt@vergara.tech" -copyright: "(c)2022-2024 Vergara Technologies LLC" - -extra-source-files: -- README.md -- CHANGELOG.md -- configure - -# Metadata used when publishing your package -synopsis: Utilities to interact with the Zcash blockchain -category: Blockchain - -# To avoid duplicated efforts in documentation and dealing with the -# complications of embedding Haddock markup inside cabal files, it is -# common to point users to the README.md file. -description: Please see the README on the repo at - -dependencies: -- base >= 4.7 && < 5 - -library: - source-dirs: src - dependencies: - - bytestring - - borsh >= 0.2 - - text - - foreign-rust - - generics-sop - - aeson - - http-conduit - - base58-bytestring - - cryptonite - - memory - - hexstring - pkg-config-dependencies: - - rustzcash_wrapper-uninstalled - -tests: - zcash-haskell-test: - main: Spec.hs - source-dirs: test - ghc-options: - - -threaded - - -rtsopts - - -with-rtsopts=-N - dependencies: - - zcash-haskell - - hspec - - bytestring - - text - - aeson - - haskoin-core - - hexstring diff --git a/stack.yaml b/stack.yaml deleted file mode 100644 index b5b06a5..0000000 --- a/stack.yaml +++ /dev/null @@ -1,77 +0,0 @@ -# This file was automatically generated by 'stack init' -# -# Some commonly used options have been documented as comments in this file. -# For advanced use and comprehensive documentation of the format, please see: -# https://docs.haskellstack.org/en/stable/yaml_configuration/ - -# Resolver to choose a 'specific' stackage snapshot or a compiler version. -# A snapshot resolver dictates the compiler version and the set of packages -# to be used for project dependencies. For example: -# -# resolver: lts-3.5 -# resolver: nightly-2015-09-21 -# resolver: ghc-7.10.2 -# -# The location of a snapshot can be provided as a file or url. Stack assumes -# a snapshot provided as a file might change, whereas a url resource does not. -# -# resolver: ./custom-snapshot.yaml -# resolver: https://example.com/snapshots/2018-01-01.yaml -resolver: lts-21.22 - -# User packages to be built. -# Various formats can be used as shown in the example below. -# -# packages: -# - some-directory -# - https://example.com/foo/bar/baz-0.0.2.tar.gz -# subdirs: -# - auto-update -# - wai -packages: -- . -# Dependency packages to be pulled from upstream that are not in the resolver. -# These entries can reference officially published versions as well as -# forks / in-progress versions pinned to a git hash. For example: -# -extra-deps: -# - acme-missiles-0.3 - - git: https://git.vergara.tech/Vergara_Tech/haskell-foreign-rust.git - commit: 787c2e813eb3a5d16c375d4b37dfefbd2adcdf05 - - git: https://github.com/well-typed/borsh.git - commit: d2fcfa159e0a844b1ec5e8ed3e232d4b380fa831 - - git: https://git.vergara.tech/Vergara_Tech/haskell-hexstring.git - commit: fd1ddce73c0ad18a2a4509a299c6e93f8c6c383d - - vector-0.13.0.0@sha256:fa5cac81a17a5af388716792e8b99c24b3b66770086756d0d8b23f8272a0244c,9112 - - aeson-2.1.2.1@sha256:f10f3c661bd5cf57aee46b94420e47736240b8e209ac15f4bfc1a4e4d55831fa,6344 - - generically-0.1.1 - - semialign-1.2.0.1@sha256:ee3468e349e72ec0a604ae05573a4de7181d97d10366254244a0cca8a76d6c35,2852 - - strict-0.4.0.1@sha256:d6205a748eb8db4cd17a7179be970c94598809709294ccfa43159c7f3cc4bf5d,4187 - - these-1.1.1.1@sha256:2991c13e264b0c35c696c8f5f85c428c53bc42e93b1dfbd19a582052112d948a,2748 - - assoc-1.0.2@sha256:9decd0933cb6b903a40a8ace02d634bf90048ee2e5b0a514dccad7056c041881,1253 -# -# extra-deps: [] - -# Override default flag values for local packages and extra-deps -# flags: {} - -# Extra package databases containing global packages -# extra-package-dbs: [] - -# Control whether we use the GHC we find on the path -# system-ghc: true -# -# Require a specific version of Stack, using version ranges -# require-stack-version: -any # Default -# require-stack-version: ">=2.9" -# -# Override the architecture used by Stack, especially useful on Windows -# arch: i386 -# arch: x86_64 -# -# Extra directories used by Stack for building -# extra-include-dirs: [/path/to/dir] -# extra-lib-dirs: [/path/to/dir] -# -# Allow a newer minor version of GHC than the snapshot specifies -# compiler-check: newer-minor diff --git a/test/Spec.hs b/test/Spec.hs index c5aafdb..c387f83 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -32,7 +32,6 @@ import qualified Data.Text.Lazy.Encoding as LE import qualified Data.Text.Lazy.IO as LTIO import Data.Word import GHC.Float.RealFracMethods (properFractionDoubleInteger) -import Haskoin.Keys.Mnemonic import Test.Hspec import ZcashHaskell.Keys (generateWalletSeedPhrase, getWalletSeed) import ZcashHaskell.Orchard @@ -438,6 +437,15 @@ main = do let msg = maybe "" a_memo decryptedNote2 msg `shouldBe` "Hello World!\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL" + describe "Wallet seed phrase" $ do + it "Generate phrase" $ do + p <- generateWalletSeedPhrase + print p + BS.length p `shouldNotBe` 0 + it "Derive seed" $ do + p <- generateWalletSeedPhrase + let s = getWalletSeed p + maybe 0 BS.length s `shouldBe` 64 describe "Address tests" $ do it "Encode transparent" $ do let ua = diff --git a/zcash-haskell.cabal b/zcash-haskell.cabal index 3b60510..8f422e9 100644 --- a/zcash-haskell.cabal +++ b/zcash-haskell.cabal @@ -1,11 +1,11 @@ -cabal-version: 1.12 +cabal-version: 3.0 -- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack name: zcash-haskell -version: 0.4.2 +version: 0.4.2.1 synopsis: Utilities to interact with the Zcash blockchain description: Please see the README on the repo at category: Blockchain @@ -14,15 +14,17 @@ maintainer: pitmutt@vergara.tech copyright: (c)2022-2024 Vergara Technologies LLC license: MIT license-file: LICENSE -build-type: Simple -extra-source-files: +build-type: Custom +extra-doc-files: README.md CHANGELOG.md - configure -source-repository head - type: git - location: https://git.vergara.tech/Vergara_Tech/zcash-haskell +custom-setup + setup-depends: + base >= 4.7 && < 5 + , Cabal >= 3.0.0.0 + , directory >= 1.3.6.0 + , filepath >= 1.3.0.2 library exposed-modules: @@ -33,12 +35,8 @@ library ZcashHaskell.Transparent ZcashHaskell.Types ZcashHaskell.Utils - other-modules: - Paths_zcash_haskell hs-source-dirs: src - pkgconfig-depends: - rustzcash_wrapper-uninstalled build-depends: aeson , base >=4.7 && <5 @@ -48,17 +46,17 @@ library , cryptonite , foreign-rust , generics-sop - , hexstring + , hexstring >=0.12 , http-conduit , memory , text - default-language: Haskell2010 + build-tool-depends: + c2hs:c2hs + default-language: GHC2021 test-suite zcash-haskell-test type: exitcode-stdio-1.0 main-is: Spec.hs - other-modules: - Paths_zcash_haskell hs-source-dirs: test ghc-options: -threaded -rtsopts -with-rtsopts=-N @@ -71,4 +69,5 @@ test-suite zcash-haskell-test , hspec , text , zcash-haskell - default-language: Haskell2010 + extra-libraries: rustzcash_wrapper + default-language: GHC2021