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  }