From 9ffe64dc1eea9721bd1d0a0fb4377f50283823d8 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Thu, 7 Mar 2019 09:02:40 +0100 Subject: [PATCH 01/97] failing test --- types/coin_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/types/coin_test.go b/types/coin_test.go index 50dd8bb52..6971e6750 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -519,3 +519,43 @@ func TestCoinsIsAnyGTE(t *testing.T) { assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAnyGTE(Coins{{testDenom1, one}, {testDenom2, two}})) assert.True(t, Coins{{"xxx", one}, {"yyy", one}}.IsAnyGTE(Coins{{testDenom2, one}, {"ccc", one}, {"yyy", one}, {"zzz", one}})) } + +func TestCoinsIsAllGT(t *testing.T) { + one := NewInt(1) + two := NewInt(2) + + assert.False(t, Coins{}.IsAllGT(Coins{})) + assert.True(t, Coins{{testDenom1, one}}.IsAllGT(Coins{})) + assert.False(t, Coins{}.IsAllGT(Coins{{testDenom1, one}})) + assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom1, two}})) + assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom2, one}})) + assert.False(t, Coins{{testDenom1, one}, {testDenom2, two}}.IsAllGT(Coins{{testDenom1, two}, {testDenom2, one}})) + assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom1, one}})) + assert.True(t, Coins{{testDenom1, two}}.IsAllGT(Coins{{testDenom1, one}})) + assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.False(t, Coins{{testDenom2, two}}.IsAllGT(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.False(t, Coins{{testDenom2, one}}.IsAllGT(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.False(t, Coins{{testDenom1, one}, {testDenom2, two}}.IsAllGT(Coins{{testDenom1, one}, {testDenom2, one}})) + assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllGT(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.False(t, Coins{{"xxx", one}, {"yyy", one}}.IsAllGT(Coins{{testDenom2, one}, {"ccc", one}, {"yyy", one}, {"zzz", one}})) +} + +func TestCoinsIsAllGTE(t *testing.T) { + one := NewInt(1) + two := NewInt(2) + + assert.True(t, Coins{}.IsAllGTE(Coins{})) + assert.True(t, Coins{{testDenom1, one}}.IsAllGTE(Coins{})) + assert.False(t, Coins{}.IsAllGTE(Coins{{testDenom1, one}})) + assert.False(t, Coins{{testDenom1, one}}.IsAllGTE(Coins{{testDenom1, two}})) + assert.False(t, Coins{{testDenom1, one}}.IsAllGTE(Coins{{testDenom2, one}})) + assert.False(t, Coins{{testDenom1, one}, {testDenom2, two}}.IsAllGTE(Coins{{testDenom1, two}, {testDenom2, one}})) + assert.True(t, Coins{{testDenom1, one}}.IsAllGTE(Coins{{testDenom1, one}})) + assert.True(t, Coins{{testDenom1, two}}.IsAllGTE(Coins{{testDenom1, one}})) + assert.False(t, Coins{{testDenom1, one}}.IsAllGTE(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.False(t, Coins{{testDenom2, two}}.IsAllGTE(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.False(t, Coins{{testDenom2, one}}.IsAllGTE(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.True(t, Coins{{testDenom1, one}, {testDenom2, two}}.IsAllGTE(Coins{{testDenom1, one}, {testDenom2, one}})) + assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllGTE(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.False(t, Coins{{"xxx", one}, {"yyy", one}}.IsAllGTE(Coins{{testDenom2, one}, {"ccc", one}, {"yyy", one}, {"zzz", one}})) +} From a24dee015599f89cc7f64d96ab08f5cb1edecc76 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 7 Mar 2019 11:51:14 -0800 Subject: [PATCH 02/97] Merge PR #3808: Make cli tests use build files * Make cli tests use build files * Update PENDING.md Add PR number. --- Makefile | 4 +- PENDING.md | 2 + client/lcd/test_helpers.go | 2 +- cmd/gaia/cli_test/test_helpers.go | 88 +++++++++++++++---------------- 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/Makefile b/Makefile index d939fde1c..04803aaf2 100644 --- a/Makefile +++ b/Makefile @@ -160,8 +160,8 @@ godocs: test: test_unit -test_cli: - @go test -p 4 `go list github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test` -tags=cli_test +test_cli: build + @go test -p 4 `go list ./cmd/gaia/cli_test/...` -tags=cli_test test_ledger: # First test with mock diff --git a/PENDING.md b/PENDING.md index 591311315..7b6461828 100644 --- a/PENDING.md +++ b/PENDING.md @@ -38,6 +38,8 @@ ### Gaia +* #3808 `gaiad` and `gaiacli` integration tests use ./build/ binaries. + ### SDK ### Tendermint diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index 507c6af03..6e2ea73c6 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -668,7 +668,7 @@ func doTransfer( resp, body, recvAddr := doTransferWithGas( t, port, seed, name, memo, pwd, addr, "", 1.0, false, true, fees, ) - require.Equal(t, http.StatusOK, resp.StatusCode, resp) + require.Equal(t, http.StatusOK, resp.StatusCode, body) var txResp sdk.TxResponse err := cdc.UnmarshalJSON([]byte(body), &txResp) diff --git a/cmd/gaia/cli_test/test_helpers.go b/cmd/gaia/cli_test/test_helpers.go index 21419ad96..16227acfb 100644 --- a/cmd/gaia/cli_test/test_helpers.go +++ b/cmd/gaia/cli_test/test_helpers.go @@ -163,7 +163,7 @@ func (f *Fixtures) Flags() string { // UnsafeResetAll is gaiad unsafe-reset-all func (f *Fixtures) UnsafeResetAll(flags ...string) { - cmd := fmt.Sprintf("gaiad --home=%s unsafe-reset-all", f.GDHome) + cmd := fmt.Sprintf("../../../build/gaiad --home=%s unsafe-reset-all", f.GDHome) executeWrite(f.T, addFlags(cmd, flags)) err := os.RemoveAll(filepath.Join(f.GDHome, "config", "gentx")) require.NoError(f.T, err) @@ -172,7 +172,7 @@ func (f *Fixtures) UnsafeResetAll(flags ...string) { // GDInit is gaiad init // NOTE: GDInit sets the ChainID for the Fixtures instance func (f *Fixtures) GDInit(moniker string, flags ...string) { - cmd := fmt.Sprintf("gaiad init -o --home=%s %s", f.GDHome, moniker) + cmd := fmt.Sprintf("../../../build/gaiad init -o --home=%s %s", f.GDHome, moniker) _, stderr := tests.ExecuteT(f.T, addFlags(cmd, flags), app.DefaultKeyPass) var chainID string @@ -189,25 +189,25 @@ func (f *Fixtures) GDInit(moniker string, flags ...string) { // AddGenesisAccount is gaiad add-genesis-account func (f *Fixtures) AddGenesisAccount(address sdk.AccAddress, coins sdk.Coins, flags ...string) { - cmd := fmt.Sprintf("gaiad add-genesis-account %s %s --home=%s", address, coins, f.GDHome) + cmd := fmt.Sprintf("../../../build/gaiad add-genesis-account %s %s --home=%s", address, coins, f.GDHome) executeWriteCheckErr(f.T, addFlags(cmd, flags)) } // GenTx is gaiad gentx func (f *Fixtures) GenTx(name string, flags ...string) { - cmd := fmt.Sprintf("gaiad gentx --name=%s --home=%s --home-client=%s", name, f.GDHome, f.GCLIHome) + cmd := fmt.Sprintf("../../../build/gaiad gentx --name=%s --home=%s --home-client=%s", name, f.GDHome, f.GCLIHome) executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } // CollectGenTxs is gaiad collect-gentxs func (f *Fixtures) CollectGenTxs(flags ...string) { - cmd := fmt.Sprintf("gaiad collect-gentxs --home=%s", f.GDHome) + cmd := fmt.Sprintf("../../../build/gaiad collect-gentxs --home=%s", f.GDHome) executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } // GDStart runs gaiad start with the appropriate flags and returns a process func (f *Fixtures) GDStart(flags ...string) *tests.Process { - cmd := fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --p2p.laddr=%v", f.GDHome, f.RPCAddr, f.P2PAddr) + cmd := fmt.Sprintf("../../../build/gaiad start --home=%s --rpc.laddr=%v --p2p.laddr=%v", f.GDHome, f.RPCAddr, f.P2PAddr) proc := tests.GoExecuteTWithStdout(f.T, addFlags(cmd, flags)) tests.WaitForTMStart(f.Port) tests.WaitForNextNBlocksTM(1, f.Port) @@ -216,7 +216,7 @@ func (f *Fixtures) GDStart(flags ...string) *tests.Process { // GDTendermint returns the results of gaiad tendermint [query] func (f *Fixtures) GDTendermint(query string) string { - cmd := fmt.Sprintf("gaiad tendermint %s --home=%s", query, f.GDHome) + cmd := fmt.Sprintf("../../../build/gaiad tendermint %s --home=%s", query, f.GDHome) success, stdout, stderr := executeWriteRetStdStreams(f.T, cmd) require.Empty(f.T, stderr) require.True(f.T, success) @@ -225,7 +225,7 @@ func (f *Fixtures) GDTendermint(query string) string { // ValidateGenesis runs gaiad validate-genesis func (f *Fixtures) ValidateGenesis() { - cmd := fmt.Sprintf("gaiad validate-genesis --home=%s", f.GDHome) + cmd := fmt.Sprintf("../../../build/gaiad validate-genesis --home=%s", f.GDHome) executeWriteCheckErr(f.T, cmd) } @@ -234,31 +234,31 @@ func (f *Fixtures) ValidateGenesis() { // KeysDelete is gaiacli keys delete func (f *Fixtures) KeysDelete(name string, flags ...string) { - cmd := fmt.Sprintf("gaiacli keys delete --home=%s %s", f.GCLIHome, name) + cmd := fmt.Sprintf("../../../build/gaiacli keys delete --home=%s %s", f.GCLIHome, name) executeWrite(f.T, addFlags(cmd, append(append(flags, "-y"), "-f"))) } // KeysAdd is gaiacli keys add func (f *Fixtures) KeysAdd(name string, flags ...string) { - cmd := fmt.Sprintf("gaiacli keys add --home=%s %s", f.GCLIHome, name) + cmd := fmt.Sprintf("../../../build/gaiacli keys add --home=%s %s", f.GCLIHome, name) executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } // KeysAddRecover prepares gaiacli keys add --recover func (f *Fixtures) KeysAddRecover(name, mnemonic string, flags ...string) { - cmd := fmt.Sprintf("gaiacli keys add --home=%s --recover %s", f.GCLIHome, name) + cmd := fmt.Sprintf("../../../build/gaiacli keys add --home=%s --recover %s", f.GCLIHome, name) executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass, mnemonic) } // KeysAddRecoverHDPath prepares gaiacli keys add --recover --account --index func (f *Fixtures) KeysAddRecoverHDPath(name, mnemonic string, account uint32, index uint32, flags ...string) { - cmd := fmt.Sprintf("gaiacli keys add --home=%s --recover %s --account %d --index %d", f.GCLIHome, name, account, index) + cmd := fmt.Sprintf("../../../build/gaiacli keys add --home=%s --recover %s --account %d --index %d", f.GCLIHome, name, account, index) executeWriteCheckErr(f.T, addFlags(cmd, flags), app.DefaultKeyPass, mnemonic) } // KeysShow is gaiacli keys show func (f *Fixtures) KeysShow(name string, flags ...string) keys.KeyOutput { - cmd := fmt.Sprintf("gaiacli keys show --home=%s %s", f.GCLIHome, name) + cmd := fmt.Sprintf("../../../build/gaiacli keys show --home=%s %s", f.GCLIHome, name) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var ko keys.KeyOutput err := clientkeys.UnmarshalJSON([]byte(out), &ko) @@ -279,7 +279,7 @@ func (f *Fixtures) KeyAddress(name string) sdk.AccAddress { // CLIConfig is gaiacli config func (f *Fixtures) CLIConfig(key, value string, flags ...string) { - cmd := fmt.Sprintf("gaiacli config --home=%s %s %s", f.GCLIHome, key, value) + cmd := fmt.Sprintf("../../../build/gaiacli config --home=%s %s %s", f.GCLIHome, key, value) executeWriteCheckErr(f.T, addFlags(cmd, flags)) } @@ -288,7 +288,7 @@ func (f *Fixtures) CLIConfig(key, value string, flags ...string) { // TxSend is gaiacli tx send func (f *Fixtures) TxSend(from string, to sdk.AccAddress, amount sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx send %s %s %v --from=%s", to, amount, f.Flags(), from) + cmd := fmt.Sprintf("../../../build/gaiacli tx send %s %s %v --from=%s", to, amount, f.Flags(), from) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } @@ -296,25 +296,25 @@ func (f *Fixtures) txSendWithConfirm( from string, to sdk.AccAddress, amount sdk.Coin, confirm string, flags ...string, ) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx send %s %s %v --from=%s", to, amount, f.Flags(), from) + cmd := fmt.Sprintf("../../../build/gaiacli tx send %s %s %v --from=%s", to, amount, f.Flags(), from) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), confirm, app.DefaultKeyPass) } // TxSign is gaiacli tx sign func (f *Fixtures) TxSign(signer, fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx sign %v --from=%s %v", f.Flags(), signer, fileName) + cmd := fmt.Sprintf("../../../build/gaiacli tx sign %v --from=%s %v", f.Flags(), signer, fileName) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } // TxBroadcast is gaiacli tx broadcast func (f *Fixtures) TxBroadcast(fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx broadcast %v %v", f.Flags(), fileName) + cmd := fmt.Sprintf("../../../build/gaiacli tx broadcast %v %v", f.Flags(), fileName) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } // TxEncode is gaiacli tx encode func (f *Fixtures) TxEncode(fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx encode %v %v", f.Flags(), fileName) + cmd := fmt.Sprintf("../../../build/gaiacli tx encode %v %v", f.Flags(), fileName) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } @@ -322,7 +322,7 @@ func (f *Fixtures) TxEncode(fileName string, flags ...string) (bool, string, str func (f *Fixtures) TxMultisign(fileName, name string, signaturesFiles []string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx multisign %v %s %s %s", f.Flags(), + cmd := fmt.Sprintf("../../../build/gaiacli tx multisign %v %s %s %s", f.Flags(), fileName, name, strings.Join(signaturesFiles, " "), ) return executeWriteRetStdStreams(f.T, cmd) @@ -333,7 +333,7 @@ func (f *Fixtures) TxMultisign(fileName, name string, signaturesFiles []string, // TxStakingCreateValidator is gaiacli tx staking create-validator func (f *Fixtures) TxStakingCreateValidator(from, consPubKey string, amount sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx staking create-validator %v --from=%s --pubkey=%s", f.Flags(), from, consPubKey) + cmd := fmt.Sprintf("../../../build/gaiacli tx staking create-validator %v --from=%s --pubkey=%s", f.Flags(), from, consPubKey) cmd += fmt.Sprintf(" --amount=%v --moniker=%v --commission-rate=%v", amount, from, "0.05") cmd += fmt.Sprintf(" --commission-max-rate=%v --commission-max-change-rate=%v", "0.20", "0.10") cmd += fmt.Sprintf(" --min-self-delegation=%v", "1") @@ -342,7 +342,7 @@ func (f *Fixtures) TxStakingCreateValidator(from, consPubKey string, amount sdk. // TxStakingUnbond is gaiacli tx staking unbond func (f *Fixtures) TxStakingUnbond(from, shares string, validator sdk.ValAddress, flags ...string) bool { - cmd := fmt.Sprintf("gaiacli tx staking unbond %s %v --from=%s %v", validator, shares, from, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli tx staking unbond %s %v --from=%s %v", validator, shares, from, f.Flags()) return executeWrite(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } @@ -351,20 +351,20 @@ func (f *Fixtures) TxStakingUnbond(from, shares string, validator sdk.ValAddress // TxGovSubmitProposal is gaiacli tx gov submit-proposal func (f *Fixtures) TxGovSubmitProposal(from, typ, title, description string, deposit sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx gov submit-proposal %v --from=%s --type=%s", f.Flags(), from, typ) + cmd := fmt.Sprintf("../../../build/gaiacli tx gov submit-proposal %v --from=%s --type=%s", f.Flags(), from, typ) cmd += fmt.Sprintf(" --title=%s --description=%s --deposit=%s", title, description, deposit) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } // TxGovDeposit is gaiacli tx gov deposit func (f *Fixtures) TxGovDeposit(proposalID int, from string, amount sdk.Coin, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx gov deposit %d %s --from=%s %v", proposalID, amount, from, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli tx gov deposit %d %s --from=%s %v", proposalID, amount, from, f.Flags()) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } // TxGovVote is gaiacli tx gov vote func (f *Fixtures) TxGovVote(proposalID int, option gov.VoteOption, from string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("gaiacli tx gov vote %d %s --from=%s %v", proposalID, option, from, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli tx gov vote %d %s --from=%s %v", proposalID, option, from, f.Flags()) return executeWriteRetStdStreams(f.T, addFlags(cmd, flags), app.DefaultKeyPass) } @@ -373,7 +373,7 @@ func (f *Fixtures) TxGovVote(proposalID int, option gov.VoteOption, from string, // QueryAccount is gaiacli query account func (f *Fixtures) QueryAccount(address sdk.AccAddress, flags ...string) auth.BaseAccount { - cmd := fmt.Sprintf("gaiacli query account %s %v", address, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query account %s %v", address, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var initRes map[string]json.RawMessage err := json.Unmarshal([]byte(out), &initRes) @@ -392,7 +392,7 @@ func (f *Fixtures) QueryAccount(address sdk.AccAddress, flags ...string) auth.Ba // QueryTxs is gaiacli query txs func (f *Fixtures) QueryTxs(page, limit int, tags ...string) []sdk.TxResponse { - cmd := fmt.Sprintf("gaiacli query txs --page=%d --limit=%d --tags='%s' %v", page, limit, queryTags(tags), f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query txs --page=%d --limit=%d --tags='%s' %v", page, limit, queryTags(tags), f.Flags()) out, _ := tests.ExecuteT(f.T, cmd, "") var txs []sdk.TxResponse cdc := app.MakeCodec() @@ -403,7 +403,7 @@ func (f *Fixtures) QueryTxs(page, limit int, tags ...string) []sdk.TxResponse { // QueryTxsInvalid query txs with wrong parameters and compare expected error func (f *Fixtures) QueryTxsInvalid(expectedErr error, page, limit int, tags ...string) { - cmd := fmt.Sprintf("gaiacli query txs --page=%d --limit=%d --tags='%s' %v", page, limit, queryTags(tags), f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query txs --page=%d --limit=%d --tags='%s' %v", page, limit, queryTags(tags), f.Flags()) _, err := tests.ExecuteT(f.T, cmd, "") require.EqualError(f.T, expectedErr, err) } @@ -413,7 +413,7 @@ func (f *Fixtures) QueryTxsInvalid(expectedErr error, page, limit int, tags ...s // QueryStakingValidator is gaiacli query staking validator func (f *Fixtures) QueryStakingValidator(valAddr sdk.ValAddress, flags ...string) staking.Validator { - cmd := fmt.Sprintf("gaiacli query staking validator %s %v", valAddr, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query staking validator %s %v", valAddr, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var validator staking.Validator cdc := app.MakeCodec() @@ -424,7 +424,7 @@ func (f *Fixtures) QueryStakingValidator(valAddr sdk.ValAddress, flags ...string // QueryStakingUnbondingDelegationsFrom is gaiacli query staking unbonding-delegations-from func (f *Fixtures) QueryStakingUnbondingDelegationsFrom(valAddr sdk.ValAddress, flags ...string) []staking.UnbondingDelegation { - cmd := fmt.Sprintf("gaiacli query staking unbonding-delegations-from %s %v", valAddr, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query staking unbonding-delegations-from %s %v", valAddr, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var ubds []staking.UnbondingDelegation cdc := app.MakeCodec() @@ -435,7 +435,7 @@ func (f *Fixtures) QueryStakingUnbondingDelegationsFrom(valAddr sdk.ValAddress, // QueryStakingDelegationsTo is gaiacli query staking delegations-to func (f *Fixtures) QueryStakingDelegationsTo(valAddr sdk.ValAddress, flags ...string) []staking.Delegation { - cmd := fmt.Sprintf("gaiacli query staking delegations-to %s %v", valAddr, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query staking delegations-to %s %v", valAddr, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var delegations []staking.Delegation cdc := app.MakeCodec() @@ -446,7 +446,7 @@ func (f *Fixtures) QueryStakingDelegationsTo(valAddr sdk.ValAddress, flags ...st // QueryStakingPool is gaiacli query staking pool func (f *Fixtures) QueryStakingPool(flags ...string) staking.Pool { - cmd := fmt.Sprintf("gaiacli query staking pool %v", f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query staking pool %v", f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var pool staking.Pool cdc := app.MakeCodec() @@ -457,7 +457,7 @@ func (f *Fixtures) QueryStakingPool(flags ...string) staking.Pool { // QueryStakingParameters is gaiacli query staking parameters func (f *Fixtures) QueryStakingParameters(flags ...string) staking.Params { - cmd := fmt.Sprintf("gaiacli query staking params %v", f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query staking params %v", f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var params staking.Params cdc := app.MakeCodec() @@ -471,7 +471,7 @@ func (f *Fixtures) QueryStakingParameters(flags ...string) staking.Params { // QueryGovParamDeposit is gaiacli query gov param deposit func (f *Fixtures) QueryGovParamDeposit() gov.DepositParams { - cmd := fmt.Sprintf("gaiacli query gov param deposit %s", f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov param deposit %s", f.Flags()) out, _ := tests.ExecuteT(f.T, cmd, "") var depositParam gov.DepositParams cdc := app.MakeCodec() @@ -482,7 +482,7 @@ func (f *Fixtures) QueryGovParamDeposit() gov.DepositParams { // QueryGovParamVoting is gaiacli query gov param voting func (f *Fixtures) QueryGovParamVoting() gov.VotingParams { - cmd := fmt.Sprintf("gaiacli query gov param voting %s", f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov param voting %s", f.Flags()) out, _ := tests.ExecuteT(f.T, cmd, "") var votingParam gov.VotingParams cdc := app.MakeCodec() @@ -493,7 +493,7 @@ func (f *Fixtures) QueryGovParamVoting() gov.VotingParams { // QueryGovParamTallying is gaiacli query gov param tallying func (f *Fixtures) QueryGovParamTallying() gov.TallyParams { - cmd := fmt.Sprintf("gaiacli query gov param tallying %s", f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov param tallying %s", f.Flags()) out, _ := tests.ExecuteT(f.T, cmd, "") var tallyingParam gov.TallyParams cdc := app.MakeCodec() @@ -504,7 +504,7 @@ func (f *Fixtures) QueryGovParamTallying() gov.TallyParams { // QueryGovProposals is gaiacli query gov proposals func (f *Fixtures) QueryGovProposals(flags ...string) gov.Proposals { - cmd := fmt.Sprintf("gaiacli query gov proposals %v", f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov proposals %v", f.Flags()) stdout, stderr := tests.ExecuteT(f.T, addFlags(cmd, flags), "") if strings.Contains(stderr, "No matching proposals found") { return gov.Proposals{} @@ -519,7 +519,7 @@ func (f *Fixtures) QueryGovProposals(flags ...string) gov.Proposals { // QueryGovProposal is gaiacli query gov proposal func (f *Fixtures) QueryGovProposal(proposalID int, flags ...string) gov.Proposal { - cmd := fmt.Sprintf("gaiacli query gov proposal %d %v", proposalID, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov proposal %d %v", proposalID, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var proposal gov.Proposal cdc := app.MakeCodec() @@ -530,7 +530,7 @@ func (f *Fixtures) QueryGovProposal(proposalID int, flags ...string) gov.Proposa // QueryGovVote is gaiacli query gov vote func (f *Fixtures) QueryGovVote(proposalID int, voter sdk.AccAddress, flags ...string) gov.Vote { - cmd := fmt.Sprintf("gaiacli query gov vote %d %s %v", proposalID, voter, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov vote %d %s %v", proposalID, voter, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var vote gov.Vote cdc := app.MakeCodec() @@ -541,7 +541,7 @@ func (f *Fixtures) QueryGovVote(proposalID int, voter sdk.AccAddress, flags ...s // QueryGovVotes is gaiacli query gov votes func (f *Fixtures) QueryGovVotes(proposalID int, flags ...string) []gov.Vote { - cmd := fmt.Sprintf("gaiacli query gov votes %d %v", proposalID, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov votes %d %v", proposalID, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var votes []gov.Vote cdc := app.MakeCodec() @@ -552,7 +552,7 @@ func (f *Fixtures) QueryGovVotes(proposalID int, flags ...string) []gov.Vote { // QueryGovDeposit is gaiacli query gov deposit func (f *Fixtures) QueryGovDeposit(proposalID int, depositor sdk.AccAddress, flags ...string) gov.Deposit { - cmd := fmt.Sprintf("gaiacli query gov deposit %d %s %v", proposalID, depositor, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov deposit %d %s %v", proposalID, depositor, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var deposit gov.Deposit cdc := app.MakeCodec() @@ -563,7 +563,7 @@ func (f *Fixtures) QueryGovDeposit(proposalID int, depositor sdk.AccAddress, fla // QueryGovDeposits is gaiacli query gov deposits func (f *Fixtures) QueryGovDeposits(propsalID int, flags ...string) []gov.Deposit { - cmd := fmt.Sprintf("gaiacli query gov deposits %d %v", propsalID, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query gov deposits %d %v", propsalID, f.Flags()) out, _ := tests.ExecuteT(f.T, addFlags(cmd, flags), "") var deposits []gov.Deposit cdc := app.MakeCodec() @@ -577,7 +577,7 @@ func (f *Fixtures) QueryGovDeposits(propsalID int, flags ...string) []gov.Deposi // QuerySigningInfo returns the signing info for a validator func (f *Fixtures) QuerySigningInfo(val string) slashing.ValidatorSigningInfo { - cmd := fmt.Sprintf("gaiacli query slashing signing-info %s %s", val, f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query slashing signing-info %s %s", val, f.Flags()) res, errStr := tests.ExecuteT(f.T, cmd, "") require.Empty(f.T, errStr) cdc := app.MakeCodec() @@ -589,7 +589,7 @@ func (f *Fixtures) QuerySigningInfo(val string) slashing.ValidatorSigningInfo { // QuerySlashingParams is gaiacli query slashing params func (f *Fixtures) QuerySlashingParams() slashing.Params { - cmd := fmt.Sprintf("gaiacli query slashing params %s", f.Flags()) + cmd := fmt.Sprintf("../../../build/gaiacli query slashing params %s", f.Flags()) res, errStr := tests.ExecuteT(f.T, cmd, "") require.Empty(f.T, errStr) cdc := app.MakeCodec() From fbd79d0cadea7677f44f43c67965fc7438cd9df0 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 8 Mar 2019 01:55:08 +0100 Subject: [PATCH 03/97] Merge PR #3818: Introduce sdk.NewCoins --- PENDING.md | 3 + cmd/gaia/app/genesis_test.go | 4 +- cmd/gaia/init/genesis_accts_test.go | 16 +-- types/coin.go | 38 +++++++ types/coin_test.go | 28 +++++ x/auth/ante_test.go | 30 +++--- x/auth/feekeeper.go | 7 +- x/auth/feekeeper_test.go | 6 +- x/auth/genesis.go | 2 +- x/auth/stdtx.go | 2 +- x/auth/test_utils.go | 2 +- x/bank/keeper.go | 4 +- x/bank/keeper_test.go | 146 +++++++++++++-------------- x/bank/msgs_test.go | 48 ++++----- x/bank/simulation/invariants.go | 2 +- x/distribution/keeper/test_common.go | 2 +- x/gov/keeper.go | 2 +- x/gov/keeper_test.go | 8 +- x/gov/msgs_test.go | 14 +-- x/mock/app.go | 4 +- 20 files changed, 219 insertions(+), 149 deletions(-) diff --git a/PENDING.md b/PENDING.md index 7b6461828..338afcbac 100644 --- a/PENDING.md +++ b/PENDING.md @@ -26,6 +26,9 @@ ### SDK +* [\3813](https://github.com/cosmos/cosmos-sdk/pull/3813) New sdk.NewCoins safe constructor to replace bare + sdk.Coins{} declarations. + ### Tendermint diff --git a/cmd/gaia/app/genesis_test.go b/cmd/gaia/app/genesis_test.go index 4d39b4e48..300f4afcd 100644 --- a/cmd/gaia/app/genesis_test.go +++ b/cmd/gaia/app/genesis_test.go @@ -41,7 +41,7 @@ func makeGenesisState(t *testing.T, genTxs []auth.StdTx) GenesisState { msg := msgs[0].(staking.MsgCreateValidator) acc := auth.NewBaseAccountWithAddress(sdk.AccAddress(msg.ValidatorAddress)) - acc.Coins = sdk.Coins{sdk.NewInt64Coin(defaultBondDenom, 150)} + acc.Coins = sdk.NewCoins(sdk.NewInt64Coin(defaultBondDenom, 150)) genAccs[i] = NewGenesisAccount(&acc) stakingData.Pool.NotBondedTokens = stakingData.Pool.NotBondedTokens.Add(sdk.NewInt(150)) // increase the supply } @@ -55,7 +55,7 @@ func TestToAccount(t *testing.T) { priv := ed25519.GenPrivKey() addr := sdk.AccAddress(priv.PubKey().Address()) authAcc := auth.NewBaseAccountWithAddress(addr) - authAcc.SetCoins(sdk.Coins{sdk.NewInt64Coin(defaultBondDenom, 150)}) + authAcc.SetCoins(sdk.NewCoins(sdk.NewInt64Coin(defaultBondDenom, 150))) genAcc := NewGenesisAccount(&authAcc) acc := genAcc.ToAccount() require.IsType(t, &auth.BaseAccount{}, acc) diff --git a/cmd/gaia/init/genesis_accts_test.go b/cmd/gaia/init/genesis_accts_test.go index 2c17acc54..74af5a42b 100644 --- a/cmd/gaia/init/genesis_accts_test.go +++ b/cmd/gaia/init/genesis_accts_test.go @@ -32,8 +32,8 @@ func TestAddGenesisAccount(t *testing.T) { args{ app.GenesisState{}, addr1, - sdk.Coins{}, - sdk.Coins{}, + sdk.NewCoins(), + sdk.NewCoins(), 0, 0, }, @@ -44,8 +44,8 @@ func TestAddGenesisAccount(t *testing.T) { args{ app.GenesisState{Accounts: []app.GenesisAccount{{Address: addr1}}}, addr1, - sdk.Coins{}, - sdk.Coins{}, + sdk.NewCoins(), + sdk.NewCoins(), 0, 0, }, @@ -56,8 +56,8 @@ func TestAddGenesisAccount(t *testing.T) { args{ app.GenesisState{}, addr1, - sdk.Coins{sdk.NewInt64Coin("stake", 50)}, - sdk.Coins{sdk.NewInt64Coin("stake", 100)}, + sdk.NewCoins(sdk.NewInt64Coin("stake", 50)), + sdk.NewCoins(sdk.NewInt64Coin("stake", 100)), 0, 0, }, @@ -68,8 +68,8 @@ func TestAddGenesisAccount(t *testing.T) { args{ app.GenesisState{}, addr1, - sdk.Coins{sdk.NewInt64Coin("stake", 50)}, - sdk.Coins{sdk.NewInt64Coin("stake", 50)}, + sdk.NewCoins(sdk.NewInt64Coin("stake", 50)), + sdk.NewCoins(sdk.NewInt64Coin("stake", 50)), 1654668078, 1554668078, }, diff --git a/types/coin.go b/types/coin.go index 365e0f2ef..95b30a890 100644 --- a/types/coin.go +++ b/types/coin.go @@ -130,6 +130,28 @@ func (coin Coin) IsNegative() bool { // Coins is a set of Coin, one per currency type Coins []Coin +// NewCoins constructs a new coin set. +func NewCoins(coins ...Coin) Coins { + // remove zeroes + newCoins := removeZeroCoins(Coins(coins)) + if len(newCoins) == 0 { + return Coins{} + } + + newCoins.Sort() + + // detect duplicate Denoms + if dupIndex := findDup(newCoins); dupIndex != -1 { + panic(fmt.Errorf("find duplicate denom: %s", newCoins[dupIndex])) + } + + if !newCoins.IsValid() { + panic(fmt.Errorf("invalid coin set: %s", newCoins)) + } + + return newCoins +} + func (coins Coins) String() string { if len(coins) == 0 { return "" @@ -552,3 +574,19 @@ func ParseCoins(coinsStr string) (coins Coins, err error) { return coins, nil } + +// findDup works on the assumption that coins is sorted +func findDup(coins Coins) int { + if len(coins) <= 1 { + return -1 + } + + prevDenom := coins[0] + for i := 1; i < len(coins); i++ { + if coins[i] == prevDenom { + return i + } + } + + return -1 +} diff --git a/types/coin_test.go b/types/coin_test.go index 50dd8bb52..643d94127 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -519,3 +519,31 @@ func TestCoinsIsAnyGTE(t *testing.T) { assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAnyGTE(Coins{{testDenom1, one}, {testDenom2, two}})) assert.True(t, Coins{{"xxx", one}, {"yyy", one}}.IsAnyGTE(Coins{{testDenom2, one}, {"ccc", one}, {"yyy", one}, {"zzz", one}})) } + +func TestNewCoins(t *testing.T) { + tenatom := NewInt64Coin("atom", 10) + tenbtc := NewInt64Coin("btc", 10) + zeroeth := NewInt64Coin("eth", 0) + tests := []struct { + name string + coins Coins + want Coins + wantPanic bool + }{ + {"empty args", []Coin{}, Coins{}, false}, + {"one coin", []Coin{tenatom}, Coins{tenatom}, false}, + {"sort after create", []Coin{tenbtc, tenatom}, Coins{tenatom, tenbtc}, false}, + {"sort and remove zeroes", []Coin{zeroeth, tenbtc, tenatom}, Coins{tenatom, tenbtc}, false}, + {"panic on dups", []Coin{tenatom, tenatom}, Coins{}, true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.wantPanic { + require.Panics(t, func() { NewCoins(tt.coins...) }) + return + } + got := NewCoins(tt.coins...) + require.True(t, got.IsEqual(tt.want)) + }) + } +} diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 8d1db6f1a..beff481e9 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -300,18 +300,18 @@ func TestAnteHandlerFees(t *testing.T) { tx = newTestTx(ctx, msgs, privs, accnums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeInsufficientFunds) - acc1.SetCoins(sdk.Coins{sdk.NewInt64Coin("atom", 149)}) + acc1.SetCoins(sdk.NewCoins(sdk.NewInt64Coin("atom", 149))) input.ak.SetAccount(ctx, acc1) checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeInsufficientFunds) require.True(t, input.fck.GetCollectedFees(ctx).IsEqual(emptyCoins)) require.True(t, input.ak.GetAccount(ctx, addr1).GetCoins().AmountOf("atom").Equal(sdk.NewInt(149))) - acc1.SetCoins(sdk.Coins{sdk.NewInt64Coin("atom", 150)}) + acc1.SetCoins(sdk.NewCoins(sdk.NewInt64Coin("atom", 150))) input.ak.SetAccount(ctx, acc1) checkValidTx(t, anteHandler, ctx, tx, false) - require.True(t, input.fck.GetCollectedFees(ctx).IsEqual(sdk.Coins{sdk.NewInt64Coin("atom", 150)})) + require.True(t, input.fck.GetCollectedFees(ctx).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("atom", 150)))) require.True(t, input.ak.GetAccount(ctx, addr1).GetCoins().AmountOf("atom").Equal(sdk.NewInt(0))) } @@ -333,24 +333,24 @@ func TestAnteHandlerMemoGas(t *testing.T) { var tx sdk.Tx msg := newTestMsg(addr1) privs, accnums, seqs := []crypto.PrivKey{priv1}, []uint64{0}, []uint64{0} - fee := NewStdFee(0, sdk.Coins{sdk.NewInt64Coin("atom", 0)}) + fee := NewStdFee(0, sdk.NewCoins(sdk.NewInt64Coin("atom", 0))) // tx does not have enough gas tx = newTestTx(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee) checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeOutOfGas) // tx with memo doesn't have enough gas - fee = NewStdFee(801, sdk.Coins{sdk.NewInt64Coin("atom", 0)}) + fee = NewStdFee(801, sdk.NewCoins(sdk.NewInt64Coin("atom", 0))) tx = newTestTxWithMemo(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee, "abcininasidniandsinasindiansdiansdinaisndiasndiadninsd") checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeOutOfGas) // memo too large - fee = NewStdFee(9000, sdk.Coins{sdk.NewInt64Coin("atom", 0)}) + fee = NewStdFee(9000, sdk.NewCoins(sdk.NewInt64Coin("atom", 0))) tx = newTestTxWithMemo(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee, strings.Repeat("01234567890", 500)) checkInvalidTx(t, anteHandler, ctx, tx, false, sdk.CodeMemoTooLarge) // tx with memo has enough gas - fee = NewStdFee(9000, sdk.Coins{sdk.NewInt64Coin("atom", 0)}) + fee = NewStdFee(9000, sdk.NewCoins(sdk.NewInt64Coin("atom", 0))) tx = newTestTxWithMemo(ctx, []sdk.Msg{msg}, privs, accnums, seqs, fee, strings.Repeat("0123456789", 10)) checkValidTx(t, anteHandler, ctx, tx, false) } @@ -721,28 +721,28 @@ func TestEnsureSufficientMempoolFees(t *testing.T) { input StdFee expectedOK bool }{ - {NewStdFee(200000, sdk.Coins{sdk.NewInt64Coin("photino", 5)}), false}, - {NewStdFee(200000, sdk.Coins{sdk.NewInt64Coin("stake", 1)}), false}, - {NewStdFee(200000, sdk.Coins{sdk.NewInt64Coin("stake", 2)}), true}, - {NewStdFee(200000, sdk.Coins{sdk.NewInt64Coin("photino", 10)}), true}, + {NewStdFee(200000, sdk.NewCoins(sdk.NewInt64Coin("photino", 5))), false}, + {NewStdFee(200000, sdk.NewCoins(sdk.NewInt64Coin("stake", 1))), false}, + {NewStdFee(200000, sdk.NewCoins(sdk.NewInt64Coin("stake", 2))), true}, + {NewStdFee(200000, sdk.NewCoins(sdk.NewInt64Coin("photino", 10))), true}, { NewStdFee( 200000, - sdk.Coins{ + sdk.NewCoins( sdk.NewInt64Coin("photino", 10), sdk.NewInt64Coin("stake", 2), - }, + ), ), true, }, { NewStdFee( 200000, - sdk.Coins{ + sdk.NewCoins( sdk.NewInt64Coin("atom", 5), sdk.NewInt64Coin("photino", 10), sdk.NewInt64Coin("stake", 2), - }, + ), ), true, }, diff --git a/x/auth/feekeeper.go b/x/auth/feekeeper.go index aa8cf9212..bc6506b17 100644 --- a/x/auth/feekeeper.go +++ b/x/auth/feekeeper.go @@ -33,10 +33,11 @@ func (fck FeeCollectionKeeper) GetCollectedFees(ctx sdk.Context) sdk.Coins { store := ctx.KVStore(fck.key) bz := store.Get(collectedFeesKey) if bz == nil { - return sdk.Coins{} + return sdk.NewCoins() } - feePool := &(sdk.Coins{}) + emptyFees := sdk.NewCoins() + feePool := &emptyFees fck.cdc.MustUnmarshalBinaryLengthPrefixed(bz, feePool) return *feePool } @@ -57,5 +58,5 @@ func (fck FeeCollectionKeeper) AddCollectedFees(ctx sdk.Context, coins sdk.Coins // ClearCollectedFees - clear the fee pool func (fck FeeCollectionKeeper) ClearCollectedFees(ctx sdk.Context) { - fck.setCollectedFees(ctx, sdk.Coins{}) + fck.setCollectedFees(ctx, sdk.NewCoins()) } diff --git a/x/auth/feekeeper_test.go b/x/auth/feekeeper_test.go index a624fb38c..ab49305f1 100644 --- a/x/auth/feekeeper_test.go +++ b/x/auth/feekeeper_test.go @@ -9,9 +9,9 @@ import ( ) var ( - emptyCoins = sdk.Coins{} - oneCoin = sdk.Coins{sdk.NewInt64Coin("foocoin", 1)} - twoCoins = sdk.Coins{sdk.NewInt64Coin("foocoin", 2)} + emptyCoins = sdk.NewCoins() + oneCoin = sdk.NewCoins(sdk.NewInt64Coin("foocoin", 1)) + twoCoins = sdk.NewCoins(sdk.NewInt64Coin("foocoin", 2)) ) func TestFeeCollectionKeeperGetSet(t *testing.T) { diff --git a/x/auth/genesis.go b/x/auth/genesis.go index da2beb0d7..7f94415df 100644 --- a/x/auth/genesis.go +++ b/x/auth/genesis.go @@ -22,7 +22,7 @@ func NewGenesisState(collectedFees sdk.Coins, params Params) GenesisState { // DefaultGenesisState - Return a default genesis state func DefaultGenesisState() GenesisState { - return NewGenesisState(sdk.Coins{}, DefaultParams()) + return NewGenesisState(sdk.NewCoins(), DefaultParams()) } // InitGenesis - Init store state from genesis data diff --git a/x/auth/stdtx.go b/x/auth/stdtx.go index 4ca318635..542a962e4 100644 --- a/x/auth/stdtx.go +++ b/x/auth/stdtx.go @@ -141,7 +141,7 @@ func (fee StdFee) Bytes() []byte { // (in the lcd_test, client side its null, // server side its []) if len(fee.Amount) == 0 { - fee.Amount = sdk.Coins{} + fee.Amount = sdk.NewCoins() } bz, err := msgCdc.MarshalJSON(fee) // TODO if err != nil { diff --git a/x/auth/test_utils.go b/x/auth/test_utils.go index 800622b42..d6533d168 100644 --- a/x/auth/test_utils.go +++ b/x/auth/test_utils.go @@ -55,7 +55,7 @@ func newTestMsg(addrs ...sdk.AccAddress) *sdk.TestMsg { func newStdFee() StdFee { return NewStdFee(50000, - sdk.Coins{sdk.NewInt64Coin("atom", 150)}, + sdk.NewCoins(sdk.NewInt64Coin("atom", 150)), ) } diff --git a/x/bank/keeper.go b/x/bank/keeper.go index 81db06387..c5322ec5c 100644 --- a/x/bank/keeper.go +++ b/x/bank/keeper.go @@ -211,7 +211,7 @@ func (keeper BaseViewKeeper) Codespace() sdk.CodespaceType { func getCoins(ctx sdk.Context, am auth.AccountKeeper, addr sdk.AccAddress) sdk.Coins { acc := am.GetAccount(ctx, addr) if acc == nil { - return sdk.Coins{} + return sdk.NewCoins() } return acc.GetCoins() } @@ -255,7 +255,7 @@ func subtractCoins(ctx sdk.Context, ak auth.AccountKeeper, addr sdk.AccAddress, return nil, nil, sdk.ErrInvalidCoins(amt.String()) } - oldCoins, spendableCoins := sdk.Coins{}, sdk.Coins{} + oldCoins, spendableCoins := sdk.NewCoins(), sdk.NewCoins() acc := getAccount(ctx, ak, addr) if acc != nil { diff --git a/x/bank/keeper_test.go b/x/bank/keeper_test.go index cb277882e..4076b7882 100644 --- a/x/bank/keeper_test.go +++ b/x/bank/keeper_test.go @@ -66,71 +66,71 @@ func TestKeeper(t *testing.T) { // Test GetCoins/SetCoins input.ak.SetAccount(ctx, acc) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins())) - bankKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) + bankKeeper.SetCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) // Test HasCoins - require.True(t, bankKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) - require.True(t, bankKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 5)})) - require.False(t, bankKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 15)})) - require.False(t, bankKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 5)})) + require.True(t, bankKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) + require.True(t, bankKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) + require.False(t, bankKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 15)))) + require.False(t, bankKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 5)))) // Test AddCoins - bankKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 15)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 25)})) + bankKeeper.AddCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 15))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 25)))) - bankKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 15)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 15), sdk.NewInt64Coin("foocoin", 25)})) + bankKeeper.AddCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 15))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 15), sdk.NewInt64Coin("foocoin", 25)))) // Test SubtractCoins - bankKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}) - bankKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 5)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 15)})) + bankKeeper.SubtractCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10))) + bankKeeper.SubtractCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 5))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 15)))) - bankKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 11)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 15)})) + bankKeeper.SubtractCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 11))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 15)))) - bankKeeper.SubtractCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 10)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 15)})) - require.False(t, bankKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 1)})) + bankKeeper.SubtractCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 15)))) + require.False(t, bankKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 1)))) // Test SendCoins - bankKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewInt64Coin("foocoin", 5)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) - require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 5)})) + bankKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) + require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) - _, err2 := bankKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewInt64Coin("foocoin", 50)}) + _, err2 := bankKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50))) require.Implements(t, (*sdk.Error)(nil), err2) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) - require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 5)})) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) + require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) - bankKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 30)}) - bankKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 5)}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 20), sdk.NewInt64Coin("foocoin", 5)})) - require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 10)})) + bankKeeper.AddCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 30))) + bankKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 5))) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 20), sdk.NewInt64Coin("foocoin", 5)))) + require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 10)))) // Test InputOutputCoins - input1 := NewInput(addr2, sdk.Coins{sdk.NewInt64Coin("foocoin", 2)}) - output1 := NewOutput(addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 2)}) + input1 := NewInput(addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 2))) + output1 := NewOutput(addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 2))) bankKeeper.InputOutputCoins(ctx, []Input{input1}, []Output{output1}) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 20), sdk.NewInt64Coin("foocoin", 7)})) - require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 8)})) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 20), sdk.NewInt64Coin("foocoin", 7)))) + require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 8)))) inputs := []Input{ - NewInput(addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 3)}), - NewInput(addr2, sdk.Coins{sdk.NewInt64Coin("barcoin", 3), sdk.NewInt64Coin("foocoin", 2)}), + NewInput(addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 3))), + NewInput(addr2, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 3), sdk.NewInt64Coin("foocoin", 2))), } outputs := []Output{ - NewOutput(addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 1)}), - NewOutput(addr3, sdk.Coins{sdk.NewInt64Coin("barcoin", 2), sdk.NewInt64Coin("foocoin", 5)}), + NewOutput(addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 1))), + NewOutput(addr3, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 2), sdk.NewInt64Coin("foocoin", 5))), } bankKeeper.InputOutputCoins(ctx, inputs, outputs) - require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 21), sdk.NewInt64Coin("foocoin", 4)})) - require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 7), sdk.NewInt64Coin("foocoin", 6)})) - require.True(t, bankKeeper.GetCoins(ctx, addr3).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 2), sdk.NewInt64Coin("foocoin", 5)})) + require.True(t, bankKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 21), sdk.NewInt64Coin("foocoin", 4)))) + require.True(t, bankKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 7), sdk.NewInt64Coin("foocoin", 6)))) + require.True(t, bankKeeper.GetCoins(ctx, addr3).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 2), sdk.NewInt64Coin("foocoin", 5)))) } func TestSendKeeper(t *testing.T) { @@ -147,33 +147,33 @@ func TestSendKeeper(t *testing.T) { // Test GetCoins/SetCoins input.ak.SetAccount(ctx, acc) - require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) + require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins())) - bankKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}) - require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) + bankKeeper.SetCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10))) + require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) // Test HasCoins - require.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) - require.True(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 5)})) - require.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 15)})) - require.False(t, sendKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 5)})) + require.True(t, sendKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) + require.True(t, sendKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) + require.False(t, sendKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 15)))) + require.False(t, sendKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 5)))) - bankKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 15)}) + bankKeeper.SetCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 15))) // Test SendCoins - sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewInt64Coin("foocoin", 5)}) - require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) - require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 5)})) + sendKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5))) + require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) + require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) - _, err := sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewInt64Coin("foocoin", 50)}) + _, err := sendKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 50))) require.Implements(t, (*sdk.Error)(nil), err) - require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) - require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 5)})) + require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) + require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) - bankKeeper.AddCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 30)}) - sendKeeper.SendCoins(ctx, addr, addr2, sdk.Coins{sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 5)}) - require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 20), sdk.NewInt64Coin("foocoin", 5)})) - require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.Coins{sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 10)})) + bankKeeper.AddCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 30))) + sendKeeper.SendCoins(ctx, addr, addr2, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 5))) + require.True(t, sendKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 20), sdk.NewInt64Coin("foocoin", 5)))) + require.True(t, sendKeeper.GetCoins(ctx, addr2).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("barcoin", 10), sdk.NewInt64Coin("foocoin", 10)))) // validate coins with invalid denoms or negative values cannot be sent // NOTE: We must use the Coin literal as the constructor does not allow @@ -195,16 +195,16 @@ func TestViewKeeper(t *testing.T) { // Test GetCoins/SetCoins input.ak.SetAccount(ctx, acc) - require.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{})) + require.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins())) - bankKeeper.SetCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}) - require.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) + bankKeeper.SetCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10))) + require.True(t, viewKeeper.GetCoins(ctx, addr).IsEqual(sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) // Test HasCoins - require.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 10)})) - require.True(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 5)})) - require.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("foocoin", 15)})) - require.False(t, viewKeeper.HasCoins(ctx, addr, sdk.Coins{sdk.NewInt64Coin("barcoin", 5)})) + require.True(t, viewKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 10)))) + require.True(t, viewKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 5)))) + require.False(t, viewKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("foocoin", 15)))) + require.False(t, viewKeeper.HasCoins(ctx, addr, sdk.NewCoins(sdk.NewInt64Coin("barcoin", 5)))) } func TestVestingAccountSend(t *testing.T) { @@ -213,8 +213,8 @@ func TestVestingAccountSend(t *testing.T) { ctx := input.ctx.WithBlockHeader(abci.Header{Time: now}) endTime := now.Add(24 * time.Hour) - origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} - sendCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} + origCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100)) + sendCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 50)) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace) bankKeeper.SetSendEnabled(ctx, true) @@ -247,8 +247,8 @@ func TestVestingAccountReceive(t *testing.T) { ctx := input.ctx.WithBlockHeader(abci.Header{Time: now}) endTime := now.Add(24 * time.Hour) - origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} - sendCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} + origCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100)) + sendCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 50)) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace) bankKeeper.SetSendEnabled(ctx, true) @@ -281,8 +281,8 @@ func TestDelegateCoins(t *testing.T) { ctx := input.ctx.WithBlockHeader(abci.Header{Time: now}) endTime := now.Add(24 * time.Hour) - origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} - delCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} + origCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100)) + delCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 50)) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace) bankKeeper.SetSendEnabled(ctx, true) @@ -318,8 +318,8 @@ func TestUndelegateCoins(t *testing.T) { ctx := input.ctx.WithBlockHeader(abci.Header{Time: now}) endTime := now.Add(24 * time.Hour) - origCoins := sdk.Coins{sdk.NewInt64Coin("steak", 100)} - delCoins := sdk.Coins{sdk.NewInt64Coin("steak", 50)} + origCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100)) + delCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 50)) bankKeeper := NewBaseKeeper(input.ak, input.pk.Subspace(DefaultParamspace), DefaultCodespace) bankKeeper.SetSendEnabled(ctx, true) diff --git a/x/bank/msgs_test.go b/x/bank/msgs_test.go index baec34bcf..521e81761 100644 --- a/x/bank/msgs_test.go +++ b/x/bank/msgs_test.go @@ -12,7 +12,7 @@ import ( func TestMsgSendRoute(t *testing.T) { addr1 := sdk.AccAddress([]byte("from")) addr2 := sdk.AccAddress([]byte("to")) - coins := sdk.Coins{sdk.NewInt64Coin("atom", 10)} + coins := sdk.NewCoins(sdk.NewInt64Coin("atom", 10)) var msg = NewMsgSend(addr1, addr2, coins) require.Equal(t, msg.Route(), "bank") @@ -22,9 +22,9 @@ func TestMsgSendRoute(t *testing.T) { func TestMsgSendValidation(t *testing.T) { addr1 := sdk.AccAddress([]byte("from")) addr2 := sdk.AccAddress([]byte("to")) - atom123 := sdk.Coins{sdk.NewInt64Coin("atom", 123)} - atom0 := sdk.Coins{sdk.NewInt64Coin("atom", 0)} - atom123eth123 := sdk.Coins{sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 123)} + atom123 := sdk.NewCoins(sdk.NewInt64Coin("atom", 123)) + atom0 := sdk.NewCoins(sdk.NewInt64Coin("atom", 0)) + atom123eth123 := sdk.NewCoins(sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 123)) atom123eth0 := sdk.Coins{sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 0)} var emptyAddr sdk.AccAddress @@ -41,12 +41,12 @@ func TestMsgSendValidation(t *testing.T) { {false, NewMsgSend(addr1, emptyAddr, atom123)}, // empty to addr } - for i, tc := range cases { + for _, tc := range cases { err := tc.tx.ValidateBasic() if tc.valid { - require.Nil(t, err, "%d: %+v", i, err) + require.Nil(t, err) } else { - require.NotNil(t, err, "%d", i) + require.NotNil(t, err) } } } @@ -54,7 +54,7 @@ func TestMsgSendValidation(t *testing.T) { func TestMsgSendGetSignBytes(t *testing.T) { addr1 := sdk.AccAddress([]byte("input")) addr2 := sdk.AccAddress([]byte("output")) - coins := sdk.Coins{sdk.NewInt64Coin("atom", 10)} + coins := sdk.NewCoins(sdk.NewInt64Coin("atom", 10)) var msg = NewMsgSend(addr1, addr2, coins) res := msg.GetSignBytes() @@ -63,7 +63,7 @@ func TestMsgSendGetSignBytes(t *testing.T) { } func TestMsgSendGetSigners(t *testing.T) { - var msg = NewMsgSend(sdk.AccAddress([]byte("input1")), sdk.AccAddress{}, sdk.Coins{}) + var msg = NewMsgSend(sdk.AccAddress([]byte("input1")), sdk.AccAddress{}, sdk.NewCoins()) res := msg.GetSigners() // TODO: fix this ! require.Equal(t, fmt.Sprintf("%v", res), "[696E70757431]") @@ -73,7 +73,7 @@ func TestMsgMultiSendRoute(t *testing.T) { // Construct a MsgSend addr1 := sdk.AccAddress([]byte("input")) addr2 := sdk.AccAddress([]byte("output")) - coins := sdk.Coins{sdk.NewInt64Coin("atom", 10)} + coins := sdk.NewCoins(sdk.NewInt64Coin("atom", 10)) var msg = MsgMultiSend{ Inputs: []Input{NewInput(addr1, coins)}, Outputs: []Output{NewOutput(addr2, coins)}, @@ -87,12 +87,12 @@ func TestMsgMultiSendRoute(t *testing.T) { func TestInputValidation(t *testing.T) { addr1 := sdk.AccAddress([]byte{1, 2}) addr2 := sdk.AccAddress([]byte{7, 8}) - someCoins := sdk.Coins{sdk.NewInt64Coin("atom", 123)} - multiCoins := sdk.Coins{sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 20)} + someCoins := sdk.NewCoins(sdk.NewInt64Coin("atom", 123)) + multiCoins := sdk.NewCoins(sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 20)) var emptyAddr sdk.AccAddress - emptyCoins := sdk.Coins{} - emptyCoins2 := sdk.Coins{sdk.NewInt64Coin("eth", 0)} + emptyCoins := sdk.NewCoins() + emptyCoins2 := sdk.NewCoins(sdk.NewInt64Coin("eth", 0)) someEmptyCoins := sdk.Coins{sdk.NewInt64Coin("eth", 10), sdk.NewInt64Coin("atom", 0)} unsortedCoins := sdk.Coins{sdk.NewInt64Coin("eth", 1), sdk.NewInt64Coin("atom", 1)} @@ -125,12 +125,12 @@ func TestInputValidation(t *testing.T) { func TestOutputValidation(t *testing.T) { addr1 := sdk.AccAddress([]byte{1, 2}) addr2 := sdk.AccAddress([]byte{7, 8}) - someCoins := sdk.Coins{sdk.NewInt64Coin("atom", 123)} - multiCoins := sdk.Coins{sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 20)} + someCoins := sdk.NewCoins(sdk.NewInt64Coin("atom", 123)) + multiCoins := sdk.NewCoins(sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 20)) var emptyAddr sdk.AccAddress - emptyCoins := sdk.Coins{} - emptyCoins2 := sdk.Coins{sdk.NewInt64Coin("eth", 0)} + emptyCoins := sdk.NewCoins() + emptyCoins2 := sdk.NewCoins(sdk.NewInt64Coin("eth", 0)) someEmptyCoins := sdk.Coins{sdk.NewInt64Coin("eth", 10), sdk.NewInt64Coin("atom", 0)} unsortedCoins := sdk.Coins{sdk.NewInt64Coin("eth", 1), sdk.NewInt64Coin("atom", 1)} @@ -163,10 +163,10 @@ func TestOutputValidation(t *testing.T) { func TestMsgMultiSendValidation(t *testing.T) { addr1 := sdk.AccAddress([]byte{1, 2}) addr2 := sdk.AccAddress([]byte{7, 8}) - atom123 := sdk.Coins{sdk.NewInt64Coin("atom", 123)} - atom124 := sdk.Coins{sdk.NewInt64Coin("atom", 124)} - eth123 := sdk.Coins{sdk.NewInt64Coin("eth", 123)} - atom123eth123 := sdk.Coins{sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 123)} + atom123 := sdk.NewCoins(sdk.NewInt64Coin("atom", 123)) + atom124 := sdk.NewCoins(sdk.NewInt64Coin("atom", 124)) + eth123 := sdk.NewCoins(sdk.NewInt64Coin("eth", 123)) + atom123eth123 := sdk.NewCoins(sdk.NewInt64Coin("atom", 123), sdk.NewInt64Coin("eth", 123)) input1 := NewInput(addr1, atom123) input2 := NewInput(addr1, eth123) @@ -217,7 +217,7 @@ func TestMsgMultiSendValidation(t *testing.T) { func TestMsgMultiSendGetSignBytes(t *testing.T) { addr1 := sdk.AccAddress([]byte("input")) addr2 := sdk.AccAddress([]byte("output")) - coins := sdk.Coins{sdk.NewInt64Coin("atom", 10)} + coins := sdk.NewCoins(sdk.NewInt64Coin("atom", 10)) var msg = MsgMultiSend{ Inputs: []Input{NewInput(addr1, coins)}, Outputs: []Output{NewOutput(addr2, coins)}, @@ -250,7 +250,7 @@ func TestMsgSendSigners(t *testing.T) { {7, 8, 9}, } - someCoins := sdk.Coins{sdk.NewInt64Coin("atom", 123)} + someCoins := sdk.NewCoins(sdk.NewInt64Coin("atom", 123)) inputs := make([]Input, len(signers)) for i, signer := range signers { inputs[i] = NewInput(signer, someCoins) diff --git a/x/bank/simulation/invariants.go b/x/bank/simulation/invariants.go index 7448b4687..f6ee642e3 100644 --- a/x/bank/simulation/invariants.go +++ b/x/bank/simulation/invariants.go @@ -28,7 +28,7 @@ func NonnegativeBalanceInvariant(ak auth.AccountKeeper) sdk.Invariant { // is what is expected func TotalCoinsInvariant(ak auth.AccountKeeper, totalSupplyFn func() sdk.Coins) sdk.Invariant { return func(ctx sdk.Context) error { - totalCoins := sdk.Coins{} + totalCoins := sdk.NewCoins() chkAccount := func(acc auth.Account) bool { coins := acc.GetCoins() diff --git a/x/distribution/keeper/test_common.go b/x/distribution/keeper/test_common.go index a17b4b5fe..094f16316 100644 --- a/x/distribution/keeper/test_common.go +++ b/x/distribution/keeper/test_common.go @@ -158,5 +158,5 @@ func (fck DummyFeeCollectionKeeper) SetCollectedFees(in sdk.Coins) { heldFees = in } func (fck DummyFeeCollectionKeeper) ClearCollectedFees(_ sdk.Context) { - heldFees = sdk.Coins{} + heldFees = sdk.NewCoins() } diff --git a/x/gov/keeper.go b/x/gov/keeper.go index 2ea507977..5eadfaaac 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -109,7 +109,7 @@ func (keeper Keeper) NewTextProposal(ctx sdk.Context, title string, description ProposalType: proposalType, Status: StatusDepositPeriod, FinalTallyResult: EmptyTallyResult(), - TotalDeposit: sdk.Coins{}, + TotalDeposit: sdk.NewCoins(), SubmitTime: ctx.BlockHeader().Time, } diff --git a/x/gov/keeper_test.go b/x/gov/keeper_test.go index 44861877d..6fdf6d4e7 100644 --- a/x/gov/keeper_test.go +++ b/x/gov/keeper_test.go @@ -69,15 +69,15 @@ func TestDeposits(t *testing.T) { proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText) proposalID := proposal.GetProposalID() - fourSteak := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromTendermintPower(4))} - fiveSteak := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromTendermintPower(5))} + fourSteak := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromTendermintPower(4))) + fiveSteak := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromTendermintPower(5))) addr0Initial := keeper.ck.GetCoins(ctx, addrs[0]) addr1Initial := keeper.ck.GetCoins(ctx, addrs[1]) expTokens := sdk.TokensFromTendermintPower(42) - require.Equal(t, sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, expTokens)}, addr0Initial) - require.True(t, proposal.GetTotalDeposit().IsEqual(sdk.Coins{})) + require.Equal(t, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, expTokens)), addr0Initial) + require.True(t, proposal.GetTotalDeposit().IsEqual(sdk.NewCoins())) // Check no deposits at beginning deposit, found := keeper.GetDeposit(ctx, proposalID, addrs[1]) diff --git a/x/gov/msgs_test.go b/x/gov/msgs_test.go index 41e9cc65f..db5c4da0b 100644 --- a/x/gov/msgs_test.go +++ b/x/gov/msgs_test.go @@ -11,10 +11,10 @@ import ( ) var ( - coinsPos = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000)} - coinsZero = sdk.Coins{} - coinsPosNotAtoms = sdk.Coins{sdk.NewInt64Coin("foo", 10000)} - coinsMulti = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000), sdk.NewInt64Coin("foo", 10000)} + coinsPos = sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000)) + coinsZero = sdk.NewCoins() + coinsPosNotAtoms = sdk.NewCoins(sdk.NewInt64Coin("foo", 10000)) + coinsMulti = sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000), sdk.NewInt64Coin("foo", 10000)) ) func init() { @@ -23,7 +23,7 @@ func init() { // test ValidateBasic for MsgCreateValidator func TestMsgSubmitProposal(t *testing.T) { - _, addrs, _, _ := mock.CreateGenAccounts(1, sdk.Coins{}) + _, addrs, _, _ := mock.CreateGenAccounts(1, sdk.NewCoins()) tests := []struct { title, description string proposalType ProposalKind @@ -65,7 +65,7 @@ func TestMsgDepositGetSignBytes(t *testing.T) { // test ValidateBasic for MsgDeposit func TestMsgDeposit(t *testing.T) { - _, addrs, _, _ := mock.CreateGenAccounts(1, sdk.Coins{}) + _, addrs, _, _ := mock.CreateGenAccounts(1, sdk.NewCoins()) tests := []struct { proposalID uint64 depositorAddr sdk.AccAddress @@ -90,7 +90,7 @@ func TestMsgDeposit(t *testing.T) { // test ValidateBasic for MsgDeposit func TestMsgVote(t *testing.T) { - _, addrs, _, _ := mock.CreateGenAccounts(1, sdk.Coins{}) + _, addrs, _, _ := mock.CreateGenAccounts(1, sdk.NewCoins()) tests := []struct { proposalID uint64 voterAddr sdk.AccAddress diff --git a/x/mock/app.go b/x/mock/app.go index 3e24bee0d..d576dde8e 100644 --- a/x/mock/app.go +++ b/x/mock/app.go @@ -62,7 +62,7 @@ func NewApp() *App { KeyFeeCollection: sdk.NewKVStoreKey("fee"), KeyParams: sdk.NewKVStoreKey("params"), TKeyParams: sdk.NewTransientStoreKey("transient_params"), - TotalCoinsSupply: sdk.Coins{}, + TotalCoinsSupply: sdk.NewCoins(), } app.ParamsKeeper = params.NewKeeper(app.Cdc, app.KeyParams, app.TKeyParams) @@ -213,7 +213,7 @@ func SetGenesis(app *App, accs []auth.Account) { func GenTx(msgs []sdk.Msg, accnums []uint64, seq []uint64, priv ...crypto.PrivKey) auth.StdTx { // Make the transaction free fee := auth.StdFee{ - Amount: sdk.Coins{sdk.NewInt64Coin("foocoin", 0)}, + Amount: sdk.NewCoins(sdk.NewInt64Coin("foocoin", 0)), Gas: 100000, } From 71ca0e55357b2a82895dd730f8687d25fb5bc2f0 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 8 Mar 2019 00:23:12 +0000 Subject: [PATCH 04/97] Port IsAllGT from safe-coins PR --- types/coin.go | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/types/coin.go b/types/coin.go index 95b30a890..cf6e4d122 100644 --- a/types/coin.go +++ b/types/coin.go @@ -269,6 +269,23 @@ func (coins Coins) safeAdd(coinsB Coins) Coins { } } +// ContainsDenomsOf returns true if coinsB' denom set +// is subset of the receiver's denoms. +func (coins Coins) ContainsDenomsOf(coinsB Coins) bool { + // more denoms in B than in receiver + if len(coinsB) > len(coins) { + return false + } + + for _, coinB := range coinsB { + if coins.AmountOf(coinB.Denom).IsZero() { + return false + } + } + + return true +} + // Sub subtracts a set of coins from another. // // e.g. @@ -297,12 +314,26 @@ func (coins Coins) SafeSub(coinsB Coins) (Coins, bool) { // IsAllGT returns true if for every denom in coins, the denom is present at a // greater amount in coinsB. func (coins Coins) IsAllGT(coinsB Coins) bool { - diff, _ := coins.SafeSub(coinsB) - if len(diff) == 0 { + if len(coins) == 0 { return false } - return diff.IsAllPositive() + if len(coinsB) == 0 { + return true + } + + if !coins.ContainsDenomsOf(coinsB) { + return false + } + + for _, coinB := range coinsB { + amountA, amountB := coins.AmountOf(coinB.Denom), coinB.Amount + if !amountA.GT(amountB) { + return false + } + } + + return true } // IsAllGTE returns true iff for every denom in coins, the denom is present at From 862cc436f334570932e6efe1730d9083d74cacdd Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 8 Mar 2019 00:24:05 +0000 Subject: [PATCH 05/97] Fix tests --- types/coin_test.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/types/coin_test.go b/types/coin_test.go index b29b5ece6..f9268b019 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -276,10 +276,7 @@ func TestCoins(t *testing.T) { mixedCase3 := Coins{ {"gAs", NewInt(1)}, } - empty := Coins{ - {"gold", NewInt(0)}, - } - null := Coins{} + empty := NewCoins() badSort1 := Coins{ {"tree", NewInt(1)}, {"gas", NewInt(1)}, @@ -312,7 +309,7 @@ func TestCoins(t *testing.T) { assert.False(t, mixedCase2.IsValid(), "First Coins denoms contain upper case characters") assert.False(t, mixedCase3.IsValid(), "Single denom in Coins contains upper case characters") assert.True(t, good.IsAllPositive(), "Expected coins to be positive: %v", good) - assert.False(t, null.IsAllPositive(), "Expected coins to not be positive: %v", null) + assert.False(t, empty.IsAllPositive(), "Expected coins to not be positive: %v", empty) assert.True(t, good.IsAllGTE(empty), "Expected %v to be >= %v", good, empty) assert.False(t, good.IsAllLT(empty), "Expected %v to be < %v", good, empty) assert.True(t, empty.IsAllLT(good), "Expected %v to be < %v", empty, good) @@ -331,7 +328,7 @@ func TestCoinsGT(t *testing.T) { assert.True(t, Coins{{testDenom1, one}}.IsAllGT(Coins{})) assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom1, one}})) assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom2, one}})) - assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllGT(Coins{{testDenom2, one}})) + assert.True(t, Coins{{testDenom1, one}, {testDenom2, two}}.IsAllGT(Coins{{testDenom2, one}})) assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllGT(Coins{{testDenom2, two}})) } @@ -358,7 +355,7 @@ func TestCoinsLT(t *testing.T) { assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom2, one}})) assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom2, two}})) assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom1, one}, {testDenom2, one}})) - assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom1, one}, {testDenom2, two}})) + assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom1, two}, {testDenom2, two}})) assert.True(t, Coins{}.IsAllLT(Coins{{testDenom1, one}})) } From c57de3daeabf94ed045fb9cf9a0e239250cc852e Mon Sep 17 00:00:00 2001 From: shirleypyj <43328538+shirleypyj@users.noreply.github.com> Date: Fri, 8 Mar 2019 13:51:42 +0800 Subject: [PATCH 06/97] Merge PR #3827: Create delegator-guide-cli.md --- .../cn/gaia/delegator-guide-cli.md | 519 ++++++++++++++++++ 1 file changed, 519 insertions(+) create mode 100644 docs/translations/cn/gaia/delegator-guide-cli.md diff --git a/docs/translations/cn/gaia/delegator-guide-cli.md b/docs/translations/cn/gaia/delegator-guide-cli.md new file mode 100644 index 000000000..5d34db0d4 --- /dev/null +++ b/docs/translations/cn/gaia/delegator-guide-cli.md @@ -0,0 +1,519 @@ +# 委托人指南 (CLI) + + +本文介绍了如何使用Cosmos Hub的命令行交互(CLI)程序实现通证委托的相关知识和操作步骤。 + +同时,本文也介绍了如何管理账户,如何从筹款人那里恢复账户,以及如何使用一个硬件钱包的相关知识。 + +::: 风险提示 + +**重要提示**:请务必按照下面的操作步骤谨慎操作,过程中发生任何错误都有可能导致您永远失去所拥有的通证。因此,请在开始操作之前先仔细阅读全文,如果有任何问题可以联系我们获得支持。 + + +另请注意,您即将要与Cosmos Hub进行交互,Cosmos Hub仍然是一个试验型的区块链技术软件。虽然Cosmos Hub区块链是应用现有最新技术开发并经过审核的,但我们仍然可能会在运行时遇到问题,需要不断更新和修复漏洞。此外,使用区块链技术仍然要求有很高的技术能力,并且有可能遇到我们无法预知和控制的风险。使用Cosmos Hub前,您需要充分了解与加密软件相关的潜在风险(请参考[Cosmos跨链贡献条款](https://github.com/cosmos/cosmos/blob/master/fundraiser/Interchain%20Cosmos%20Contribution%20Terms%20-%20FINAL.pdf)中关于风险的部分条款),并且我们跨链基金会和(或)Tendermint团队对于因为使用本产品而可能产生的损失不承担任何责任。使用Cosmos Hub需要遵守Apache 2.0开源软件授权条款,用户需要自己承担所有责任,所使用的软件按“现状”提供且不提供任何形式的保障或条件。 +::: + + +请务必谨慎行事! + +## 目录 + +- [安装 `gaiacli`](#安装-gaiacli) +- [Cosmos账户](#Cosmos账户) + + [通过募资人恢复一个账户](#通过募资人恢复一个账户) + + [创建一个账户](#创建一个账户) +- [访问Cosmos Hub网络](#访问Cosmos-Hub网络) + + [运行您自己的全节点](#运行您自己的全节点) + + [连接到一个远程全节点](#连接到一个远程全节点) +- [设置`gaiacli`](#设置-gaiacli) +- [状态查询](#状态查询) +- [发起交易](#发起交易) + + [关于gas费和手续费](#关于gas费和手续费) + + [抵押Atom通证 & 提取奖励](#抵押atom通证--提取奖励) + + [参与链上治理](#参与链上治理) + + [从一台离线电脑上签署交易](#从一台离线电脑上签署交易) + +## 安装 `gaiacli` + +`gaiacli`: 与`gaiad`全节点交互的命令行用户界面。 + +::: 安全提示 + +**请检查并且确认你下载的`gaiacli`是可获得的最新稳定版本** +::: + + +[**下载已编译代码**]暂不提供 + + +[**通过源代码安装**](https://cosmos.network/docs/gaia/installation.html) + +::: tip 提示 + +`gaiacli` 需要通过操作系统的终端窗口使用,打开步骤如下所示: +- **Windows**: `开始` > `所有程序` > `附件` > `终端` +- **MacOS**: `访达` > `应用程序` > `实用工具` > `终端` +- **Linux**: `Ctrl` + `Alt` + `T` +::: + +## Cosmos账户 + +每个Cosmos账户的核心基础是一个包含12或24个词的助记词组,通过这个助记词可以生成无数个Cosmos账户,例如,一组私钥/公钥对。这被称为一个硬件钱包(跟多硬件钱包相关说明请参见[BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)) + +``` + 账户 0 账户 1 账户 2 + ++------------------+ +------------------+ +------------------+ +| | | | | | +| 地址 0 | | 地址 1 | | 地址 2 | +| ^ | | ^ | | ^ | +| | | | | | | | | +| | | | | | | | | +| | | | | | | | | +| + | | + | | + | +| 公钥 0 | | 公钥 1 | | 公钥 2 | +| ^ | | ^ | | ^ | +| | | | | | | | | +| | | | | | | | | +| | | | | | | | | +| + | | + | | + | +| 私钥 0 | | 私钥 1 | | 私钥 2 | +| ^ | | ^ | | ^ | ++------------------+ +------------------+ +------------------+ + | | | + | | | + | | | + +--------------------------------------------------------------------+ + | + | + +---------+---------+ + | | + | 助记词 (Seed) | + | | + +-------------------+ +``` + + +私钥是控制一个账户中所存资产的钥匙。私钥是通过助记词单向产生的。如果您不小心丢失了私钥,你可以通过助记词恢复。 然而,如果你丢失了助记词,那么你就有可能失去对由这个助记词产生的所有私钥的控制。同样,如果有人获得了你的助记词,他们就可以操作所有相关账户。 + +::: 警告 + +**谨慎保管并不要告诉他人你的助记词。 为了防止资产被盗或者丢失,您最好多备份几份助记词, 并且把它们存放在只有您知道的安全地方,这样做将有助于保障您的私钥以及相关账户的安全。** +::: + + +Cosmos地址是一个以可读词开头的字符串(比如`cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg`) 如果有人想给你转账通证,他们就往这个地址转账。根据给定地址来推算私钥是不可行的。 + +### 通过募资人恢复一个账户 + +::: 提示 + +*注:这部分内容仅适用于众筹活动参与者* +::: + + +如果您是众筹的参与者,你应该有一个助记词。新产生的助记词用24个词,但是12个词的助记词组也兼容所有Cosmos工具。 + +#### 通过硬件钱包设备进行操作 + + +一个数字钱包设备的核心是通过一个助记词在多个区块链上创建账户(包括Cosmos hub)。通常,您会在初始化您的数字钱包设备时创建一个新的助记词,也可以通过已有的助记词进行导入。让我们一起来看如何将您在参与众筹时获得的助记词设定为一个数字钱包设备的seed。 + +::: 警告 + +*注意:**最好使用一个新的钱包设备**来恢复您的Cosmos账户。确实,每个数字钱包设备只能有一个助记词。 当然,您可以通过 `设置`>`设备`>`重置所有` 将一个已经有助记词的(用过的)数字钱包重新初始化。**但请注意,这样会清空您设备中现有的助记词,如果您没有做好备份的话,有可能会丢失您的资产*** +::: + + +对于一个没有初始化的数字钱包设备,您需要做如下操作。 + + +1. 将您的数字钱包设备通过USB与电脑链接 +2. 同时按下两个按钮 +3. **不要**选择“配置一个新设备”选项,而是选择“恢复配置” +4. 选择一个PIN +5. 选择12个词选项 +6. 逐个按顺序输入您在众筹时获得的12个助记词 + + +现在,您的钱包已经正确地设置好您在众筹时获得的助记词,切勿丢失!任何时候您的钱包设备出现问题,您都可以通过助记词在一个新的钱包设备上恢复所有账户。 + + +接下来,请点击[这里](#使用硬件钱包设备进行操作)来学习如何生成一个账户。 + +#### 在电脑上操作 + +::: 警告 + +**注意: 在一台没有联网的计算机上执行以下操作会更加安全** +::: + +如果您希望通过众筹时获得的助记词恢复账户并保存相关私钥,请按以下步骤操作: + +```bash +gaiacli keys add --recover +``` + + +首先,您需要输入一个密码来对您硬盘上账户`0`的私钥进行加密。每次您发出一笔交易时都将需要输入这个密码。如果您丢失了密码,您可以通过助记词来恢复您的私钥。 + + +-`` 是账户名称,用来指代用助记词生成私钥/公钥对的Cosmos账户。在您发起交易时,这个账户名称被用来识别您的账户。 + + +- 您可以通过增加 `--account` 标志来指定您账户生成的路径 (`0`, `1`, `2`, ...), `0` 是缺省值。 + + +### 创建一个账户 + +前,您需要先安装`gaiacli`,同时,您需要知道你希望在哪里保存和使用您的私钥。 最好的办法是把他们保存在一台没有上网的电脑或者一个硬件钱包设备里面。 将私钥保存在一台联网的电脑里面比较危险,任何人通过网络攻击都有可能获取您的私钥,进而盗取您的资产。 + +#### 使用硬件钱包设备进行操作 + +::: 警告 + +**建议仅使用您新买的钱包设备或者您足够信任的设备** +::: + +当您初始化钱包设备时,设备会产生一个24个词的助记词组。这个助记词组和Cosmos是兼容的,我们可以通过这个助记词组创建Cosmos账户。所以,您需要做的是确认您的钱包设备兼容`gaiacli`,通过下面的步骤可以帮助您确认您的设备是否兼容: + + +1. 下载[Ledger Live应用](https://www.ledger.com/pages/ledger-live). +2. 通过USB将钱包与计算机连接,并且将钱包固件升级到最新版本。 +3. 到Ledger Live钱包的应用商店下载”Cosmos“应用(这可能需要花些时间)。**下载”Cosmos“应用程序需要在Ledger Live钱包`Settings`选项中激活`Dev Mode`** +4. 在你的钱包设备上操作Cosmos APP。 + + +然后,通过以下命令创建账户: + +```bash +gaiacli keys add --ledger +``` + +::: 注意: 该命令仅在硬件钱包已导入并在解锁状态时才有效::: + + +- `` 是账户名称,用来指代用助记词生成私钥/公钥对的Cosmos账户。在您发起交易时,这个账户名称被用来识别您的账户。 + + +- 您可以通过增加 `--account` 标志来指定您账户生成的路径 (`0`, `1`, `2`, ...), `0` 是缺省值。 + +#### 使用电脑设备进行操作 + +::: 警告 + +**注意:在一台没有联网的电脑上操作会更加安全** +::: + +然后,通过以下命令创建账户: + +```bash +gaiacli keys add +``` + +这个命令会产生一个24个词的助记词组,并且同时保存账户 `0` 的私钥和公钥。 另外,您还需要输入一个密码来对您硬盘上账户`0`的私钥进行加密。 每次您发出一笔交易时都将需要输入这个密码。如果您丢失了密码,您可以通过助记词来恢复您的私钥。 + +::: 危险提示 + +**千万不要丢失或者告诉其他人你的12个词的助记词组。 为了防止资产被盗或者丢失,您最好多备份几份助记词, 并且把它们存放在只有您知道的安全地方,如果有人取得您的助记词,那么他也就取得了您的私钥并且可以控制相关账户。** +::: + +::: 警告 +在确认已经安全保存好您的助记词以后(至少3遍!),你可以用如下命令清除终端窗口中的命令历史记录,以防有人通过历史记录获得您的助记词。 + +```bash +history -c +rm ~/.bash_history +``` +::: + +你可以用以下命令使用助记词生成多个账户: + +```bash +gaiacli keys add --recover --account 1 +``` + +- - `` 是账户名称,用来指代用助记词生成私钥/公钥对的Cosmos账户。在您发起交易时,这个账户名称用来识别您的账户。 + +- 您可以通过增加 `--account` 标志来指定您账户生成的路径 (`0`, `1`, `2`, ...), `0` 是缺省值。 + + +这条命令需要您输入一个密码。改变账号就代表生成了一个新的账户。 + +## 访问Cosmos Hub网络 + + +为了查询网络状态和发起交易,你需要通过自建一个全节点,或者连接到其他人的全节点访问Cosmos Hub网络 + +::: 警告 + +**注意: 请不要与任何人分享您的助记词,您是唯一需要知道这些助记词的人。如果任何人通过邮件或者其他社交媒体向您要求您提供您的助记词,那就需要警惕了。 请记住,Cosmos/Tendermint团队,或跨链基金会永远不会通过邮件要求您提供您的账户密码或助记词。** +::: + +### 运行您自己的全节点 + + +这是最安全的途径,但需要相当多的资源。您需要有较大的带宽和至少1TB的磁盘容量来运行一个全节点。 + + + `gaia`的安装教程在[这里](https://cosmos.network/docs/gaia/installation.html), 如何运行一个全节点指导在[这里](https://cosmos.network/docs/gaia/join-testnet.html) + +### 连接到一个远程全节点 + + +如果您不想或没有能力运行一个全节点,您也可以连接到其他人的全节点。您需要谨慎的选择一个可信的运营商,因为恶意的运营商往往会向您反馈错误的查询结果,或者对您的交易进行监控。 然而,他们永远也无法盗取您的资产,因为您的私钥仅保持在您的本地计算机或者钱包设备中。 验证人,钱包供应商或者交易所是可以提供全节点的运营商。 + + +连接到其他人提供的全节点,你需要一个全节点地址,如`https://77.87.106.33:26657`。这个地址是您的供应商提供的一个可信的接入地址。你会在下一节中用到这个地址。 + +## 设置 `gaiacli` + +::: 提示 + +**在开始设置 `gaiacli`前,请确认你已经可以[访问Cosmos Hub网络](#访问cosmos-hub网络)** +::: + +::: 警告 + +**请确认您使用的`gaiacli`是最新的稳定版本** +::: + +无论您是否在自己运行一个节点,`gaiacli` 都可以帮您实现与Cosmos Hub网络的交互。让我们来完成对它的配置。 + + +您需要用下面的命令行完成对`gaiacli`的配置: + +```bash +gaiacli config +``` + + +此命名允许您为每个参数设置缺省值。 + + +首先,设置你想要访问的全节点的地址: + +```bash +gaiacli config node : + + +//查询指定地址的验证人相关的所有委托信息 (e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg) +gaiacli query staking delegations + +// 查询从一个指定地址的委托人(e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)和一个指定地址的验证人(e.g. cosmosvaloper1n5pepvmgsfd3p2tqqgvt505jvymmstf6s9gw27) 之间的委托交易 +gaiacli query staking delegation + +// 查询一个指定地址的委托人(e.g. cosmos10snjt8dmpr5my0h76xj48ty80uzwhraqalu4eg)所能获得的奖励情况 +gaiacli query distr rewards + +// 查询所有现在正等待抵押的提案 +gaiacli query gov proposals --status deposit_period + +//查询所有现在正等待投票的填 +gaiacli query gov proposals --status voting_period + +// 查询一个指定propsalID的提案信息 +gaiacli query gov proposal +``` + +需要了解跟多的命令,只需要用: + +```bash +gaiacli query +``` + +对于每条命令,您都可以使用`-h` 或 `--help` 参数来获得更多的信息。 + +## 发起交易 + +### 关于gas费和手续费 + + +Cosmos Hub网络上的交易在被执行时需要支付手续费。这个手续费是用于支付执行交易所需的gas。计算公式如下: +``` +fees = gas * gasPrices +``` + +`gas` 的多少取决于交易类型,不同的交易类型会收取不同的 `gas` 。每个交易的 `gas` 费是在实际执行过程中计算的,但我们可以通过设置 `gas` 参数中的 `auto` 值实现在交易前对 `gas` 费的估算,但这只是一个粗略的估计,你可以通过 `--gas-adjustment` (缺省值 `1.0`) 对预估的`gas` 值进行调节,以确保为交易支付足够的`gas` 。 + +`gasPrice` 用于设置单位 `gas` 的价格。每个验证人会设置一个最低gas价`min-gas-price`, 并只会将`gasPrice`大于`min-gas-price`的交易打包。 + +交易的`fees` 是`gas` 和 `gasPrice`的乘积。作为一个用户,你需要输入3个参数中至少2个, `gasPrice`/`fees`的值越大,您的交易就越有机会被打包执行。 + +### 抵押Atom通证 & 提取奖励 + +::: 提示 +**在您抵押通证或取回奖励之前,您需要完成[`gaiacli` 设置](#设置-gaiacli) 和 [创建账户](#创建一个账户)** +::: + +::: 警告 +**在抵押通证前,请仔细阅读[委托者常见问题](https://cosmos.network/resources/delegators) 并且理解其中的风险和责任** +::: + +::: 警告 +**注意:执行以下命令需要在一台联网的计算机。用一个硬件钱包设备执行这些命令会更安全。关于离线交易过程请看[这里](#从一台离线电脑上签署交易).** +::: + +```bash +// 向指定验证人绑定一定数量的Atom通证 +// 参数设定样例: =cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, =10000stake, =0.001stake + +gaiacli tx staking delegate --from --gas auto --gas-prices + + +// 提取所有的奖励 +// 参数设定样例: =0.001stake + +gaiacli tx distr withdraw-all-rewards --from --gas auto --gas-prices + + +// 向指定验证人申请解绑一定数量的Atom通证 +// 解绑的通证需要3周后才能完全解绑并可以交易, +// 参数设定样例: =cosmosvaloper18thamkhnj9wz8pa4nhnp9rldprgant57pk2m8s, =10000stake, =0.001stake + +gaiacli tx staking unbond --from --gas auto --gas-prices +``` + +::: 提示 +::: +如果您是使用一个联网的钱包设备,在交易被广播到网络前您需要在设备上确认交易。 + +确认您的交易已经发出,可以用以下查询: + +```bash +// 您的账户余额在您抵押Atom通证或者取回奖励后会发生变化 +gaiacli query account + +// 您在抵押后应该能查到委托交易 +gaiacli query staking delegations + +// 如果交易已经被打包,将会返回交易记录(tx) +// 在以下查询命令中可以使用显示的交易哈希值作为参数 +gaiacli query tx + +``` + +如果您是连接到一个可信全节点的话,您可以通过一个区块链浏览器做检查。 + +## 参与链上治理 + +#### 链上治理入门 + +Cosmos Hub有一个内建的治理系统,该系统允许抵押通证的持有人参与提案投票。系统现在支持3种提案类型: + +- `Text Proposals`: 这是最基本的一种提案类型,通常用于获得大家对某个网络治理意见的观点。 +- `Parameter Proposals`: 这种提案通常用于改变网络参数的设定。 +- `Software Upgrade Proposal`: 这个提案用于升级Hub的软件。 + +任何Atom通证的持有人都能够提交一个提案。为了让一个提案获准公开投票,提议人必须要抵押一定量的通证 `deposit`,且抵押值必须大于 `minDeposit` 参数设定值. 提案的抵押不需要提案人一次全部交付。如果早期提案人交付的 `deposit` 不足,那么提案进入 `deposit_period` 状态。 此后,任何通证持有人可以通过 `depositTx` 交易增加对提案的抵押。 + +当`deposit` 达到 `minDeposit`,提案进入2周的 `voting_period` 。 任何**抵押了通证**的持有人都可以参与对这个提案的投票。投票的选项有`Yes`, `No`, `NoWithVeto` 和 `Abstain`。投票的权重取决于投票人所抵押的通证数量。如果通证持有人不投票,那么委托人将继承其委托的验证人的投票选项。当然,委托人也可以自己投出与所委托验证人不同的票。 + + +当投票期结束后,获得50%(不包括投`Abstain `票)以上 `Yes` 投票权重且少于33.33% 的`NoWithVeto`(不包括投`Abstain `票)提案将被接受, + +#### 实践练习 + +::: 提示 +**在您能够抵押通证或者提取奖励以前,您需要了解[通证抵押](#抵押atom通证--提取奖励)** +::: + +::: 警告 + +**注意:执行以下命令需要一台联网的计算机。用一个硬件钱包设备执行这些命令会更安全。关于离线交易过程请看[这里](#从一台离线电脑上签署交易).** +::: + +```bash +// 提交一个提案 +// =text/parameter_change/software_upgrade +// ex value for flag: =0.0001stake + +gaiacli tx gov submit-proposal --title "Test Proposal" --description "My awesome proposal" --type --deposit=10stake --gas auto --gas-prices --from + +// 增加对提案的抵押 +// Retrieve proposalID from $gaiacli query gov proposals --status deposit_period +// 通过 $gaiacli query gov proposals --status deposit_period 命令获得 `proposalID` +// 参数设定样例: =1stake + +gaiacli tx gov deposit --gas auto --gas-prices --from + +// 对一个提案投票 +// Retrieve proposalID from $gaiacli query gov proposals --status voting_period +通过 $gaiacli query gov proposals --status deposit_period 命令获得 `proposalID` +//