mirror of
https://github.com/airalab/hs-web3.git
synced 2024-10-04 04:07:20 +03:00
Fix build on stackage nightly & lts-11
This commit is contained in:
parent
884ba7a930
commit
e14c2c6155
12
.travis.yml
12
.travis.yml
@ -16,8 +16,6 @@ cache:
|
||||
matrix:
|
||||
include:
|
||||
# Build with different GHC versions
|
||||
- env: RESOLVER=lts-9.21
|
||||
compiler: ": #GHC 8.0.2"
|
||||
- env: RESOLVER=lts-11.22
|
||||
compiler: ": #GHC 8.2.2"
|
||||
- env: RESOLVER=lts-12.14
|
||||
@ -26,9 +24,6 @@ matrix:
|
||||
compiler: ": #GHC 8.6.1"
|
||||
|
||||
# Build on macOS in addition to Linux
|
||||
- env: RESOLVER=lts-9.21
|
||||
compiler: ": #GHC 8.0.2"
|
||||
os: osx
|
||||
- env: RESOLVER=lts-11.22
|
||||
compiler: ": #GHC 8.2.2"
|
||||
os: osx
|
||||
@ -39,6 +34,9 @@ matrix:
|
||||
compiler: ": #GHC 8.6.1"
|
||||
os: osx
|
||||
|
||||
install:
|
||||
- curl -sSL https://get.haskellstack.org/ | sh -s - -d .
|
||||
- ./stack --version
|
||||
|
||||
script:
|
||||
- nix-shell -p stack --run \
|
||||
"stack test web3:unit --flag web3:solidity --nix --no-terminal --haddock --no-haddock-deps --resolver $RESOLVER"
|
||||
- ./stack test web3:unit --flag web3:solidity --nix --no-terminal --haddock --no-haddock-deps --resolver $RESOLVER
|
||||
|
@ -23,6 +23,7 @@ All notable changes to this project will be documented in this file.
|
||||
- Solidity related data types and codecs moved to Data.Solidity
|
||||
- Solidity related parsers and compiler moved to Language.Solidity
|
||||
- Modules in Network.Ethereum.Web3 moved to Network.Ethereum.Api
|
||||
- fromWei/toWei from `Unit` typeclass now operates over `Integral`
|
||||
|
||||
### Removed
|
||||
- `convert` function from `Unit` typeclass
|
||||
|
77
README.md
77
README.md
@ -6,43 +6,74 @@ The Haskell Ethereum API which implements the [Generic JSON RPC](https://github.
|
||||
[![Documentation Status](https://readthedocs.org/projects/hs-web3/badge/?version=latest)](https://hs-web3.readthedocs.io/en/latest/?badge=latest)
|
||||
[![Build Status](https://travis-ci.org/airalab/hs-web3.svg?branch=master)](https://travis-ci.org/airalab/hs-web3)
|
||||
[![Hackage](https://img.shields.io/hackage/v/web3.svg)](http://hackage.haskell.org/package/web3)
|
||||
![Haskell Programming Language](https://img.shields.io/badge/language-Haskell-blue.svg)
|
||||
[![LTS-12](http://stackage.org/package/web3/badge/lts-12)](http://stackage.org/lts-12/package/web3)
|
||||
[![nightly](http://stackage.org/package/web3/badge/nightly)](http://stackage.org/nightly/package/web3)
|
||||
[![Code Triagers](https://www.codetriage.com/airalab/hs-web3/badges/users.svg)](https://www.codetriage.com/airalab/hs-web3)
|
||||
![BSD3 License](http://img.shields.io/badge/license-BSD3-brightgreen.svg)
|
||||
[![Code Triagers Badge](https://www.codetriage.com/airalab/hs-web3/badges/users.svg)](https://www.codetriage.com/airalab/hs-web3)
|
||||
|
||||
Installation
|
||||
------------
|
||||
Install
|
||||
-------
|
||||
|
||||
Using [Stackage](https://docs.haskellstack.org):
|
||||
`stack install web3`
|
||||
|
||||
stack install web3
|
||||
Usage
|
||||
-----
|
||||
|
||||
Quick start
|
||||
-----------
|
||||
```haskell
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
module Main where
|
||||
|
||||
Lets import library entrypoint modules using `ghci`:
|
||||
-- Basic imports
|
||||
import Network.Ethereum.Web3
|
||||
|
||||
> import Network.Ethereum.Web3
|
||||
> import qualified Network.Ethereum.Api.Web3 as Web3
|
||||
-- Eth API support
|
||||
import qualified Network.Ethereum.Api.Eth as Eth
|
||||
import Network.Ethereum.Api.Types
|
||||
|
||||
> We recomends to import `Network.Ethereun.Api.Web3` as **qualified**, because it has name similar to their prefix in JSON-RPC API.
|
||||
-- ENS support
|
||||
import qualified Network.Ethereum.Ens as Ens
|
||||
|
||||
Looks anything in `Web3` API:
|
||||
-- Lens to simple param setting
|
||||
import Lens.Micro ((.~))
|
||||
|
||||
> :t Web3.clientVersion
|
||||
Web3.clientVersion :: JsonRpc m => m Text
|
||||
main :: IO ()
|
||||
main = do
|
||||
-- Use default provider on http://localhost:8545
|
||||
ret <- runWeb3 $ do
|
||||
|
||||
To run it use `Web3` provider monad:
|
||||
-- Get address of default account
|
||||
me <- head <$> Eth.accounts
|
||||
|
||||
> :t runWeb3
|
||||
runWeb3 :: MonadIO m => Web3 a -> m (Either Web3Error a)
|
||||
-- Get balance of default account on latest block
|
||||
myBalance <- Eth.getBalance me Latest
|
||||
|
||||
> runWeb3 Web3.clientVersion
|
||||
Right "Parity-Ethereum//v2.0.3-unstable/x86_64-linux-gnu/rustc1.29.0"
|
||||
-- Get half of balance
|
||||
let halfBalance = fromWei (myBalance / 2)
|
||||
|
||||
> Function `runWeb3` use default provider at `http://localhost:8545`, for using custom providers try `runweb3'`.
|
||||
-- Use default account
|
||||
withAccount () $ do
|
||||
-- Get Ethereum address via ENS
|
||||
alice <- Ens.resolve "alice.address.on.eth"
|
||||
bob <- Ens.resolve "bob.address.on.eth"
|
||||
|
||||
-- Send transaction with value
|
||||
withParam (value .~ halfBalance) $ do
|
||||
|
||||
-- Send transaction to alice account
|
||||
withParam (to .~ alice) $ send ()
|
||||
|
||||
-- Send transaction to bob account
|
||||
withParam (to .~ bob) $ send ()
|
||||
|
||||
-- Return sended value
|
||||
return halfBalance
|
||||
|
||||
-- Web3 error handling
|
||||
case ret of
|
||||
Left e -> error $ show e
|
||||
Right v -> print (v :: Ether) -- Print returned value in ethers
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
See [documentation](https://hs-web3.readthedocs.io) for other examples.
|
||||
|
||||
Read more in the [documentation on ReadTheDocs](https://hs-web3.readthedocs.io).
|
||||
|
10
package.yaml
10
package.yaml
@ -3,7 +3,7 @@ version: 0.8.0.0
|
||||
synopsis: Ethereum API for Haskell
|
||||
description: Web3 is a Haskell client library for Ethereum
|
||||
github: "airalab/hs-web3"
|
||||
license: BSD3
|
||||
license: BSD-3-Clause
|
||||
license-file: LICENSE
|
||||
author: Alexander Krupenkin
|
||||
maintainer: mail@akru.me
|
||||
@ -13,6 +13,7 @@ category: Network
|
||||
extra-source-files:
|
||||
- README.md
|
||||
- CHANGELOG.md
|
||||
- stack.yaml
|
||||
- examples/token/ERC20.hs
|
||||
- examples/token/ERC20.json
|
||||
- examples/token/Main.hs
|
||||
@ -23,7 +24,7 @@ extra-source-files:
|
||||
|
||||
dependencies:
|
||||
- base >4.9 && <4.13
|
||||
- secp256k1-haskell >=0.1.3 && <0.2
|
||||
- secp256k1-haskell >=0.1.4 && <0.2
|
||||
- http-client-tls >=0.3.5.1 && <0.4
|
||||
- template-haskell >=2.11.1.0 && <2.15
|
||||
- microlens-aeson >=2.2.0.2 && <2.4
|
||||
@ -46,7 +47,7 @@ dependencies:
|
||||
- memory >=0.14.11 && <0.15
|
||||
- cereal >=0.5.4.0 && <0.6
|
||||
- aeson >=1.1.2.0 && <1.5
|
||||
- vinyl >=0.5.3 && <0.11
|
||||
- vinyl >=0.5.3 && <0.10
|
||||
- async >=2.1.1.1 && <2.3
|
||||
- text >=1.2.2.2 && <1.3
|
||||
- mtl >=2.2.1 && <2.3
|
||||
@ -98,7 +99,8 @@ library:
|
||||
cpp-options: -DSOLIDITY_COMPILER
|
||||
dependencies: containers
|
||||
extra-libraries: solidity
|
||||
c-sources: ./cbits/solidity_lite.cpp
|
||||
cxx-options: -std=c++14
|
||||
cxx-sources: ./cbits/solidity_lite.cpp
|
||||
include-dirs: ./cbits
|
||||
|
||||
tests:
|
||||
|
@ -44,6 +44,7 @@ import qualified Data.ByteString as BS (take, unpack)
|
||||
import qualified Data.ByteString.Char8 as C8 (drop, length, pack, unpack)
|
||||
import qualified Data.Char as C (toLower, toUpper)
|
||||
import Data.Default (Default (..))
|
||||
import Data.Monoid ((<>))
|
||||
import Data.String (IsString (..))
|
||||
import Data.Text.Encoding as T (encodeUtf8)
|
||||
import Generics.SOP (Generic)
|
||||
|
@ -21,6 +21,7 @@ module Language.Solidity.Compiler where
|
||||
|
||||
import Data.ByteString (ByteString)
|
||||
import Data.Map (Map)
|
||||
import Data.Semigroup (Semigroup (..))
|
||||
import qualified Language.Solidity.Compiler.Foreign as FFI
|
||||
import System.IO.Unsafe (unsafePerformIO)
|
||||
|
||||
@ -40,6 +41,7 @@ instance Semigroup Sources where
|
||||
(optimization a || optimization b)
|
||||
|
||||
instance Monoid Sources where
|
||||
mappend = (<>)
|
||||
mempty = Sources mempty mempty False
|
||||
|
||||
type Compiled = Map ByteString (ByteString, ByteString)
|
||||
|
@ -23,6 +23,7 @@ import Control.Monad.State.Strict (get, runStateT)
|
||||
import Control.Monad.Trans (MonadTrans (..))
|
||||
import qualified Data.ByteArray as BA (convert)
|
||||
import Data.Maybe (listToMaybe)
|
||||
import Data.Monoid ((<>))
|
||||
import Data.Proxy (Proxy (..))
|
||||
|
||||
import Data.Solidity.Abi.Codec (decode, encode)
|
||||
|
@ -24,6 +24,7 @@ import Control.Monad.State.Strict (get, runStateT)
|
||||
import Control.Monad.Trans (lift)
|
||||
import qualified Data.ByteArray as BA (convert)
|
||||
import Data.Default (Default (..))
|
||||
import Data.Monoid ((<>))
|
||||
import Data.Proxy (Proxy (..))
|
||||
|
||||
import Data.Solidity.Abi.Codec (decode, encode)
|
||||
|
@ -27,7 +27,7 @@ import Data.ByteString (ByteString)
|
||||
import Data.ByteString.Short (fromShort)
|
||||
import Data.Default (Default (..))
|
||||
import Data.Maybe (fromJust, fromMaybe)
|
||||
import Data.Monoid (mempty)
|
||||
import Data.Monoid (mempty, (<>))
|
||||
import Data.Proxy (Proxy (..))
|
||||
import Data.RLP (packRLP, rlpEncode)
|
||||
|
||||
|
@ -25,6 +25,7 @@ import Control.Concurrent (threadDelay)
|
||||
import Control.Exception (Exception, throwIO)
|
||||
import Control.Monad.IO.Class (liftIO)
|
||||
import Data.Either (lefts, rights)
|
||||
|
||||
import Data.Solidity.Event (DecodeEvent (..))
|
||||
import qualified Network.Ethereum.Api.Eth as Eth
|
||||
import Network.Ethereum.Api.Provider (Web3)
|
||||
|
@ -65,12 +65,19 @@ import Data.Maybe (catMaybes, fromJust,
|
||||
listToMaybe)
|
||||
import Data.Monoid ((<>))
|
||||
import Data.Proxy (Proxy (..))
|
||||
import Data.Tagged (Tagged (..))
|
||||
import Data.Vinyl (Rec ((:&), RNil),
|
||||
RecApplicative)
|
||||
import Data.Vinyl.CoRec (CoRec (..), Field,
|
||||
FoldRec, Handler (H),
|
||||
Handlers, coRecToRec,
|
||||
firstField, match,
|
||||
onField)
|
||||
import Data.Vinyl.Functor (Compose (..),
|
||||
Identity (..))
|
||||
import Data.Vinyl.TypeLevel (AllAllSat)
|
||||
|
||||
import Data.Solidity.Event (DecodeEvent (..))
|
||||
import Data.Tagged
|
||||
import Data.Vinyl
|
||||
import Data.Vinyl.CoRec
|
||||
import Data.Vinyl.Functor
|
||||
import Data.Vinyl.TypeLevel
|
||||
import qualified Network.Ethereum.Api.Eth as Eth
|
||||
import Network.Ethereum.Api.Provider (Web3, forkWeb3)
|
||||
import Network.Ethereum.Api.Types (Change (..),
|
||||
|
@ -46,6 +46,7 @@ import Data.Machine (MachineT, asParts,
|
||||
unfoldPlan, (~>))
|
||||
import Data.Machine.Plan (PlanT, stop, yield)
|
||||
import Data.Maybe (catMaybes, listToMaybe)
|
||||
|
||||
import Data.Solidity.Event (DecodeEvent (..))
|
||||
import qualified Network.Ethereum.Api.Eth as Eth
|
||||
import Network.Ethereum.Api.Provider (Web3, forkWeb3)
|
||||
|
@ -24,6 +24,7 @@ import Data.ByteArray (convert, zero)
|
||||
import Data.ByteArray.Sized (unsafeFromByteArrayAccess)
|
||||
import Data.ByteString (ByteString)
|
||||
import Data.ByteString.Char8 (split)
|
||||
import Data.Monoid ((<>))
|
||||
import Lens.Micro ((.~))
|
||||
|
||||
import Data.Solidity.Prim (Address, BytesN)
|
||||
|
@ -74,10 +74,10 @@ import qualified Text.Read.Lex as L
|
||||
-- | Ethereum value unit
|
||||
class (Read a, Show a, UnitSpec a, Fractional a) => Unit a where
|
||||
-- | Make a value from integer wei
|
||||
fromWei :: Integer -> a
|
||||
fromWei :: Integral b => b -> a
|
||||
|
||||
-- | Convert a value to integer wei
|
||||
toWei :: a -> Integer
|
||||
toWei :: Integral b => a -> b
|
||||
|
||||
-- | Unit specification
|
||||
class UnitSpec a where
|
||||
@ -92,8 +92,8 @@ mkValue :: forall a b . (UnitSpec a, RealFrac b) => b -> Value a
|
||||
mkValue = MkValue . round . (* divider (Proxy :: Proxy a))
|
||||
|
||||
instance UnitSpec a => Unit (Value a) where
|
||||
fromWei = MkValue
|
||||
toWei = unValue
|
||||
fromWei = MkValue . toInteger
|
||||
toWei = fromInteger . unValue
|
||||
|
||||
instance UnitSpec a => UnitSpec (Value a) where
|
||||
divider = const $ divider (Proxy :: Proxy a)
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
|
||||
resolver: lts-12.12
|
||||
resolver: lts-12.14
|
||||
|
||||
# User packages to be built.
|
||||
packages:
|
||||
@ -7,8 +7,9 @@ packages:
|
||||
|
||||
# Extra package dependencies
|
||||
extra-deps:
|
||||
- secp256k1-haskell-0.1.3
|
||||
- secp256k1-haskell-0.1.4
|
||||
- relapse-1.0.0.0
|
||||
- vinyl-0.9.3
|
||||
|
||||
# Dependencies bounds
|
||||
pvp-bounds: both
|
||||
|
@ -31,8 +31,9 @@ import Control.Concurrent.MVar
|
||||
import Control.Monad.IO.Class (liftIO)
|
||||
import Control.Monad.Trans.Class (lift)
|
||||
import Control.Monad.Trans.Reader (ask)
|
||||
import Data.Default
|
||||
import Data.Default (def)
|
||||
import Data.List (sort)
|
||||
import Data.Monoid ((<>))
|
||||
import Test.Hspec
|
||||
|
||||
import qualified Network.Ethereum.Api.Eth as Eth
|
||||
|
Loading…
Reference in New Issue
Block a user