class SubstrateClient

Attributes

metadata[R]
spec_name[R]
spec_version[R]

Public Class Methods

new(url) click to toggle source
# File lib/substrate_client.rb, line 38
def initialize(url)
  @url = url
  @request_id = 1
  @metadata_cache = {}
  init_types_and_metadata
end

Public Instance Methods

compose_call(module_name, call_name, params, block_hash=nil) click to toggle source

compose_call “Balances”, “Transfer”, { dest: “0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409”, value: 1_000_000_000_000 }

# File lib/substrate_client.rb, line 164
def compose_call(module_name, call_name, params, block_hash=nil)
  self.init_types_and_metadata(block_hash)
  SubstrateClient::Helper.compose_call_from_metadata(@metadata, module_name, call_name, params)
end
generate_storage_hash_from_data(storage_hex_data) click to toggle source
# File lib/substrate_client.rb, line 169
def generate_storage_hash_from_data(storage_hex_data)
  "0x" + Crypto.blake2_256(Scale::Bytes.new(storage_hex_data).bytes)
end
generate_storage_key(module_name, storage_name, params = nil, block_hash = nil) click to toggle source
# File lib/substrate_client.rb, line 158
def generate_storage_key(module_name, storage_name, params = nil, block_hash = nil)
  self.init_types_and_metadata(block_hash)
  SubstrateClient::Helper.generate_storage_key_from_metadata(@metadata, module_name, storage_name, params)
end
get_block(block_hash=nil) click to toggle source
# File lib/substrate_client.rb, line 120
def get_block(block_hash=nil)
  self.init_types_and_metadata(block_hash)
  block = self.chain_getBlock(block_hash)
  SubstrateClient::Helper.decode_block(block)
rescue => ex
  Scale::Types.logger.error ex
  Scale::Types.logger.error ex.backtrace.join("\n\t")
end
get_block_events(block_hash=nil) click to toggle source
# File lib/substrate_client.rb, line 129
def get_block_events(block_hash=nil)
  self.init_types_and_metadata(block_hash)

  storage_key =  "0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7"
  events_data = state_getStorage storage_key, block_hash

  scale_bytes = Scale::Bytes.new(events_data)
  decoded = Scale::Types.get("Vec<EventRecord>").decode(scale_bytes).to_human
  [events_data, decoded]
end
get_block_number(block_hash) click to toggle source
# File lib/substrate_client.rb, line 110
def get_block_number(block_hash)
  header = self.chain_getHeader(block_hash)
  header["number"].to_i(16)
end
get_metadata(block_hash=nil) click to toggle source
# File lib/substrate_client.rb, line 115
def get_metadata(block_hash=nil)
  self.init_types_and_metadata(block_hash)
  @metadata
end
get_metadata_from_cache(spec_version) click to toggle source
# File lib/substrate_client.rb, line 88
def get_metadata_from_cache(spec_version)

end
get_storage(module_name, storage_name, params = nil, block_hash = nil) click to toggle source
# File lib/substrate_client.rb, line 140
def get_storage(module_name, storage_name, params = nil, block_hash = nil)
  self.init_types_and_metadata(block_hash)

  storage_key, return_type, storage_item = SubstrateClient::Helper.generate_storage_key_from_metadata(@metadata, module_name, storage_name, params)

  data = self.state_getStorage(storage_key, block_hash)

  if data.nil?
    return if storage_item[:modifier] == "Optional"

    data = storage_item[:fallback]
  end

  bytes = Scale::Bytes.new(data)
  type = Scale::Types.get(return_type)
  type.decode(bytes)
end
init_types_and_metadata(block_hash=nil) click to toggle source
# File lib/substrate_client.rb, line 61
def init_types_and_metadata(block_hash=nil)
  runtime_version = self.state_getRuntimeVersion(block_hash)
  spec_name = runtime_version["specName"].downcase
  spec_version = runtime_version["specVersion"]

  registry = Scale::TypeRegistry.instance

  # load types
  if registry.types == nil
    registry.load(spec_name: spec_name)
  end
  registry.spec_version = spec_version

  # set current metadata
  metadata = @metadata_cache[spec_version]
  if metadata.nil?
    hex = self.state_getMetadata(block_hash)
    metadata = Scale::Types::Metadata.decode(Scale::Bytes.new(hex))
    @metadata_cache[spec_version] = metadata
  end

  @metadata = metadata
  registry.metadata = metadata

  true
end
invoke(method, *params) click to toggle source
# File lib/substrate_client.rb, line 92
def invoke(method, *params)
  request(method, params)
end
method_missing(method, *args) click to toggle source

################################################ origin rpc methods ################################################

# File lib/substrate_client.rb, line 99
def method_missing(method, *args)
  invoke method, *args
end
methods() click to toggle source

################################################ custom methods based on origin rpc methods ################################################

# File lib/substrate_client.rb, line 106
def methods
  invoke("rpc_methods")["methods"]
end
request(method, params) click to toggle source
# File lib/substrate_client.rb, line 45
def request(method, params)
  payload = {
    "jsonrpc" => "2.0",
    "method" => method,
    "params" => params,
    "id" => @request_id
  }

  data = ws_request(@url, payload)
  if data["error"]
    raise RpcError, data["error"]
  else
    data["result"]
  end
end