/
handle_msg.go
105 lines (86 loc) · 2.91 KB
/
handle_msg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package gov
import (
"fmt"
"strconv"
"github.com/forbole/bdjuno/v2/types"
sdk "github.com/cosmos/cosmos-sdk/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
juno "github.com/forbole/juno/v2/types"
)
// HandleMsg implements modules.MessageModule
func (m *Module) HandleMsg(index int, msg sdk.Msg, tx *juno.Tx) error {
if len(tx.Logs) == 0 {
return nil
}
switch cosmosMsg := msg.(type) {
case *govtypes.MsgSubmitProposal:
return m.handleMsgSubmitProposal(tx, index, cosmosMsg)
case *govtypes.MsgDeposit:
return m.handleMsgDeposit(tx, cosmosMsg)
case *govtypes.MsgVote:
return m.handleMsgVote(tx, cosmosMsg)
}
return nil
}
// handleMsgSubmitProposal allows to properly handle a handleMsgSubmitProposal
func (m *Module) handleMsgSubmitProposal(tx *juno.Tx, index int, msg *govtypes.MsgSubmitProposal) error {
// Get the proposal id
event, err := tx.FindEventByType(index, govtypes.EventTypeSubmitProposal)
if err != nil {
return fmt.Errorf("error while searching for EventTypeSubmitProposal: %s", err)
}
id, err := tx.FindAttributeByKey(event, govtypes.AttributeKeyProposalID)
if err != nil {
return fmt.Errorf("error while searching for AttributeKeyProposalID: %s", err)
}
proposalID, err := strconv.ParseUint(id, 10, 64)
if err != nil {
return fmt.Errorf("error while parsing proposal id: %s", err)
}
// Get the proposal
proposal, err := m.source.Proposal(tx.Height, proposalID)
if err != nil {
return fmt.Errorf("error while getting proposal: %s", err)
}
// Unpack the content
var content govtypes.Content
err = m.cdc.UnpackAny(proposal.Content, &content)
if err != nil {
return fmt.Errorf("error while unpacking proposal content: %s", err)
}
// Store the proposal
proposalObj := types.NewProposal(
proposal.ProposalId,
proposal.ProposalRoute(),
proposal.ProposalType(),
proposal.GetContent(),
proposal.Status.String(),
proposal.SubmitTime,
proposal.DepositEndTime,
proposal.VotingStartTime,
proposal.VotingEndTime,
msg.Proposer,
)
err = m.db.SaveProposals([]types.Proposal{proposalObj})
if err != nil {
return err
}
// Store the deposit
deposit := types.NewDeposit(proposal.ProposalId, msg.Proposer, msg.InitialDeposit, tx.Height)
return m.db.SaveDeposits([]types.Deposit{deposit})
}
// handleMsgDeposit allows to properly handle a handleMsgDeposit
func (m *Module) handleMsgDeposit(tx *juno.Tx, msg *govtypes.MsgDeposit) error {
deposit, err := m.source.ProposalDeposit(tx.Height, msg.ProposalId, msg.Depositor)
if err != nil {
return fmt.Errorf("error while getting proposal deposit: %s", err)
}
return m.db.SaveDeposits([]types.Deposit{
types.NewDeposit(msg.ProposalId, msg.Depositor, deposit.Amount, tx.Height),
})
}
// handleMsgVote allows to properly handle a handleMsgVote
func (m *Module) handleMsgVote(tx *juno.Tx, msg *govtypes.MsgVote) error {
vote := types.NewVote(msg.ProposalId, msg.Voter, msg.Option, tx.Height)
return m.db.SaveVote(vote)
}