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

Generalize and consolidate duplicated error variants #1319

Closed
1 task done
seanchen1991 opened this issue Aug 22, 2024 · 6 comments · Fixed by #1350
Closed
1 task done

Generalize and consolidate duplicated error variants #1319

seanchen1991 opened this issue Aug 22, 2024 · 6 comments · Fixed by #1350
Assignees
Labels
O: code-hygiene Objective: aims to improve code hygiene O: maintainability Objective: cause to ease modification, fault corrections and improve code understanding S: errors Scope: related to error handlings
Milestone

Comments

@seanchen1991
Copy link
Contributor

seanchen1991 commented Aug 22, 2024

Feature Summary

Duplicated error variants scattered across the ibc-rs codebase should be consolidated as much as possible. These should then live in a more centralized location in the repository, depending on how general they are and on how many ibc-rs crates make use of them.

Proposal

One concrete example of this is mentioned in this comment. All error variants that have to do with surfacing decoding errors can be consolidated under one DecodingError type that would live in the ibc-primitives crate:

pub enum DecodingError {
    /// invalid identifier: `{0}`
    InvalidIdentifier(IdentifierError),
    /// invalid field: `{0}`
    InvalidFeild(String)
    /// missing field: `{0}`
    MissingFeild(String)
    /// mismatched type URLs: expected `{expected}`, actual `{actual}`
    MismatchedTypeUrls { expected: String, actual: String },
     /// failed to decode with error: `{description}`
    FailedtoDecode { description: String },

    // ... any other relevant variants.
}

Tasks

@seanchen1991 seanchen1991 self-assigned this Aug 22, 2024
@seanchen1991 seanchen1991 added O: code-hygiene Objective: aims to improve code hygiene O: maintainability Objective: cause to ease modification, fault corrections and improve code understanding labels Aug 22, 2024
@seanchen1991 seanchen1991 added this to the v1 milestone Aug 22, 2024
@seanchen1991
Copy link
Contributor Author

@Farhad-Shabani I just realized that if this DecodingError type is going to belong in ibc-primitives, the IdentiferError variant can't contain an IdentifierError type, since that would then introduce a dependency on ics24-host. Would it make sense to move the IdentifierError type into ibc-primitives?

@Farhad-Shabani
Copy link
Member

I just realized that if this DecodingError type is going to belong in ibc-primitives, the IdentiferError variant can't contain an IdentifierError type, since that would then introduce a dependency on ics24-host. Would it make sense to move the IdentifierError type into ibc-primitives?

Since DecodingError and IdentifierError mostly occur during Protobuf deserialization, it makes sense to keep them together. Though, I'm more inclined to place both under the ics24-host. After we recently refactored the Timestamp and differentiated the TimeoutTimestamp placing it under ics-04, the codebase under ibc-primitives now appears would be more suitable for merging into ics-24 in the future.

@seanchen1991
Copy link
Contributor Author

the codebase under ibc-primitives now appears would be more suitable for merging into ics-24 in the future

So ics24 will become the foundational dependency that other ibc-rs workspaces / crates rely upon?

@Farhad-Shabani
Copy link
Member

So ics24 will become the foundational dependency that other ibc-rs workspaces / crates rely upon?

Exactly. It seems like an unnecessary breakdown of the codebase, especially since there's no clear definition of what should be placed under the ibc-primitives. When looking at the existing codebase, the components there, like Signer, Timestamp, serialization, and conversions, appear to be more host-related utilities for interacting with the host. We should definitely investigate and make a decision on this later as a separate issue.

@seanchen1991
Copy link
Contributor Author

Is the idea then that IdentifierErrors will be subsumed by DecodingError? I.e., every current instance of an IdentifierError will become a DecodingError::InvalidIdentifier(IdentifierError)? Or is it that DecodingError::InvalidIdentifier(IdentifierError) should only be used for when an invalid identifier causes a decoding error?

@Farhad-Shabani
Copy link
Member

Is the idea then that IdentifierErrors will be subsumed by DecodingError? I.e., every current instance of an IdentifierError will become a DecodingError::InvalidIdentifier(IdentifierError)? Or is it that DecodingError::InvalidIdentifier(IdentifierError) should only be used for when an invalid identifier causes a decoding error?

I’d prefer the latter one. To use it for cases where an invalid identifier causes a decoding error, especially considering various IBC clients and applications can exist. We can’t be certain that an IdentifierError will be exclusively happening in decoding situations.

@seanchen1991 seanchen1991 added the S: errors Scope: related to error handlings label Sep 5, 2024
Farhad-Shabani added a commit that referenced this issue Sep 24, 2024
github-merge-queue bot pushed a commit that referenced this issue Sep 24, 2024
* Clean up `ibc-apps` errors (#1318)

* Clean up ics20-transfer error

* Clean up NftTransfer error

* Incorporate PR feedback

* Remove redundant TODO comment

* Simplify NftTransferError variant

* Add TODO reminder

* Clean up `ibc-core` and `ibc-clients` error types (#1317)

* Clean up pass of ClientError type

* Clean up pass of ics24 errors

* Clean up pass of ics23 errors

* Clean up pass of ics07 errors

* Clean up ChannelError type

* Clean up PacketError type

* Better organize error variants

* cargo nightly fmt

* Update error variant in integration tests

* Fix ics23 tests

* Fix typo in doc comment

* Update cw-check Cargo.lock

* Clean up ics08 error

* Cargo nightly fmt

* Change single-field error variants to tuple structs

* Propogate error variant changes

* Propogate error variant changes

* Clean up PacketError type

* Clean up IdentifierError type

* Clean up ics26 RouterError

* Clean up ics03 ConnectionError

* Fix error variant naming

* Fix error variant naming

* Remove redundant Other error variant

* Clarify tendermint client error naming

* Rename tendermint client Error to TendermintClientError

* Rename wasm light client Error to WasmClientError

* Rename ics25-handler Error to HandlerError

* Remove unused HandlerError

* Remove TendermintClientError::InvalidHeader error for more specific variant

* Rename LightClientVerifierError variant to FailedToVerifyHeader

* Rename ConsensusStateTimestampGteTrustingPeriod to InsufficientTrustingPeriod

* Remove redundant ChannelError::FailedToParseSequence variant

* Rename ChannelError::FailedChannelVerification to FailedProofVerification

* Replace incorrect usages of FailedPacketVerification

* Define From<CommitmentError> for ClientError impl

* Add IdentifierError::FailedToParse variant

* Replace InvalidPrefix error usage

* Fix doc comment typo

* Improve ChannelError variant names

* Add PacketError::InvalidPathPrefix variant

* Remove unnecessary PacketError variant

* Add error variants used by basecoin

* nit: remove unnecessary map_err in verify_(non_)membership

* imp: define EmptyCommitmentRoot

* nit: remove MissingHostHeight

* fix: remove unnecessary map_err(PacketError::Channel)

* Remove a TODO

---------

Co-authored-by: Farhad Shabani <farhad.shabani@gmail.com>

* Clean up `QueryError` and `RelayerError` types (#1321)

* Clean up ibc-query QueryError type

* Clean up ibc-testkit RelayerError

* Clean up ibc-testkit RelayerError

* Change wording of a doc comment

* Remove RelayerError

* Consolidate decoding-related errors into new `DecodingError` type (#1325)

* Define DecodingError in ibc-primitives

* Utilize DecodingError in ics721

* Start using DecodingError in ClientError

* Define StatusError type

* Wire up StatusError

* Wiring up DecodingError

* Add DecodingError to RouterError

* Remove unused From impl

* Change format of an import

* Change format of an import

* Change format of an import

* Move DecodingError into ics24

* Cargo nightly fmt

* Use DecodingError in more places

* cargo fmt

* cargo fmt

* Update cw-check Cargo.lock

* Add necessary wasm-client feature attribute

* Move InvalidUri error variant back to NftTransferError

* Regenerate cw hcheck cargo.lock

* Add serde feature attribute

* Remove ClientError::InvalidClientIdentifier error variant in favor of DecodingError::InvalidIdentifier

* Add derive_more::From on NftTransferError

* Stashing changes

* Revert "Add derive_more::From on NftTransferError"

This reverts commit 234ebee.

* Remove RouterError::UnknownMessageTypeUrl

* Add derive_more::From on TokenTransferError

* Add derive_more to NftTransferError

* Remove tendermint-proto dependency from ibc-primitives

* Remove StatusError

* Remove unnecessary ClientError::Decoding wrappings

* Clean up TendermintClientError

* Regenerate cw-check cargo.lock

* taplo fmt

* Apply PR feedback

* Use ibc_proto::Error type instead of tendermint_proto::Error

* Change FailedToParseType fields to make them more clear

* Revert InvalidTrace and InvalidCoin TokenTransferError variants

* Remove NftTransferError variants in favor of DecodingError::InvalidJson

* cargo fmt

* Regenerate cw-check cargo.lock

* Separate out error variants that need to be moved to host-relevant errors

* Consolidate TendermintClientError decoding errors

* Consolidate Connection and Packet decoding errors

* Remove WasmClientError

* Consolidate Identifier variant naming

* Remove HostError annotations in doc comments

* Consolidate CommitmentError variants

* Consolidate ConnectionError variants

* Revert some CommitmentError variants

* Change TryFrom<Any> for MsgEnvelope Error type to DecodingError

* Remove ConnectionError::Identifier variant in favor of DecodingError::Identifier

* Remove ChannelError::Identifier variant in favor of DecodingError::Identifier

* Remove PacketError::Identifier variant in favor of DecodingError::Identifier

* Revert TokenTransferError FailedToDeserializeAck and FailedToDeserializePacketData

* Revert NftTransferError FailedToDeserializeAck and FailedToDeserializePacketData

* Revert ics20 and ics721 on_recv_packet_execute impls

* Remove additional Identifier error variants

* Add TendermintClientError::InsufficientMisbehaviourHeaderHeight variant

* Implement From<IdentifierError> for ClientError and ConnectionError

* Incorporate PR feedback

* Change TryFrom<RawConsensusState> for ConsensusState error to DecodingError

* Remove RouterError::Decoding variant

* Revert AcknowledgementStatus tests

* Cargo fmt

* Fix test_ack_de

* Fix typo in doc comment

* Fix test_ack_de

* Fix test_ack_de

* fix: revert nft721 on module errors

* fix: remove Identifier variant from few more enums

* fix: remove unused tendermint-proto dep

* chore: update Cargo.lock

---------

Co-authored-by: Farhad Shabani <farhad.shabani@gmail.com>

* imp(ibc-apps): migrate to `DecodingError` in `TryFrom` conversions (#1335)

* imp: migrate to DecodingError in TryFrom conversions, ibc-apps

* imp: apply on TryFrom<RawPacketData>

* fix: missing import

* fix: apply review comments

* imp: move away from From<Infallible>

* Define `HostError` type (#1331)

* Define DecodingError in ibc-primitives

* Utilize DecodingError in ics721

* Start using DecodingError in ClientError

* Define StatusError type

* Wire up StatusError

* Wiring up DecodingError

* Add DecodingError to RouterError

* Remove unused From impl

* Change format of an import

* Change format of an import

* Change format of an import

* Move DecodingError into ics24

* Cargo nightly fmt

* Use DecodingError in more places

* cargo fmt

* cargo fmt

* Update cw-check Cargo.lock

* Add necessary wasm-client feature attribute

* Move InvalidUri error variant back to NftTransferError

* Regenerate cw hcheck cargo.lock

* Add serde feature attribute

* Remove ClientError::InvalidClientIdentifier error variant in favor of DecodingError::InvalidIdentifier

* Add derive_more::From on NftTransferError

* Stashing changes

* Revert "Add derive_more::From on NftTransferError"

This reverts commit ea9c83d.

* Remove RouterError::UnknownMessageTypeUrl

* Add derive_more::From on TokenTransferError

* Add derive_more to NftTransferError

* Remove tendermint-proto dependency from ibc-primitives

* Remove StatusError

* Remove unnecessary ClientError::Decoding wrappings

* Clean up TendermintClientError

* Regenerate cw-check cargo.lock

* taplo fmt

* Apply PR feedback

* Use ibc_proto::Error type instead of tendermint_proto::Error

* Change FailedToParseType fields to make them more clear

* Revert InvalidTrace and InvalidCoin TokenTransferError variants

* Remove NftTransferError variants in favor of DecodingError::InvalidJson

* cargo fmt

* Regenerate cw-check cargo.lock

* Separate out error variants that need to be moved to host-relevant errors

* Consolidate TendermintClientError decoding errors

* Consolidate Connection and Packet decoding errors

* Remove WasmClientError

* Consolidate Identifier variant naming

* Remove HostError annotations in doc comments

* Consolidate CommitmentError variants

* Consolidate ConnectionError variants

* Revert some CommitmentError variants

* Change TryFrom<Any> for MsgEnvelope Error type to DecodingError

* Define HostError type

* Rename ContextError to HandlerError

* Change `pick_version` impl

* Update ValidationContext trait methods to return HostError type

* Rename HandlerError variants throughout the code base

* Remove match arm that is no longer relevant

* Change ClientValidationContext trait methods to return HostErrors

* Change TokenTransferValidationContext and NftTransferValidationContext trait error types

* Updating validation contexts to return HostError types

* Map errors to HostError variants

* Update ValidateSelfClientContext trait

* Update Upgrade validation and execution contexts to return HostErrors

* Fix merge conflicts

* Fix merge conflicts

* Revert execute_upgrade_client_proposal error type to UpgradeClientError

* cargo fmt

* Remove unused alloc::string::ToString

* Import ibc_core::primitives::prelude into handler/mod.rs

* cargo fmt

* Attempt to fix failing testkit test

* Remove RouterError::UnknownPort variant

* Remove some uses of ClientError::Other variants

* Fix recv_packet_validate_happy_path test

* Fix conn_open_ack_no_connection test

* cargo fmt

* fix conn_open_ack_no_connection test without adding new HostError variant

* fix test_create_client_try_from test

* Remove unnecessary import

* Fix test_create_client_try_from

* cargo fmt

* fix: remove now unneeded with_packet_receipt

* fix: revert unintended ack status changes in ICS-20

* fix: revert unintended ack status changes in ICS-721

* fix: remove unintended tendermint-proto

* fix: update Cargo.lock for cw-check

* Fix lingering issues from merge conflicts

* Fix lingering issues from merge conflicts

* Remove From<Infallible> for ClientError impl

* cargo fmt

* Rename HostError InvalidData and MissingData variants

* Define helper functions for HostError

* Use newly-define HostError helpers

* Remove HostError::AppModule variant

* Prune some HostError variants

* Consolidate some HostError variants

* Remove HostError::NonexistentType variant

* Remove HostError::UnexpectedState variant

* Consolidate HostError::UnknownResource variant

* cargo fmt

* Remove unnecessary to_string calls

* Revert `pick_version` method's documentation

* Remove some more HostError variants

* Remove From<DecodingError> for StatusValue impl

* Fix AcknowledgementStatus tests

* fix: revert errors in ICS721 callbacks

* Change references to HandlerError in docs to refer to HostError where appropriate

---------

Signed-off-by: Sean Chen <seanchen11235@gmail.com>
Co-authored-by: Farhad Shabani <farhad.shabani@gmail.com>

* Consolidate `PacketError` and `ChannelError` (#1343)

* Merge PacketError variants into ChannelError

* cargo nightly fmt

* Consolidate ChanelError verification variants

* Convert ics04 try_from impls to use DecodingError

* Add changelog entry

* Incorporate some PR feedback

* Remove ChannelError::MissingProof and MissingProofHeight error variants

* Add `HostError` contexts to module-level error types (#1345)

* Add ConnectionError::Host variant and clean up some other variants

* Migrate some ics03 handlers to return HostErrors

* Revert "Migrate some ics03 handlers to return HostErrors"

This reverts commit f48a1a6.

* Add HostError variant to ChannelError

* Remove HandlerError::Host variant

* Map client handler HostErrors to ClientError::Host

* Revert "Map client handler HostErrors to ClientError::Host"

This reverts commit 247be8a.

* Change ics02-client handlers to return ClientError

* Change ics03-connection handlers to return ConnectionError

* Change ics04-channel handlers to return ChannelError

* Make necessary changes in ics25 dispatch

* imp: misc improvements and fixes

* imp: use derive_more::From for ChannelError

* fix: rename InvalidClientState under ConnectionError

* nit: remove redundant import

---------

Co-authored-by: Farhad Shabani <farhad.shabani@gmail.com>

* Clean up generic String variants in error types (#1347)

* Clean up most instances of ClientError::Other

* Rename CommitmentError variants

* Clean up some DecodingError calls

* Incorporate some PR feedback

* Incorporate more PR feedback

* A bunch of DecodingError associated type changes

* Eliminate a bunch of redundant map_err calls

* cargo fmt

* Fix ics23 spec tests

* Fix a typo

* Clean up some error messages

* Consolidate MismatchedTypeUrl and MismatchedEventKind variants

* Miscellaneous clean up

* cargo fmt

* Remove unused CommitmentError variants

* Clean up errors to match ADR description

* More clean up

* Add changelog entry

* fix: remove now unused HeightError

* Clean up TimestampError

---------

Co-authored-by: Farhad Shabani <farhad.shabani@gmail.com>

* nitpicks

* fix: remove ibc-core-connection-types dep under ICS-04

* fix: propogate errors in refund_packet_nft_execute

* fix: revert few errors in ICS-20 module callbacks

* imp: use if let for type_url matches

* nit: minor improvements

* fix: use RouterError in case of ModuleID not found

* chore: add changelog

* chore: add changelog for #1319

---------

Signed-off-by: Sean Chen <seanchen11235@gmail.com>
Co-authored-by: Farhad Shabani <farhad.shabani@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
O: code-hygiene Objective: aims to improve code hygiene O: maintainability Objective: cause to ease modification, fault corrections and improve code understanding S: errors Scope: related to error handlings
Projects
Status: Done
Development

Successfully merging a pull request may close this issue.

2 participants