github.com/Finschia/finschia-sdk@v0.49.1/x/feegrant/msgs_test.go (about) 1 package feegrant_test 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/Finschia/finschia-sdk/codec" 10 codectypes "github.com/Finschia/finschia-sdk/codec/types" 11 sdk "github.com/Finschia/finschia-sdk/types" 12 "github.com/Finschia/finschia-sdk/x/auth/legacy/legacytx" 13 "github.com/Finschia/finschia-sdk/x/feegrant" 14 ) 15 16 func TestMsgGrantAllowance(t *testing.T) { 17 cdc := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) 18 addr, _ := sdk.AccAddressFromBech32("link1ghekyjucln7y67ntx7cf27m9dpuxxemnqk82wt") 19 addr2, _ := sdk.AccAddressFromBech32("link18vd8fpwxzck93qlwghaj6arh4p7c5n89fvcmzu") 20 atom := sdk.NewCoins(sdk.NewInt64Coin("atom", 555)) 21 threeHours := time.Now().Add(3 * time.Hour) 22 basic := &feegrant.BasicAllowance{ 23 SpendLimit: atom, 24 Expiration: &threeHours, 25 } 26 27 cases := map[string]struct { 28 grantee sdk.AccAddress 29 granter sdk.AccAddress 30 grant *feegrant.BasicAllowance 31 valid bool 32 }{ 33 "valid": { 34 grantee: addr, 35 granter: addr2, 36 grant: basic, 37 valid: true, 38 }, 39 "no grantee": { 40 granter: addr2, 41 grantee: sdk.AccAddress{}, 42 grant: basic, 43 valid: false, 44 }, 45 "no granter": { 46 granter: sdk.AccAddress{}, 47 grantee: addr, 48 grant: basic, 49 valid: false, 50 }, 51 "grantee == granter": { 52 grantee: addr, 53 granter: addr, 54 grant: basic, 55 valid: false, 56 }, 57 } 58 59 for _, tc := range cases { 60 msg, err := feegrant.NewMsgGrantAllowance(tc.grant, tc.granter, tc.grantee) 61 require.NoError(t, err) 62 err = msg.ValidateBasic() 63 64 if tc.valid { 65 require.NoError(t, err) 66 67 addrSlice := msg.GetSigners() 68 require.Equal(t, tc.granter.String(), addrSlice[0].String()) 69 70 allowance, err := msg.GetFeeAllowanceI() 71 require.NoError(t, err) 72 require.Equal(t, tc.grant, allowance) 73 74 err = msg.UnpackInterfaces(cdc) 75 require.NoError(t, err) 76 } else { 77 require.Error(t, err) 78 } 79 } 80 } 81 82 func TestMsgRevokeAllowance(t *testing.T) { 83 addr, _ := sdk.AccAddressFromBech32("link1ghekyjucln7y67ntx7cf27m9dpuxxemnqk82wt") 84 addr2, _ := sdk.AccAddressFromBech32("link18vd8fpwxzck93qlwghaj6arh4p7c5n89fvcmzu") 85 atom := sdk.NewCoins(sdk.NewInt64Coin("atom", 555)) 86 threeHours := time.Now().Add(3 * time.Hour) 87 88 basic := &feegrant.BasicAllowance{ 89 SpendLimit: atom, 90 Expiration: &threeHours, 91 } 92 cases := map[string]struct { 93 grantee sdk.AccAddress 94 granter sdk.AccAddress 95 grant *feegrant.BasicAllowance 96 valid bool 97 }{ 98 "valid": { 99 grantee: addr, 100 granter: addr2, 101 grant: basic, 102 valid: true, 103 }, 104 "no grantee": { 105 granter: addr2, 106 grantee: sdk.AccAddress{}, 107 grant: basic, 108 valid: false, 109 }, 110 "no granter": { 111 granter: sdk.AccAddress{}, 112 grantee: addr, 113 grant: basic, 114 valid: false, 115 }, 116 "grantee == granter": { 117 grantee: addr, 118 granter: addr, 119 grant: basic, 120 valid: false, 121 }, 122 } 123 124 for _, tc := range cases { 125 msg := feegrant.NewMsgRevokeAllowance(tc.granter, tc.grantee) 126 err := msg.ValidateBasic() 127 if tc.valid { 128 require.NoError(t, err) 129 addrSlice := msg.GetSigners() 130 require.Equal(t, tc.granter.String(), addrSlice[0].String()) 131 } else { 132 require.Error(t, err) 133 } 134 } 135 } 136 137 func TestAminoJSON(t *testing.T) { 138 tx := legacytx.StdTx{} 139 var msg legacytx.LegacyMsg 140 allowanceAny, err := codectypes.NewAnyWithValue(&feegrant.BasicAllowance{SpendLimit: sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(100)))}) 141 require.NoError(t, err) 142 143 // Amino JSON encoding has changed in feegrant since v0.46. 144 // Before, it was outputting something like: 145 // `{"account_number":"1","chain_id":"foo","fee":{"amount":[],"gas":"0"},"memo":"memo","msgs":[{"allowance":{"spend_limit":[{"amount":"100","denom":"foo"}]},"grantee":"link1def","granter":"link1abc"}],"sequence":"1","timeout_height":"1"}` 146 // 147 // This was a bug. Now, it's as below, See how there's `type` & `value` fields. 148 // ref: https://github.com/cosmos/cosmos-sdk/issues/11190 149 // ref: https://github.com/cosmos/cosmjs/issues/1026 150 msg = &feegrant.MsgGrantAllowance{Granter: "link1abc", Grantee: "link1def", Allowance: allowanceAny} 151 tx.Msgs = []sdk.Msg{msg} 152 require.Equal(t, 153 `{"account_number":"1","chain_id":"foo","fee":{"amount":[],"gas":"0"},"memo":"memo","msgs":[{"type":"cosmos-sdk/MsgGrantAllowance","value":{"allowance":{"type":"cosmos-sdk/BasicAllowance","value":{"spend_limit":[{"amount":"100","denom":"foo"}]}},"grantee":"link1def","granter":"link1abc"}}],"sequence":"1","timeout_height":"1"}`, 154 string(legacytx.StdSignBytes("foo", 1, 1, 1, legacytx.StdFee{}, []sdk.Msg{msg}, "memo")), 155 ) 156 157 msg = &feegrant.MsgRevokeAllowance{Granter: "link1abc", Grantee: "link1def"} 158 tx.Msgs = []sdk.Msg{msg} 159 require.Equal(t, 160 `{"account_number":"1","chain_id":"foo","fee":{"amount":[],"gas":"0"},"memo":"memo","msgs":[{"type":"cosmos-sdk/MsgRevokeAllowance","value":{"grantee":"link1def","granter":"link1abc"}}],"sequence":"1","timeout_height":"1"}`, 161 string(legacytx.StdSignBytes("foo", 1, 1, 1, legacytx.StdFee{}, []sdk.Msg{msg}, "memo")), 162 ) 163 }