From ab01d00484cabfbea57186fd57e6b7f3afdc0a49 Mon Sep 17 00:00:00 2001 From: Magic Cat <37407870+MonikaCat@users.noreply.github.com> Date: Mon, 12 Jun 2023 20:40:23 +0700 Subject: [PATCH] feat: add `x/authz` message parser (#97) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Closes [BDU-1030](https://forbole.atlassian.net/jira/software/c/projects/BDU/issues/BDU-1030) ## Checklist - [x] Targeted PR against correct branch. - [x] Linked to Github issue with discussion and accepted design OR link to spec that describes this work. - [ ] Wrote unit tests. - [x] Re-reviewed `Files changed` in the Github PR explorer. [BDU-1030]: https://forbole.atlassian.net/browse/BDU-1030?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .github/workflows/lint.yml | 6 +- .github/workflows/test.yml | 4 +- CHANGELOG.md | 4 ++ modules/messages/account_parser.go | 96 ++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 5 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index da8f21fe..2bdf3118 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -18,7 +18,7 @@ jobs: uses: actions/checkout@v3 - name: Compute diff 📜 - uses: technote-space/get-diff-action@v6.1.0 + uses: technote-space/get-diff-action@v6.1.2 with: SUFFIX_FILTER: | .go @@ -27,9 +27,9 @@ jobs: - name: Setup Go 🧰 if: "env.GIT_DIFF != ''" - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: - go-version: 1.20 + go-version: "1.20" - name: Run lint ✅ if: "env.GIT_DIFF != ''" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 956c4b7f..3fe0cf38 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,9 +24,9 @@ jobs: uses: actions/checkout@v3 - name: Setup Go 🧰 - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: - go-version: 1.20 + go-version: "1.20" - name: Compute diff 📜 uses: technote-space/get-diff-action@v6.1.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c9bb463..e8a4d4a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## Unreleased +### Changes +- ([\#97](https://github.com/forbole/juno/pull/97)) Add `x/authz` message parser + ## v5.1.0 ### Changes - Bumped Go version to `1.20` diff --git a/modules/messages/account_parser.go b/modules/messages/account_parser.go index e7a5d16c..3f67bfcb 100644 --- a/modules/messages/account_parser.go +++ b/modules/messages/account_parser.go @@ -2,6 +2,7 @@ package messages import ( "fmt" + "strings" "github.com/gogo/protobuf/proto" @@ -12,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + authztypes "github.com/cosmos/cosmos-sdk/x/authz" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -52,6 +54,7 @@ var CosmosMessageAddressesParser = JoinMessageParsers( GovMessagesParser, SlashingMessagesParser, StakingMessagesParser, + AuthzMessageParser, DefaultMessagesParser, ) @@ -205,3 +208,96 @@ func StakingMessagesParser(_ codec.Codec, cosmosMsg sdk.Msg) ([]string, error) { return nil, MessageNotSupported(cosmosMsg) } + +// AuthzMessageParser returns the list of all the accounts involved in the given +// message if it's related to the x/authz module +func AuthzMessageParser(c codec.Codec, cosmosMsg sdk.Msg) ([]string, error) { + switch msg := cosmosMsg.(type) { + case *authztypes.MsgGrant: + return []string{msg.Grantee, msg.Granter}, nil + case *authztypes.MsgRevoke: + return []string{msg.Grantee, msg.Granter}, nil + case *authztypes.MsgExec: + for _, index := range msg.Msgs { + var executedMsg sdk.Msg + if err := c.UnpackAny(index, &executedMsg); err != nil { + return nil, fmt.Errorf("error while unpacking message from authz: %s", err) + } + + switch { + case strings.Contains(index.TypeUrl, "bank"): + addresses, err := BankMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "crisis"): + addresses, err := CrisisMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "distribution"): + addresses, err := DistributionMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "evidence"): + addresses, err := EvidenceMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "gov.v1beta1"): + addresses, err := GovV1Beta1MessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "gov.v1."): + addresses, err := GovV1MessageParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "ibc"): + addresses, err := IBCTransferMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "slashing"): + addresses, err := SlashingMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + case strings.Contains(index.TypeUrl, "staking"): + addresses, err := StakingMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + default: + addresses, err := DefaultMessagesParser(c, executedMsg) + if err != nil { + return nil, MessageNotSupported(executedMsg) + } + addresses = append(addresses, msg.Grantee) + return addresses, nil + } + } + } + + return nil, MessageNotSupported(cosmosMsg) +}