-
Notifications
You must be signed in to change notification settings - Fork 47
/
handler.go
87 lines (74 loc) · 2.37 KB
/
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
package msgfee
import (
"github.com/iov-one/weave"
"github.com/iov-one/weave/errors"
"github.com/iov-one/weave/gconf"
"github.com/iov-one/weave/migration"
"github.com/iov-one/weave/orm"
"github.com/iov-one/weave/x"
)
const (
setMsgFeeCost = 0
)
// RegisterRoutes registers handlers for feedlist message processing.
func RegisterRoutes(r weave.Registry, auth x.Authenticator) {
r = migration.SchemaMigratingRegistry("msgfee", r)
fees := NewMsgFeeBucket()
r.Handle(&SetMsgFeeMsg{}, &setMsgFeeHandler{
auth: auth,
fees: fees,
})
r.Handle(&UpdateConfigurationMsg{}, NewConfigHandler(auth))
}
// RegisterQuery register queries from buckets in this package
func RegisterQuery(qr weave.QueryRouter) {
NewMsgFeeBucket().Register("msgfee", qr)
}
type setMsgFeeHandler struct {
auth x.Authenticator
fees orm.ModelBucket
}
func (h *setMsgFeeHandler) Check(ctx weave.Context, db weave.KVStore, tx weave.Tx) (*weave.CheckResult, error) {
if _, err := h.validate(ctx, db, tx); err != nil {
return nil, err
}
return &weave.CheckResult{GasAllocated: setMsgFeeCost}, nil
}
func (h *setMsgFeeHandler) Deliver(ctx weave.Context, db weave.KVStore, tx weave.Tx) (*weave.DeliverResult, error) {
msg, err := h.validate(ctx, db, tx)
if err != nil {
return nil, err
}
// If a fee is zero, this is an unset operation. No need to store a zero value fee.
if msg.Fee.IsZero() {
err = h.fees.Delete(db, []byte(msg.MsgPath))
} else {
_, err = h.fees.Put(db, []byte(msg.MsgPath), &MsgFee{
Metadata: &weave.Metadata{},
MsgPath: msg.MsgPath,
Fee: msg.Fee,
})
}
if err != nil {
return nil, errors.Wrap(err, "cannot store fee")
}
return &weave.DeliverResult{Data: []byte(msg.MsgPath)}, nil
}
func (h *setMsgFeeHandler) validate(ctx weave.Context, db weave.KVStore, tx weave.Tx) (*SetMsgFeeMsg, error) {
var msg SetMsgFeeMsg
if err := weave.LoadMsg(tx, &msg); err != nil {
return nil, errors.Wrap(err, "load msg")
}
var conf Configuration
if err := gconf.Load(db, "msgfee", &conf); err != nil {
return nil, errors.Wrap(err, "load configuration")
}
if !h.auth.HasAddress(ctx, conf.FeeAdmin) {
return nil, errors.Wrap(errors.ErrUnauthorized, "fee admin authentication required")
}
return &msg, nil
}
func NewConfigHandler(auth x.Authenticator) weave.Handler {
var conf Configuration
return gconf.NewUpdateConfigurationHandler("msgfee", &conf, auth, migration.CurrentAdmin)
}