# x/globalfee audit
## Conclusion
No issues found. Some stuff can be simplified, lacks some tests and godocs.
### module.go
#### RegisterGRPCGatewayRoutes
- Has an ignored error, in the original implementation it panics.
### fee_utils.go
- Move tests from antetest/fee_utils_test.go to the same directory; and suite is unnecessary (they are unit tests).
- getMinGasPrice and bypassMinFeeMsgs don't have a unit test
- GetTxPriority is not used
### fee.go
- `!ctx.IsCheckTx() || simulate {` can be moved some lines up in AnteHandle to return earlier.
- In `getGlobalFee` DefaultZeroGlobalFee's error is not returned until the end of the function. Was this intentional?
- Add a godoc to `getGlobalFee`
### params.go
DecCoins Validate() can be simplified (I have this in local if you prefer a PR):
```go=
func (coins DecCoins) Validate() error {
if len(coins) == 0 {
return nil
}
lowDenom := ""
seenDenoms := make(map[string]bool)
for _, coin := range coins {
if err := coin.Validate(); err != nil {
return err
}
if seenDenoms[coin.Denom] {
return fmt.Errorf("duplicate denomination %s", coin.Denom)
}
if coin.Denom <= lowDenom {
return fmt.Errorf("denomination %s is not sorted", coin.Denom)
}
// we compare each coin against the last denom
lowDenom = coin.Denom
seenDenoms[coin.Denom] = true
}
return nil
}
```
This is possible because the original `sdk.DecCoins` and `sdk.DecCoin` validation works differently. In this implementation the `DecCoins` validation works like `sdk.DecCoin` (accepting zero values).
### params_test.go
Would like to add a couple of tests cases:
```go=
// these 3 last cases should be impossible to reach if constructors are properly used
"negative amount, fail": {
sdk.DecCoins{sdk.DecCoin{Denom: "photon", Amount: sdk.OneDec().Neg()}},
true,
},
"invalid denom, fail": {
sdk.DecCoins{sdk.DecCoin{Denom: "photon!", Amount: sdk.OneDec()}},
true,
},
"invalid second denom, fail": {
sdk.DecCoins{
sdk.DecCoin{Denom: "photon", Amount: sdk.OneDec()},
sdk.DecCoin{Denom: "photon!", Amount: sdk.OneDec()},
},
true,
},
```