<!-- The default pull request template is for types feat, fix, or refactor. For other templates, add one of the following parameters to the url: - template=docs.md - template=other.md --> ## Description ref: #8961 <!-- Add a description of the changes that this PR introduces and the files that are the most critical to review. --> Following up on [#9697](https://github.com/cosmos/cosmos-sdk/pull/9697#pullrequestreview-727295733), this PR is the first step for the #8961. --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [x] added `!` to the type prefix if API or client breaking change - [x] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [x] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [x] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable)
105 lines
2.2 KiB
Go
105 lines
2.2 KiB
Go
package feegrant_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/simapp"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/feegrant"
|
|
)
|
|
|
|
func TestGrant(t *testing.T) {
|
|
app := simapp.Setup(t, false)
|
|
addr, err := sdk.AccAddressFromBech32("cosmos1qk93t4j0yyzgqgt6k5qf8deh8fq6smpn3ntu3x")
|
|
require.NoError(t, err)
|
|
addr2, err := sdk.AccAddressFromBech32("cosmos1p9qh4ldfd6n0qehujsal4k7g0e37kel90rc4ts")
|
|
require.NoError(t, err)
|
|
atom := sdk.NewCoins(sdk.NewInt64Coin("atom", 555))
|
|
ctx := app.BaseApp.NewContext(false, tmproto.Header{
|
|
Time: time.Now(),
|
|
})
|
|
now := ctx.BlockTime()
|
|
oneYear := now.AddDate(1, 0, 0)
|
|
|
|
zeroAtoms := sdk.NewCoins(sdk.NewInt64Coin("atom", 0))
|
|
cdc := app.AppCodec()
|
|
|
|
cases := map[string]struct {
|
|
granter sdk.AccAddress
|
|
grantee sdk.AccAddress
|
|
limit sdk.Coins
|
|
expires time.Time
|
|
valid bool
|
|
}{
|
|
"good": {
|
|
granter: addr2,
|
|
grantee: addr,
|
|
limit: atom,
|
|
expires: oneYear,
|
|
valid: true,
|
|
},
|
|
"no grantee": {
|
|
granter: addr2,
|
|
grantee: nil,
|
|
limit: atom,
|
|
expires: oneYear,
|
|
valid: false,
|
|
},
|
|
"no granter": {
|
|
granter: nil,
|
|
grantee: addr,
|
|
limit: atom,
|
|
expires: oneYear,
|
|
valid: false,
|
|
},
|
|
"self-grant": {
|
|
granter: addr2,
|
|
grantee: addr2,
|
|
limit: atom,
|
|
expires: oneYear,
|
|
valid: false,
|
|
},
|
|
"zero allowance": {
|
|
granter: addr2,
|
|
grantee: addr,
|
|
limit: zeroAtoms,
|
|
expires: oneYear,
|
|
valid: false,
|
|
},
|
|
}
|
|
|
|
for name, tc := range cases {
|
|
tc := tc
|
|
t.Run(name, func(t *testing.T) {
|
|
grant, err := feegrant.NewGrant(tc.granter, tc.grantee, &feegrant.BasicAllowance{
|
|
SpendLimit: tc.limit,
|
|
Expiration: &tc.expires,
|
|
})
|
|
require.NoError(t, err)
|
|
err = grant.ValidateBasic()
|
|
|
|
if !tc.valid {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
require.NoError(t, err)
|
|
|
|
// if it is valid, let's try to serialize, deserialize, and make sure it matches
|
|
bz, err := cdc.Marshal(&grant)
|
|
require.NoError(t, err)
|
|
var loaded feegrant.Grant
|
|
err = cdc.Unmarshal(bz, &loaded)
|
|
require.NoError(t, err)
|
|
|
|
err = loaded.ValidateBasic()
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, grant, loaded)
|
|
})
|
|
}
|
|
}
|