Really Basic ReasonML web3 like interface
The goal is for this to support most common web3 functionality in ReasonML as well as some less common functionality that I need.
I am currently learning ReasonML and using this as an exercise at implementing something I understand fairly well (web3) using ReasonMl.
This means the API is likely going to change a lot as I learn more about idiomatic ReasonML and fix stupid beginners mistakes.
Setting up a Provider
There is currently support for the following providers that both live in the Providers
namespace:
Providers.web3(web3provider)
which wraps an existing web3 provider eg. MetaMaskProviders.http(url)
which is configured with a url to a http based provider like infura
Once you have a provider you pass it as a parameter to all the functions in the Eth
namespace.
let provider = Providers.http("https://mainnet.infura.io/bs-eth");netVersion(provider)|> Repromise.wait(result => switch (result) {| Ok(netId) => Js.log("we are on the " ++ string_of_int(netId) ++ " chain")| Error(msg) => Js.log(msg)});
Calling functions
All functions in the Eth
module return typed Belt.Result
in a Repromise. So instead of looking out for rejected calls, do a pattern match.
See the List of Methods implemented for more details.
Roadmap
- Fetch based https provider interface
- Wrap javascript Web3 provider (a la metamask)
- Most common JSON-RPC methods implemented (In bold below)
- Basic Documentation
- Solidity ABI codec in native reasonml
- Add support for WebSocket provider
- Filter support with support for some sort of reactive streams. Maybe wonka
- Implement complete wrappers for the JSON-RPC apps methods listed below
- EIP 712 support
- Add RLP encoder to be able to encode transactions for signing
- Allow signing in ReasonML using WASM
- Support for bs-native
Ethereum JSON-RPC Implemented Methods
The RPC methods currently implemented are:
-
eth_accounts
asaccounts()
-
eth_blockNumber
asblockNumber()
-
eth_call
ascall()
-
eth_coinbase
ascoinbase()
-
eth_estimateGas
asestimateGas()
-
eth_gasPrice
asgasPrice()
-
eth_getBalance
asbalanceOf()
-
eth_getBlockByNumber
asblockByNumber
-
eth_getBlockByHash
asblockByHash
-
eth_getBlockTransactionCountByHash
-
eth_getBlockTransactionCountByNumber
-
eth_getCode
-
eth_getCompilers
-
eth_getFilterChanges
-
eth_getFilterLogs
-
eth_getLogs
-
eth_getStorageAt
-
eth_getTransactionByHash
astransactionByHash()
-
eth_getTransactionByBlockHashAndIndex
-
eth_getTransactionByBlockNumberAndIndex
-
eth_getTransactionCount
astransactionCount()
-
eth_getTransactionReceipt
as `transactionReceipt() -
eth_hashrate
-
eth_mining
-
eth_newBlockFilter
-
eth_newFilter
(includes log/event filters) -
eth_protocolVersion
-
eth_sendTransaction
assendTransaction()
-
eth_sendRawTransaction
assendRawTransaction()
-
eth_subscribe
(only for websocket connections. "syncing" subscriptions are not yet supported) -
eth_unsubscribe
(only for websocket connections. "syncing" subscriptions are not yet supported) -
eth_syncing
-
eth_uninstallFilter
-
net_listening
-
net_peerCount
-
net_version
asnetVersion()
Non-Standard ganache-cli methods:
-
evm_snapshot
-
evm_revert
-
evm_increaseTime
-
evm_mine
asmineBlock()