Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(docs): submitter docs #2837

Merged
merged 15 commits into from
Jul 28, 2024
Merged

feat(docs): submitter docs #2837

merged 15 commits into from
Jul 28, 2024

Conversation

golangisfun123
Copy link
Collaborator

@golangisfun123 golangisfun123 commented Jul 2, 2024

Description
A clear and concise description of the features you're adding in this pull request.

Additional context
Add any other context about the problem you're solving.

Metadata

  • Fixes #[Link to Issue]

Summary by CodeRabbit

  • Documentation

    • Updated description of the Submitter module in the Ethergo project.
    • Enhanced SubmitTransaction method details and added examples.
    • Clarified reaper functionality, Submitter configuration, nonce management, and database behavior.
    • Listed observability metrics for Prometheus monitoring.
  • New Features

    • Added Mermaid support in Markdown configuration for documentation.
  • Chores

    • Added @docusaurus/theme-mermaid as a dependency in package.json.

8de2a05: docs preview link
697dc53: docs preview link
b440fa9: docs preview link
c9752fe: docs preview link
da1bc5b: docs preview link
398944b: docs preview link
4f2c1cd: docs preview link
f7e3572: docs preview link
6ded9c8: docs preview link
9daeca1: docs preview link

@golangisfun123 golangisfun123 requested a review from trajan0x as a code owner July 2, 2024 16:21
Copy link
Contributor

coderabbitai bot commented Jul 2, 2024

Walkthrough

The updates enhance the Submitter module in the Ethergo project, providing detailed information on the SubmitTransaction method, reaper functionality, configuration, nonce management, database behavior, and observability metrics. Examples and links have been added to improve understanding and usage. Additionally, support for Mermaid diagrams in documentation is introduced in the Docusaurus configuration.

Changes

Files Change Summary
docs/bridge/docs/Services/Submitter.md Updated to include detailed information on SubmitTransaction method, reaper functionality, configuration, nonce management, database behavior, and observability metrics with examples.
ethergo/submitter/chain_queue.go Reordered import statements for better organization.
docs/bridge/docusaurus.config.ts Added support for Mermaid diagrams; modified themes array to include @docusaurus/theme-mermaid.
docs/bridge/package.json Added @docusaurus/theme-mermaid as a dependency.

Poem

In Ethergo's realm, the Submitter so bright,
Transactions now clearer, in day or in night.
With nonce and metrics, and examples to see,
Enhanced configurations, as smooth as can be.
Docusaurus now draws, with Mermaid's delight,
Our docs and code shine, in technical light. 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions bot added go Pull requests that update Go code M-docs size/s labels Jul 2, 2024
Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Summary

  • Added comprehensive documentation for Ethergo Submitter in /docs/bridge/docs/Services/Submitter.md
  • Included example configurations and code snippets in the documentation
  • Explained internal mechanisms like nonce management and reaper functionality in the documentation
  • Reordered import statements in /ethergo/submitter/chain_queue.go

2 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link

cloudflare-workers-and-pages bot commented Jul 2, 2024

Deploying sanguine-fe with  Cloudflare Pages  Cloudflare Pages

Latest commit: 135d902
Status: ✅  Deploy successful!
Preview URL: https://e02f0926.sanguine-fe.pages.dev
Branch Preview URL: https://submitter-docs.sanguine-fe.pages.dev

View logs

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between bdf657c and de7062c.

Files ignored due to path filters (1)
  • docs/bridge/docs/Services/img/submitter/submitter_flow.svg is excluded by !**/*.svg
Files selected for processing (2)
  • docs/bridge/docs/Services/Submitter.md (1 hunks)
  • ethergo/submitter/chain_queue.go (1 hunks)
Files skipped from review due to trivial changes (1)
  • ethergo/submitter/chain_queue.go
Additional context used
LanguageTool
docs/bridge/docs/Services/Submitter.md

[grammar] ~88-~88: Possible subject-verb agreement error detected.
Context: ...selector loop running at all times that calls the processQueue method, concurrently...

(PLURAL_THAT_AGREEMENT)


[uncategorized] ~138-~138: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions. - `...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~139-~139: Loose punctuation mark.
Context: ... pending transactions. - current_nonce: The current nonce. - `oldest_pending_tx...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~140-~140: Loose punctuation mark.
Context: ...The current nonce. - oldest_pending_tx: The age of the oldest pending transacti...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~141-~141: Loose punctuation mark.
Context: ...pending transaction. - confirmed_queue: The number of confirmed transactions. -...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~142-~142: Loose punctuation mark.
Context: ... confirmed transactions. - gas_balance: The current gas balance. The metrics c...

(UNLIKELY_OPENING_PUNCTUATION)

Markdownlint
docs/bridge/docs/Services/Submitter.md

66-66: Column: 1
Hard tabs

(MD010, no-hard-tabs)


71-71: Column: 1
Hard tabs

(MD010, no-hard-tabs)


72-72: Column: 1
Hard tabs

(MD010, no-hard-tabs)


73-73: Column: 1
Hard tabs

(MD010, no-hard-tabs)


75-75: Column: 1
Hard tabs

(MD010, no-hard-tabs)


127-127: Column: 1
Hard tabs

(MD010, no-hard-tabs)


128-128: Column: 1
Hard tabs

(MD010, no-hard-tabs)


129-129: Column: 1
Hard tabs

(MD010, no-hard-tabs)


130-130: Column: 1
Hard tabs

(MD010, no-hard-tabs)

Additional comments not posted (5)
docs/bridge/docs/Services/Submitter.md (5)

11-11: LGTM!

The addition of the submitter flow image enhances the documentation.


15-16: LGTM!

The detailed explanation of the SubmitTransaction method and its usage with GetSubmissionStatus is clear and informative.


23-23: LGTM!

The explanation about the reaper functionality and its configuration is clear and useful.


27-49: LGTM!

The configuration details and example YAML configuration provide clear instructions on how to configure the Submitter module.


57-78: LGTM!

The example of how to use the SubmitTransaction method is clear and practical.

Tools
Markdownlint

66-66: Column: 1
Hard tabs

(MD010, no-hard-tabs)


71-71: Column: 1
Hard tabs

(MD010, no-hard-tabs)


72-72: Column: 1
Hard tabs

(MD010, no-hard-tabs)


73-73: Column: 1
Hard tabs

(MD010, no-hard-tabs)


75-75: Column: 1
Hard tabs

(MD010, no-hard-tabs)

Comment on lines 80 to 142
### Nonce Management, Database, Internals

#### Nonce Management and Multichain

Submitter was designed with multiple chains in mind by keeping track of a thread-safe `map[chainid]nonce`. When we build the transaction opts, we lock on the chainid until we finish firing off the transaction.
We also keep a `map[txHash]txStatus` with the same thread-safe mechanism.
This allows us to concurrently fire off transactions on different chains while ensuring our nonces are correct.

The [Queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) has a selector loop running at all times that calls the `processQueue` method, concurrently processing and storing confirmed txs, or using the [chain queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) to fire off and store pending txs on chain.

#### Customizing DB Behavior

The Chain Queue db interface, [Service](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/db/service.go), allows a user to customize their Transaction DB behavior. The concrete implementation is in [store.go](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/db/txdb/store.go).

#### Transaction DB

The schema for a transaction to be stored in the Transaction DB is:

```go
// ETHTX contains a raw evm transaction that is unsigned.
type ETHTX struct {
ID uint64 `gorm:"column:id;primaryKey;autoIncrement:true"`
// UUID is a unique ID for this transaction that will persist across retries.
UUID string `gorm:"column:uuid;index"`
// CreatedAt is the time the transaction was created
CreatedAt time.Time
// TXHash is the hash of the transaction
TXHash string `gorm:"column:tx_hash;uniqueIndex;size:256"`
// From is the sender of the transaction
From string `gorm:"column:from;index"`
// ChainID is the chain id the transaction hash will be sent on
ChainID uint64 `gorm:"column:chain_id;index"`
// Nonce is the nonce of the raw evm tx
Nonce uint64 `gorm:"column:nonce;index"`
// RawTx is the raw serialized transaction
RawTx []byte `gorm:"column:raw_tx"`
// Status is the status of the transaction
Status db.Status `gorm:"column:status;index"`
}
```

Using [GORM.db](https://pkg.go.dev/gorm.io/gorm), you can use whatever database you'd like, MySQL, Sqlite, etc.

#### MySQL Example

```go
gdb, err := gorm.Open(mysql.Open(dbURL), &gorm.Config{
Logger: common_base.GetGormLogger(logger),
FullSaveAssociations: true,
NamingStrategy: NamingStrategy,
NowFunc: time.Now,
})
```

### Observability

Submitter exposes metrics for Prometheus. The metrics are:

- `num_pending_txs`: The number of pending transactions.
- `current_nonce`: The current nonce.
- `oldest_pending_tx`: The age of the oldest pending transaction.
- `confirmed_queue`: The number of confirmed transactions.
- `gas_balance`: The current gas balance.

- `num_pending_txs`: The number of pending transactions.
- `current_nonce`: The current nonce.
- `oldest_pending_tx`: The age of the oldest pending transaction.
- `confirmed_queue`: The number of confirmed transactions.
- `gas_balance`: The current gas balance.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

The details about nonce management, database behavior, and observability metrics are clear and valuable.

Fix grammatical issues and hard tabs.

There are some grammatical issues and hard tabs in the code blocks.

- The [Queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) has a selector loop running at all times that calls the `processQueue` method, concurrently processing and storing confirmed txs, or using the [chain queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) to fire off and store pending txs on chain.
+ The [Queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) has a selector loop running at all times which calls the `processQueue` method, concurrently processing and storing confirmed txs, or using the [chain queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) to fire off and store pending txs on chain.

- - `num_pending_txs`: The number of pending transactions.
- - `current_nonce`: The current nonce.
- - `oldest_pending_tx`: The age of the oldest pending transaction.
- - `confirmed_queue`: The number of confirmed transactions.
- - `gas_balance`: The current gas balance.
+ - `num_pending_txs`: The number of pending transactions
+ - `current_nonce`: The current nonce
+ - `oldest_pending_tx`: The age of the oldest pending transaction
+ - `confirmed_queue`: The number of confirmed transactions
+ - `gas_balance`: The current gas balance

-	 tx, err = contract.ReceiveMessage(
-            transactor,
-            msg.Message,
-            msg.Attestation,
-            )
-	if err != nil {
-		return nil, fmt.Errorf("could not submit transaction: %w", err)
-	}
+    tx, err = contract.ReceiveMessage(
+        transactor,
+        msg.Message,
+        msg.Attestation,
+    )
+    if err != nil {
+        return nil, fmt.Errorf("could not submit transaction: %w", err)
+    }

-	gdb, err := gorm.Open(mysql.Open(dbURL), &gorm.Config{
-	Logger:               common_base.GetGormLogger(logger),
-	FullSaveAssociations: true,
-	NamingStrategy:       NamingStrategy,
-	NowFunc:              time.Now,
+gdb, err := gorm.Open(mysql.Open(dbURL), &gorm.Config{
+    Logger:               common_base.GetGormLogger(logger),
+    FullSaveAssociations: true,
+    NamingStrategy:       NamingStrategy,
+    NowFunc:              time.Now,
})
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
### Nonce Management, Database, Internals
#### Nonce Management and Multichain
Submitter was designed with multiple chains in mind by keeping track of a thread-safe `map[chainid]nonce`. When we build the transaction opts, we lock on the chainid until we finish firing off the transaction.
We also keep a `map[txHash]txStatus` with the same thread-safe mechanism.
This allows us to concurrently fire off transactions on different chains while ensuring our nonces are correct.
The [Queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) has a selector loop running at all times that calls the `processQueue` method, concurrently processing and storing confirmed txs, or using the [chain queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) to fire off and store pending txs on chain.
#### Customizing DB Behavior
The Chain Queue db interface, [Service](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/db/service.go), allows a user to customize their Transaction DB behavior. The concrete implementation is in [store.go](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/db/txdb/store.go).
#### Transaction DB
The schema for a transaction to be stored in the Transaction DB is:
```go
// ETHTX contains a raw evm transaction that is unsigned.
type ETHTX struct {
ID uint64 `gorm:"column:id;primaryKey;autoIncrement:true"`
// UUID is a unique ID for this transaction that will persist across retries.
UUID string `gorm:"column:uuid;index"`
// CreatedAt is the time the transaction was created
CreatedAt time.Time
// TXHash is the hash of the transaction
TXHash string `gorm:"column:tx_hash;uniqueIndex;size:256"`
// From is the sender of the transaction
From string `gorm:"column:from;index"`
// ChainID is the chain id the transaction hash will be sent on
ChainID uint64 `gorm:"column:chain_id;index"`
// Nonce is the nonce of the raw evm tx
Nonce uint64 `gorm:"column:nonce;index"`
// RawTx is the raw serialized transaction
RawTx []byte `gorm:"column:raw_tx"`
// Status is the status of the transaction
Status db.Status `gorm:"column:status;index"`
}
```
Using [GORM.db](https://pkg.go.dev/gorm.io/gorm), you can use whatever database you'd like, MySQL, Sqlite, etc.
#### MySQL Example
```go
gdb, err := gorm.Open(mysql.Open(dbURL), &gorm.Config{
Logger: common_base.GetGormLogger(logger),
FullSaveAssociations: true,
NamingStrategy: NamingStrategy,
NowFunc: time.Now,
})
```
### Observability
Submitter exposes metrics for Prometheus. The metrics are:
- `num_pending_txs`: The number of pending transactions.
- `current_nonce`: The current nonce.
- `oldest_pending_tx`: The age of the oldest pending transaction.
- `confirmed_queue`: The number of confirmed transactions.
- `gas_balance`: The current gas balance.
- `num_pending_txs`: The number of pending transactions.
- `current_nonce`: The current nonce.
- `oldest_pending_tx`: The age of the oldest pending transaction.
- `confirmed_queue`: The number of confirmed transactions.
- `gas_balance`: The current gas balance.
### Nonce Management, Database, Internals
#### Nonce Management and Multichain
Submitter was designed with multiple chains in mind by keeping track of a thread-safe `map[chainid]nonce`. When we build the transaction opts, we lock on the chainid until we finish firing off the transaction.
We also keep a `map[txHash]txStatus` with the same thread-safe mechanism.
This allows us to concurrently fire off transactions on different chains while ensuring our nonces are correct.
The [Queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) has a selector loop running at all times which calls the `processQueue` method, concurrently processing and storing confirmed txs, or using the [chain queue](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/chain_queue.go) to fire off and store pending txs on chain.
#### Customizing DB Behavior
The Chain Queue db interface, [Service](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/db/service.go), allows a user to customize their Transaction DB behavior. The concrete implementation is in [store.go](https://github.com/synapsecns/sanguine/blob/ethergo/v0.9.0/ethergo/submitter/db/txdb/store.go).
#### Transaction DB
The schema for a transaction to be stored in the Transaction DB is:
```go
// ETHTX contains a raw evm transaction that is unsigned.
type ETHTX struct {
ID uint64 `gorm:"column:id;primaryKey;autoIncrement:true"`
// UUID is a unique ID for this transaction that will persist across retries.
UUID string `gorm:"column:uuid;index"`
// CreatedAt is the time the transaction was created
CreatedAt time.Time
// TXHash is the hash of the transaction
TXHash string `gorm:"column:tx_hash;uniqueIndex;size:256"`
// From is the sender of the transaction
From string `gorm:"column:from;index"`
// ChainID is the chain id the transaction hash will be sent on
ChainID uint64 `gorm:"column:chain_id;index"`
// Nonce is the nonce of the raw evm tx
Nonce uint64 `gorm:"column:nonce;index"`
// RawTx is the raw serialized transaction
RawTx []byte `gorm:"column:raw_tx"`
// Status is the status of the transaction
Status db.Status `gorm:"column:status;index"`
}
```
Using [GORM.db](https://pkg.go.dev/gorm.io/gorm), you can use whatever database you'd like, MySQL, Sqlite, etc.
#### MySQL Example
```go
gdb, err := gorm.Open(mysql.Open(dbURL), &gorm.Config{
Logger: common_base.GetGormLogger(logger),
FullSaveAssociations: true,
NamingStrategy: NamingStrategy,
NowFunc: time.Now,
})
```
### Observability
Submitter exposes metrics for Prometheus. The metrics are:
- `num_pending_txs`: The number of pending transactions
- `current_nonce`: The current nonce
- `oldest_pending_tx`: The age of the oldest pending transaction
- `confirmed_queue`: The number of confirmed transactions
- `gas_balance`: The current gas balance
Tools
LanguageTool

[grammar] ~88-~88: Possible subject-verb agreement error detected.
Context: ...selector loop running at all times that calls the processQueue method, concurrently...

(PLURAL_THAT_AGREEMENT)


[uncategorized] ~138-~138: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions. - `...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~139-~139: Loose punctuation mark.
Context: ... pending transactions. - current_nonce: The current nonce. - `oldest_pending_tx...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~140-~140: Loose punctuation mark.
Context: ...The current nonce. - oldest_pending_tx: The age of the oldest pending transacti...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~141-~141: Loose punctuation mark.
Context: ...pending transaction. - confirmed_queue: The number of confirmed transactions. -...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~142-~142: Loose punctuation mark.
Context: ... confirmed transactions. - gas_balance: The current gas balance. The metrics c...

(UNLIKELY_OPENING_PUNCTUATION)

Markdownlint

127-127: Column: 1
Hard tabs

(MD010, no-hard-tabs)


128-128: Column: 1
Hard tabs

(MD010, no-hard-tabs)


129-129: Column: 1
Hard tabs

(MD010, no-hard-tabs)


130-130: Column: 1
Hard tabs

(MD010, no-hard-tabs)

Copy link

codecov bot commented Jul 2, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 21.92734%. Comparing base (d0f1508) to head (135d902).
Report is 25 commits behind head on master.

Additional details and impacted files
@@                 Coverage Diff                 @@
##              master       #2837         +/-   ##
===================================================
- Coverage   25.91575%   21.92734%   -3.98841%     
===================================================
  Files            751         640        -111     
  Lines          53890       50868       -3022     
  Branches          80           0         -80     
===================================================
- Hits           13966       11154       -2812     
+ Misses         38480       38388         -92     
+ Partials        1444        1326        -118     
Flag Coverage Δ
agents 34.09763% <ø> (ø)
cctp-relayer 31.97848% <ø> (+0.04068%) ⬆️
core ?
ethergo 48.04604% <ø> (-0.22421%) ⬇️
explorer 4.97877% <ø> (ø)
git-changes-action ?
omnirpc 33.23904% <ø> (+0.15775%) ⬆️
opbot 0.18564% <ø> (-0.02519%) ⬇️
packages ?
promexporter 8.50242% <ø> (?)
rfq 24.76775% <ø> (-2.35389%) ⬇️
screener-api ?
scribe 18.11159% <ø> (-0.06438%) ⬇️
tools 30.55118% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Summary

(updates since last review)

  • No major changes found since last review.

1 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between de7062c and c8462de.

Files selected for processing (1)
  • docs/bridge/docs/Services/Submitter.md (1 hunks)
Additional context used
LanguageTool
docs/bridge/docs/Services/Submitter.md

[uncategorized] ~137-~137: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions - `c...

(UNLIKELY_OPENING_PUNCTUATION)

Markdownlint
docs/bridge/docs/Services/Submitter.md

66-66: Column: 1
Hard tabs

(MD010, no-hard-tabs)


71-71: Column: 1
Hard tabs

(MD010, no-hard-tabs)


72-72: Column: 1
Hard tabs

(MD010, no-hard-tabs)


73-73: Column: 1
Hard tabs

(MD010, no-hard-tabs)


75-75: Column: 1
Hard tabs

(MD010, no-hard-tabs)

Additional comments not posted (4)
docs/bridge/docs/Services/Submitter.md (4)

11-16: LGTM!

The documentation correctly describes the new functionality of the SubmitTransaction method.


23-23: LGTM!

The documentation accurately describes the reaper functionality and its configurability.


27-29: LGTM!

The documentation correctly describes the configuration options and the use of the Chains map.


31-49: LGTM!

The example configuration is clear and provides useful information for users.

Comment on lines 53 to 78
### Overview

`SubmitTransaction` abstracts many of the complexities of on-chain transaction submission such as nonce management and gas bumping. In addition, sent transactions are stored in the database for easy indexing of older transactions.

#### Example of SubmitTransaction

Below is an example of how to submit a transaction using Submitter. Note that the actual transaction submission logic takes place in the callback. We use an abigen binding here to send the transaction (`ReceiveMessage`), but any way to send a transaction also works, like our [Ethergo/EVM client](https://pkg.go.dev/github.com/synapsecns/sanguine/ethergo@v0.9.0/client) or geth's `ethclient`.

```go
nonce, err := c.txSubmitter.SubmitTransaction(
ctx,
big.NewInt(int64(msg.DestChainID)),
func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) {
tx, err = contract.ReceiveMessage(
transactor,
msg.Message,
msg.Attestation,
)
if err != nil {
return nil, fmt.Errorf("could not submit transaction: %w", err)
}

return tx, nil
},
)
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace hard tabs with spaces.

The example is clear and demonstrates the correct usage of the SubmitTransaction method. However, there are hard tabs that need to be replaced with spaces.

-	tx, err = contract.ReceiveMessage(
-            transactor,
-            msg.Message,
-            msg.Attestation,
-            )
-	if err != nil {
-		return nil, fmt.Errorf("could not submit transaction: %w", err)
-	}
+    tx, err = contract.ReceiveMessage(
+        transactor,
+        msg.Message,
+        msg.Attestation,
+    )
+    if err != nil {
+        return nil, fmt.Errorf("could not submit transaction: %w", err)
+    }
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
### Overview
`SubmitTransaction` abstracts many of the complexities of on-chain transaction submission such as nonce management and gas bumping. In addition, sent transactions are stored in the database for easy indexing of older transactions.
#### Example of SubmitTransaction
Below is an example of how to submit a transaction using Submitter. Note that the actual transaction submission logic takes place in the callback. We use an abigen binding here to send the transaction (`ReceiveMessage`), but any way to send a transaction also works, like our [Ethergo/EVM client](https://pkg.go.dev/github.com/synapsecns/sanguine/ethergo@v0.9.0/client) or geth's `ethclient`.
```go
nonce, err := c.txSubmitter.SubmitTransaction(
ctx,
big.NewInt(int64(msg.DestChainID)),
func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) {
tx, err = contract.ReceiveMessage(
transactor,
msg.Message,
msg.Attestation,
)
if err != nil {
return nil, fmt.Errorf("could not submit transaction: %w", err)
}
return tx, nil
},
)
```
### Overview
`SubmitTransaction` abstracts many of the complexities of on-chain transaction submission such as nonce management and gas bumping. In addition, sent transactions are stored in the database for easy indexing of older transactions.
#### Example of SubmitTransaction
Below is an example of how to submit a transaction using Submitter. Note that the actual transaction submission logic takes place in the callback. We use an abigen binding here to send the transaction (`ReceiveMessage`), but any way to send a transaction also works, like our [Ethergo/EVM client](https://pkg.go.dev/github.com/synapsecns/sanguine/ethergo@v0.9.0/client) or geth's `ethclient`.
```go
nonce, err := c.txSubmitter.SubmitTransaction(
ctx,
big.NewInt(int64(msg.DestChainID)),
func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) {
tx, err = contract.ReceiveMessage(
transactor,
msg.Message,
msg.Attestation,
)
if err != nil {
return nil, fmt.Errorf("could not submit transaction: %w", err)
}
return tx, nil
},
)
```
Tools
Markdownlint

66-66: Column: 1
Hard tabs

(MD010, no-hard-tabs)


71-71: Column: 1
Hard tabs

(MD010, no-hard-tabs)


72-72: Column: 1
Hard tabs

(MD010, no-hard-tabs)


73-73: Column: 1
Hard tabs

(MD010, no-hard-tabs)


75-75: Column: 1
Hard tabs

(MD010, no-hard-tabs)

docs/bridge/docs/Services/Submitter.md Outdated Show resolved Hide resolved
docs/bridge/docs/Services/Submitter.md Outdated Show resolved Hide resolved
docs/bridge/docs/Services/Submitter.md Outdated Show resolved Hide resolved
docs/bridge/docs/Services/Submitter.md Show resolved Hide resolved
`SubmitTransaction` abstracts many of the complexities of on-chain transaction submission such as nonce management and gas bumping. In addition, sent transactions are stored in the database for easy indexing of older transactions.

#### Example of SubmitTransaction

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe have a Using submitter as a library section? This is just very different than the average user configuring submitter/understanding how it works


### Nonce Management, Database, Internals

#### Nonce Management and Multichain
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same goes for this, try to seperate using submitter as a library from as an end user

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Summary

(updates since last review)

  • Enhanced Submitter module documentation with detailed descriptions and examples (docs/bridge/docs/Services/Submitter.md)
  • Enabled Mermaid support for markdown in Docusaurus configuration (docs/bridge/docusaurus.config.ts)
  • Added @docusaurus/theme-mermaid dependency to package.json for improved diagramming capabilities (docs/bridge/package.json)

3 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between c8462de and 1070d38.

Files selected for processing (3)
  • docs/bridge/docs/Services/Submitter.md (1 hunks)
  • docs/bridge/docusaurus.config.ts (2 hunks)
  • docs/bridge/package.json (1 hunks)
Files skipped from review due to trivial changes (1)
  • docs/bridge/package.json
Additional context used
LanguageTool
docs/bridge/docs/Services/Submitter.md

[misspelling] ~21-~21: Use “an” instead of ‘a’ if the following word starts with a vowel sound, e.g. ‘an article’, ‘an hour’.
Context: ...B, Status, is an enum, represented as a uint8. It is important to know what num...

(EN_A_VS_AN)


[uncategorized] ~105-~105: Possible missing comma found.
Context: ...he complexities of on-chain transaction submission such as nonce management and gas bumpin...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~187-~187: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions - `c...

(UNLIKELY_OPENING_PUNCTUATION)

Markdownlint
docs/bridge/docs/Services/Submitter.md

19-19: Expected: h3; Actual: h4
Heading levels should only increment by one level at a time

(MD001, heading-increment)


32-32: Column: 1
Hard tabs

(MD010, no-hard-tabs)


33-33: Column: 1
Hard tabs

(MD010, no-hard-tabs)


34-34: Column: 1
Hard tabs

(MD010, no-hard-tabs)


35-35: Column: 1
Hard tabs

(MD010, no-hard-tabs)


36-36: Column: 1
Hard tabs

(MD010, no-hard-tabs)


37-37: Column: 1
Hard tabs

(MD010, no-hard-tabs)


38-38: Column: 1
Hard tabs

(MD010, no-hard-tabs)


39-39: Column: 1
Hard tabs

(MD010, no-hard-tabs)


40-40: Column: 1
Hard tabs

(MD010, no-hard-tabs)


41-41: Column: 1
Hard tabs

(MD010, no-hard-tabs)


42-42: Column: 1
Hard tabs

(MD010, no-hard-tabs)


43-43: Column: 1
Hard tabs

(MD010, no-hard-tabs)


44-44: Column: 1
Hard tabs

(MD010, no-hard-tabs)


45-45: Column: 1
Hard tabs

(MD010, no-hard-tabs)


116-116: Column: 1
Hard tabs

(MD010, no-hard-tabs)


121-121: Column: 1
Hard tabs

(MD010, no-hard-tabs)


122-122: Column: 1
Hard tabs

(MD010, no-hard-tabs)


123-123: Column: 1
Hard tabs

(MD010, no-hard-tabs)


125-125: Column: 1
Hard tabs

(MD010, no-hard-tabs)

Additional comments not posted (5)
docs/bridge/docusaurus.config.ts (2)

25-28: LGTM! Enabling Mermaid support.

The addition of Mermaid support in the markdown configuration is beneficial for adding diagrams to the documentation.


127-127: LGTM! Adding Mermaid theme.

Adding @docusaurus/theme-mermaid to the themes array is necessary to support Mermaid diagrams in the documentation.

docs/bridge/docs/Services/Submitter.md (3)

51-51: LGTM! Description of reaper functionality.

The description of the reaper functionality is clear and informative.


55-57: LGTM! Description of Submitter configuration.

The description of the submitter configuration is clear and informative.


132-137: LGTM! Description of nonce management.

The description of nonce management is clear and informative.

@@ -10,29 +10,185 @@ The Ethergo Submitter module is designed to submit transactions to an EVM-based

## Key Features

- **Transaction Submission**: The main function of the module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed.
The module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed. The nonce may then be used in the `GetSubmissionStatus` method to check the state: `Pending`, `Stored`, `Submitted`, `FailedSubmit`, `ReplacedOrConfirmed`, `Replaced`, `Confirmed`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add corresponding database interactions.

The description of the SubmitTransaction method is clear, but it would be beneficial to include details about the corresponding database interactions.

Comment on lines 19 to 21
#### Note: Status Enum

In the DB, `Status`, is an enum, represented as a uint8. It is important to know what number indicates what status.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix grammatical issue.

Use "an" instead of "a" before "enum".

- In the DB, `Status`, is an enum, represented as a uint8.
+ In the DB, `Status`, is an enum, represented as an uint8.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#### Note: Status Enum
In the DB, `Status`, is an enum, represented as a uint8. It is important to know what number indicates what status.
#### Note: Status Enum
In the DB, `Status`, is an enum, represented as an uint8. It is important to know what number indicates what status.
Tools
LanguageTool

[misspelling] ~21-~21: Use “an” instead of ‘a’ if the following word starts with a vowel sound, e.g. ‘an article’, ‘an hour’.
Context: ...B, Status, is an enum, represented as a uint8. It is important to know what num...

(EN_A_VS_AN)

Markdownlint

19-19: Expected: h3; Actual: h4
Heading levels should only increment by one level at a time

(MD001, heading-increment)

Comment on lines 111 to 128
```go
nonce, err := c.txSubmitter.SubmitTransaction(
ctx,
big.NewInt(int64(msg.DestChainID)),
func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) {
tx, err = contract.ReceiveMessage(
transactor,
msg.Message,
msg.Attestation,
)
if err != nil {
return nil, fmt.Errorf("could not submit transaction: %w", err)
}

return tx, nil
},
)
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace hard tabs with spaces.

The example is clear and demonstrates the correct usage of the SubmitTransaction method. However, there are hard tabs that need to be replaced with spaces.

-	tx, err = contract.ReceiveMessage(
-            transactor,
-            msg.Message,
-            msg.Attestation,
-            )
-	if err != nil {
-		return nil, fmt.Errorf("could not submit transaction: %w", err)
-	}
+    tx, err = contract.ReceiveMessage(
+        transactor,
+        msg.Message,
+        msg.Attestation,
+    )
+    if err != nil {
+        return nil, fmt.Errorf("could not submit transaction: %w", err)
+    }
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
```go
nonce, err := c.txSubmitter.SubmitTransaction(
ctx,
big.NewInt(int64(msg.DestChainID)),
func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) {
tx, err = contract.ReceiveMessage(
transactor,
msg.Message,
msg.Attestation,
)
if err != nil {
return nil, fmt.Errorf("could not submit transaction: %w", err)
}
return tx, nil
},
)
```
```go
nonce, err := c.txSubmitter.SubmitTransaction(
ctx,
big.NewInt(int64(msg.DestChainID)),
func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) {
tx, err = contract.ReceiveMessage(
transactor,
msg.Message,
msg.Attestation,
)
if err != nil {
return nil, fmt.Errorf("could not submit transaction: %w", err)
}
return tx, nil
},
)
```
Tools
Markdownlint

116-116: Column: 1
Hard tabs

(MD010, no-hard-tabs)


121-121: Column: 1
Hard tabs

(MD010, no-hard-tabs)


122-122: Column: 1
Hard tabs

(MD010, no-hard-tabs)


123-123: Column: 1
Hard tabs

(MD010, no-hard-tabs)


125-125: Column: 1
Hard tabs

(MD010, no-hard-tabs)

Comment on lines 32 to 45
// Pending is the status of a tx that has not been processed yet.
Pending Status = iota + 1 // Pending
// Stored is the status of a tx that has been stored.
Stored // Stored
// Submitted is the status of a tx that has been submitted.
Submitted // Submitted
// FailedSubmit is the status of a tx that has failed to submit.
FailedSubmit // Failed
// ReplacedOrConfirmed is the status of a tx that has been replaced by a new tx or confirmed. The actual status will be set later.
ReplacedOrConfirmed // ReplacedOrConfirmed
// Replaced is the status of a tx that has been replaced by a new tx.
Replaced // Replaced
// Confirmed is the status of a tx that has been confirmed.
Confirmed // Confirmed
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace hard tabs with spaces.

The constants for the Status enum are well-defined, but hard tabs should be replaced with spaces.

-	Pending Status = iota + 1 // Pending
-	Stored // Stored
-	Submitted // Submitted
-	FailedSubmit // Failed
-	ReplacedOrConfirmed // ReplacedOrConfirmed
-	Replaced // Replaced
-	Confirmed // Confirmed
+    Pending Status = iota + 1 // Pending
+    Stored // Stored
+    Submitted // Submitted
+    FailedSubmit // Failed
+    ReplacedOrConfirmed // ReplacedOrConfirmed
+    Replaced // Replaced
+    Confirmed // Confirmed
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Pending is the status of a tx that has not been processed yet.
Pending Status = iota + 1 // Pending
// Stored is the status of a tx that has been stored.
Stored // Stored
// Submitted is the status of a tx that has been submitted.
Submitted // Submitted
// FailedSubmit is the status of a tx that has failed to submit.
FailedSubmit // Failed
// ReplacedOrConfirmed is the status of a tx that has been replaced by a new tx or confirmed. The actual status will be set later.
ReplacedOrConfirmed // ReplacedOrConfirmed
// Replaced is the status of a tx that has been replaced by a new tx.
Replaced // Replaced
// Confirmed is the status of a tx that has been confirmed.
Confirmed // Confirmed
// Pending is the status of a tx that has not been processed yet.
Pending Status = iota + 1 // Pending
// Stored is the status of a tx that has been stored.
Stored // Stored
// Submitted is the status of a tx that has been submitted.
Submitted // Submitted
// FailedSubmit is the status of a tx that has failed to submit.
FailedSubmit // Failed
// ReplacedOrConfirmed is the status of a tx that has been replaced by a new tx or confirmed. The actual status will be set later.
ReplacedOrConfirmed // ReplacedOrConfirmed
// Replaced is the status of a tx that has been replaced by a new tx.
Replaced // Replaced
// Confirmed is the status of a tx that has been confirmed.
Confirmed // Confirmed
Tools
Markdownlint

32-32: Column: 1
Hard tabs

(MD010, no-hard-tabs)


33-33: Column: 1
Hard tabs

(MD010, no-hard-tabs)


34-34: Column: 1
Hard tabs

(MD010, no-hard-tabs)


35-35: Column: 1
Hard tabs

(MD010, no-hard-tabs)


36-36: Column: 1
Hard tabs

(MD010, no-hard-tabs)


37-37: Column: 1
Hard tabs

(MD010, no-hard-tabs)


38-38: Column: 1
Hard tabs

(MD010, no-hard-tabs)


39-39: Column: 1
Hard tabs

(MD010, no-hard-tabs)


40-40: Column: 1
Hard tabs

(MD010, no-hard-tabs)


41-41: Column: 1
Hard tabs

(MD010, no-hard-tabs)


42-42: Column: 1
Hard tabs

(MD010, no-hard-tabs)


43-43: Column: 1
Hard tabs

(MD010, no-hard-tabs)


44-44: Column: 1
Hard tabs

(MD010, no-hard-tabs)


45-45: Column: 1
Hard tabs

(MD010, no-hard-tabs)

docs/bridge/docs/Services/Submitter.md Outdated Show resolved Hide resolved
Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Summary

(updates since last review)

  • Removed @docusaurus/theme-mermaid dependency from /docs/bridge/package.json
  • No major changes found since last review.

1 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range and nitpick comments (1)
docs/bridge/docs/Services/Submitter.md (1)

13-13: Improve readability of status list.

The list of statuses returned by the SubmitTransaction method should be formatted for better readability.

- The module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed. The nonce may then be used in the `GetSubmissionStatus` method to check the status: `Pending`, `Stored`, `Submitted`, `FailedSubmit`, `ReplacedOrConfirmed`, `Replaced`, `Confirmed`. [More about the `Status` enum](#status-enum)
+ The module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed. The nonce may then be used in the `GetSubmissionStatus` method to check the status:
+ - `Pending`
+ - `Stored`
+ - `Submitted`
+ - `FailedSubmit`
+ - `ReplacedOrConfirmed`
+ - `Replaced`
+ - `Confirmed`
+ [More about the `Status` enum](#status-enum)
Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 1070d38 and dfbe066.

Files selected for processing (1)
  • docs/bridge/docs/Services/Submitter.md (1 hunks)
Additional context used
LanguageTool
docs/bridge/docs/Services/Submitter.md

[uncategorized] ~75-~75: Possible missing comma found.
Context: ...he complexities of on-chain transaction submission such as nonce management and gas bumpin...

(AI_HYDRA_LEO_MISSING_COMMA)


[grammar] ~129-~129: The word “setup” is a noun. The verb is spelled with a space.
Context: ...#### 4.1 Submitter Suite We will first setup the Submitter Suite, which handles crea...

(NOUN_VERB_CONFUSION)


[uncategorized] ~555-~555: Possible missing comma found.
Context: ... </details> ### 5: Run tests In the console rungo test ./...`. You should see the...

(AI_HYDRA_LEO_MISSING_COMMA)


[misspelling] ~622-~622: Use “an” instead of ‘a’ if the following word starts with a vowel sound, e.g. ‘an article’, ‘an hour’.
Context: ...B, Status, is an enum, represented as a uint8. It is important to know what num...

(EN_A_VS_AN)


[uncategorized] ~654-~654: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions - `c...

(UNLIKELY_OPENING_PUNCTUATION)

Markdownlint
docs/bridge/docs/Services/Submitter.md

138-138: Column: 1
Hard tabs

(MD010, no-hard-tabs)


139-139: Column: 1
Hard tabs

(MD010, no-hard-tabs)


140-140: Column: 1
Hard tabs

(MD010, no-hard-tabs)


141-141: Column: 1
Hard tabs

(MD010, no-hard-tabs)


142-142: Column: 1
Hard tabs

(MD010, no-hard-tabs)


143-143: Column: 1
Hard tabs

(MD010, no-hard-tabs)


144-144: Column: 1
Hard tabs

(MD010, no-hard-tabs)


146-146: Column: 1
Hard tabs

(MD010, no-hard-tabs)


147-147: Column: 1
Hard tabs

(MD010, no-hard-tabs)


148-148: Column: 1
Hard tabs

(MD010, no-hard-tabs)


149-149: Column: 1
Hard tabs

(MD010, no-hard-tabs)


150-150: Column: 1
Hard tabs

(MD010, no-hard-tabs)


151-151: Column: 1
Hard tabs

(MD010, no-hard-tabs)


152-152: Column: 1
Hard tabs

(MD010, no-hard-tabs)


153-153: Column: 1
Hard tabs

(MD010, no-hard-tabs)


154-154: Column: 1
Hard tabs

(MD010, no-hard-tabs)


155-155: Column: 1
Hard tabs

(MD010, no-hard-tabs)


156-156: Column: 1
Hard tabs

(MD010, no-hard-tabs)


157-157: Column: 1
Hard tabs

(MD010, no-hard-tabs)


158-158: Column: 1
Hard tabs

(MD010, no-hard-tabs)


159-159: Column: 1
Hard tabs

(MD010, no-hard-tabs)


160-160: Column: 1
Hard tabs

(MD010, no-hard-tabs)


161-161: Column: 1
Hard tabs

(MD010, no-hard-tabs)


162-162: Column: 1
Hard tabs

(MD010, no-hard-tabs)


163-163: Column: 1
Hard tabs

(MD010, no-hard-tabs)


164-164: Column: 1
Hard tabs

(MD010, no-hard-tabs)


165-165: Column: 1
Hard tabs

(MD010, no-hard-tabs)


166-166: Column: 1
Hard tabs

(MD010, no-hard-tabs)


167-167: Column: 1
Hard tabs

(MD010, no-hard-tabs)


168-168: Column: 1
Hard tabs

(MD010, no-hard-tabs)


169-169: Column: 1
Hard tabs

(MD010, no-hard-tabs)


170-170: Column: 1
Hard tabs

(MD010, no-hard-tabs)


171-171: Column: 1
Hard tabs

(MD010, no-hard-tabs)


175-175: Column: 1
Hard tabs

(MD010, no-hard-tabs)


176-176: Column: 1
Hard tabs

(MD010, no-hard-tabs)


177-177: Column: 1
Hard tabs

(MD010, no-hard-tabs)


178-178: Column: 1
Hard tabs

(MD010, no-hard-tabs)


181-181: Column: 1
Hard tabs

(MD010, no-hard-tabs)


182-182: Column: 1
Hard tabs

(MD010, no-hard-tabs)


186-186: Column: 1
Hard tabs

(MD010, no-hard-tabs)


187-187: Column: 1
Hard tabs

(MD010, no-hard-tabs)


188-188: Column: 1
Hard tabs

(MD010, no-hard-tabs)


189-189: Column: 1
Hard tabs

(MD010, no-hard-tabs)


190-190: Column: 1
Hard tabs

(MD010, no-hard-tabs)


191-191: Column: 1
Hard tabs

(MD010, no-hard-tabs)


192-192: Column: 1
Hard tabs

(MD010, no-hard-tabs)


193-193: Column: 1
Hard tabs

(MD010, no-hard-tabs)


194-194: Column: 1
Hard tabs

(MD010, no-hard-tabs)


195-195: Column: 1
Hard tabs

(MD010, no-hard-tabs)


196-196: Column: 1
Hard tabs

(MD010, no-hard-tabs)


197-197: Column: 1
Hard tabs

(MD010, no-hard-tabs)


198-198: Column: 1
Hard tabs

(MD010, no-hard-tabs)


199-199: Column: 1
Hard tabs

(MD010, no-hard-tabs)


204-204: Column: 1
Hard tabs

(MD010, no-hard-tabs)


206-206: Column: 1
Hard tabs

(MD010, no-hard-tabs)


207-207: Column: 1
Hard tabs

(MD010, no-hard-tabs)


208-208: Column: 1
Hard tabs

(MD010, no-hard-tabs)


209-209: Column: 1
Hard tabs

(MD010, no-hard-tabs)


210-210: Column: 1
Hard tabs

(MD010, no-hard-tabs)


211-211: Column: 1
Hard tabs

(MD010, no-hard-tabs)


212-212: Column: 1
Hard tabs

(MD010, no-hard-tabs)


213-213: Column: 1
Hard tabs

(MD010, no-hard-tabs)


214-214: Column: 1
Hard tabs

(MD010, no-hard-tabs)


215-215: Column: 1
Hard tabs

(MD010, no-hard-tabs)


217-217: Column: 1
Hard tabs

(MD010, no-hard-tabs)


218-218: Column: 1
Hard tabs

(MD010, no-hard-tabs)


219-219: Column: 1
Hard tabs

(MD010, no-hard-tabs)


220-220: Column: 1
Hard tabs

(MD010, no-hard-tabs)


222-222: Column: 1
Hard tabs

(MD010, no-hard-tabs)


224-224: Column: 1
Hard tabs

(MD010, no-hard-tabs)


225-225: Column: 1
Hard tabs

(MD010, no-hard-tabs)


226-226: Column: 1
Hard tabs

(MD010, no-hard-tabs)


227-227: Column: 1
Hard tabs

(MD010, no-hard-tabs)


228-228: Column: 1
Hard tabs

(MD010, no-hard-tabs)


229-229: Column: 1
Hard tabs

(MD010, no-hard-tabs)


230-230: Column: 1
Hard tabs

(MD010, no-hard-tabs)


231-231: Column: 1
Hard tabs

(MD010, no-hard-tabs)


233-233: Column: 1
Hard tabs

(MD010, no-hard-tabs)


234-234: Column: 1
Hard tabs

(MD010, no-hard-tabs)


235-235: Column: 1
Hard tabs

(MD010, no-hard-tabs)


236-236: Column: 1
Hard tabs

(MD010, no-hard-tabs)


237-237: Column: 1
Hard tabs

(MD010, no-hard-tabs)


238-238: Column: 1
Hard tabs

(MD010, no-hard-tabs)


239-239: Column: 1
Hard tabs

(MD010, no-hard-tabs)


240-240: Column: 1
Hard tabs

(MD010, no-hard-tabs)


241-241: Column: 1
Hard tabs

(MD010, no-hard-tabs)


242-242: Column: 1
Hard tabs

(MD010, no-hard-tabs)


243-243: Column: 1
Hard tabs

(MD010, no-hard-tabs)


245-245: Column: 1
Hard tabs

(MD010, no-hard-tabs)


246-246: Column: 1
Hard tabs

(MD010, no-hard-tabs)


247-247: Column: 1
Hard tabs

(MD010, no-hard-tabs)


248-248: Column: 1
Hard tabs

(MD010, no-hard-tabs)


249-249: Column: 1
Hard tabs

(MD010, no-hard-tabs)


250-250: Column: 1
Hard tabs

(MD010, no-hard-tabs)


251-251: Column: 1
Hard tabs

(MD010, no-hard-tabs)


252-252: Column: 1
Hard tabs

(MD010, no-hard-tabs)


253-253: Column: 1
Hard tabs

(MD010, no-hard-tabs)


254-254: Column: 1
Hard tabs

(MD010, no-hard-tabs)


255-255: Column: 1
Hard tabs

(MD010, no-hard-tabs)


256-256: Column: 1
Hard tabs

(MD010, no-hard-tabs)


257-257: Column: 1
Hard tabs

(MD010, no-hard-tabs)


259-259: Column: 1
Hard tabs

(MD010, no-hard-tabs)


260-260: Column: 1
Hard tabs

(MD010, no-hard-tabs)


261-261: Column: 1
Hard tabs

(MD010, no-hard-tabs)


262-262: Column: 1
Hard tabs

(MD010, no-hard-tabs)


263-263: Column: 1
Hard tabs

(MD010, no-hard-tabs)


264-264: Column: 1
Hard tabs

(MD010, no-hard-tabs)


265-265: Column: 1
Hard tabs

(MD010, no-hard-tabs)


266-266: Column: 1
Hard tabs

(MD010, no-hard-tabs)


267-267: Column: 1
Hard tabs

(MD010, no-hard-tabs)


268-268: Column: 1
Hard tabs

(MD010, no-hard-tabs)


269-269: Column: 1
Hard tabs

(MD010, no-hard-tabs)


270-270: Column: 1
Hard tabs

(MD010, no-hard-tabs)


271-271: Column: 1
Hard tabs

(MD010, no-hard-tabs)


277-277: Column: 1
Hard tabs

(MD010, no-hard-tabs)


278-278: Column: 1
Hard tabs

(MD010, no-hard-tabs)


279-279: Column: 1
Hard tabs

(MD010, no-hard-tabs)


280-280: Column: 1
Hard tabs

(MD010, no-hard-tabs)


281-281: Column: 1
Hard tabs

(MD010, no-hard-tabs)


282-282: Column: 1
Hard tabs

(MD010, no-hard-tabs)


284-284: Column: 1
Hard tabs

(MD010, no-hard-tabs)


285-285: Column: 1
Hard tabs

(MD010, no-hard-tabs)


286-286: Column: 1
Hard tabs

(MD010, no-hard-tabs)


287-287: Column: 1
Hard tabs

(MD010, no-hard-tabs)


288-288: Column: 1
Hard tabs

(MD010, no-hard-tabs)


289-289: Column: 1
Hard tabs

(MD010, no-hard-tabs)


290-290: Column: 1
Hard tabs

(MD010, no-hard-tabs)


291-291: Column: 1
Hard tabs

(MD010, no-hard-tabs)


292-292: Column: 1
Hard tabs

(MD010, no-hard-tabs)


293-293: Column: 1
Hard tabs

(MD010, no-hard-tabs)


294-294: Column: 1
Hard tabs

(MD010, no-hard-tabs)


296-296: Column: 1
Hard tabs

(MD010, no-hard-tabs)


297-297: Column: 1
Hard tabs

(MD010, no-hard-tabs)


298-298: Column: 1
Hard tabs

(MD010, no-hard-tabs)


299-299: Column: 1
Hard tabs

(MD010, no-hard-tabs)


301-301: Column: 1
Hard tabs

(MD010, no-hard-tabs)


302-302: Column: 1
Hard tabs

(MD010, no-hard-tabs)


303-303: Column: 1
Hard tabs

(MD010, no-hard-tabs)


304-304: Column: 1
Hard tabs

(MD010, no-hard-tabs)


305-305: Column: 1
Hard tabs

(MD010, no-hard-tabs)


306-306: Column: 1
Hard tabs

(MD010, no-hard-tabs)


307-307: Column: 1
Hard tabs

(MD010, no-hard-tabs)


308-308: Column: 1
Hard tabs

(MD010, no-hard-tabs)


313-313: Column: 1
Hard tabs

(MD010, no-hard-tabs)


314-314: Column: 1
Hard tabs

(MD010, no-hard-tabs)


315-315: Column: 1
Hard tabs

(MD010, no-hard-tabs)


316-316: Column: 1
Hard tabs

(MD010, no-hard-tabs)


320-320: Column: 1
Hard tabs

(MD010, no-hard-tabs)


327-327: Column: 1
Hard tabs

(MD010, no-hard-tabs)


331-331: Column: 1
Hard tabs

(MD010, no-hard-tabs)


332-332: Column: 1
Hard tabs

(MD010, no-hard-tabs)


334-334: Column: 1
Hard tabs

(MD010, no-hard-tabs)


335-335: Column: 1
Hard tabs

(MD010, no-hard-tabs)


336-336: Column: 1
Hard tabs

(MD010, no-hard-tabs)


337-337: Column: 1
Hard tabs

(MD010, no-hard-tabs)


338-338: Column: 1
Hard tabs

(MD010, no-hard-tabs)


339-339: Column: 1
Hard tabs

(MD010, no-hard-tabs)


340-340: Column: 1
Hard tabs

(MD010, no-hard-tabs)


345-345: Column: 1
Hard tabs

(MD010, no-hard-tabs)


346-346: Column: 1
Hard tabs

(MD010, no-hard-tabs)


347-347: Column: 1
Hard tabs

(MD010, no-hard-tabs)


349-349: Column: 1
Hard tabs

(MD010, no-hard-tabs)


351-351: Column: 1
Hard tabs

(MD010, no-hard-tabs)


353-353: Column: 1
Hard tabs

(MD010, no-hard-tabs)


354-354: Column: 1
Hard tabs

(MD010, no-hard-tabs)


355-355: Column: 1
Hard tabs

(MD010, no-hard-tabs)


356-356: Column: 1
Hard tabs

(MD010, no-hard-tabs)


358-358: Column: 1
Hard tabs

(MD010, no-hard-tabs)


359-359: Column: 1
Hard tabs

(MD010, no-hard-tabs)


360-360: Column: 1
Hard tabs

(MD010, no-hard-tabs)


361-361: Column: 1
Hard tabs

(MD010, no-hard-tabs)


362-362: Column: 1
Hard tabs

(MD010, no-hard-tabs)


364-364: Column: 1
Hard tabs

(MD010, no-hard-tabs)


366-366: Column: 1
Hard tabs

(MD010, no-hard-tabs)


367-367: Column: 1
Hard tabs

(MD010, no-hard-tabs)


368-368: Column: 1
Hard tabs

(MD010, no-hard-tabs)


369-369: Column: 1
Hard tabs

(MD010, no-hard-tabs)


370-370: Column: 1
Hard tabs

(MD010, no-hard-tabs)


371-371: Column: 1
Hard tabs

(MD010, no-hard-tabs)


372-372: Column: 1
Hard tabs

(MD010, no-hard-tabs)


374-374: Column: 1
Hard tabs

(MD010, no-hard-tabs)


375-375: Column: 1
Hard tabs

(MD010, no-hard-tabs)


376-376: Column: 1
Hard tabs

(MD010, no-hard-tabs)


377-377: Column: 1
Hard tabs

(MD010, no-hard-tabs)


378-378: Column: 1
Hard tabs

(MD010, no-hard-tabs)


379-379: Column: 1
Hard tabs

(MD010, no-hard-tabs)


380-380: Column: 1
Hard tabs

(MD010, no-hard-tabs)


381-381: Column: 1
Hard tabs

(MD010, no-hard-tabs)


382-382: Column: 1
Hard tabs

(MD010, no-hard-tabs)


383-383: Column: 1
Hard tabs

(MD010, no-hard-tabs)


384-384: Column: 1
Hard tabs

(MD010, no-hard-tabs)


385-385: Column: 1
Hard tabs

(MD010, no-hard-tabs)


387-387: Column: 1
Hard tabs

(MD010, no-hard-tabs)


389-389: Column: 1
Hard tabs

(MD010, no-hard-tabs)


390-390: Column: 1
Hard tabs

(MD010, no-hard-tabs)


391-391: Column: 1
Hard tabs

(MD010, no-hard-tabs)


392-392: Column: 1
Hard tabs

(MD010, no-hard-tabs)


393-393: Column: 1
Hard tabs

(MD010, no-hard-tabs)


412-412: Column: 1
Hard tabs

(MD010, no-hard-tabs)


413-413: Column: 1
Hard tabs

(MD010, no-hard-tabs)


415-415: Column: 1
Hard tabs

(MD010, no-hard-tabs)


416-416: Column: 1
Hard tabs

(MD010, no-hard-tabs)


417-417: Column: 1
Hard tabs

(MD010, no-hard-tabs)


418-418: Column: 1
Hard tabs

(MD010, no-hard-tabs)


419-419: Column: 1
Hard tabs

(MD010, no-hard-tabs)


420-420: Column: 1
Hard tabs

(MD010, no-hard-tabs)


421-421: Column: 1
Hard tabs

(MD010, no-hard-tabs)


422-422: Column: 1
Hard tabs

(MD010, no-hard-tabs)


423-423: Column: 1
Hard tabs

(MD010, no-hard-tabs)


430-430: Column: 1
Hard tabs

(MD010, no-hard-tabs)


431-431: Column: 1
Hard tabs

(MD010, no-hard-tabs)


432-432: Column: 1
Hard tabs

(MD010, no-hard-tabs)


433-433: Column: 1
Hard tabs

(MD010, no-hard-tabs)


434-434: Column: 1
Hard tabs

(MD010, no-hard-tabs)


435-435: Column: 1
Hard tabs

(MD010, no-hard-tabs)


436-436: Column: 1
Hard tabs

(MD010, no-hard-tabs)


437-437: Column: 1
Hard tabs

(MD010, no-hard-tabs)


439-439: Column: 1
Hard tabs

(MD010, no-hard-tabs)


440-440: Column: 1
Hard tabs

(MD010, no-hard-tabs)


442-442: Column: 1
Hard tabs

(MD010, no-hard-tabs)


443-443: Column: 1
Hard tabs

(MD010, no-hard-tabs)


444-444: Column: 1
Hard tabs

(MD010, no-hard-tabs)


445-445: Column: 1
Hard tabs

(MD010, no-hard-tabs)


446-446: Column: 1
Hard tabs

(MD010, no-hard-tabs)


448-448: Column: 1
Hard tabs

(MD010, no-hard-tabs)


449-449: Column: 1
Hard tabs

(MD010, no-hard-tabs)


450-450: Column: 1
Hard tabs

(MD010, no-hard-tabs)


452-452: Column: 1
Hard tabs

(MD010, no-hard-tabs)


453-453: Column: 1
Hard tabs

(MD010, no-hard-tabs)


455-455: Column: 1
Hard tabs

(MD010, no-hard-tabs)


456-456: Column: 1
Hard tabs

(MD010, no-hard-tabs)


457-457: Column: 1
Hard tabs

(MD010, no-hard-tabs)


458-458: Column: 1
Hard tabs

(MD010, no-hard-tabs)


459-459: Column: 1
Hard tabs

(MD010, no-hard-tabs)


460-460: Column: 1
Hard tabs

(MD010, no-hard-tabs)


461-461: Column: 1
Hard tabs

(MD010, no-hard-tabs)


462-462: Column: 1
Hard tabs

(MD010, no-hard-tabs)


463-463: Column: 1
Hard tabs

(MD010, no-hard-tabs)


464-464: Column: 1
Hard tabs

(MD010, no-hard-tabs)


465-465: Column: 1
Hard tabs

(MD010, no-hard-tabs)


466-466: Column: 1
Hard tabs

(MD010, no-hard-tabs)


467-467: Column: 1
Hard tabs

(MD010, no-hard-tabs)


468-468: Column: 1
Hard tabs

(MD010, no-hard-tabs)


470-470: Column: 1
Hard tabs

(MD010, no-hard-tabs)


471-471: Column: 1
Hard tabs

(MD010, no-hard-tabs)


473-473: Column: 1
Hard tabs

(MD010, no-hard-tabs)


474-474: Column: 1
Hard tabs

(MD010, no-hard-tabs)


475-475: Column: 1
Hard tabs

(MD010, no-hard-tabs)


476-476: Column: 1
Hard tabs

(MD010, no-hard-tabs)


477-477: Column: 1
Hard tabs

(MD010, no-hard-tabs)


478-478: Column: 1
Hard tabs

(MD010, no-hard-tabs)


479-479: Column: 1
Hard tabs

(MD010, no-hard-tabs)


480-480: Column: 1
Hard tabs

(MD010, no-hard-tabs)


481-481: Column: 1
Hard tabs

(MD010, no-hard-tabs)


482-482: Column: 1
Hard tabs

(MD010, no-hard-tabs)


483-483: Column: 1
Hard tabs

(MD010, no-hard-tabs)


485-485: Column: 1
Hard tabs

(MD010, no-hard-tabs)


486-486: Column: 1
Hard tabs

(MD010, no-hard-tabs)


487-487: Column: 1
Hard tabs

(MD010, no-hard-tabs)


489-489: Column: 1
Hard tabs

(MD010, no-hard-tabs)


490-490: Column: 1
Hard tabs

(MD010, no-hard-tabs)


491-491: Column: 1
Hard tabs

(MD010, no-hard-tabs)


492-492: Column: 1
Hard tabs

(MD010, no-hard-tabs)


493-493: Column: 1
Hard tabs

(MD010, no-hard-tabs)


494-494: Column: 1
Hard tabs

(MD010, no-hard-tabs)


495-495: Column: 1
Hard tabs

(MD010, no-hard-tabs)


496-496: Column: 1
Hard tabs

(MD010, no-hard-tabs)


497-497: Column: 1
Hard tabs

(MD010, no-hard-tabs)


498-498: Column: 1
Hard tabs

(MD010, no-hard-tabs)


500-500: Column: 1
Hard tabs

(MD010, no-hard-tabs)


501-501: Column: 1
Hard tabs

(MD010, no-hard-tabs)


502-502: Column: 1
Hard tabs

(MD010, no-hard-tabs)


503-503: Column: 1
Hard tabs

(MD010, no-hard-tabs)


504-504: Column: 1
Hard tabs

(MD010, no-hard-tabs)


506-506: Column: 1
Hard tabs

(MD010, no-hard-tabs)


507-507: Column: 1
Hard tabs

(MD010, no-hard-tabs)


508-508: Column: 1
Hard tabs

(MD010, no-hard-tabs)


510-510: Column: 1
Hard tabs

(MD010, no-hard-tabs)


511-511: Column: 1
Hard tabs

(MD010, no-hard-tabs)


512-512: Column: 1
Hard tabs

(MD010, no-hard-tabs)


513-513: Column: 1
Hard tabs

(MD010, no-hard-tabs)


514-514: Column: 1
Hard tabs

(MD010, no-hard-tabs)


515-515: Column: 1
Hard tabs

(MD010, no-hard-tabs)


516-516: Column: 1
Hard tabs

(MD010, no-hard-tabs)


517-517: Column: 1
Hard tabs

(MD010, no-hard-tabs)


518-518: Column: 1
Hard tabs

(MD010, no-hard-tabs)


519-519: Column: 1
Hard tabs

(MD010, no-hard-tabs)


520-520: Column: 1
Hard tabs

(MD010, no-hard-tabs)


522-522: Column: 1
Hard tabs

(MD010, no-hard-tabs)


523-523: Column: 1
Hard tabs

(MD010, no-hard-tabs)


524-524: Column: 1
Hard tabs

(MD010, no-hard-tabs)


525-525: Column: 1
Hard tabs

(MD010, no-hard-tabs)


526-526: Column: 1
Hard tabs

(MD010, no-hard-tabs)


528-528: Column: 1
Hard tabs

(MD010, no-hard-tabs)


529-529: Column: 1
Hard tabs

(MD010, no-hard-tabs)


530-530: Column: 1
Hard tabs

(MD010, no-hard-tabs)


531-531: Column: 1
Hard tabs

(MD010, no-hard-tabs)


532-532: Column: 1
Hard tabs

(MD010, no-hard-tabs)


533-533: Column: 1
Hard tabs

(MD010, no-hard-tabs)


534-534: Column: 1
Hard tabs

(MD010, no-hard-tabs)


535-535: Column: 1
Hard tabs

(MD010, no-hard-tabs)


537-537: Column: 1
Hard tabs

(MD010, no-hard-tabs)


538-538: Column: 1
Hard tabs

(MD010, no-hard-tabs)


539-539: Column: 1
Hard tabs

(MD010, no-hard-tabs)


540-540: Column: 1
Hard tabs

(MD010, no-hard-tabs)


541-541: Column: 1
Hard tabs

(MD010, no-hard-tabs)


542-542: Column: 1
Hard tabs

(MD010, no-hard-tabs)


544-544: Column: 1
Hard tabs

(MD010, no-hard-tabs)


545-545: Column: 1
Hard tabs

(MD010, no-hard-tabs)


546-546: Column: 1
Hard tabs

(MD010, no-hard-tabs)


633-633: Column: 1
Hard tabs

(MD010, no-hard-tabs)


634-634: Column: 1
Hard tabs

(MD010, no-hard-tabs)


635-635: Column: 1
Hard tabs

(MD010, no-hard-tabs)


636-636: Column: 1
Hard tabs

(MD010, no-hard-tabs)


637-637: Column: 1
Hard tabs

(MD010, no-hard-tabs)


638-638: Column: 1
Hard tabs

(MD010, no-hard-tabs)


639-639: Column: 1
Hard tabs

(MD010, no-hard-tabs)


640-640: Column: 1
Hard tabs

(MD010, no-hard-tabs)


641-641: Column: 1
Hard tabs

(MD010, no-hard-tabs)


642-642: Column: 1
Hard tabs

(MD010, no-hard-tabs)


643-643: Column: 1
Hard tabs

(MD010, no-hard-tabs)


644-644: Column: 1
Hard tabs

(MD010, no-hard-tabs)


645-645: Column: 1
Hard tabs

(MD010, no-hard-tabs)


646-646: Column: 1
Hard tabs

(MD010, no-hard-tabs)


73-73: null
Multiple headings with the same content

(MD024, no-duplicate-heading)


86-86: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


94-94: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


100-100: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


109-109: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


119-119: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

Additional comments not posted (2)
docs/bridge/docs/Services/Submitter.md (2)

21-23: LGTM!

The description of the reaper functionality is clear and concise.


71-71: Fix grammatical issue.

Use "an" instead of "a" before "enum".

- In the DB, `Status`, is an enum, represented as a uint8.
+ In the DB, `Status`, is an enum, represented as an uint8.

Likely invalid or redundant comment.

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Summary

(updates since last review)

  • Updated docs/bridge/docs/Services/Submitter.md with detailed explanations of SubmitTransaction method, reaper functionality, and observability metrics.
  • Added configuration specifics and examples to enhance understanding.
  • Introduced support for Mermaid diagrams in documentation.

1 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

@golangisfun123 golangisfun123 requested a review from trajan0x July 9, 2024 16:03
@github-actions github-actions bot added size/s and removed size/m labels Jul 10, 2024
Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Summary

(updates since last review)

  • Added detailed explanations of SubmitTransaction method, reaper functionality, and observability metrics in docs/bridge/docs/Services/Submitter.md
  • Included configuration specifics and examples for better understanding
  • Introduced support for Mermaid diagrams in documentation

No major changes found since last review.

1 file(s) reviewed, 1 comment(s)
Edit PR Review Bot Settings


The Executor naturally uses the Submitter because we want to asynchronously listen for events, process them, and fire off the respective transaction since many of the triggering events can happen simultanously.

You will need a couple things in order to use the Transaciton submitter that signs with your own private key, RPC url(s) (OmniRPC is recommended), DB service, and config values. We'll tackle these in order.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📚 spelling: Typo in 'Transaciton'.

Suggested change
You will need a couple things in order to use the Transaciton submitter that signs with your own private key, RPC url(s) (OmniRPC is recommended), DB service, and config values. We'll tackle these in order.
Transaction

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between dfbe066 and a11f1d5.

Files selected for processing (1)
  • docs/bridge/docs/Services/Submitter.md (1 hunks)
Additional context used
LanguageTool
docs/bridge/docs/Services/Submitter.md

[uncategorized] ~75-~75: Possible missing comma found.
Context: ...he complexities of on-chain transaction submission such as nonce management and gas bumpin...

(AI_HYDRA_LEO_MISSING_COMMA)


[grammar] ~83-~83: Using ‘couple’ without ‘of’ is considered to be informal.
Context: ... happen simultanously. You will need a couple things in order to use the Transaciton submitt...

(PLENTY_OF_NOUNS)


[style] ~83-~83: Consider a shorter alternative to avoid wordiness.
Context: ...anously. You will need a couple things in order to use the Transaciton submitter that sign...

(IN_ORDER_TO_PREMIUM)


[grammar] ~113-~113: Did you mean the abbreviation for “I don’t know”?
Context: ...ore that implements the gorm.DB type. Idk what to put here. 5. Finally, run the ...

(IDK)


[misspelling] ~182-~182: Use “an” instead of ‘a’ if the following word starts with a vowel sound, e.g. ‘an article’, ‘an hour’.
Context: ...B, Status, is an enum, represented as a uint8. It is important to know what num...

(EN_A_VS_AN)


[uncategorized] ~214-~214: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions. - `...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~215-~215: Loose punctuation mark.
Context: ... pending transactions. - current_nonce: The current nonce. - `oldest_pending_tx...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~216-~216: Loose punctuation mark.
Context: ...The current nonce. - oldest_pending_tx: The age of the oldest pending transacti...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~217-~217: Loose punctuation mark.
Context: ...pending transaction. - confirmed_queue: The number of confirmed transactions. -...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~218-~218: Loose punctuation mark.
Context: ... confirmed transactions. - gas_balance: The current gas balance. The metrics c...

(UNLIKELY_OPENING_PUNCTUATION)

Markdownlint
docs/bridge/docs/Services/Submitter.md

193-193: Column: 1
Hard tabs

(MD010, no-hard-tabs)


194-194: Column: 1
Hard tabs

(MD010, no-hard-tabs)


195-195: Column: 1
Hard tabs

(MD010, no-hard-tabs)


196-196: Column: 1
Hard tabs

(MD010, no-hard-tabs)


197-197: Column: 1
Hard tabs

(MD010, no-hard-tabs)


198-198: Column: 1
Hard tabs

(MD010, no-hard-tabs)


199-199: Column: 1
Hard tabs

(MD010, no-hard-tabs)


200-200: Column: 1
Hard tabs

(MD010, no-hard-tabs)


201-201: Column: 1
Hard tabs

(MD010, no-hard-tabs)


202-202: Column: 1
Hard tabs

(MD010, no-hard-tabs)


203-203: Column: 1
Hard tabs

(MD010, no-hard-tabs)


204-204: Column: 1
Hard tabs

(MD010, no-hard-tabs)


205-205: Column: 1
Hard tabs

(MD010, no-hard-tabs)


206-206: Column: 1
Hard tabs

(MD010, no-hard-tabs)


73-73: null
Multiple headings with the same content

(MD024, no-duplicate-heading)


89-89: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

Additional comments not posted (3)
docs/bridge/docs/Services/Submitter.md (3)

21-23: LGTM!

The reaper functionality is well-documented and clear.


125-132: LGTM!

The information on nonce management and database behavior is clear and detailed.


214-218: Fix loose punctuation mark.

The documentation correctly lists the observability metrics, but there is a loose punctuation mark.

- `num_pending_txs`: The number of pending transactions
- `current_nonce`: The current nonce
- `oldest_pending_tx`: The age of the oldest pending transaction
- `confirmed_queue`: The number of confirmed transactions
- `gas_balance`: The current gas balance
+ - `num_pending_txs`: The number of pending transactions.
+ - `current_nonce`: The current nonce.
+ - `oldest_pending_tx`: The age of the oldest pending transaction.
+ - `confirmed_queue`: The number of confirmed transactions.
+ - `gas_balance`: The current gas balance.

Likely invalid or redundant comment.

Tools
LanguageTool

[uncategorized] ~214-~214: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions. - `...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~215-~215: Loose punctuation mark.
Context: ... pending transactions. - current_nonce: The current nonce. - `oldest_pending_tx...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~216-~216: Loose punctuation mark.
Context: ...The current nonce. - oldest_pending_tx: The age of the oldest pending transacti...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~217-~217: Loose punctuation mark.
Context: ...pending transaction. - confirmed_queue: The number of confirmed transactions. -...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~218-~218: Loose punctuation mark.
Context: ... confirmed transactions. - gas_balance: The current gas balance. The metrics c...

(UNLIKELY_OPENING_PUNCTUATION)


Thirdly, you want to have an OmniRPC client for multichain transaction sending support.

4. Our services use a db store that implements the `gorm.DB` type. Idk what to put here.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix informal language.

Replace "Idk" with "I don't know" for formal documentation.

- Our services use a db store that implements the `gorm.DB` type. Idk what to put here.
+ Our services use a db store that implements the `gorm.DB` type. I don't know what to put here.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
4. Our services use a db store that implements the `gorm.DB` type. Idk what to put here.
4. Our services use a db store that implements the `gorm.DB` type. I don't know what to put here.
Tools
LanguageTool

[grammar] ~113-~113: Did you mean the abbreviation for “I don’t know”?
Context: ...ore that implements the gorm.DB type. Idk what to put here. 5. Finally, run the ...

(IDK)

Comment on lines +31 to +69
```yaml
submitter_config:
chains:
1:
# MaxBatchSize is the maximum number of transactions to send in a batch.
# If this is zero, the default will be used.
# This field is ignored if batching is disabled.
max_batch_size: 50
# Batch is whether or not to batch transactions at the rpc level.
skip_batching: false
# MaxGasPrice is the maximum gas price to use for transactions.
max_gas_price: 200000000000 # 200 Gwei
# MinGasPrice is the gas price that will be used if 0 is returned
# from the gas price oracle.
min_gas_price: 1000000000 # 1 Gwei
# BumpIntervalSeconds is the number of seconds to
# wait before bumping a transaction.
bump_interval_seconds: 120
# GasBumpPercentages is the percentage to bump the gas price by.
# This is applied to the greatrer of the chainprice or the last price.
gas_bump_percentage: 10
# GasEstimate is the gas estimate to use for transactions if
# dynamic gas estimation is enabled.
# This is only used as a default if the estimate fails.
gas_estimate: 1000000
# DynamicGasEstimate is whether or not to use dynamic gas estimation.
dynamic_gas_estimate: true
# SupportsEIP1559 is whether or not this chain supports EIP1559.
supports_eip_1559: true
43114:
max_gas_price: 100000000000 # 100 Gwei
10:
max_gas_price: 90000000000 # 90 Gwei
min_gas_price: 100000000 # 0.1 Gwei
# ReaperInterval is the interval at which scan for transactions to flush
reaper_interval: 604800000000000 # int64(7 * 24 * time.Hour)
# MaxRecordAge is the maximum age of a record before it is flushed
max_record_age: 86400000000000 # int64(1 * 24 * time.Hour)
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace hard tabs with spaces.

Replace hard tabs in the example configuration with spaces for consistency.

-	gdb, err := gorm.Open(mysql.Open(dbURL), &gorm.Config{
-    Logger:               common_base.GetGormLogger(logger),
-    FullSaveAssociations: true,
-    NamingStrategy:       NamingStrategy,
-    NowFunc:              time.Now,
+    gdb, err := gorm.Open(mysql.Open(dbURL), &gorm.Config{
+        Logger:               common_base.GetGormLogger(logger),
+        FullSaveAssociations: true,
+        NamingStrategy:       NamingStrategy,
+        NowFunc:              time.Now,
})

Committable suggestion was skipped due to low confidence.


Submitter exposes metrics for Prometheus. The metrics are:
`SubmitTransaction` abstracts many of the complexities of on-chain transaction submission such as nonce management and gas bumping. In addition, sent transactions are stored in the database for easy indexing of older transactions.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add missing comma.

A comma is missing after "submission".

- `SubmitTransaction` abstracts many of the complexities of on-chain transaction submission such as nonce management and gas bumping.
+ `SubmitTransaction` abstracts many of the complexities of on-chain transaction submission, such as nonce management and gas bumping.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
`SubmitTransaction` abstracts many of the complexities of on-chain transaction submission such as nonce management and gas bumping. In addition, sent transactions are stored in the database for easy indexing of older transactions.
`SubmitTransaction` abstracts many of the complexities of on-chain transaction submission, such as nonce management and gas bumping. In addition, sent transactions are stored in the database for easy indexing of older transactions.
Tools
LanguageTool

[uncategorized] ~75-~75: Possible missing comma found.
Context: ...he complexities of on-chain transaction submission such as nonce management and gas bumpin...

(AI_HYDRA_LEO_MISSING_COMMA)


The Executor naturally uses the Submitter because we want to asynchronously listen for events, process them, and fire off the respective transaction since many of the triggering events can happen simultanously.

You will need a couple things in order to use the Transaciton submitter that signs with your own private key, RPC url(s) (OmniRPC is recommended), DB service, and config values. We'll tackle these in order.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix grammatical issue.

Using ‘couple’ without ‘of’ is considered informal. Additionally, consider a shorter alternative to avoid wordiness.

- You will need a couple things in order to use the Transaciton submitter that signs with your own private key, RPC url(s) (OmniRPC is recommended), DB service, and config values.
+ You will need a few things to use the Transaction submitter that signs with your own private key, RPC URL(s) (OmniRPC is recommended), DB service, and config values.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
You will need a couple things in order to use the Transaciton submitter that signs with your own private key, RPC url(s) (OmniRPC is recommended), DB service, and config values. We'll tackle these in order.
You will need a few things to use the Transaction submitter that signs with your own private key, RPC URL(s) (OmniRPC is recommended), DB service, and config values. We'll tackle these in order.
Tools
LanguageTool

[grammar] ~83-~83: Using ‘couple’ without ‘of’ is considered to be informal.
Context: ... happen simultanously. You will need a couple things in order to use the Transaciton submitt...

(PLENTY_OF_NOUNS)


[style] ~83-~83: Consider a shorter alternative to avoid wordiness.
Context: ...anously. You will need a couple things in order to use the Transaciton submitter that sign...

(IN_ORDER_TO_PREMIUM)

# wait before bumping a transaction.
bump_interval_seconds: 120
# GasBumpPercentages is the percentage to bump the gas price by.
# This is applied to the greatrer of the chainprice or the last price.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix typo.

Correct the typo "greatrer" to "greater".

-      # This is applied to the greatrer of the chainprice or the last price.
+      # This is applied to the greater of the chain price or the last price.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# This is applied to the greatrer of the chainprice or the last price.
# This is applied to the greater of the chain price or the last price.

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Summary

(updates since last review)

  • Enhanced details on SubmitTransaction method, reaper functionality, configuration, nonce management, database behavior, and observability metrics in docs/bridge/docs/Services/Submitter.md
  • Added examples and links for better understanding
  • Included support for Mermaid diagrams in documentation

No major changes found since last review.

1 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between a11f1d5 and 135d902.

Files selected for processing (1)
  • docs/bridge/docs/Services/Submitter.md (1 hunks)
Additional context used
LanguageTool
docs/bridge/docs/Services/Submitter.md

[uncategorized] ~75-~75: Possible missing comma found.
Context: ...he complexities of on-chain transaction submission such as nonce management and gas bumpin...

(AI_HYDRA_LEO_MISSING_COMMA)


[grammar] ~83-~83: Using ‘couple’ without ‘of’ is considered to be informal.
Context: ... happen simultanously. You will need a couple things in order to use the Transaciton submitt...

(PLENTY_OF_NOUNS)


[style] ~83-~83: Consider a shorter alternative to avoid wordiness.
Context: ...anously. You will need a couple things in order to use the Transaciton submitter that sign...

(IN_ORDER_TO_PREMIUM)


[style] ~92-~92: The expression “for sure” is rather colloquial. To elevate your writing, consider replacing it with an adverb.
Context: ...f the service uses a submitter, it will for sure have the submitter_config below. ```...

(FOR_SURE2)


[misspelling] ~170-~170: Use “an” instead of ‘a’ if the following word starts with a vowel sound, e.g. ‘an article’, ‘an hour’.
Context: ...B, Status, is an enum, represented as a uint8. It is important to know what num...

(EN_A_VS_AN)


[uncategorized] ~202-~202: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions. - `...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~203-~203: Loose punctuation mark.
Context: ... pending transactions. - current_nonce: The current nonce. - `oldest_pending_tx...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~204-~204: Loose punctuation mark.
Context: ...The current nonce. - oldest_pending_tx: The age of the oldest pending transacti...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~205-~205: Loose punctuation mark.
Context: ...pending transaction. - confirmed_queue: The number of confirmed transactions. -...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~206-~206: Loose punctuation mark.
Context: ... confirmed transactions. - gas_balance: The current gas balance. The metrics c...

(UNLIKELY_OPENING_PUNCTUATION)

Markdownlint
docs/bridge/docs/Services/Submitter.md

181-181: Column: 1
Hard tabs

(MD010, no-hard-tabs)


182-182: Column: 1
Hard tabs

(MD010, no-hard-tabs)


183-183: Column: 1
Hard tabs

(MD010, no-hard-tabs)


184-184: Column: 1
Hard tabs

(MD010, no-hard-tabs)


185-185: Column: 1
Hard tabs

(MD010, no-hard-tabs)


186-186: Column: 1
Hard tabs

(MD010, no-hard-tabs)


187-187: Column: 1
Hard tabs

(MD010, no-hard-tabs)


188-188: Column: 1
Hard tabs

(MD010, no-hard-tabs)


189-189: Column: 1
Hard tabs

(MD010, no-hard-tabs)


190-190: Column: 1
Hard tabs

(MD010, no-hard-tabs)


191-191: Column: 1
Hard tabs

(MD010, no-hard-tabs)


192-192: Column: 1
Hard tabs

(MD010, no-hard-tabs)


193-193: Column: 1
Hard tabs

(MD010, no-hard-tabs)


194-194: Column: 1
Hard tabs

(MD010, no-hard-tabs)


73-73: null
Multiple headings with the same content

(MD024, no-duplicate-heading)

Additional comments not posted (3)
docs/bridge/docs/Services/Submitter.md (3)

21-23: LGTM!

The description of the reaper functionality is clear and concise.


113-120: LGTM!

The details about nonce management and database internals are clear and valuable.


50-50: Fix typo.

Correct the typo "greatrer" to "greater".

-      # This is applied to the greatrer of the chainprice or the last price.
+      # This is applied to the greater of the chain price or the last price.

Likely invalid or redundant comment.

Comment on lines +202 to +206
- `num_pending_txs`: The number of pending transactions.
- `current_nonce`: The current nonce.
- `oldest_pending_tx`: The age of the oldest pending transaction.
- `confirmed_queue`: The number of confirmed transactions.
- `gas_balance`: The current gas balance.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix the loose punctuation mark.

The documentation correctly lists the observability metrics, but there is a loose punctuation mark.

- `num_pending_txs`: The number of pending transactions
- `current_nonce`: The current nonce
- `oldest_pending_tx`: The age of the oldest pending transaction
- `confirmed_queue`: The number of confirmed transactions
- `gas_balance`: The current gas balance
+ - `num_pending_txs`: The number of pending transactions.
+ - `current_nonce`: The current nonce.
+ - `oldest_pending_tx`: The age of the oldest pending transaction.
+ - `confirmed_queue`: The number of confirmed transactions.
+ - `gas_balance`: The current gas balance.

Committable suggestion was skipped due to low confidence.

Tools
LanguageTool

[uncategorized] ~202-~202: Loose punctuation mark.
Context: ...s. The metrics are: - num_pending_txs: The number of pending transactions. - `...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~203-~203: Loose punctuation mark.
Context: ... pending transactions. - current_nonce: The current nonce. - `oldest_pending_tx...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~204-~204: Loose punctuation mark.
Context: ...The current nonce. - oldest_pending_tx: The age of the oldest pending transacti...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~205-~205: Loose punctuation mark.
Context: ...pending transaction. - confirmed_queue: The number of confirmed transactions. -...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~206-~206: Loose punctuation mark.
Context: ... confirmed transactions. - gas_balance: The current gas balance. The metrics c...

(UNLIKELY_OPENING_PUNCTUATION)

- `gas_balance`: The current gas balance.
The Executor naturally uses the Submitter because we want to asynchronously listen for events, process them, and fire off the respective transaction since many of the triggering events can happen simultanously.

You will need a couple things in order to use the Transaciton submitter that signs with your own private key, config values, and more.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix grammatical issue.

Using ‘couple’ without ‘of’ is considered informal. Additionally, consider a shorter alternative to avoid wordiness.

- You will need a couple things in order to use the Transaciton submitter that signs with your own private key, config values, and more.
+ You will need a few things to use the Transaction submitter that signs with your own private key, config values, and more.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
You will need a couple things in order to use the Transaciton submitter that signs with your own private key, config values, and more.
You will need a few things to use the Transaction submitter that signs with your own private key, config values, and more.
Tools
LanguageTool

[grammar] ~83-~83: Using ‘couple’ without ‘of’ is considered to be informal.
Context: ... happen simultanously. You will need a couple things in order to use the Transaciton submitt...

(PLENTY_OF_NOUNS)


[style] ~83-~83: Consider a shorter alternative to avoid wordiness.
Context: ...anously. You will need a couple things in order to use the Transaciton submitter that sign...

(IN_ORDER_TO_PREMIUM)

@@ -10,29 +10,200 @@

## Key Features

- **Transaction Submission**: The main function of the module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed.
The module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed. The nonce may then be used in the `GetSubmissionStatus` method to check the status: `Pending`, `Stored`, `Submitted`, `FailedSubmit`, `ReplacedOrConfirmed`, `Replaced`, `Confirmed`. [More about the `Status` enum](#status-enum)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix grammatical issue.

The sentence should be rephrased for clarity.

- The module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed.
+ The core feature of the module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
The module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed. The nonce may then be used in the `GetSubmissionStatus` method to check the status: `Pending`, `Stored`, `Submitted`, `FailedSubmit`, `ReplacedOrConfirmed`, `Replaced`, `Confirmed`. [More about the `Status` enum](#status-enum)
The core feature of the module is the `SubmitTransaction` method, which returns a nonce and ensures that the transaction will eventually be confirmed. The nonce may then be used in the `GetSubmissionStatus` method to check the status: `Pending`, `Stored`, `Submitted`, `FailedSubmit`, `ReplacedOrConfirmed`, `Replaced`, `Confirmed`. [More about the `Status` enum](#status-enum)

Comment on lines +181 to +195
// Pending is the status of a tx that has not been processed yet.
Pending Status = iota + 1 // Pending
// Stored is the status of a tx that has been stored.
Stored // Stored
// Submitted is the status of a tx that has been submitted.
Submitted // Submitted
// FailedSubmit is the status of a tx that has failed to submit.
FailedSubmit // Failed
// ReplacedOrConfirmed is the status of a tx that has been replaced by a new tx or confirmed. The actual status will be set later.
ReplacedOrConfirmed // ReplacedOrConfirmed
// Replaced is the status of a tx that has been replaced by a new tx.
Replaced // Replaced
// Confirmed is the status of a tx that has been confirmed.
Confirmed // Confirmed
)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace hard tabs with spaces.

The constants for the Status enum are well-defined, but hard tabs should be replaced with spaces.

-	Pending Status = iota + 1 // Pending
-	Stored // Stored
-	Submitted // Submitted
-	FailedSubmit // Failed
-	ReplacedOrConfirmed // ReplacedOrConfirmed
-	Replaced // Replaced
-	Confirmed // Confirmed
+    Pending Status = iota + 1 // Pending
+    Stored // Stored
+    Submitted // Submitted
+    FailedSubmit // Failed
+    ReplacedOrConfirmed // ReplacedOrConfirmed
+    Replaced // Replaced
+    Confirmed // Confirmed
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Pending is the status of a tx that has not been processed yet.
Pending Status = iota + 1 // Pending
// Stored is the status of a tx that has been stored.
Stored // Stored
// Submitted is the status of a tx that has been submitted.
Submitted // Submitted
// FailedSubmit is the status of a tx that has failed to submit.
FailedSubmit // Failed
// ReplacedOrConfirmed is the status of a tx that has been replaced by a new tx or confirmed. The actual status will be set later.
ReplacedOrConfirmed // ReplacedOrConfirmed
// Replaced is the status of a tx that has been replaced by a new tx.
Replaced // Replaced
// Confirmed is the status of a tx that has been confirmed.
Confirmed // Confirmed
)
// Pending is the status of a tx that has not been processed yet.
Pending Status = iota + 1 // Pending
// Stored is the status of a tx that has been stored.
Stored // Stored
// Submitted is the status of a tx that has been submitted.
Submitted // Submitted
// FailedSubmit is the status of a tx that has failed to submit.
FailedSubmit // Failed
// ReplacedOrConfirmed is the status of a tx that has been replaced by a new tx or confirmed. The actual status will be set later.
ReplacedOrConfirmed // ReplacedOrConfirmed
// Replaced is the status of a tx that has been replaced by a new tx.
Replaced // Replaced
// Confirmed is the status of a tx that has been confirmed.
Confirmed // Confirmed
Tools
Markdownlint

181-181: Column: 1
Hard tabs

(MD010, no-hard-tabs)


182-182: Column: 1
Hard tabs

(MD010, no-hard-tabs)


183-183: Column: 1
Hard tabs

(MD010, no-hard-tabs)


184-184: Column: 1
Hard tabs

(MD010, no-hard-tabs)


185-185: Column: 1
Hard tabs

(MD010, no-hard-tabs)


186-186: Column: 1
Hard tabs

(MD010, no-hard-tabs)


187-187: Column: 1
Hard tabs

(MD010, no-hard-tabs)


188-188: Column: 1
Hard tabs

(MD010, no-hard-tabs)


189-189: Column: 1
Hard tabs

(MD010, no-hard-tabs)


190-190: Column: 1
Hard tabs

(MD010, no-hard-tabs)


191-191: Column: 1
Hard tabs

(MD010, no-hard-tabs)


192-192: Column: 1
Hard tabs

(MD010, no-hard-tabs)


193-193: Column: 1
Hard tabs

(MD010, no-hard-tabs)


194-194: Column: 1
Hard tabs

(MD010, no-hard-tabs)

@golangisfun123 golangisfun123 changed the title Submitter docs feat(docs): submitter docs Jul 17, 2024
@trajan0x trajan0x merged commit 683fb3e into master Jul 28, 2024
51 checks passed
@trajan0x trajan0x deleted the submitter-docs branch July 28, 2024 16:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants