github.com/ava-labs/avalanchego@v1.11.11/vms/avm/client_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package avm
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/ava-labs/avalanchego/api"
    13  	"github.com/ava-labs/avalanchego/ids"
    14  	"github.com/ava-labs/avalanchego/utils/json"
    15  	"github.com/ava-labs/avalanchego/utils/rpc"
    16  )
    17  
    18  type mockClient struct {
    19  	require        *require.Assertions
    20  	expectedInData interface{}
    21  }
    22  
    23  func (mc *mockClient) SendRequest(
    24  	_ context.Context,
    25  	_ string,
    26  	inData interface{},
    27  	_ interface{},
    28  	_ ...rpc.Option,
    29  ) error {
    30  	mc.require.Equal(mc.expectedInData, inData)
    31  	return nil
    32  }
    33  
    34  func TestClientCreateAsset(t *testing.T) {
    35  	require := require.New(t)
    36  	client := client{}
    37  	{
    38  		// empty slices
    39  		clientHolders := []*ClientHolder{}
    40  		clientMinters := []ClientOwners{}
    41  		clientFrom := []ids.ShortID{}
    42  		clientChangeAddr := ids.GenerateTestShortID()
    43  		serviceHolders := []*Holder{}
    44  		serviceMinters := []Owners{}
    45  		serviceFrom := []string{}
    46  		serviceChangeAddr := clientChangeAddr.String()
    47  		expectedInData := &CreateAssetArgs{
    48  			JSONSpendHeader: api.JSONSpendHeader{
    49  				JSONFromAddrs:  api.JSONFromAddrs{From: serviceFrom},
    50  				JSONChangeAddr: api.JSONChangeAddr{ChangeAddr: serviceChangeAddr},
    51  			},
    52  			InitialHolders: serviceHolders,
    53  			MinterSets:     serviceMinters,
    54  		}
    55  		client.requester = &mockClient{
    56  			require:        require,
    57  			expectedInData: expectedInData,
    58  		}
    59  		_, err := client.CreateAsset(
    60  			context.Background(),
    61  			api.UserPass{},
    62  			clientFrom,
    63  			clientChangeAddr,
    64  			"",
    65  			"",
    66  			0,
    67  			clientHolders,
    68  			clientMinters,
    69  		)
    70  		require.NoError(err)
    71  	}
    72  	{
    73  		// non empty slices
    74  		clientHolders := []*ClientHolder{
    75  			{
    76  				Amount:  11,
    77  				Address: ids.GenerateTestShortID(),
    78  			},
    79  		}
    80  		clientMinters := []ClientOwners{
    81  			{
    82  				Threshold: 22,
    83  				Minters:   []ids.ShortID{ids.GenerateTestShortID()},
    84  			},
    85  		}
    86  		clientFrom := []ids.ShortID{ids.GenerateTestShortID()}
    87  		clientChangeAddr := ids.GenerateTestShortID()
    88  		serviceHolders := []*Holder{
    89  			{
    90  				Amount:  json.Uint64(clientHolders[0].Amount),
    91  				Address: clientHolders[0].Address.String(),
    92  			},
    93  		}
    94  		serviceMinters := []Owners{
    95  			{
    96  				Threshold: json.Uint32(clientMinters[0].Threshold),
    97  				Minters:   []string{clientMinters[0].Minters[0].String()},
    98  			},
    99  		}
   100  		serviceFrom := []string{clientFrom[0].String()}
   101  		serviceChangeAddr := clientChangeAddr.String()
   102  		expectedInData := &CreateAssetArgs{
   103  			JSONSpendHeader: api.JSONSpendHeader{
   104  				JSONFromAddrs:  api.JSONFromAddrs{From: serviceFrom},
   105  				JSONChangeAddr: api.JSONChangeAddr{ChangeAddr: serviceChangeAddr},
   106  			},
   107  			InitialHolders: serviceHolders,
   108  			MinterSets:     serviceMinters,
   109  		}
   110  		client.requester = &mockClient{
   111  			require:        require,
   112  			expectedInData: expectedInData,
   113  		}
   114  		_, err := client.CreateAsset(
   115  			context.Background(),
   116  			api.UserPass{},
   117  			clientFrom,
   118  			clientChangeAddr,
   119  			"",
   120  			"",
   121  			0,
   122  			clientHolders,
   123  			clientMinters,
   124  		)
   125  		require.NoError(err)
   126  	}
   127  }
   128  
   129  func TestClientCreateFixedCapAsset(t *testing.T) {
   130  	require := require.New(t)
   131  	client := client{}
   132  	{
   133  		// empty slices
   134  		clientHolders := []*ClientHolder{}
   135  		clientFrom := []ids.ShortID{}
   136  		clientChangeAddr := ids.GenerateTestShortID()
   137  		serviceHolders := []*Holder{}
   138  		serviceFrom := []string{}
   139  		serviceChangeAddr := clientChangeAddr.String()
   140  		expectedInData := &CreateAssetArgs{
   141  			JSONSpendHeader: api.JSONSpendHeader{
   142  				JSONFromAddrs:  api.JSONFromAddrs{From: serviceFrom},
   143  				JSONChangeAddr: api.JSONChangeAddr{ChangeAddr: serviceChangeAddr},
   144  			},
   145  			InitialHolders: serviceHolders,
   146  		}
   147  		client.requester = &mockClient{
   148  			require:        require,
   149  			expectedInData: expectedInData,
   150  		}
   151  		_, err := client.CreateFixedCapAsset(
   152  			context.Background(),
   153  			api.UserPass{},
   154  			clientFrom,
   155  			clientChangeAddr,
   156  			"",
   157  			"",
   158  			0,
   159  			clientHolders,
   160  		)
   161  		require.NoError(err)
   162  	}
   163  	{
   164  		// non empty slices
   165  		clientHolders := []*ClientHolder{
   166  			{
   167  				Amount:  11,
   168  				Address: ids.GenerateTestShortID(),
   169  			},
   170  		}
   171  		clientFrom := []ids.ShortID{ids.GenerateTestShortID()}
   172  		clientChangeAddr := ids.GenerateTestShortID()
   173  		serviceHolders := []*Holder{
   174  			{
   175  				Amount:  json.Uint64(clientHolders[0].Amount),
   176  				Address: clientHolders[0].Address.String(),
   177  			},
   178  		}
   179  		serviceFrom := []string{clientFrom[0].String()}
   180  		serviceChangeAddr := clientChangeAddr.String()
   181  		expectedInData := &CreateAssetArgs{
   182  			JSONSpendHeader: api.JSONSpendHeader{
   183  				JSONFromAddrs:  api.JSONFromAddrs{From: serviceFrom},
   184  				JSONChangeAddr: api.JSONChangeAddr{ChangeAddr: serviceChangeAddr},
   185  			},
   186  			InitialHolders: serviceHolders,
   187  		}
   188  		client.requester = &mockClient{
   189  			require:        require,
   190  			expectedInData: expectedInData,
   191  		}
   192  		_, err := client.CreateFixedCapAsset(
   193  			context.Background(),
   194  			api.UserPass{},
   195  			clientFrom,
   196  			clientChangeAddr,
   197  			"",
   198  			"",
   199  			0,
   200  			clientHolders,
   201  		)
   202  		require.NoError(err)
   203  	}
   204  }