Repository: coinbase/rosetta-cli
Pull request #268 (2022-01-08 19:29:49)

Update README and CONTRIBUTING files information
### Motivation

This is part of the effort to consolidate Rosetta information into the Rosetta API documentation. The bulk of the information in the README file got moved to the [Rosetta API](https://rosetta-api.org) website, to these docs:
* [The rosetta-cli tool](https://www.rosetta-api.org/docs/rosetta_cli.html)
* [How to Write a Rosetta DSL File](https://www.rosetta-api.org/docs/rosetta_dsl_file.html)

Also updated CONTRIBUTING file to conform to the new template.

### Solution
Update README information
 
Update copyright year to current year

Update README to match new repo template

Update `s/discrepency/discrepancy` misspelling in several files
  
Update CONTRIBUTING file with new repo template

### Open questions

Suggestions appreciated.




Patch:
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 1246487..232e169 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -16,7 +16,7 @@ version: 2.1
 executors:
   default:
     docker:
-      - image: circleci/golang:1.16
+      - image: cimg/go:1.16
         user: root # go directory is owned by root
     working_directory: /go/src/github.com/coinbase/rosetta-cli
     environment:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 217d1ed..23a0341 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,52 +2,87 @@
 
 ## Code of Conduct
 
-All interactions with this project follow our [Code of Conduct][code-of-conduct].
-By participating, you are expected to honor this code. Violators can be banned
-from further participation in this project, or potentially all Coinbase projects.
+All interactions with this project follow our [Code of Conduct](https://github.com/coinbase/code-of-conduct). By participating, you are expected to honor this code. Violators can be banned from further participation in this project, or potentially all Coinbase projects.
 
-[code-of-conduct]: https://github.com/coinbase/code-of-conduct
+## How to Contribute
 
-## Bug Reports
+You can contribute to this repository by asking questions, providing feedback, and reporting issues.
 
-* Ensure your issue [has not already been reported][1]. It may already be fixed!
-* Include the steps you carried out to produce the problem.
-* Include the behavior you observed along with the behavior you expected, and
-  why you expected it.
-* Include any relevant stack traces or debugging output.
+### Asking Questions
 
-## Feature Requests
+Submit your questions via the [Rosetta Community boards][13].
 
-We welcome feedback with or without pull requests. If you have an idea for how
-to improve the project, great! All we ask is that you take the time to write a
-clear and concise explanation of what need you are trying to solve. If you have
-thoughts on _how_ it can be solved, include those too!
+### Providing Feedback
+
+You can also use the [Rosetta Community boards][13] to provide feedback.
+
+### Reporting Issues
+
+You can report issues by submitting bug reports, feature requests, or pull requests via GitHub. You **must** submit [security issues](#security-issues) and [support requests](#support-requests) through the links provided.
+
+#### Bug Reports
+
+Before filing a bug report, ensure that your issue [has not already been reported][1]. It may already be fixed!
+
+If your bug hasn’t been fixed, follow these steps to file a bug report:
+
+1. [Open an issue in GitHub][10].
+2. Add a title for your bug report. It should briefly describe the problem.
+3. Follow the template that appears in the Write text box. This is the best way to describe the bug.
+4. Click _Submit new issue_ to finish filing the bug report.
+
+#### Feature Requests
+
+We welcome feedback with or without pull requests. If you have an idea for how to improve the project, great! All we ask is that you take the time to write a clear and concise explanation of the need you are trying to solve. If you have thoughts on _how_ it can be solved, include those too!
+
+To submit a feature request, follow these steps:
+
+1. [Open an issue in GitHub][10].
+2. Add a title for your feature request. It should briefly describe your requested feature.
+3. Follow the template that appears in the Write text box. This is the best way to explain your request. Be clear and concise in your responses.
+4. Click _Submit new issue_ to submit the feature request.
 
 The best way to see a feature added, however, is to submit a pull request.
 
-## Pull Requests
+#### Pull Requests
+
+Before creating your pull request, it's usually worth asking whether the code you're planning on writing will be considered for merging. You can do this by [opening an issue][1] and asking. It may also help give the maintainers context for when the time comes to review your code.
 
-* Before creating your pull request, it's usually worth asking if the code
-  you're planning on writing will actually be considered for merging. You can
-  do this by [opening an issue][1] and asking. It may also help give the
-  maintainers context for when the time comes to review your code.
+Ensure that your [commit messages are well-written][2]. This can double as your pull request message, so it pays to take the time to write a clear message.
 
-* Ensure your [commit messages are well-written][2]. This can double as your
-  pull request message, so it pays to take the time to write a clear message.
+Additionally, make sure that you have written unit tests for your changes. If you're unsure as to what to test, don't hesitate to [open an issue][1] and ask!
 
-* Add tests for your feature. You should be able to look at other tests for
-  examples. If you're unsure, don't hesitate to [open an issue][1] and ask!
+To submit your pull request, follow these steps:
 
-* Submit your pull request!
+1. Follow these instructions on how to [open a pull request in GitHub][11].
+2. Click _Create pull request_ to submit your pull request.
 
-## Support Requests
+Once you submit your pull request, a reviewer will revise it, and either approve it or offer suggestions.
 
-For security reasons, any communication referencing support tickets for Coinbase
-products will be ignored. The request will have its content redacted and will
-be locked to prevent further discussion.
+#### Security Issues
+
+You can send a report through Coinbase's [H1 program][12]. Check out the [Security][14] tab for more information.
+
+#### Support Requests
 
 All support requests must be made via [our support team][3].
 
+**For security reasons, any communication referencing support tickets for Coinbase products will be ignored.** The request will have its content redacted and will be locked to prevent further discussion.
+
+© 2022 Coinbase
+
+<!-- Before adding link 15, populate link 4. One you do that, please erase this note. --->
 [1]: https://github.com/coinbase/rosetta-cli/issues
 [2]: https://chris.beams.io/posts/git-commit/#seven-rules
 [3]: https://support.coinbase.com/customer/en/portal/articles/2288496-how-can-i-contact-coinbase-support-
+<!--- [4]: link removed --->
+[5]: https://github.com/coinbase/rosetta-cli/issues/new/choose
+[6]: https://github.com/coinbase/rosetta-cli/issues/new?assignees=&labels=bug&template=bug_report.md&title=
+[7]: https://github.com/coinbase/rosetta-cli/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=
+[8]: https://github.com/coinbase/rosetta-cli/pulls
+[9]: https://github.com/coinbase/rosetta-cli/compare
+[10]: https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/working-with-your-remote-repository-on-github-or-github-enterprise/creating-an-issue-or-pull-request#creating-an-issue
+[11]: https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/working-with-your-remote-repository-on-github-or-github-enterprise/creating-an-issue-or-pull-request#creating-a-pull-request
+[12]: https://hackerone.com/coinbase
+[13]: https://community.rosetta-api.org
+[14]: https://github.com/coinbase/rosetta-cli/security
diff --git a/README.md b/README.md
index 20bb7f5..c3add1e 100644
--- a/README.md
+++ b/README.md
@@ -16,569 +16,75 @@ CLI to validate the correctness of Rosetta API implementations
   <a href="https://github.com/coinbase/rosetta-cli/blob/master/LICENSE.txt"><img src="https://img.shields.io/github/license/coinbase/rosetta-cli.svg" /></a>
 </p>
 
-## Overview
-The `rosetta-cli` is used by developers to test the correctness of their Rosetta
-API implementations. The CLI also provides the ability to look up block contents
-and account balances.
+The `rosetta-cli` tool is used by developers to test the correctness of their Rosetta API implementations. The CLI also provides the ability to look up block contents and account balances.
 
-## Documentation
-Before diving into the CLI, we recommend taking a look at the Rosetta API Docs:
-
-* [Overview](https://www.rosetta-api.org/docs/welcome.html)
-* [Data API](https://www.rosetta-api.org/docs/data_api_introduction.html)
-* [Construction API](https://www.rosetta-api.org/docs/construction_api_introduction.html)
+## Installation
 
-## Install
 To download a binary for the latest release, run:
 ```
 curl -sSfL https://raw.githubusercontent.com/coinbase/rosetta-cli/master/scripts/install.sh | sh -s
 ```
 
-The binary will be installed inside the `./bin` directory (relative to where the install command was run).
+The binary will be installed inside the `./bin` directory (relative to the directory where you ran the installation command).
 
 _Downloading binaries from the Github UI will cause permission errors on Mac._
 
-### Installing in Custom Location
+### Installing in a Custom Location
 To download the binary into a specific directory, run:
 ```
 curl -sSfL https://raw.githubusercontent.com/coinbase/rosetta-cli/master/scripts/install.sh | sh -s -- -b <relative directory>
 ```
 
-## Usage
-```
-CLI for the Rosetta API
-
-Usage:
-  rosetta-cli [command]
-
-Available Commands:
-  check:construction           Check the correctness of a Rosetta Construction API Implementation
-  check:data                   Check the correctness of a Rosetta Data API Implementation
-  configuration:create         Create a default configuration file at the provided path
-  configuration:validate       Ensure a configuration file at the provided path is formatted correctly
-  help                         Help about any command
-  utils:asserter-configuration Generate a static configuration file for the Asserter
-  utils:train-zstd             Generate a zstd dictionary for enhanced compression performance
-  version                      Print rosetta-cli version
-  view:balance                 View an account balance
-  view:block                   View a block
-  view:networks                View all network statuses
-
-Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-  -h, --help                        help for rosetta-cli
-      --mem-profile string          Save the pprof mem profile in the specified file
-
-Use "rosetta-cli [command] --help" for more information about a command.
-```
-
-### Configuration
-All `rosetta-cli` parameters are populated from a configuration file (`--configuration-file`)
-provided at runtime. If a configuration file is not provided, the default
-configuration is used. This default configuration can be viewed
-[here](examples/configuration/default.json). Note, there is no default
-configuration for running `check:construction` as this is very network-specific.
-You can view a full list of all configuration options [here](https://pkg.go.dev/github.com/coinbase/rosetta-cli/configuration).
-
-In the `examples/configuration` directory, you can find examples configuration
-files for running tests against a Bitcoin Rosetta implementation
-([config](https://github.com/coinbase/rosetta-bitcoin/tree/master/rosetta-cli-conf)) and an Ethereum Rosetta
-implementation ([config](https://github.com/coinbase/rosetta-ethereum/tree/master/rosetta-cli-conf)).
-
-#### Using environment variables
-
-It's possible to set the configuration file path using an environment variable instead
-of using a CLI flag. See an example below:
-
-```bash
-ROSETTA_CONFIGURATION_FILE=/path/to/cli/config rosetta <command>
-```
-
-CLI flags take precedence over environment variables.
-
-#### Writing check:construction Tests
-The new Construction API testing framework (first released in `rosetta-cli@v0.5.0`) uses
-a new design pattern to allow for complex transaction construction orchestration.
-You can read more about the design goals [here](https://community.rosetta-api.org/t/feedback-request-automated-construction-api-testing-improvements/146).
-
-Most teams write their Construction API tests using the
-[Rosetta Constructor DSL](https://github.com/coinbase/rosetta-sdk-go/tree/master/constructor/dsl).
-We have examples of a DSL files written for [UTXO-based chains](https://github.com/coinbase/rosetta-bitcoin/blob/master/rosetta-cli-conf/testnet/bitcoin.ros)
-and [account-based chains](https://github.com/coinbase/rosetta-ethereum/blob/master/rosetta-cli-conf/testnet/ethereum.ros).
-
-##### Terminology
-When first learning about a new topic, it is often useful to understand the
-hierarchy of concerns. In the automated Construction API tester, this
-"hierarchy" is as follows:
-```text
-Workflows -> Jobs
-  Scenarios
-    Actions
-```
-
-`Workflows` contain collections of `Scenarios` to execute. `Scenarios` are
-executed atomically in database transactions (rolled back if execution fails)
-and culminate in an optional broadcast. This means that a single `Workflow`
-could contain multiple broadcasts (which can be useful for orchestrating
-staking-related transactions that affect a single account).
-
-To perform a `Workflow`, we create a `Job`. This `Job` has a unique identifier
-and stores state for all `Scenarios` in the `Workflow`. State is shared across
-an entire `Job` so `Actions` in a `Scenario` can access the output of `Actions`
-in other `Scenarios`. The syntax for accessing this shared state can be found
-[here](https://github.com/tidwall/gjson/blob/master/SYNTAX.md).
-
-`Actions` are discrete operations that can be performed in the context of a
-`Scenario`.  A full list of all `Actions` that can be performed can be found
-[here](https://pkg.go.dev/github.com/coinbase/rosetta-sdk-go/constructor/job#ActionType).
-
-If you have suggestions for more actions, please
-[open an issue in `rosetta-sdk-go`](https://github.com/coinbase/rosetta-sdk-go/issues)!
-
-##### Workflows
-To use the automated Construction API tester (without prefunded accounts),
-you must implement 2 required `Workflows`:
-* `create_account`
-* `request_funds`
-
-_If you don't implement these 2 `Workflows`, processing could stall._
-
-Please note that `create_account` can contain a transaction broadcast if
-on-chain origination is required for new accounts on your blockchain.
-
-If you plan to run the automated Construction API tester in CI, you may wish to
-provide [`prefunded accounts`](https://pkg.go.dev/github.com/coinbase/rosetta-cli/configuration#ConstructionConfiguration)
-when running the tester (otherwise you would need to manually fund generated
-accounts).
-
-Optionally, you can also provide a `return_funds` workflow that will be invoked
-when exiting `check:construction`. This can be useful in CI when you want to return
-all funds to a single accout or faucet (instead of black-holing them in all the addresses
-created during testing).
-
-##### Broadcast Invocation
-If you'd like to broadcast a transaction at the end of a `Scenario`,
-you must populate the following fields:
-* `<scenario>.network`
-* `<scenario>.operations`
-* `<scenario>.confirmation_depth` (allows for stake-related transactions to complete before marking as a success)
-
-Optionally, you can populate the following field:
-* `<scenario>.preprocess_metadata`
-
-Once a transaction is confirmed on-chain (after the provided
-`<scenario>.confirmation_depth`, it is stored by the tester at
-`<scenario>.transaction` for access by other `Scenarios` in the same `Job`.
-
-##### Dry Runs
-In UTXO-based blockchains, it may be necessary to amend the `operations` stored
-in `<scenario>.operations` based on the `suggested_fee` returned in
-`/construction/metadata`. The automated Construction API tester supports
-running a "dry run" of a transaction broadcast if you set the follow field:
-* `<scenario>.dry_run = true`
-
-The suggested fee will then be stored as `<scenario>.suggested_fee` for use by
-other `Scenarios` in the same `Job`. You can find an example of this in the
-Bitcoin [config](examples/configuration/bitcoin.json).
-
-*If this field is not populated or set to `false`, the transaction
-will be constructed, signed, and broadcast.*
-
-#### End Conditions
-When running the `rosetta-cli` in a CI job, it is usually desired to exit
-when certain conditions are met (or before then with an exit code of 1). We
-provide this functionality through the use of "end conditions" which can be
-specified in your configuration file.
-
-##### check:data
-A full list of `check:data` end conditions can be found [here](https://pkg.go.dev/github.com/coinbase/rosetta-cli/configuration#DataEndConditions).
-If any end condition is satisifed, we will exit and output the
-results in `results_output_file` (if it is populated).
-
-##### check:construction
-The `check:construction` end condition is a map of
-workflow:count that indicates how many of each workflow
-should be performed before `check:construction` should stop.
-For example, `{"create_account": 5}` indicates that 5 `create_account`
-workflows should be performed before stopping.
-
-Unlike `check:data`, all `check:construction` end conditions
-must be satisifed before the `rosetta-cli` will exit.
-
-#### Disable Complex Checks
-If you are just getting started with your implementation, you may want
-to disable balance tracking (did any address balance go below zero?) and
-reconciliation (does the balance I calculated match the balance returned
-by the `/account/balance` endpoint?). Take a look at the
-[simple configuration](examples/configuration/simple.json) for an example of
-how to do this.
-
-#### Status Codes
-If there are no issues found while running `check`, it will exit with a `0` status code.
-If there are any issues, it will exit with a `1` status code. It can be useful
-to run this command as an integration test for any changes to your implementation.
-
-### Commands
-#### version
-```
-Print rosetta-cli version
-
-Usage:
-  rosetta-cli version [flags]
-
-Flags:
-  -h, --help   help for version
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
-
-#### check:data
-```
-Check all server responses are properly constructed, that
-there are no duplicate blocks and transactions, that blocks can be processed
-from genesis to the current block (re-orgs handled automatically), and that
-computed balance changes are equal to balance changes reported by the node.
-
-When re-running this command, it will start where it left off if you specify
-some data directory. Otherwise, it will create a new temporary directory and start
-again from the genesis block. If you want to discard some number of blocks
-populate the start_index filed in the configuration file with some block index.
-Starting from a given index can be useful to debug a small range of blocks for
-issues but it is highly recommended you sync from start to finish to ensure
-all correctness checks are performed.
-
-By default, account balances are looked up at specific heights (instead of
-only at the current block). If your node does not support this functionality,
-you can disable historical balance lookups in your configuration file. This will
-make reconciliation much less efficient but it will still work.
-
-If check fails due to an INACTIVE reconciliation error (balance changed without
-any corresponding operation), the cli will automatically try to find the block
-missing an operation. If historical balance disabled is true, this automatic
-debugging tool does not work.
-
-To debug an INACTIVE account reconciliation error without historical balance lookup,
-set the interesting accounts to the path of a JSON file containing
-accounts that will be actively checked for balance changes at each block. This
-will return an error at the block where a balance change occurred with no
-corresponding operations.
-
-If your blockchain has a genesis allocation of funds and you set
-historical balance disabled to true, you must provide an
-absolute path to a JSON file containing initial balances with the
-bootstrap balance config. You can look at the examples folder for an example
-of what one of these files looks like.
-
-Usage:
-  rosetta-cli check:data [flags]
-
-Flags:
-  -h, --help   help for check:data
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
-
-#### check:construction
-```
-The check:construction command runs an automated test of a
-Construction API implementation by creating and broadcasting transactions
-on a blockchain. In short, this tool generates new addresses, requests
-funds, constructs transactions, signs transactions, broadcasts transactions,
-and confirms transactions land on-chain. At each phase, a series of tests
-are run to ensure that intermediate representations are correct (i.e. does
-an unsigned transaction return a superset of operations provided during
-construction?).
-
-Check out the https://github.com/coinbase/rosetta-cli/tree/master/examples
-directory for examples of how to configure this test for Bitcoin and
-Ethereum.
-
-Right now, this tool only supports transfer testing (for both account-based
-and UTXO-based blockchains). However, we plan to add support for testing
-arbitrary scenarios (i.e. staking, governance).
-
-Usage:
-  rosetta-cli check:construction [flags]
-
-Flags:
-  -h, --help   help for check:construction
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
-
-#### configuration:create
-```
-Create a default configuration file at the provided path
-
-Usage:
-  rosetta-cli configuration:create [flags]
-
-Flags:
-  -h, --help   help for configuration:create
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
+## Updates and Releases
 
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
-
-#### configuration:validate
-```
-Validate the correctness of a configuration file at the provided path
+We recommend that you continually update your installation to the latest release as soon as possible. The latest release notes are available in our [Community](https://community.rosetta-api.org) board under the [Release](https://community.rosetta-api.org/c/releases/13) category.
 
-Usage:
-  rosetta-cli configuration:validate [flags]
+You can also view releases and change log information in the [Releases](https://github.com/coinbase/rosetta-cli/releases) section of this repository.
 
-Flags:
-  -h, --help   help for configuration:validate
-
-Global Flags:
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
+## Documentation
 
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-```
+You can find the Rosetta API documentation at [rosetta-api.org](https://www.rosetta-api.org/docs/welcome.html)
 
-#### view:networks
-```
-While debugging a Data API implementation, it can be very
-useful to view network(s) status. This command fetches the network
-status from all available networks and prints it to the terminal.
+For more information on the rosetta-cli tool, read our [The rosetta-cli tool](https://www.rosetta-api.org/docs/rosetta_cli.html) documentation.
 
-If this command errors, it is likely because the /network/* endpoints are
-not formatted correctly.
+For more information on how to test your implementation file with the `rosetta-cli` tool, read our [How to Test Your Rosetta Implementation](https://www.rosetta-api.org/docs/rosetta_test.html) documentation.
 
-Usage:
-  rosetta-cli view:networks [flags]
+Our documentation is divided into the following sections:
 
-Flags:
-  -h, --help   help for view:networks
+* [Product Overview](https://www.rosetta-api.org/docs/welcome.html)
+* [Getting Started](https://www.rosetta-api.org/docs/getting_started.html)
+* [Rosetta API Spec](https://www.rosetta-api.org/docs/Reference.html)
+* [Testing](https://www.rosetta-api.org/docs/rosetta_cli.html)
+* [Best Practices](https://www.rosetta-api.org/docs/node_deployment.html)
+* [Repositories](https://www.rosetta-api.org/docs/rosetta_specifications.html)
 
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
+## Contributing
 
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
+You may contribute to the `rosetta-cli` project in various ways:
 
-#### view:balance
-```
-While debugging, it is often useful to inspect the state
-of an account at a certain block. This command allows you to look up
-any account by providing a JSON representation of a types.AccountIdentifier
-(and optionally a height to perform the query).
-
-For example, you could run view:balance '{"address":"interesting address"}' 1000
-to lookup the balance of an interesting address at block 1000. Allowing the
-address to specified as JSON allows for querying by SubAccountIdentifier.
-
-Usage:
-  rosetta-cli view:balance [flags]
-
-Flags:
-  -h, --help   help for view:balance
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
+* [Asking Questions](CONTRIBUTING.md/#asking-questions)
+* [Providing Feedback](CONTRIBUTING.md/#providing-feedback)
+* [Reporting Issues](CONTRIBUTING.md/#reporting-issues)
 
-#### view:block
-```
-While debugging a Data API implementation, it can be very
-useful to inspect block contents. This command allows you to fetch any
-block by index to inspect its contents. It uses the
-fetcher (https://github.com/coinbase/rosetta-sdk-go/tree/master/fetcher) package
-to automatically get all transactions in the block and assert the format
-of the block is correct before printing.
-
-If this command errors, it is likely because the block you are trying to
-fetch is formatted incorrectly.
-
-Usage:
-  rosetta-cli view:block [flags]
-
-Flags:
-  -h, --help           help for view:block
-      --only-changes   Only print balance changes for accounts in the block
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
+Read our [Contributing](CONTRIBUTING.MD) documentation for more information.
 
-#### utils:asserter-configuration
-```
-In production deployments, it is useful to initialize the response
-Asserter (https://github.com/coinbase/rosetta-sdk-go/tree/master/asserter) using
-a static configuration instead of intializing a configuration dynamically
-from the node. This allows a client to error on new types/statuses that may
-have been added in an update instead of silently erroring.
-
-To use this command, simply provide an absolute path as the argument for where
-the configuration file should be saved (in JSON).
-
-Usage:
-  rosetta-cli utils:asserter-configuration [flags]
-
-Flags:
-  -h, --help   help for utils:asserter-configuration
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
+## rosetta-cli Tool Development
 
-#### utils:train-zstd
-```
-Zstandard (https://github.com/facebook/zstd) is used by
-rosetta-sdk-go/storage to compress data stored to disk. It is possible
-to improve compression performance by training a dictionary on a particular
-storage namespace. This command runs this training and outputs a dictionary
-that can be used with rosetta-sdk-go/storage.
-
-The arguments for this command are:
-<namespace> <database path> <dictionary path> <max items> (<existing dictionary path>)
-
-You can learn more about dictionary compression on the Zstandard
-website: https://github.com/facebook/zstd#the-case-for-small-data-compression
-
-Usage:
-  rosetta-cli utils:train-zstd [flags]
-
-Flags:
-  -h, --help   help for utils:train-zstd
-
-Global Flags:
-      --block-profile string        Save the pprof block profile in the specified file
-      --configuration-file string   Configuration file that provides connection and test settings.
-                                    If you would like to generate a starter configuration file (populated
-                                    with the defaults), run rosetta-cli configuration:create.
-
-                                    Any fields not populated in the configuration file will be populated with
-                                    default values.
-      --cpu-profile string          Save the pprof cpu profile in the specified file
-      --mem-profile string          Save the pprof mem profile in the specified file
-```
+While working on improvements to this repository, we recommend that you use these commands to check your code:
 
-## Correctness Checks
-This tool performs a variety of correctness checks using the Rosetta Server. If
-any correctness check fails, the CLI will exit and print out a detailed
-message explaining the error.
-
-### Response Correctness
-The validator uses the autogenerated [Go Client package](https://github.com/coinbase/rosetta-sdk-go)
-to communicate with the Rosetta Server and assert that responses adhere
-to the Rosetta interface specification.
-
-### Duplicate Hashes
-The validator checks that a block hash or transaction hash is
-never duplicated.
-
-### Non-negative Balances
-The validator checks that an account balance does not go
-negative from any operations.
-
-### Balance Reconciliation
-#### Active Addresses
-The CLI checks that the balance of an account computed by
-its operations is equal to the balance of the account according
-to the node. If this balance is not identical, the CLI will
-exit.
-
-#### Inactive Addresses
-The CLI randomly checks the balances of accounts that aren't
-involved in any transactions. The balances of accounts could change
-on the blockchain node without being included in an operation
-returned by the Rosetta Data API. Recall that all balance-changing
-operations should be returned by the Rosetta Data API.
-
-## Development
 * `make deps` to install dependencies
 * `make test` to run tests
 * `make lint` to lint the source code (included generated code)
 * `make release` to run one last check before opening a PR
 * `make compile version=RELEASE_TAG` to generate binaries
 
-If you are developing on both rosetta-cli and rosetta-sdk-go, use [go.mod replace](https://golang.org/ref/mod#go-mod-file-replace) to reference local changes: 
+If you are developing on both the `rosetta-cli` and `rosetta-sdk-go` repositories, use [go.mod replace](https://golang.org/ref/mod#go-mod-file-replace) to reference local changes: 
 ```
 replace "github.com/coinbase/rosetta-sdk-go" v0.6.8 => "../rosetta-sdk-go"
 ```
 
 ### Helper/Handler
-Many of the packages use a `Helper/Handler` interface pattern to acquire
-required information or to send events to some client implementation. An example
-of this is in the `reconciler` package where a `Helper` is used to get
-the account balance and the `Handler` is called to indicate whether the
-reconciliation of an account was successful.
+Many of the packages use a `Helper/Handler` interface pattern to acquire required information or to send events to some client implementation. An example of this is in the `reconciler` package where a `Helper` is used to get the account balance and the `Handler` is called to indicate whether the reconciliation of an account was successful.
 
 ### Repo Structure
 ```
@@ -590,16 +96,28 @@ pkg
   tester // test orchestrators
 ```
 
-## Troubleshoot
-* While running `check:data` or `check:construction` option if you get the following error:
+### Troubleshooting
 
-    ```dial tcp 127.0.0.1:8080: socket: too many open files: unable to sync to 1902533: unable to sync to 1902533```
+While running the `check:data` or `check:construction` option, if you get the following error:
+
+```dial tcp 127.0.0.1:8080: socket: too many open files: unable to sync to 1902533: unable to sync to 1902533```
     
-    Please run `ulimit -n 10000` to increase the max concurrent opened file limit
+Please run the `ulimit -n 10000` command to increase the max concurrent opened file limit.
+
+_Note: MacOS users, if you face  `ulimit: setrlimit failed: invalid argument` error while setting `ulimit`, please run `sudo launchctl limit maxfiles 10000 200000` before setting the `ulimit`_
+
+## Related Projects
+
+* [`rosetta-sdk-go`][https://github.com/coinbase/rosetta-sdk-go] — The `rosetta-sdk-go` SDK provides a collection of packages used for interaction with the Rosetta API specification. Much of the SDK code is generated from this, the [`rosetta-specifications`](https://github.com/coinbase/rosetta-specifications) repository.
+* [`rosetta-specifications`](https://github.com/coinbase/rosetta-specifications) — The `rosetta-specifications` repository generates the SDK code in the [`rosetta-sdk-go`][https://github.com/coinbase/rosetta-sdk-go] repository.
+
+### Reference Implementations
+
+To help you with examples, we developed complete Rosetta API reference implementations for [Bitcoin](https://github.com/coinbase/rosetta-bitcoin) and [Ethereum](https://github.com/coinbase/rosetta-ethereum). Developers of Bitcoin-like or Ethereum-like blockchains may find it easier to fork these reference implementations than to write an implementation from scratch.
 
-    _Note: MacOS users, if you face  `ulimit: setrlimit failed: invalid argument` error while setting `ulimit`, please run `sudo launchctl limit maxfiles 10000 200000` before setting the `ulimit`_
+You can also find community implementations for a variety of blockchains in the [rosetta-ecosystem][https://github.com/coinbase/rosetta-ecosystem] repository, and in the [ecosystem category](https://community.rosetta-api.org/c/ecosystem) of our community site. 
 
 ## License
 This project is available open source under the terms of the [Apache 2.0 License](https://opensource.org/licenses/Apache-2.0).
 
-© 2021 Coinbase
+© 2022 Coinbase
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 6308774..4ae4d39 100644
--- a/go.mod
+++ b/go.mod
@@ -3,11 +3,12 @@ module github.com/coinbase/rosetta-cli
 go 1.16
 
 require (
-	github.com/coinbase/rosetta-sdk-go v0.7.2
+	github.com/coinbase/rosetta-sdk-go v0.7.3
 	github.com/fatih/color v1.13.0
 	github.com/olekukonko/tablewriter v0.0.5
 	github.com/pkg/errors v0.9.1
 	github.com/spf13/cobra v1.3.0
 	github.com/stretchr/testify v1.7.0
+	go.uber.org/zap v1.21.0
 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
 )
diff --git a/go.sum b/go.sum
index 718bbfe..3ba38c2 100644
--- a/go.sum
+++ b/go.sum
@@ -50,6 +50,10 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU=
+filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
+git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
+git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
 github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
 github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc=
 github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4=
@@ -100,6 +104,7 @@ github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7
 github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0=
 github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM=
 github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@@ -108,11 +113,14 @@ github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+Wji
 github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
 github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
 github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
+github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs=
 github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo=
 github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA=
 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
 github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
 github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
+github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts=
+github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ=
 github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o=
 github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
 github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
@@ -121,6 +129,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku
 github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
 github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
 github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
+github.com/bwesterb/go-ristretto v1.2.0 h1:xxWOVbN5m8NNKiSDZXE1jtZvZnC6JSJ9cYFADiZcWtw=
+github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
 github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
 github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
@@ -148,10 +158,15 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH
 github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/coinbase/rosetta-sdk-go v0.7.2 h1:uCNrASIyt7rV9bA3gzPG3JDlxVP5v/zLgi01GWngncM=
-github.com/coinbase/rosetta-sdk-go v0.7.2/go.mod h1:wk9dvjZFSZiWSNkFuj3dMleTA1adLFotg5y71PhqKB4=
+github.com/coinbase/kryptology v1.5.5 h1:iSB2AOGYBxvq+/4huDWVEnyCWWWrVBbb7yiCcLrE2rw=
+github.com/coinbase/kryptology v1.5.5/go.mod h1:3zId6V3k/8v/o5gksjffbWMkH7Ik1UgeZVGTBvlpIxc=
+github.com/coinbase/rosetta-sdk-go v0.7.3 h1:SnnJ5VJGZe6l4rYhyNha94SVUJinVwtZTPvtfgF2Xfw=
+github.com/coinbase/rosetta-sdk-go v0.7.3/go.mod h1:PeO5OtybTPoddCrBrWaJS2vBICc2oLFoJkIIuRS/wPo=
 github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
+github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
 github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
+github.com/consensys/gnark-crypto v0.5.3 h1:4xLFGZR3NWEH2zy+YzvzHicpToQR8FXFbfLNvpGB+rE=
+github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0=
 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
@@ -326,6 +341,7 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
 github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
 github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -422,6 +438,7 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg=
 github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
+github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77 h1:6xiz3+ZczT3M4+I+JLpcPGG1bQKm8067HktB17EDWEE=
@@ -461,6 +478,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
 github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
+github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM=
 github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
@@ -481,6 +499,8 @@ github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h
 github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
 github.com/neilotoole/errgroup v0.1.6 h1:PODGqPXdT5BC/zCYIMoTrwV+ujKcW+gBXM6Ye9Ve3R8=
 github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE=
+github.com/nixberg/chacha-rng-go v0.1.0 h1:2Y90hS8H/O+82yLWKD4MldkJM7Pzhezc7rT6EILvDNo=
+github.com/nixberg/chacha-rng-go v0.1.0/go.mod h1:iPf1i6Vcwgoue86dblORobEXNCd1PFQiysFiImawfCM=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
@@ -630,11 +650,16 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
+go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
 golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -653,6 +678,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -741,8 +767,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
 golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c=
 golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -851,6 +878,7 @@ golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211205182925-97ca703d548d h1:FjkYO/PPp4Wi0EAUOVLxePm7qVW4r4ctbWpURyuOD0E=
 golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1123,3 +1151,4 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=
diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go
index 91b16ac..9fd9cce 100644
--- a/pkg/logger/logger.go
+++ b/pkg/logger/logger.go
@@ -21,6 +21,9 @@ import (
 	"os"
 	"path"
 
+	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
+
 	"github.com/coinbase/rosetta-cli/pkg/results"
 
 	"github.com/coinbase/rosetta-sdk-go/parser"
@@ -33,6 +36,8 @@ import (
 
 var _ statefulsyncer.Logger = (*Logger)(nil)
 
+type CheckType string
+
 const (
 	// blockStreamFile contains the stream of processed
 	// blocks and whether they were added or removed.
@@ -58,6 +63,11 @@ const (
 	// removeEvent is printed in a stream
 	// when an event is orphaned.
 	removeEvent = "Remove"
+
+	// Construction identifies construction check
+	Construction CheckType = "construction"
+	// Data identifies data check
+	Data CheckType = "data"
 )
 
 // Logger contains all logic to record validator output
@@ -71,6 +81,8 @@ type Logger struct {
 
 	lastStatsMessage    string
 	lastProgressMessage string
+
+	zapLogger *zap.Logger
 }
 
 // NewLogger constructs a new Logger.
@@ -80,14 +92,43 @@ func NewLogger(
 	logTransactions bool,
 	logBalanceChanges bool,
 	logReconciliation bool,
-) *Logger {
+	checkType CheckType,
+	network *types.NetworkIdentifier,
+	fields ...zap.Field,
+) (*Logger, error) {
+	zapLogger, err := buildZapLogger(checkType, network, fields...)
+	if err != nil {
+		return nil, err
+	}
 	return &Logger{
 		logDir:            logDir,
 		logBlocks:         logBlocks,
 		logTransactions:   logTransactions,
 		logBalanceChanges: logBalanceChanges,
 		logReconciliation: logReconciliation,
+		zapLogger:         zapLogger,
+	}, nil
+}
+
+func buildZapLogger(
+	checkType CheckType,
+	network *types.NetworkIdentifier,
+	fields ...zap.Field,
+) (*zap.Logger, error) {
+	config := zap.NewDevelopmentConfig()
+	config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
+
+	baseSlice := []zap.Field {
+		zap.String("blockchain", network.Blockchain),
+		zap.String("network", network.Network),
+		zap.String("check_type", string(checkType)),
 	}
+	mergedSlice := append(baseSlice, fields...)
+
+	zapLogger, err := config.Build(
+		zap.Fields(mergedSlice...),
+	)
+	return zapLogger, err
 }
 
 // LogDataStatus logs results.CheckDataStatus.
@@ -276,7 +317,7 @@ func (l *Logger) TransactionStream(
 			block.BlockIdentifier.Index,
 			block.BlockIdentifier.Hash,
 		)
-		
+
 		fmt.Print(transactionString)
 		_, err = f.WriteString(transactionString)
 
@@ -471,6 +512,36 @@ func (l *Logger) ReconcileFailureStream(
 	return nil
 }
 
+// Info logs at Info level
+func (l *Logger) Info(msg string, fields ...zap.Field) {
+	l.zapLogger.Info(msg, fields...)
+}
+
+// Debug logs at Debug level
+func (l *Logger) Debug(msg string, fields ...zap.Field) {
+	l.zapLogger.Debug(msg, fields...)
+}
+
+// Error logs at Error level
+func (l *Logger) Error(msg string, fields ...zap.Field) {
+	l.zapLogger.Error(msg, fields...)
+}
+
+// Warn logs at Warn level
+func (l *Logger) Warn(msg string, fields ...zap.Field) {
+	l.zapLogger.Warn(msg, fields...)
+}
+
+// Panic logs at Panic level
+func (l *Logger) Panic(msg string, fields ...zap.Field) {
+	l.zapLogger.Panic(msg, fields...)
+}
+
+// Fatal logs at Fatal level
+func (l *Logger) Fatal(msg string, fields ...zap.Field) {
+	l.zapLogger.Fatal(msg, fields...)
+}
+
 // Helper function to close log file
 func closeFile(f *os.File) {
 	err := f.Close()
diff --git a/pkg/results/data_results.go b/pkg/results/data_results.go
index e667409..1c2f98e 100644
--- a/pkg/results/data_results.go
+++ b/pkg/results/data_results.go
@@ -498,7 +498,7 @@ func (c *CheckDataTests) Print() {
 	table.Append(
 		[]string{
 			"Reconciliation",
-			"No balance discrepencies were found between computed and live balances",
+			"No balance discrepancies were found between computed and live balances",
 			convertBool(c.Reconciliation),
 		},
 	)


Test patch:
diff --git a/pkg/tester/construction.go b/pkg/tester/construction.go
index 9f997d7..653b357 100644
--- a/pkg/tester/construction.go
+++ b/pkg/tester/construction.go
@@ -113,13 +113,18 @@ func InitializeConstruction(
 	}
 
 	counterStorage := modules.NewCounterStorage(localStore)
-	logger := logger.NewLogger(
+	logger, err := logger.NewLogger(
 		dataPath,
 		false,
 		false,
 		false,
 		false,
+		logger.Construction,
+		network,
 	)
+	if err != nil {
+		return nil, fmt.Errorf("unable to initialize logger with error: %s", err.Error())
+	}
 
 	blockStorage := modules.NewBlockStorage(localStore, config.SerialBlockWorkers)
 	keyStorage := modules.NewKeyStorage(localStore)
diff --git a/pkg/tester/data.go b/pkg/tester/data.go
index a24c67e..382c644 100644
--- a/pkg/tester/data.go
+++ b/pkg/tester/data.go
@@ -181,13 +181,19 @@ func InitializeData(
 	blockStorage := modules.NewBlockStorage(localStore, config.SerialBlockWorkers)
 	balanceStorage := modules.NewBalanceStorage(localStore)
 
-	logger := logger.NewLogger(
+	logger, err := logger.NewLogger(
 		dataPath,
 		config.Data.LogBlocks,
 		config.Data.LogTransactions,
 		config.Data.LogBalanceChanges,
 		config.Data.LogReconciliations,
+		logger.Data,
+		network,
 	)
+	if err != nil {
+		log.Fatalf(fmt.Sprintf("unable to initialize logger with error: %s", err.Error()))
+		return nil
+	}
 
 	var forceInactiveReconciliation bool
 	reconcilerHelper := processor.NewReconcilerHelper(
@@ -1018,14 +1024,20 @@ func (t *DataTester) recursiveOpSearch(
 	blockStorage := modules.NewBlockStorage(localStore, t.config.SerialBlockWorkers)
 	balanceStorage := modules.NewBalanceStorage(localStore)
 
-	logger := logger.NewLogger(
+	logger, err := logger.NewLogger(
 		tmpDir,
 		false,
 		false,
 		false,
 		false,
+		logger.Data,
+		t.network,
 	)
 
+	if err != nil {
+		return nil, fmt.Errorf("unable to initialize logger with error: %s", err.Error())
+	}
+
 	t.forceInactiveReconciliation = types.Bool(false)
 	reconcilerHelper := processor.NewReconcilerHelper(
 		t.config,