forked from forbole/callisto
/
msg_handler.go
154 lines (132 loc) · 4.19 KB
/
msg_handler.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package gov
import (
"context"
"time"
"github.com/cosmos/cosmos-sdk/types/query"
"github.com/cosmos/cosmos-sdk/codec"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"github.com/faddat/bdjuno/x/auth"
bgov "github.com/faddat/bdjuno/x/gov/types"
sdk "github.com/cosmos/cosmos-sdk/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
juno "github.com/desmos-labs/juno/types"
"github.com/faddat/bdjuno/database"
)
// HandleMsg allows to handle the different messages related to the staking module
func HandleMsg(
tx *juno.Tx, msg sdk.Msg,
govClient govtypes.QueryClient, authClient authtypes.QueryClient, bankClient banktypes.QueryClient,
cdc codec.Marshaler, db *database.BigDipperDb,
) error {
if len(tx.Logs) == 0 {
return nil
}
switch cosmosMsg := msg.(type) {
case *govtypes.MsgSubmitProposal:
return handleMsgSubmitProposal(tx, cosmosMsg, govClient, authClient, bankClient, cdc, db)
case *govtypes.MsgDeposit:
return handleMsgDeposit(tx, cosmosMsg, authClient, bankClient, cdc, db)
case *govtypes.MsgVote:
return handleMsgVote(tx, cosmosMsg, authClient, bankClient, cdc, db)
}
return nil
}
// handleMsgSubmitProposal allows to properly handle a handleMsgSubmitProposal
func handleMsgSubmitProposal(
tx *juno.Tx, msg *govtypes.MsgSubmitProposal,
govClient govtypes.QueryClient, authClient authtypes.QueryClient, bankClient banktypes.QueryClient,
cdc codec.Marshaler, db *database.BigDipperDb,
) error {
// Get proposals
res, err := govClient.Proposals(
context.Background(),
&govtypes.QueryProposalsRequest{
Pagination: &query.PageRequest{
Limit: 10000, // Query 10.000 proposals
},
},
)
if err != nil {
return err
}
// Get the specific proposal
var proposal govtypes.Proposal
for _, p := range res.Proposals {
if p.GetContent().GetTitle() == msg.GetContent().GetTitle() {
proposal = p
break
}
}
// Refresh the accounts
err = auth.RefreshAccounts([]string{msg.Proposer}, tx.Height, authClient, bankClient, cdc, db)
if err != nil {
return err
}
// Store the proposal
proposalObj := bgov.NewProposal(
proposal.GetTitle(),
proposal.GetContent().GetDescription(),
proposal.ProposalRoute(),
proposal.ProposalType(),
proposal.ProposalId,
proposal.Status,
proposal.SubmitTime,
proposal.DepositEndTime,
proposal.VotingStartTime,
proposal.VotingEndTime,
msg.Proposer,
)
err = db.SaveProposal(proposalObj)
if err != nil {
return err
}
// Store the deposit
deposit := bgov.NewDeposit(
proposal.ProposalId,
msg.Proposer,
msg.InitialDeposit,
tx.Height,
)
err = db.SaveDeposit(deposit)
if err != nil {
return err
}
// Watch the proposal and renew the database when deposit end and voting end in the future
if proposal.Status == govtypes.StatusVotingPeriod && proposal.VotingEndTime.After(time.Now()) {
time.AfterFunc(time.Since(proposal.VotingEndTime), UpdateProposal(proposal.ProposalId, govClient, db))
} else if proposal.Status == govtypes.StatusDepositPeriod && proposal.DepositEndTime.After(time.Now()) {
time.AfterFunc(time.Since(proposal.DepositEndTime), UpdateProposal(proposal.ProposalId, govClient, db))
}
return nil
}
// handleMsgDeposit allows to properly handle a handleMsgDeposit
func handleMsgDeposit(
tx *juno.Tx, msg *govtypes.MsgDeposit,
authClient authtypes.QueryClient, bankClient banktypes.QueryClient,
cdc codec.Marshaler, db *database.BigDipperDb,
) error {
// Refresh the accounts
err := auth.RefreshAccounts([]string{msg.Depositor}, tx.Height, authClient, bankClient, cdc, db)
if err != nil {
return err
}
// Save the deposits
deposit := bgov.NewDeposit(msg.ProposalId, msg.Depositor, msg.Amount, tx.Height)
return db.SaveDeposit(deposit)
}
// handleMsgVote allows to properly handle a handleMsgVote
func handleMsgVote(
tx *juno.Tx, msg *govtypes.MsgVote,
authClient authtypes.QueryClient, bankClient banktypes.QueryClient,
cdc codec.Marshaler, db *database.BigDipperDb,
) error {
// Refresh accounts
err := auth.RefreshAccounts([]string{msg.Voter}, tx.Height, authClient, bankClient, cdc, db)
if err != nil {
return err
}
// Save the vote
vote := bgov.NewVote(msg.ProposalId, msg.Voter, msg.Option, tx.Height)
return db.SaveVote(vote)
}