Etherpc
Idiomatic Ethereum/Infura JSON-RPC client for Crystal, supporting WebSockets and subscriptions.
Below is the aspirational API and doesn't work yet.
client = Etherpc::WebSocketClient.new "wss://mainnet.infura.io/ws/v3/#{PROJECT_ID}"
price = client.gas_price
puts "Gas costs #{price.to_gwei} gwei"
token = Etherpc::Contracts::Erc20 "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", client
balance = token.balance_of "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8"
puts "You have #{balance} #{token.symbol}"
number_of_messages = 0
client.new_heads do |subscription|
    subscription.each_event do |event|
        number_of_messages += 1
        subscription.cancel if number_of_messages == 10
    end
end
Examples
Examples can be found in the examples folder.
To run them, do:
$ crystal run examples/basic.cr -- [endpoint] [address] [token address]
Roadmap
High-priority items that need to be done before v0.1:
- [ ] Refactor subscription API
 - [ ] HTTP transport
 - [ ] Helper factories to create clients with a given transport
 - [ ] Support for most of the geth/Infura RPC calls
 - [ ] Thorough specs
 - [ ] Error handling
 
Longer term:
- [ ] Contract ABI support
 - [ ] Use mappings for deserialization
 - [ ] Move common internal functions into 
util.cr - [ ] 
to_ether/to_gwei/to_bloom_filterutility functions - [ ] Infura authenticated endpoint helpers
 - [ ] 
parity_subscribesupport - [ ] Possibly high-level account/wallet API