Skip to content
  1. Sep 17, 2020
  2. Sep 14, 2020
    • Svyatoslav Nikolsky's avatar
      Prepare separate runtime for testing sub2sub bridge (#341) · e31eada2
      Svyatoslav Nikolsky authored
      * renamed bin/node/runtime to bin/node/rialto-runtime
      
      * replaced bridge-node-runtime references with rialto-runtime references
      
      * separate folders for millau/rialto nodes+runtimes
      
      * extracted pallet-shift-session-manager
      
      * bridge-node -> bridge-node-runtime
      
      * uninstall previous rust (temp solution???)
      
      * fix dockerfile
      
      * cargo fmt
      
      * fix benchmarks check
      
      * fix benchmarks again
      
      * update LAST_RUST_UPDATE to clear the cache
      
      * changed runtime comments
      
      * move bin/node/* to bin/
      
      * REVERT ME
      
      * Revert "REVERT ME"
      
      This reverts commit 7c335f94.
      
      * specify container name
      
      * REVERT ME
      
      * container_name -> hostname
      
      * fix typo
      
      * aliases
      
      * Revert "REVERT ME"
      
      This reverts commit 0e74af5f.
      
      * removed prefixes
      e31eada2
    • Svyatoslav Nikolsky's avatar
      Relay DummyOrdered messages (#318) · 26175490
      Svyatoslav Nikolsky authored
      
      
      * DummyOrdered relay: initial commit
      
      * 1 ML file -> 3 files
      
      * extracted generic message race loop
      
      * uncommented race error procesing
      
      * lane loop tests
      
      * cargo fmt
      
      * moved HeaderId to utils.rs
      
      * restart lane loop on stall
      
      * message delivery strategy tests
      
      * removed obsolete code
      
      * clippy
      
      * Update relays/ethereum/src/message_lane_loop.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * Update relays/ethereum/src/message_lane_loop.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * added more races docs
      
      * Update relays/ethereum/src/message_race_delivery.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * update docs
      
      * Update relays/ethereum/src/message_race_loop.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * deal with TODOs
      
      * removed docs
      
      * docs
      
      * cargo fmt --all
      
      * Update relays/ethereum/src/message_race_loop.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      Co-authored-by: default avatarHernando Castano <[email protected]>
      26175490
  3. Aug 20, 2020
  4. Aug 19, 2020
  5. Aug 18, 2020
  6. Aug 07, 2020
  7. Aug 05, 2020
    • Svyatoslav Nikolsky's avatar
      Prepare for sub to eth relay - part2 (#253) · 065339cf
      Svyatoslav Nikolsky authored
      
      
      * fixed PoA contract deploy (granda_authorities call)
      
      * pause if all submitted headers were rejected
      
      * give funds to Bertha and Carlos
      
      * max 1 active PoA transaction in headers sync :(
      
      * display initial header id when deploying PoA contract
      
      * cargo fmt + clipy
      
      * update PoA contract to accept <= 4 Substrate headers at once
      
      * pause submitting headers when contract rejects all new headers + we have active transactions
      
      * fix compilation
      
      * cargo fmt --all
      
      * does_not_select_new_headers_to_submit_when_submit_is_paused
      
      * updated bridge contract
      
      * Update relays/ethereum/src/sync.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * WiP.
      
      * Submit first incomplete header.
      
      * Finish up test.
      
      * cargo fmt --all
      
      * Remove redundant clone.
      
      * Address review comments.
      
      * cargo fmt --all
      
      * Fix clippy.
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      065339cf
  8. Aug 04, 2020
    • Hernando Castano's avatar
      Support Pallet Instances in Relay (#238) · 429f1f4f
      Hernando Castano authored
      * Sketch out how to support different bridge pallet instances
      
      * Create a common interface for using pallet instances
      
      * Start introducing generic instance parameter
      
      Attemps to make the compiler happy, but I'm having second thoughts about
      this approach. Commiting now as a way to have a checkpoint, but I think
      I'm going to need to re-consider my approach here.
      
      Ideally I want a change which introduces minimal changes, but this seems
      to be propagating around the codebase in ways I don't want.
      
      * Use trait objects instead of generics
      
      * Implement traits for Boxed trait objects
      
      This is done in order to statisfy trait bounds by types
      which use these new trait objects
      
      * Remove Clone usage for sync parameters
      
      * Remove implementation of Default for sync params
      
      * Require that BridgeInstance implements Debug
      
      * Ensure that BridgeInstance trait implements Send/Sync
      
      * Add documentation related to instances
      
      * Rust Fmt
      
      * Remove needless format
      
      * Make instance CLI option case insensitive
      
      * Replace `with_*` constructors with `new`
      
      * Clean up usage of instance structs
      
      * Enforce a default instance in the CLI params
      
      * Build sync params as we process input from CLI
      
      * Remove case insensitivity from sub-tx-mode
      
      I think this should happen, but maybe as part of a different PR
      
      * Process default Eth contract deployment config in CLI
      
      * Build EthereumExchangeParams in CLI
      
      * Process EthereumExchangeSubmitParams params in CLI
      429f1f4f
  9. Jul 31, 2020
  10. Jul 30, 2020
  11. Jul 29, 2020
    • Svyatoslav Nikolsky's avatar
      Submit exchange transactions to PoA node (#229) · 14342dc4
      Svyatoslav Nikolsky authored
      
      
      * submit Eth exchange transactions
      
      * submit ethereum in docker-compose
      
      * submit Eth exchange transactions
      
      * fix duplicate message
      
      * fix relay script
      
      * lost file
      
      * cargo fmt --all
      
      * cargo +nightly clippy
      
      * Show sccache
      
      * remove test-helpers remains
      
      * what's going on with jsonrpsee + Cargo.lock?
      
      * relay-eth-submit-exchange-tx -> poa-exchange-tx-generator
      
      * Update relays/ethereum/src/main.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * configuring exchange-gen loop using env variables
      
      * fixed signer account from dev chain to Arthur
      
      * improve debug prints
      
      * parse nonce from relay output
      
      * --eth-nonce=
      
      * fix compilation
      
      * cargo fmt --all
      
      * fix typo
      
      * duplicate relay output to tty
      
      * allow using from bash scripts tests
      
      * fix: U256::parse() expects hex string :/
      
      * cargo fmt --all
      
      * BRIDGE_HASH: ${BRIDGE_HASH:-master}
      
      * script comment
      
      * generate exchange PoA transactions by Bertha
      
      * Bertha address
      
      Co-authored-by: default avatarDenis S. Soldatov aka General-Beck <[email protected]>
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      14342dc4
  12. Jul 28, 2020
  13. Jul 27, 2020
    • Hernando Castano's avatar
      Allow Multiple Bridge Pallet Instances (#226) · 639b7664
      Hernando Castano authored
      
      
      * Add Instance type parameter to pallet
      
      * Sketch out what the runtime could look like
      
      * Allow runtime to compile with multiple bridge pallets
      
      * Cargo Fmt
      
      * Allow an instance of a PoA chain to be used with currency-exchange
      
      I specify that it's only _an instance_ instead of _instances_ since the currency-exchange
      pallet does not support multiple instances itself. What this commit does is make it so
      that the different instances of the PoA chains we currently have are compatible with the
      currency-exchange pallet through the implementation of the PeerBlockchain trait.
      
      * Add Instance type parameter to Currency Exchange pallet
      
      * Wire up currency exchange intances in runtime
      
      * Rust Fmt
      
      * Show sccache
      
      * Allow Eth pallet to use a default instance
      
      * Use a default instance in Eth pallet tests
      
      * Remove Rialto and Kovan feature flags
      
      Through some discussions it has been decided that the `bridge-node` should, like
      Substrate's `node-template`, be a showcase of the different pallets available in
      a project. Because of this I've removed the feature flags for the Rialto and Kovan
      networks in favour of having both of them included in the runtime.
      
      * Update the chain_spec to use both Rialto and Kovan configs
      
      * Update pallet level calls used by Substrate client
      
      Allows the project to compile. However, it should be noted that in reality
      we shouldn't be hardcoding the pallet we're calling.
      
      * Allow currency-exchange pallet to use a default instance
      
      * Support benchmarking an instance of the Eth pallet
      
      * Update currency exchange benchmarks to work with instances
      
      * Fix test helpers which now need a PoA instance
      
      * Remove Actions for checking Rialto and Kovan features
      
      * Add missing comments
      
      * Update Runtime API string constants
      
      * Add issue number for generic chain support in relay
      
      * Add Runtime APIs for instances of the currency-exchange pallet
      
      * Rust Fmt
      
      Co-authored-by: default avatarDenis S. Soldatov aka General-Beck <[email protected]>
      639b7664
    • Svyatoslav Nikolsky's avatar
      Auto relay exchange transactions (#227) · 4e919b8d
      Svyatoslav Nikolsky authored
      
      
      * auto relay exchange transactions
      
      * docker + auto-relay-tx
      
      * clippy
      
      * jsonrpsee in Cargo.lock ???
      
      * fix tests compilation
      
      * Show sccache
      
      * mute clippy
      
      * move
      
      * Update relays/ethereum/src/exchange.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * finish comment
      
      * (bool, String) -> StringifiedMaybeConnectionError
      
      * Update deployments/rialto/docker-compose.yml
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      Co-authored-by: default avatarDenis S. Soldatov aka General-Beck <[email protected]>
      Co-authored-by: default avatarHernando Castano <[email protected]>
      4e919b8d
  14. Jul 20, 2020
    • Tomasz Drwięga's avatar
      Fix clippy suggestions. (#179) · f10e344c
      Tomasz Drwięga authored
      
      
      * Fix clippy errors.
      
      * Cargo fmt.
      
      * Enable clippy checks.
      
      * Create if does not exist.
      
      * Fix warnings and enable sccache for clippy.
      
      * chmod +x
      
      * Revert and ignore errors.
      
      * Update cancel-workflow-action.
      
      * Fixes.
      
      * Clippy fixes.
      
      * Fix compilation.
      
      * Fix new clippy warnings.
      
      * fmt --all
      
      * Fix the rest.
      
      * fmt --all
      
      * Conditional.
      
      * Bump smallvec.
      
      * Use separate cache dir for clippy to prevent races.
      
      * Remove unused imports in tests
      
      * Remove "useless conversion"
      
      * Move clippy to main worfklow to avoid clashes.
      
      * Fix clippy error.
      
      * Fix remaning clippy errors.
      
      * cargo fmt --all
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      f10e344c
  15. Jul 17, 2020
    • Svyatoslav Nikolsky's avatar
      Relay dashboard (#191) · 6be18c57
      Svyatoslav Nikolsky authored
      * expose metrics for Prometheus
      
      * added preconfigured configs for Prometheus and Grafana
      
      * metrics-related cli args
      
      * fix compilation
      6be18c57
    • Tomasz Drwięga's avatar
      Rialto test network setup (#163) · 010c65be
      Tomasz Drwięga authored
      
      
      * Dockerfile for OpenEth.
      
      * Add relayer dockerfile.
      
      * Add docker-compose.
      
      * Working on the relay.
      
      * Bump a bunch of deps.
      
      * Change relay branch.
      
      * Running a 3-validators poa network.
      
      * Add bridge nodes.
      
      * Conditional compilation of bridge configs.
      
      * Fix genesis hash.
      
      * Disable features build.
      
      * Disable empty steps.
      
      * Work on sub2eth
      
      * Add some logs.
      
      * More logs.
      
      * Fix compilation.
      
      * Add chain-id parameter to relay.
      
      * Unify bridge-hash.
      
      * Update the hash.
      
      * Ditch sub2eth for now.
      
      * Add some docs & proxy configuration.
      
      * Fixes.
      
      * Fix remaining issues.
      
      * Increase health timeout.
      
      * Make sure to install curl for health monitoring.
      
      * Fix kovan.
      
      * Fix build.
      
      * Create if does not exist.
      
      * Fix benches.
      
      * Revert CLI params requirements.
      
      * cargo fmt --all
      
      * Apply suggestions from code review
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Add some docs.
      
      * Updat...
      010c65be
  16. Jul 14, 2020
  17. Jul 10, 2020
  18. Jul 08, 2020
  19. Jul 06, 2020
  20. Jun 23, 2020
    • Hernando Castano's avatar
      Switch to new RPC interface (#131) · 5bf635e6
      Hernando Castano authored
      
      
      * Move EthereumRpc implementation to Eth client
      
      * Move SubstrateRpc implementation to SubstrateClient
      
      * Update deploy_contract to use new RPC interface
      
      * Fix some types in the Substrate client
      
      * Swap out method bodies in Eth sync loop
      
      * Swap out method bodies in Substrate sync loop
      
      * Remove Client from SourceClient trait return types
      
      * Remove Client from TargetClient trait return types
      
      * Remove client from Source select! arms
      
      * Remove client from Target select! arms
      
      * Add missing mutable refs in Substrate client
      
      * Use mutable references in Source/Target Client traits
      
      * Try and use mutable references in Source/Client trait implementations
      
      * Handle errors more gracefully
      
      * Remove unused imports
      
      * Remove dead_code and unused_variables lints
      
      * Remove usage of `jsonrpsee::RawClient`
      
      By using a `jsonrpsee::Client` we are able to remove all the shared
      mutable references required when interacting with the RPC server. This
      is convenient as trying to sharing mutable references in code that uses
      async/await is a bit of a pain.
      
      However, using a `Client` instead of a `RawClient` is not yet supported
      by the `jsonrpsee::rpc_api` macro, so a fork must be used for the moment.
      
      * Clean up dead code and warnings
      
      * Clean up higher level RPCs
      
      Some of the RPCs that were "high level" didn't necessarily belong
      as part of the trait, so they were removed.
      
      * Use positional parameters for RPCs
      
      Both Substrate and Ethereum's RPCs use positional (array) parameters,
      so in order to be compatible with both we need to make sure that
      our API is defined with positional paramters in mind.
      
      * Rename argument for eth_getBlockByNumber
      
      * Remove some unecessary Ok-wraps
      
      * Process client requests synchonously
      
      Before the refactoring the sync loop would wait until a client finished
      handling a request before issuing another one. This behaviour was
      inadvertently changed during the refactoring leading to race conditions.
      This commit makes sure that the previous behaviour is respected.
      
      * Reduce the errors that are considered a connection error
      
      * Only decode bridge contract once
      
      * Set genesis_config at RPC client startup
      
      * Fetch genesis hash in SubstrateRpcClient::new()
      
      * Move Decode error into SubstrateNodeError
      
      * Suppress warnings caused by `rpc_api!`
      
      * Implement From RpcError for String
      
      * Handle Substrate client initalization errors more gracefully
      
      * Remove match in favour of ?
      
      Co-authored-by: default avatarSvyatoslav Nikolsky <[email protected]>
      5bf635e6
  21. Jun 11, 2020
  22. Jun 03, 2020
  23. May 22, 2020
    • Hernando Castano's avatar
      RPC Module for Relays (#80) · 55aa5780
      Hernando Castano authored
      * Test defining an RPC API
      
      * Add wrapper clients for the RPC API
      
      * Implement most Ethereum RPCs
      
      Does not include RPCs that require the bridge contract.
      
      * Implement a few of the Substrate RPCs
      
      Still missing proper error handling, as well as decoding responses from the
      Substrate node.
      
      * Make error handling more ergonomic
      
      * Implement Substrate RPCs that use `state_call`
      
      * Implement rest of Substrate RPCs
      
      * Implement `eth_call` RPC
      
      This can be used to implement higher level requests like fetching Substrate headers
      from an Ethereum node.
      
      * Build some of the higher level Ethereum RPCs
      
      Uses the new Ethereum RPC interface to do so
      
      * Build some of the higher level Substrate RPCs
      
      * Remove old Ethereum RPC methods
      
      * Remove old Substrate RPC methods
      
      * Add some documentation to Substrate RPCs
      
      * Fix typo in enum construction
      
      * Revert commits `0f0435d2` to `ca755029`
      
      This range of commits was mainly trying to integrate the new RPC interface into the existing
      codebase, however this turned out to be a little out of scope for the current PR. Instead this work
      will be incorporated into a PR which aims to close #72.
      
      * Add documentation to RPCs
      
      * Rename functions in RPC API to conform to snake_case
      
      * Check that header contains a number and hash
      
      * Put doc comments on trait instead of impl methods
      
      * Remove expect() calls
      
      * Replace runtime API enums with consts
      
      * Accept Bytes when submitting extrinsic
      
      Let's us avoid using a runtime specific Extrinsic.
      
      * Add strictly typed arguments to RPC API
      
      Missing two methods right now, which require a `serde::Deserialize`
      implemenation before they can be changed.
      
      * Add `chain_getBlock` Substrate RPC
      
      * Use typed arguments for `eth_estimateGas` and `eth_call`
      
      * Silence dead code warnings
      
      * Add check for logs bloom
      
      * Remove unused variables
      
      * Add documentation to RPC error enums
      55aa5780
  24. May 20, 2020
  25. May 19, 2020
    • Hernando Castano's avatar
      Bump rust-web3 to latest v0.11 (#100) · acf24309
      Hernando Castano authored
      * Bump rust-web3 to latest master
      
      * Use tagged release from crates.io
      
      * Add check for `logs_bloom`
      
      Since this is required by the runtime we want to enforce that an
      incoming header has this.
      acf24309
  26. May 18, 2020
  27. May 12, 2020
    • Svyatoslav Nikolsky's avatar
      Process finality proofs in solidity PoA -> Substrate contract (#69) · fb9a31b4
      Svyatoslav Nikolsky authored
      
      
      * solidity contract
      
      * continue
      
      * upd
      
      * cargo update
      
      * fixes
      
      * ehtereum_headers -> headers
      
      * extracted some common stuff
      
      * ethereum_sync.rs -> sync.rs
      
      * make sync generic
      
      * continue extracting
      
      * continue
      
      * add eth-contract argument
      
      * continue
      
      * some fixes
      
      * contract v2
      
      * continue
      
      * more fixes
      
      * more fixes
      
      * deal with duplicated params
      
      * removed multiple call_rpc variants
      
      * bail_on_error!()
      
      * fn submit_ethereum_transaction
      
      * more fixes
      
      * cargo fmt --all
      
      * fix
      
      * bail_on_arg_error!()
      
      * fix
      
      * fix
      
      * remove async_extra stuff
      
      * start work on finality builtin
      
      remove async_extra stuff
      
      continue
      
      continue
      
      local testnet (Alice + Bob) for node
      
      * added TODO
      
      * substrate-bridge.json -> substrate-bridge-abi.json
      
      * get rid of substrate transactions hashes
      
      * get rid of ethereum transactions hashes
      
      * extracted contract bytecode to separate file
      
      * cargo fmt --all
      
      * avoid duplicate import in contracts
      
      * removed Default::default()
      
      * swapped configurations for sub2eth && eth2sub
      
      * fix compilation
      
      * do not double gas limit when submitting Substrate headers
      
      * fix finality storage
      
      * at least 1 validator required
      
      * shift_session_manager_works
      
      * cargo fmt --all
      
      * solidity contract removed
      
      * consts
      
      * extracted solc compilation details to separate file
      
      * removed (obsolete in future Vec<u8> justification)
      
      * fixed cli option description
      
      * fix typos
      
      * fix grumble
      
      * extracted constants
      
      * log decoded header
      
      * new substrate version + actually verify justification
      
      * intermediate cargo fmt --all
      
      * comments
      
      * disable completion data resubmission
      
      * increased timeouts + _MS -> Duration
      
      * forget completion data after submission
      
      * builtin tests
      
      * headers tests
      
      * cargo fmt --all
      
      * update contract
      
      * Update relays/ethereum/src/ethereum_sync_loop.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * Update relays/ethereum/src/ethereum_sync_loop.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * added docs
      
      * OwnedFutureOutput
      
      * more docs fixes
      
      * cargo fmt --all
      
      * encode headers
      
      * consts + docs
      
      * aliases again
      
      * cargo fmt --all
      
      * Update relays/ethereum/src/ethereum_sync_loop.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * Update relays/ethereum/src/ethereum_sync_loop.rs
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      
      * Use Duration::from_secs() instead of from_millis()
      
      * grumbles
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * incomplete_headers_are_still_incomplete_after_advance
      
      * add hex-encoded headers to substrate_header_without_signal_parsed
      
      * cargo fmt --all
      
      * Update relays/ethereum/src/sync_loop.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * Update relays/ethereum/src/headers.rs
      
      Co-authored-by: default avatarHernando Castano <[email protected]>
      
      * added comments on Extra and Completion
      
      Co-authored-by: default avatarTomasz Drwięga <[email protected]>
      Co-authored-by: default avatarHernando Castano <[email protected]>
      fb9a31b4
  28. Apr 29, 2020
    • Svyatoslav Nikolsky's avatar
      Solidity contract that accepts unverified substrate headers (#65) · 9993873c
      Svyatoslav Nikolsky authored
      * solidity contract
      
      * continue
      
      * upd
      
      * cargo update
      
      * fixes
      
      * ehtereum_headers -> headers
      
      * extracted some common stuff
      
      * ethereum_sync.rs -> sync.rs
      
      * make sync generic
      
      * continue extracting
      
      * continue
      
      * add eth-contract argument
      
      * continue
      
      * some fixes
      
      * contract v2
      
      * continue
      
      * more fixes
      
      * more fixes
      
      * deal with duplicated params
      
      * removed multiple call_rpc variants
      
      * bail_on_error!()
      
      * fn submit_ethereum_transaction
      
      * more fixes
      
      * cargo fmt --all
      
      * fix
      
      * bail_on_arg_error!()
      
      * fix
      
      * fix
      
      * remove async_extra stuff
      
      * substrate-bridge.json -> substrate-bridge-abi.json
      
      * get rid of substrate transactions hashes
      
      * get rid of ethereum transactions hashes
      
      * extracted contract bytecode to separate file
      
      * cargo fmt --all
      
      * avoid duplicate import in contracts
      
      * removed Default::default()
      
      * swapped configurations for sub2eth && eth2sub
      
      * fix compilation
      
      * do not double gas limit when submitting Substrate headers
      
      * cargo fmt --all
      
      * solidity contract removed
      
      * consts
      
      * extracted solc compilation details to separate file
      
      * removed (obsolete in future Vec<u8> justification)
      
      * fixed cli option description
      
      * fix typos
      
      * fix grumble
      
      * extracted constants
      
      * log decoded header
      
      * cargo fmt --all
      
      * comment
      9993873c
  29. Apr 08, 2020