From 56ee192d700e134f59b2e671f1cb8f2ff929d52e Mon Sep 17 00:00:00 2001 From: Jayden Lee <41176085+tkxkd0159@users.noreply.github.com> Date: Wed, 21 Feb 2024 04:14:39 +0900 Subject: [PATCH] Implement CLITestSuite --- x/collection/client/cli/tx.go | 9 - x/collection/client/cli/tx_test.go | 791 +++++++++++++++++++++++++++++ x/collection/go.mod | 3 + x/collection/go.sum | 9 + 4 files changed, 803 insertions(+), 9 deletions(-) create mode 100644 x/collection/client/cli/tx_test.go diff --git a/x/collection/client/cli/tx.go b/x/collection/client/cli/tx.go index 484b3509d4..7a3c0a3dc3 100644 --- a/x/collection/client/cli/tx.go +++ b/x/collection/client/cli/tx.go @@ -21,15 +21,6 @@ const ( // flag for contracts FlagBaseImgURI = "base-img-uri" - - // flag for fungible token classes - FlagDecimals = "decimals" - FlagMintable = "mintable" - FlagTo = "to" - FlagSupply = "supply" - - DefaultDecimals = 8 - DefaultSupply = "0" ) // NewTxCmd returns the transaction commands for this module diff --git a/x/collection/client/cli/tx_test.go b/x/collection/client/cli/tx_test.go new file mode 100644 index 0000000000..14ad1f2a18 --- /dev/null +++ b/x/collection/client/cli/tx_test.go @@ -0,0 +1,791 @@ +package cli_test + +import ( + "fmt" + "io" + "testing" + + sdkmath "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/stretchr/testify/suite" + + abci "github.com/cometbft/cometbft/abci/types" + rpcclientmock "github.com/cometbft/cometbft/rpc/client/mock" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + testutilmod "github.com/cosmos/cosmos-sdk/types/module/testutil" + "github.com/cosmos/cosmos-sdk/x/gov" + + "github.com/Finschia/finschia-sdk/x/collection" + "github.com/Finschia/finschia-sdk/x/collection/client/cli" +) + +type CLITestSuite struct { + suite.Suite + + kr keyring.Keyring + encCfg testutilmod.TestEncodingConfig + baseCtx client.Context + clientCtx client.Context + commonFlags []string + + vendor testutil.TestAccount + operator testutil.TestAccount + customer testutil.TestAccount + stranger testutil.TestAccount + + contractID string + classID string + tokenIdx string +} + +func TestCLITestSuite(t *testing.T) { + suite.Run(t, new(CLITestSuite)) +} + +func (s *CLITestSuite) SetupSuite() { + s.encCfg = testutilmod.MakeTestEncodingConfig(gov.AppModuleBasic{}) + s.kr = keyring.NewInMemory(s.encCfg.Codec) + s.baseCtx = client.Context{}. + WithKeyring(s.kr). + WithTxConfig(s.encCfg.TxConfig). + WithCodec(s.encCfg.Codec). + WithClient(clitestutil.MockCometRPC{Client: rpcclientmock.Client{}}). + WithAccountRetriever(client.MockAccountRetriever{}). + WithOutput(io.Discard). + WithChainID("test-chain") + + ctxGen := func() client.Context { + bz, _ := s.encCfg.Codec.Marshal(&sdk.TxResponse{}) + c := clitestutil.NewMockCometRPC(abci.ResponseQuery{ + Value: bz, + }) + return s.baseCtx.WithClient(c) + } + s.clientCtx = ctxGen() + + s.commonFlags = []string{ + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10))).String()), + fmt.Sprintf("--%s=test-chain", flags.FlagChainID), + } + + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 4) + s.vendor = val[0] + s.operator = val[1] + s.customer = val[2] + s.stranger = val[3] + + s.contractID = "678c146a" + s.classID = "10000001" + s.tokenIdx = "00000001" +} + +func (s *CLITestSuite) TestNewTxCmdSendNFT() { + + tokenID := collection.NewNFTID(s.classID, 1) + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.vendor.Address.String(), + s.customer.Address.String(), + tokenID, + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.stranger.Address.String(), + s.customer.Address.String(), + tokenID, + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.stranger.Address.String(), + s.customer.Address.String(), + }, + false, + }, + "amount out of range": { + []string{ + s.contractID, + s.stranger.Address.String(), + s.customer.Address.String(), + fmt.Sprintf("%s:1%0127d", s.classID, 0), + }, + false, + }, + "invalid contract id": { + []string{ + "", + s.stranger.Address.String(), + s.customer.Address.String(), + tokenID, + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdSendNFT() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdOperatorSendNFT() { + + tokenID := collection.NewNFTID(s.classID, 1) + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.operator.Address.String(), + s.vendor.Address.String(), + s.customer.Address.String(), + tokenID, + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.vendor.Address.String(), + s.customer.Address.String(), + tokenID, + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.vendor.Address.String(), + s.customer.Address.String(), + }, + false, + }, + "amount out of range": { + []string{ + s.contractID, + s.operator.Address.String(), + s.vendor.Address.String(), + s.customer.Address.String(), + fmt.Sprintf("%s:1%0127d", s.classID, 0), + }, + false, + }, + "invalid contract id": { + []string{ + "", + s.operator.Address.String(), + s.vendor.Address.String(), + s.customer.Address.String(), + tokenID, + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdOperatorSendNFT() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdCreateContract() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.vendor.Address.String(), + fmt.Sprintf("--%s=%s", cli.FlagName, "arctic fox"), + fmt.Sprintf("--%s=%s", cli.FlagMeta, "nft metadata"), + fmt.Sprintf("--%s=%s", cli.FlagBaseImgURI, "contract base img uri"), + }, + true, + }, + "extra args": { + []string{ + s.vendor.Address.String(), + "extra", + }, + false, + }, + "not enough args": { + []string{}, + false, + }, + "invalid creator": { + []string{ + "", + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdCreateContract() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdIssueNFT() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.vendor.Address.String(), + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.vendor.Address.String(), + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + }, + false, + }, + "invalid contract id": { + []string{ + "", + s.vendor.Address.String(), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdIssueNFT() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdMintNFT() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.vendor.Address.String(), + s.customer.Address.String(), + s.classID, + fmt.Sprintf("--%s=%s", cli.FlagName, "arctic fox"), + fmt.Sprintf("--%s=%s", cli.FlagMeta, "nft metadata"), + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.vendor.Address.String(), + s.customer.Address.String(), + s.classID, + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.vendor.Address.String(), + s.customer.Address.String(), + }, + false, + }, + "invalid contract id": { + []string{ + "", + s.vendor.Address.String(), + s.customer.Address.String(), + s.classID, + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdMintNFT() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdBurnNFT() { + tokenID := collection.NewNFTID(s.classID, 2) + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.customer.Address.String(), + tokenID, + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.customer.Address.String(), + tokenID, + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.customer.Address.String(), + }, + false, + }, + "invalid contract id": { + []string{ + "", + s.customer.Address.String(), + tokenID, + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdBurnNFT() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdOperatorOperatorBurnNFT() { + tokenID := collection.NewNFTID(s.classID, 1) + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.operator.Address.String(), + s.customer.Address.String(), + tokenID, + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.customer.Address.String(), + tokenID, + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.customer.Address.String(), + }, + false, + }, + "invalid contract id": { + []string{ + "", + s.operator.Address.String(), + s.customer.Address.String(), + tokenID, + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdOperatorBurnNFT() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdModify() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.operator.Address.String(), + s.classID, + s.tokenIdx, + collection.AttributeKeyName.String(), + "tibetian fox", + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.classID, + s.tokenIdx, + collection.AttributeKeyName.String(), + "tibetian fox", + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.classID, + s.tokenIdx, + collection.AttributeKeyName.String(), + }, + false, + }, + "invalid contract id": { + []string{ + "", + s.operator.Address.String(), + s.classID, + s.tokenIdx, + collection.AttributeKeyName.String(), + "tibetian fox", + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdModify() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdGrantPermission() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.operator.Address.String(), + s.vendor.Address.String(), + collection.LegacyPermissionMint.String(), + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.vendor.Address.String(), + collection.LegacyPermissionMint.String(), + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.operator.Address.String(), + s.vendor.Address.String(), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdGrantPermission() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdRevokePermission() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.vendor.Address.String(), + collection.LegacyPermissionModify.String(), + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.vendor.Address.String(), + collection.LegacyPermissionModify.String(), + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.vendor.Address.String(), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdRevokePermission() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + var res sdk.TxResponse + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdAuthorizeOperator() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.customer.Address.String(), + s.operator.Address.String(), + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.customer.Address.String(), + s.operator.Address.String(), + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.customer.Address.String(), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdAuthorizeOperator() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} + +func (s *CLITestSuite) TestNewTxCmdRevokeOperator() { + testCases := map[string]struct { + args []string + valid bool + }{ + "valid transaction": { + []string{ + s.contractID, + s.customer.Address.String(), + s.operator.Address.String(), + }, + true, + }, + "extra args": { + []string{ + s.contractID, + s.customer.Address.String(), + s.operator.Address.String(), + "extra", + }, + false, + }, + "not enough args": { + []string{ + s.contractID, + s.customer.Address.String(), + }, + false, + }, + } + + for name, tc := range testCases { + tc := tc + + s.Run(name, func() { + cmd := cli.NewTxCmdRevokeOperator() + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, append(tc.args, s.commonFlags...)) + if !tc.valid { + s.Require().Error(err) + return + } + s.Require().NoError(err) + + resp := new(sdk.TxResponse) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp)) + }) + } +} diff --git a/x/collection/go.mod b/x/collection/go.mod index 37f52e32cd..3f73ff2aa4 100644 --- a/x/collection/go.mod +++ b/x/collection/go.mod @@ -37,6 +37,7 @@ require ( github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/pebble v0.0.0-20231101195458-481da04154d6 // indirect @@ -71,6 +72,7 @@ require ( github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.2.0 // indirect + github.com/golang/mock v1.6.0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.6.0 // indirect @@ -100,6 +102,7 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/linxGnu/grocksdb v1.8.6 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect diff --git a/x/collection/go.sum b/x/collection/go.sum index 1326f05732..cb86295e08 100644 --- a/x/collection/go.sum +++ b/x/collection/go.sum @@ -96,10 +96,14 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -720,6 +724,7 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= @@ -775,6 +780,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -816,6 +822,7 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -865,6 +872,7 @@ golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -909,6 +917,7 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=