bs-eth v0.3.0
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_accountsasaccounts()eth_blockNumberasblockNumber()eth_callascall()eth_coinbaseascoinbase()eth_estimateGasasestimateGas()eth_gasPriceasgasPrice()eth_getBalanceasbalanceOf()eth_getBlockByNumberasblockByNumbereth_getBlockByHashasblockByHasheth_getBlockTransactionCountByHasheth_getBlockTransactionCountByNumbereth_getCodeeth_getCompilerseth_getFilterChangeseth_getFilterLogseth_getLogseth_getStorageAteth_getTransactionByHashastransactionByHash()eth_getTransactionByBlockHashAndIndexeth_getTransactionByBlockNumberAndIndexeth_getTransactionCountastransactionCount()eth_getTransactionReceiptas `transactionReceipt()eth_hashrateeth_miningeth_newBlockFiltereth_newFilter(includes log/event filters)eth_protocolVersioneth_sendTransactionassendTransaction()eth_sendRawTransactionassendRawTransaction()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_syncingeth_uninstallFilternet_listeningnet_peerCountnet_versionasnetVersion()
Non-Standard ganache-cli methods:
evm_snapshotevm_revertevm_increaseTimeevm_mineasmineBlock()