-
Notifications
You must be signed in to change notification settings - Fork 41
/
tx_msg_filters.go
158 lines (131 loc) · 4.82 KB
/
tx_msg_filters.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
155
156
157
158
package ante
import (
"strings"
didtypes "github.com/cheqd/cheqd-node/x/did/types"
resourcetypes "github.com/cheqd/cheqd-node/x/resource/types"
resourceutils "github.com/cheqd/cheqd-node/x/resource/utils"
sdk "github.com/cosmos/cosmos-sdk/types"
)
const (
MsgCreateDidDoc int = iota
MsgUpdateDidDoc
MsgDeactivateDidDoc
MsgCreateResourceDefault
MsgCreateResourceImage
MsgCreateResourceJSON
TaxableMsgFeeCount
)
const (
BurnFactorDid int = iota
BurnFactorResource
BurnFactorCount
)
type TaxableMsgFee = [TaxableMsgFeeCount]sdk.Coins
type BurnFactor = [BurnFactorCount]sdk.Dec
var TaxableMsgFees = TaxableMsgFee{
MsgCreateDidDoc: (sdk.Coins)(nil),
MsgUpdateDidDoc: (sdk.Coins)(nil),
MsgDeactivateDidDoc: (sdk.Coins)(nil),
MsgCreateResourceDefault: (sdk.Coins)(nil),
MsgCreateResourceImage: (sdk.Coins)(nil),
MsgCreateResourceJSON: (sdk.Coins)(nil),
}
var BurnFactors = BurnFactor{
BurnFactorDid: sdk.NewDec(0),
BurnFactorResource: sdk.NewDec(0),
}
func GetTaxableMsg(msg interface{}) bool {
switch msg.(type) {
case *didtypes.MsgCreateDidDoc:
return true
case *didtypes.MsgUpdateDidDoc:
return true
case *didtypes.MsgDeactivateDidDoc:
return true
case *resourcetypes.MsgCreateResource:
return true
default:
return false
}
}
func GetTaxableMsgFeeWithBurnPortion(ctx sdk.Context, msg interface{}) (sdk.Coins, sdk.Coins, bool) {
switch msg := msg.(type) {
case *didtypes.MsgCreateDidDoc:
burnPortion := GetBurnFeePortion(BurnFactors[BurnFactorDid], TaxableMsgFees[MsgCreateDidDoc])
return GetRewardPortion(TaxableMsgFees[MsgCreateDidDoc], burnPortion), burnPortion, true
case *didtypes.MsgUpdateDidDoc:
burnPortion := GetBurnFeePortion(BurnFactors[BurnFactorDid], TaxableMsgFees[MsgUpdateDidDoc])
return GetRewardPortion(TaxableMsgFees[MsgUpdateDidDoc], burnPortion), burnPortion, true
case *didtypes.MsgDeactivateDidDoc:
burnPortion := GetBurnFeePortion(BurnFactors[BurnFactorDid], TaxableMsgFees[MsgDeactivateDidDoc])
return GetRewardPortion(TaxableMsgFees[MsgDeactivateDidDoc], burnPortion), burnPortion, true
case *resourcetypes.MsgCreateResource:
return GetResourceTaxableMsgFee(ctx, msg)
default:
return nil, nil, false
}
}
func GetRewardPortion(total sdk.Coins, burnPortion sdk.Coins) sdk.Coins {
if burnPortion.IsZero() {
return total
}
return total.Sub(burnPortion...)
}
func GetResourceTaxableMsgFee(ctx sdk.Context, msg *resourcetypes.MsgCreateResource) (sdk.Coins, sdk.Coins, bool) {
mediaType := resourceutils.DetectMediaType(msg.GetPayload().ToResource().Resource.Data)
// Mime type image
if strings.HasPrefix(mediaType, "image/") {
burnPortion := GetBurnFeePortion(BurnFactors[BurnFactorResource], TaxableMsgFees[MsgCreateResourceImage])
return GetRewardPortion(TaxableMsgFees[MsgCreateResourceImage], burnPortion), burnPortion, true
}
// Mime type json
if strings.HasPrefix(mediaType, "application/json") {
burnPortion := GetBurnFeePortion(BurnFactors[BurnFactorResource], TaxableMsgFees[MsgCreateResourceJSON])
return GetRewardPortion(TaxableMsgFees[MsgCreateResourceJSON], burnPortion), burnPortion, true
}
// Default mime type
burnPortion := GetBurnFeePortion(BurnFactors[BurnFactorResource], TaxableMsgFees[MsgCreateResourceDefault])
return GetRewardPortion(TaxableMsgFees[MsgCreateResourceDefault], burnPortion), burnPortion, true
}
func checkFeeParamsFromSubspace(ctx sdk.Context, didKeeper DidKeeper, resourceKeeper ResourceKeeper) bool {
didParams := didKeeper.GetParams(ctx)
TaxableMsgFees[MsgCreateDidDoc] = sdk.NewCoins(didParams.CreateDid)
TaxableMsgFees[MsgUpdateDidDoc] = sdk.NewCoins(didParams.UpdateDid)
TaxableMsgFees[MsgDeactivateDidDoc] = sdk.NewCoins(didParams.DeactivateDid)
resourceParams := resourceKeeper.GetParams(ctx)
TaxableMsgFees[MsgCreateResourceImage] = sdk.NewCoins(resourceParams.Image)
TaxableMsgFees[MsgCreateResourceJSON] = sdk.NewCoins(resourceParams.Json)
TaxableMsgFees[MsgCreateResourceDefault] = sdk.NewCoins(resourceParams.Default)
BurnFactors[BurnFactorDid] = didParams.BurnFactor
BurnFactors[BurnFactorResource] = resourceParams.BurnFactor
return true
}
func IsTaxableTx(ctx sdk.Context, didKeeper DidKeeper, resourceKeeper ResourceKeeper, tx sdk.Tx) (bool, sdk.Coins, sdk.Coins) {
_ = checkFeeParamsFromSubspace(ctx, didKeeper, resourceKeeper)
reward := (sdk.Coins)(nil)
burn := (sdk.Coins)(nil)
msgs := tx.GetMsgs()
for _, msg := range msgs {
rewardPortion, burnPortion, isIdentityMsg := GetTaxableMsgFeeWithBurnPortion(ctx, msg)
if !isIdentityMsg {
continue
}
if rewardPortion != nil {
reward = reward.Add(rewardPortion...)
burn = burn.Add(burnPortion...)
}
}
if !reward.IsZero() {
return true, reward, burn
}
return false, nil, nil
}
func IsTaxableTxLite(tx sdk.Tx) bool {
msgs := tx.GetMsgs()
for _, msg := range msgs {
if GetTaxableMsg(msg) {
return true
}
}
return false
}